annotate src/if_xcmdsrv.c @ 33591:288da62613ba v9.0.2040

patch 9.0.2040: trim(): hard to use default mask Commit: https://github.com/vim/vim/commit/6e6386716f9494ae86027c6d34f657fd03dfec42 Author: Illia Bobyr <illia.bobyr@gmail.com> Date: Tue Oct 17 11:09:45 2023 +0200 patch 9.0.2040: trim(): hard to use default mask Problem: trim(): hard to use default mask Solution: Use default 'mask' when it is v:none The default 'mask' value is pretty complex, as it includes many characters. Yet, if one needs to specify the trimming direction, the third argument, 'trim()' currently requires the 'mask' value to be provided explicitly. 'v:none' is already used to mean "use the default argument value" in user defined functions. See |none-function_argument| in help. closes: #13363 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Illia Bobyr <illia.bobyr@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Tue, 17 Oct 2023 11:15:09 +0200
parents 27c9212d10aa
children 1629cc65d78d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 8732
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 * X command server by Flemming Madsen
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 * if_xcmdsrv.c: Functions for passing commands through an X11 display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 #include "version.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 #if defined(FEAT_CLIENTSERVER) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 # ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 # include <X11/Intrinsic.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 # include <X11/Xatom.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 /*
1121
e63691e7c504 updated for version 7.1a
vimboss
parents: 819
diff changeset
25 * This file provides procedures that implement the command server
e63691e7c504 updated for version 7.1a
vimboss
parents: 819
diff changeset
26 * functionality of Vim when in contact with an X11 server.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 * Adapted from TCL/TK's send command in tkSend.c of the tk 3.6 distribution.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 * Adapted for use in Vim by Flemming Madsen. Protocol changed to that of tk 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 * Copyright (c) 1989-1993 The Regents of the University of California.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 * All rights reserved.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36 * Permission is hereby granted, without written agreement and without
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 * license or royalty fees, to use, copy, modify, and distribute this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 * software and its documentation for any purpose, provided that the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 * above copyright notice and the following two paragraphs appear in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 * all copies of this software.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 * When a result is being awaited from a sent command, one of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 * the following structures is present on a list of all outstanding
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 * sent commands. The information in the structure is used to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 * process the result when it arrives. You're probably wondering
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 * how there could ever be multiple outstanding sent commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 * This could happen if Vim instances invoke each other recursively.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 * It's unlikely, but possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 typedef struct PendingCommand
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
67 int serial; // Serial number expected in result.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
68 int code; // Result Code. 0 is OK
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
69 char_u *result; // String result for command (malloc'ed).
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
70 // NULL means command still pending.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 struct PendingCommand *nextPtr;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
72 // Next in list of all outstanding commands.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
73 // NULL means end of list.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 } PendingCommand;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 static PendingCommand *pendingCommands = NULL;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
77 // List of all commands currently
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
78 // being waited for.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 * The information below is used for communication between processes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 * during "send" commands. Each process keeps a private window, never
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 * even mapped, with one property, "Comm". When a command is sent to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 * an interpreter, the command is appended to the comm property of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 * communication window associated with the interp's process. Similarly,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 * when a result is returned from a sent command, it is also appended
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 * to the comm property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 * Each command and each result takes the form of ASCII text. For a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 * command, the text consists of a nul character followed by several
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
91 * nul-terminated ASCII strings. The first string consists of a
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
92 * single letter:
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
93 * "c" for an expression
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
94 * "k" for keystrokes
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
95 * "r" for reply
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
96 * "n" for notification.
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
97 * Subsequent strings have the form "option value" where the following options
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
98 * are supported:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 * -r commWindow serial
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 * This option means that a response should be sent to the window
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 * whose X identifier is "commWindow" (in hex), and the response should
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 * be identified with the serial number given by "serial" (in decimal).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 * If this option isn't specified then the send is asynchronous and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 * no response is sent.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 * -n name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 * "Name" gives the name of the application for which the command is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 * intended. This option must be present.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 *
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
112 * -E encoding
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
113 * Encoding name used for the text. This is the 'encoding' of the
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
114 * sender. The receiver may want to do conversion to his 'encoding'.
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
115 *
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 * -s script
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 * "Script" is the script to be executed. This option must be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 * present. Taken as a series of keystrokes in a "k" command where
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 * <Key>'s are expanded
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 * The options may appear in any order. The -n and -s options must be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 * present, but -r may be omitted for asynchronous RPCs. For compatibility
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 * with future releases that may add new features, there may be additional
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 * options present; as long as they start with a "-" character, they will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 * be ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 * A result also consists of a zero character followed by several null-
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 * terminated ASCII strings. The first string consists of the single
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 * letter "r". Subsequent strings have the form "option value" where
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 * the following options are supported:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 * -s serial
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 * Identifies the command for which this is the result. It is the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 * same as the "serial" field from the -s option in the command. This
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 * option must be present.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 * -r result
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 * "Result" is the result string for the script, which may be either
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 * a result or an error message. If this field is omitted then it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 * defaults to an empty string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 * -c code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 * 0: for OK. This is the default.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 * 1: for error: Result is the last error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 * -i errorInfo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 * -e errorCode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 * Not applicable for Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 * Options may appear in any order, and only the -s option must be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 * present. As with commands, there may be additional options besides
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 * these; unknown options are ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 * Maximum size property that can be read at one time by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 * this module:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 #define MAX_PROP_WORDS 100000
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 struct ServerReply
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 Window id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 garray_T strings;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 static garray_T serverReply = { 0, 0, 0, 0, 0 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 enum ServerReplyOp { SROP_Find, SROP_Add, SROP_Delete };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
170 typedef int (*EndCond)(void *);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
172 struct x_cmdqueue
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
173 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
174 char_u *propInfo;
7123
077ae8b63e15 commit https://github.com/vim/vim/commit/b8603882b1679385b287f14c527fa61eee60a9dd
Christian Brabandt <cb@256bit.org>
parents: 7109
diff changeset
175 long_u len;
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
176 struct x_cmdqueue *next;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
177 struct x_cmdqueue *prev;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
178 };
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
179
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
180 typedef struct x_cmdqueue x_queue_T;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
181
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
182 // dummy node, header for circular queue
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
183 static x_queue_T head = {NULL, 0, NULL, NULL};
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
184
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 * Forward declarations for procedures defined later in this file:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
189 static Window LookupName(Display *dpy, char_u *name, int delete, char_u **loose);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
190 static int SendInit(Display *dpy);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
191 static int DoRegisterName(Display *dpy, char_u *name);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
192 static void DeleteAnyLingerer(Display *dpy, Window w);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
193 static int GetRegProp(Display *dpy, char_u **regPropp, long_u *numItemsp, int domsg);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
194 static int WaitForPend(void *p);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
195 static int WindowValid(Display *dpy, Window w);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
196 static void ServerWait(Display *dpy, Window w, EndCond endCond, void *endData, int localLoop, int seconds);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
197 static int AppendPropCarefully(Display *display, Window window, Atom property, char_u *value, int length);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
198 static int x_error_check(Display *dpy, XErrorEvent *error_event);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
199 static int IsSerialName(char_u *name);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
200 static void save_in_queue(char_u *buf, long_u len);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 7172
diff changeset
201 static void server_parse_message(Display *dpy, char_u *propInfo, long_u numItems);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
203 // Private variables for the "server" functionality
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 static Atom registryProperty = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 static Atom vimProperty = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 static int got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
208 static char_u *empty_prop = (char_u *)""; // empty GetRegProp() result
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 * Associate an ASCII name with Vim. Try real hard to get a unique one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 * Returns FAIL or OK.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
215 serverRegisterName(
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
216 Display *dpy, // display to register with
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
217 char_u *name) // the name that will be used as a base
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 int res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 char_u *p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 res = DoRegisterName(dpy, name);
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
224 if (res >= 0)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
225 return OK;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
226
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
227 i = 1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
228 do
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
230 if (res < -1 || i >= 1000)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 {
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
232 msg_attr(_("Unable to register a command server name"),
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
233 HL_ATTR(HLF_W));
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
234 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 }
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
236 if (p == NULL)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
237 p = alloc(STRLEN(name) + 10);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
238 if (p == NULL)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
239 {
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
240 res = -10;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
241 continue;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
242 }
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
243 sprintf((char *)p, "%s%d", name, i++);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
244 res = DoRegisterName(dpy, p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 }
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
246 while (res < 0)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
247 ;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
248 vim_free(p);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
249
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
254 DoRegisterName(Display *dpy, char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 Window w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 #define MAX_NAME_LENGTH 100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 char_u propInfo[MAX_NAME_LENGTH + 20];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 if (commProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 return -2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 * Make sure the name is unique, and append info about it to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 * the registry property. It's important to lock the server
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 * here to prevent conflicting changes to the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 * WARNING: Do not step through this while debugging, it will hangup the X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 * server!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 XGrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 w = LookupName(dpy, name, FALSE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 if (w != (Window)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 Status status;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 int dummyInt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 unsigned int dummyUns;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 Window dummyWin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 * The name is currently registered. See if the commWindow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 * associated with the name exists. If not, or if the commWindow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 * is *our* commWindow, then just unregister the old name (this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 * could happen if an application dies without cleaning up the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 * registry).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 status = XGetGeometry(dpy, w, &dummyWin, &dummyInt, &dummyInt,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 &dummyUns, &dummyUns, &dummyUns, &dummyUns);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 (void)XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 if (status != Success && w != commWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 XFlush(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 (void)LookupName(dpy, name, /*delete=*/TRUE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 sprintf((char *)propInfo, "%x %.*s", (int_u)commWindow,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 MAX_NAME_LENGTH, name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, 8,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 PropModeAppend, propInfo, STRLEN(propInfo) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 (void)XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 if (!got_x_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 set_vim_var_string(VV_SEND_SERVER, name, -1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 serverName = vim_strsave(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 need_maketitle = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 return -2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 #if defined(FEAT_GUI) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 * Clean out new ID from registry and set it as comm win.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 * Change any registered window ID.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
330 serverChangeRegisteredWindow(
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
331 Display *dpy, // Display to register with
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
332 Window newwin) // Re-register to this ID
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 char_u propInfo[MAX_NAME_LENGTH + 20];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 commWindow = newwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
338 // Always call SendInit() here, to make sure commWindow is marked as a Vim
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
339 // window.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
343 // WARNING: Do not step through this while debugging, it will hangup the X
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
344 // server!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 XGrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 DeleteAnyLingerer(dpy, newwin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 if (serverName != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 {
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26336
diff changeset
349 // Reinsert name if it was already registered
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 (void)LookupName(dpy, serverName, /*delete=*/TRUE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 sprintf((char *)propInfo, "%x %.*s",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 (int_u)newwin, MAX_NAME_LENGTH, serverName);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, 8,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 PropModeAppend, (char_u *)propInfo,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 STRLEN(propInfo) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 * Send to an instance of Vim via the X display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 * Returns 0 for OK, negative for an error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
366 serverSendToVim(
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
367 Display *dpy, // Where to send.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
368 char_u *name, // Where to send.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
369 char_u *cmd, // What to send.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
370 char_u **result, // Result of eval'ed expression
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
371 Window *server, // Actual ID of receiving app
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
372 Bool asExpr, // Interpret as keystrokes or expr ?
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
373 int timeout, // seconds to wait or zero
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
374 Bool localLoop, // Throw away everything but result
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
375 int silent) // don't complain about no server
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 Window w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 char_u *property;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 int length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 int res;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
381 static int serial = 0; // Running count of sent commands.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
382 // Used to give each command a
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
383 // different serial number.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 PendingCommand pending;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 char_u *loosename = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 if (result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 *result = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 if (name == NULL || *name == NUL)
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
390 name = (char_u *)"GVIM"; // use a default name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391
31287
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
392 if (commProperty == None && dpy != NULL && SendInit(dpy) < 0)
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
393 return -1;
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
394
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
395 #if defined(FEAT_EVAL)
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
396 ch_log(NULL, "serverSendToVim(%s, %s)", name, cmd);
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
397 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
399 // Execute locally if no display or target is ourselves
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 if (dpy == NULL || (serverName != NULL && STRICMP(name, serverName) == 0))
11177
76fb679a310e patch 8.0.0475: not enough testing for the client-server feature
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
401 return sendToLocalVim(cmd, asExpr, result);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 * Bind the server name to a communication window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 * Find any survivor with a serialno attached to the name if the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 * original registrant of the wanted name is no longer present.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 * Delete any lingering names from dead editors.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 while (TRUE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 w = LookupName(dpy, name, FALSE, &loosename);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
414 // Check that the window is hot
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 if (w != None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 if (!WindowValid(dpy, w))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 LookupName(dpy, loosename ? loosename : name,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 /*DELETE=*/TRUE, NULL);
12399
de1ae9d8ef57 patch 8.0.1079: memory leak when remote_foreground() fails
Christian Brabandt <cb@256bit.org>
parents: 11211
diff changeset
421 vim_free(loosename);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 if (w == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 if (!silent)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
430 semsg(_(e_no_registered_server_named_str), name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 else if (loosename != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 name = loosename;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 if (server != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 *server = w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 * Send the command to target interpreter by appending it to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 * comm window in the communication window.
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 41
diff changeset
441 * Length must be computed exactly!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 */
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 41
diff changeset
443 length = STRLEN(name) + STRLEN(p_enc) + STRLEN(cmd) + 14;
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
444 property = alloc(length + 30);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
446 sprintf((char *)property, "%c%c%c-n %s%c-E %s%c-s %s",
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
447 0, asExpr ? 'c' : 'k', 0, name, 0, p_enc, 0, cmd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 if (name == loosename)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 vim_free(loosename);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
450 // Add a back reference to our comm window
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 serial++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 sprintf((char *)property + length, "%c-r %x %d",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 0, (int_u)commWindow, serial);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
454 // Add length of what "-r %x %d" resulted in, skipping the NUL.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 length += STRLEN(property + length + 1) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 res = AppendPropCarefully(dpy, w, commProperty, property, length + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 vim_free(property);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 if (res < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 {
26893
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
461 emsg(_(e_failed_to_send_command_to_destination_program));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
465 if (!asExpr) // There is no answer for this - Keys are sent async
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 * Register the fact that we're waiting for a command to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 * complete (this is needed by SendEventProc and by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 * AppendErrorProc to pass back the command's results).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 pending.serial = serial;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 pending.code = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 pending.result = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 pending.nextPtr = pendingCommands;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 pendingCommands = &pending;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
479 ServerWait(dpy, w, WaitForPend, &pending, localLoop,
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
480 timeout > 0 ? timeout : 600);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 * Unregister the information about the pending command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 * and return the result.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 if (pendingCommands == &pending)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 pendingCommands = pending.nextPtr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 PendingCommand *pcPtr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 for (pcPtr = pendingCommands; pcPtr != NULL; pcPtr = pcPtr->nextPtr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 if (pcPtr->nextPtr == &pending)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 pcPtr->nextPtr = pending.nextPtr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 }
31287
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
499
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
500 #if defined(FEAT_EVAL)
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
501 ch_log(NULL, "serverSendToVim() result: %s",
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
502 pending.result == NULL ? "NULL" : (char *)pending.result);
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
503 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 if (result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 *result = pending.result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 vim_free(pending.result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 return pending.code == 0 ? 0 : -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
513 WaitForPend(void *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 PendingCommand *pending = (PendingCommand *) p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 return pending->result != NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 * Return TRUE if window "w" exists and has a "Vim" property on it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
523 WindowValid(Display *dpy, Window w)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 Atom *plist;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 int numProp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 got_x_error = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 plist = XListProperties(dpy, w, &numProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 if (plist == NULL || got_x_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 for (i = 0; i < numProp; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 if (plist[i] == vimProperty)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 XFree(plist);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 XFree(plist);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 * Enter a loop processing X events & polling chars until we see a result
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
552 ServerWait(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
553 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
554 Window w,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
555 EndCond endCond,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
556 void *endData,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
557 int localLoop,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
558 int seconds)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 time_t start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 time_t now;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 XEvent event;
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
563
18642
bbea1f108187 patch 8.1.2313: debugging where a delay comes from is not easy
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
564 #define UI_MSEC_DELAY 53
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
565 #define SEND_MSEC_POLL 500
28142
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
566 #ifdef HAVE_SELECT
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
567 fd_set fds;
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
568
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
569 FD_ZERO(&fds);
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
570 FD_SET(ConnectionNumber(dpy), &fds);
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
571 #else
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
572 struct pollfd fds;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
573
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
574 fds.fd = ConnectionNumber(dpy);
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
575 fds.events = POLLIN;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
576 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 time(&start);
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
579 while (TRUE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 {
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
581 while (XCheckWindowEvent(dpy, commWindow, PropertyChangeMask, &event))
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
582 serverEventProc(dpy, &event, 1);
8732
29765df3a866 commit https://github.com/vim/vim/commit/1e7885abe8daa793fd9328d0fd6c456214cb467e
Christian Brabandt <cb@256bit.org>
parents: 7823
diff changeset
583 server_parse_messages();
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
584
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
585 if (endCond(endData) != 0)
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
586 break;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
587 if (!WindowValid(dpy, w))
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
588 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 time(&now);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 if (seconds >= 0 && (now - start) >= seconds)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 break;
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
592
11181
13544aa85dc0 patch 8.0.0477: the client-server test may hang when failing
Christian Brabandt <cb@256bit.org>
parents: 11177
diff changeset
593 #ifdef FEAT_TIMERS
13544aa85dc0 patch 8.0.0477: the client-server test may hang when failing
Christian Brabandt <cb@256bit.org>
parents: 11177
diff changeset
594 check_due_timer();
13544aa85dc0 patch 8.0.0477: the client-server test may hang when failing
Christian Brabandt <cb@256bit.org>
parents: 11177
diff changeset
595 #endif
13544aa85dc0 patch 8.0.0477: the client-server test may hang when failing
Christian Brabandt <cb@256bit.org>
parents: 11177
diff changeset
596
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
597 // Just look out for the answer without calling back into Vim
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 if (localLoop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 {
28142
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
600 #ifdef HAVE_SELECT
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
601 struct timeval tv;
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
602
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
603 // Set the time every call, select() may change it to the remaining
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
604 // time.
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
605 tv.tv_sec = 0;
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
606 tv.tv_usec = SEND_MSEC_POLL * 1000;
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
607 if (select(FD_SETSIZE, &fds, NULL, NULL, &tv) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 #else
28142
7dec326adb36 patch 8.2.4595: X11: using --remote-wait may keep the CPU busy
Bram Moolenaar <Bram@vim.org>
parents: 26917
diff changeset
610 if (poll(&fds, 1, SEND_MSEC_POLL) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 break;
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
618 ui_delay((long)UI_MSEC_DELAY, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 * Fetch a list of all the Vim instance names currently registered for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 * display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 * Returns a newline separated list in allocated memory or NULL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 char_u *
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
632 serverGetVimNames(Display *dpy)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 char_u *regProp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 char_u *entry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 long_u numItems;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 int_u w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 garray_T ga;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 if (registryProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 * Read the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 if (GetRegProp(dpy, &regProp, &numItems, TRUE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 * Scan all of the names out of the property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 ga_init2(&ga, 1, 100);
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
657 for (p = regProp; (long_u)(p - regProp) < numItems; p++)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 while (*p != 0 && !isspace(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 if (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 w = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 sscanf((char *)entry, "%x", &w);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 if (WindowValid(dpy, (Window)w))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 ga_concat(&ga, p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 ga_concat(&ga, (char_u *)"\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 if (regProp != empty_prop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 XFree(regProp);
21
db5102f7e29f updated for version 7.0013
vimboss
parents: 7
diff changeset
677 ga_append(&ga, NUL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 return ga.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
681 /////////////////////////////////////////////////////////////
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
682 // Reply stuff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 static struct ServerReply *
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
685 ServerReplyFind(Window w, enum ServerReplyOp op)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 struct ServerReply *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 struct ServerReply e;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 p = (struct ServerReply *) serverReply.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 for (i = 0; i < serverReply.ga_len; i++, p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 if (p->id == w)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 if (i >= serverReply.ga_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 if (p == NULL && op == SROP_Add)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 if (serverReply.ga_growsize == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 ga_init2(&serverReply, sizeof(struct ServerReply), 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 if (ga_grow(&serverReply, 1) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 p = ((struct ServerReply *) serverReply.ga_data)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 + serverReply.ga_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 e.id = w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 ga_init2(&e.strings, 1, 100);
1740
17b96d8dcc5c updated for version 7.2-038
vimboss
parents: 1698
diff changeset
708 mch_memmove(p, &e, sizeof(e));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 serverReply.ga_len++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 else if (p != NULL && op == SROP_Delete)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 ga_clear(&p->strings);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 mch_memmove(p, p + 1, (serverReply.ga_len - i - 1) * sizeof(*p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 serverReply.ga_len--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 * Convert string to windowid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 * Issue an error if the id is invalid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 Window
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
727 serverStrToWin(char_u *str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 unsigned id = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 sscanf((char *)str, "0x%x", &id);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 if (id == None)
26917
d91aea2a612c patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26893
diff changeset
733 semsg(_(e_invalid_server_id_used_str), str);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 return (Window)id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 /*
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
739 * Send a reply string (notification) to client with id "name".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 * Return -1 if the window is invalid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
743 serverSendReply(char_u *name, char_u *str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 char_u *property;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 int length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 int res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 Display *dpy = X_DISPLAY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 Window win = serverStrToWin(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 if (commProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 return -2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 if (!WindowValid(dpy, win))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 41
diff changeset
759 length = STRLEN(p_enc) + STRLEN(str) + 14;
31702
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
760 if ((property = alloc(length + 30)) == NULL)
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
761 return -1;
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
762
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
763 sprintf((char *)property, "%cn%c-E %s%c-n %s%c-w %x",
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
764 0, 0, p_enc, 0, str, 0, (unsigned int)commWindow);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
765 // Add length of what "%x" resulted in.
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
766 length += STRLEN(property + length);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
767 res = AppendPropCarefully(dpy, win, commProperty, property, length + 1);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
768 vim_free(property);
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
769
27c9212d10aa patch 9.0.1183: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31287
diff changeset
770 return res;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
774 WaitForReply(void *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776 Window *w = (Window *) p;
11177
76fb679a310e patch 8.0.0475: not enough testing for the client-server feature
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
777
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 return ServerReplyFind(*w, SROP_Find) != NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
780
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 * Wait for replies from id (win)
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
783 * When "timeout" is non-zero wait up to this many seconds.
30325
58fb880f3607 patch 9.0.0498: various small issues
Bram Moolenaar <Bram@vim.org>
parents: 28142
diff changeset
784 * Return 0 and the allocated string in "*str" when a reply is available.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 * Return -1 if the window becomes invalid while waiting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
788 serverReadReply(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
789 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
790 Window win,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
791 char_u **str,
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
792 int localLoop,
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
793 int timeout)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 struct ServerReply *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
799 ServerWait(dpy, win, WaitForReply, &win, localLoop,
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
800 timeout > 0 ? timeout : -1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 if ((p = ServerReplyFind(win, SROP_Find)) != NULL && p->strings.ga_len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 *str = vim_strsave(p->strings.ga_data);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 len = STRLEN(*str) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 if (len < p->strings.ga_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 s = (char_u *) p->strings.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 mch_memmove(s, s + len, p->strings.ga_len - len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 p->strings.ga_len -= len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
812 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
814 // Last string read. Remove from list
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
815 ga_clear(&p->strings);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816 ServerReplyFind(win, SROP_Delete);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 * Check for replies from id (win).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 * Return TRUE and a non-malloc'ed string if there is. Else return FALSE.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
828 serverPeekReply(Display *dpy, Window win, char_u **str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 struct ServerReply *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 if ((p = ServerReplyFind(win, SROP_Find)) != NULL && p->strings.ga_len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 if (str != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 *str = p->strings.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 if (!WindowValid(dpy, win))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 * Initialize the communication channels for sending commands and receiving
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 * results.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
849 SendInit(Display *dpy)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
850 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
851 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
852
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
853 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 * Create the window used for communication, and set up an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
855 * event handler for it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
860 if (commProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
861 commProperty = XInternAtom(dpy, "Comm", False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 if (vimProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863 vimProperty = XInternAtom(dpy, "Vim", False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
864 if (registryProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 registryProperty = XInternAtom(dpy, "VimRegistry", False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 if (commWindow == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 commWindow = XCreateSimpleWindow(dpy, XDefaultRootWindow(dpy),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870 getpid(), 0, 10, 10, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 WhitePixel(dpy, DefaultScreen(dpy)),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872 WhitePixel(dpy, DefaultScreen(dpy)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
873 XSelectInput(dpy, commWindow, PropertyChangeMask);
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
874 // WARNING: Do not step through this while debugging, it will hangup
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
875 // the X server!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 XGrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877 DeleteAnyLingerer(dpy, commWindow);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
881 // Make window recognizable as a vim window
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 XChangeProperty(dpy, commWindow, vimProperty, XA_STRING,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883 8, PropModeReplace, (char_u *)VIM_VERSION_SHORT,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884 (int)STRLEN(VIM_VERSION_SHORT) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 (void)XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 return got_x_error ? -1 : 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 * Given a server name, see if the name exists in the registry for a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 * particular display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 * If the given name is registered, return the ID of the window associated
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 * with the name. If the name isn't registered, then return 0.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 * Side effects:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 * If the registry property is improperly formed, then it is deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901 * If "delete" is non-zero, then if the named server is found it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 * removed from the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 static Window
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
905 LookupName(
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
906 Display *dpy, // Display whose registry to check.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
907 char_u *name, // Name of a server.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
908 int delete, // If non-zero, delete info about name.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
909 char_u **loose) // Do another search matching -999 if not found
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
910 // Return result here if a match is found
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 char_u *regProp, *entry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914 long_u numItems;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 int_u returnValue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 * Read the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 if (GetRegProp(dpy, &regProp, &numItems, FALSE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 * Scan the property for the desired name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 returnValue = (int_u)None;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
927 entry = NULL; // Not needed, but eliminates compiler warning.
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
928 for (p = regProp; (long_u)(p - regProp) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 while (*p != 0 && !isspace(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 if (*p != 0 && STRICMP(name, p + 1) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935 sscanf((char *)entry, "%x", &returnValue);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 if (loose != NULL && returnValue == (int_u)None && !IsSerialName(name))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 {
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
945 for (p = regProp; (long_u)(p - regProp) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 while (*p != 0 && !isspace(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 if (*p != 0 && IsSerialName(p + 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 && STRNICMP(name, p + 1, STRLEN(name)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 sscanf((char *)entry, "%x", &returnValue);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 *loose = vim_strsave(p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964 * Delete the property, if that is desired (copy down the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 * remainder of the registry property to overlay the deleted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 * info, then rewrite the property).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 if (delete && returnValue != (int_u)None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 int count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 count = numItems - (p - regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 if (count > 0)
1740
17b96d8dcc5c updated for version 7.2-038
vimboss
parents: 1698
diff changeset
977 mch_memmove(entry, p, count);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 8, PropModeReplace, regProp,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 (int)(numItems - (p - entry)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 if (regProp != empty_prop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 XFree(regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 return (Window)returnValue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989 /*
1197
b7ad1c609161 updated for version 7.1b
vimboss
parents: 1121
diff changeset
990 * Delete any lingering occurrence of window id. We promise that any
b7ad1c609161 updated for version 7.1b
vimboss
parents: 1121
diff changeset
991 * occurrence is not ours since it is not yet put into the registry (by us)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993 * This is necessary in the following scenario:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 * 1. There is an old windowid for an exit'ed vim in the registry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 * 2. We get that id for our commWindow but only want to send, not register.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 * 3. The window will mistakenly be regarded valid because of own commWindow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
999 DeleteAnyLingerer(
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1000 Display *dpy, // Display whose registry to check.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1001 Window win) // Window to remove
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 char_u *regProp, *entry = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 long_u numItems;
28
726bdc53fa49 updated for version 7.0018
vimboss
parents: 21
diff changeset
1006 int_u wwin;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 * Read the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 if (GetRegProp(dpy, &regProp, &numItems, FALSE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1014 // Scan the property for the window id.
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1015 for (p = regProp; (long_u)(p - regProp) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 if (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 {
28
726bdc53fa49 updated for version 7.0018
vimboss
parents: 21
diff changeset
1019 sscanf((char *)p, "%x", &wwin);
726bdc53fa49 updated for version 7.0018
vimboss
parents: 21
diff changeset
1020 if ((Window)wwin == win)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 int lastHalf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1024 // Copy down the remainder to delete entry
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 lastHalf = numItems - (p - regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 if (lastHalf > 0)
1740
17b96d8dcc5c updated for version 7.2-038
vimboss
parents: 1698
diff changeset
1031 mch_memmove(entry, p, lastHalf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 numItems = (entry - regProp) + lastHalf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 p = entry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1039 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 if (entry != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 XA_STRING, 8, PropModeReplace, regProp,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 (int)(p - regProp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 if (regProp != empty_prop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 XFree(regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1055 * Read the registry property. Delete it when it's formatted wrong.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 * Return the property in "regPropp". "empty_prop" is used when it doesn't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1057 * exist yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1058 * Return OK when successful.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1061 GetRegProp(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1062 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1063 char_u **regPropp,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1064 long_u *numItemsp,
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1065 int domsg) // When TRUE give error message.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 int result, actualFormat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 long_u bytesAfter;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 Atom actualType;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1070 XErrorHandler old_handler;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 *regPropp = NULL;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1073 old_handler = XSetErrorHandler(x_error_check);
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1074 got_x_error = FALSE;
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1075
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 result = XGetWindowProperty(dpy, RootWindow(dpy, 0), registryProperty, 0L,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 (long)MAX_PROP_WORDS, False,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078 XA_STRING, &actualType,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1079 &actualFormat, numItemsp, &bytesAfter,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 regPropp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1082 XSync(dpy, FALSE);
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1083 (void)XSetErrorHandler(old_handler);
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1084 if (got_x_error)
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1085 return FAIL;
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1086
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087 if (actualType == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 {
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1089 // No prop yet. Logically equal to the empty list
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090 *numItemsp = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 *regPropp = empty_prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1095 // If the property is improperly formed, then delete it.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 if (result != Success || actualFormat != 8 || actualType != XA_STRING)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 if (*regPropp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 XFree(*regPropp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100 XDeleteProperty(dpy, RootWindow(dpy, 0), registryProperty);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 if (domsg)
26893
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
1102 emsg(_(e_vim_instance_registry_property_is_badly_formed_deleted));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1108
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 /*
1197
b7ad1c609161 updated for version 7.1b
vimboss
parents: 1121
diff changeset
1110 * This procedure is invoked by the various X event loops throughout Vims when
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 * a property changes on the communication window. This procedure reads the
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1112 * property and enqueues command requests and responses. If immediate is true,
13353
8412df1479a3 patch 8.0.1550: various small problems in source files
Christian Brabandt <cb@256bit.org>
parents: 12399
diff changeset
1113 * it runs the event immediately instead of enqueuing it. Immediate can cause
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1114 * unintended behavior and should only be used for code that blocks for a
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1115 * response.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117 void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1118 serverEventProc(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1119 Display *dpy,
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1120 XEvent *eventPtr, // Information about event.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1121 int immediate) // Run event immediately. Should mostly be 0.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 char_u *propInfo;
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1124 int result, actualFormat;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 long_u numItems, bytesAfter;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 Atom actualType;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 if (eventPtr != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 if (eventPtr->xproperty.atom != commProperty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 || eventPtr->xproperty.state != PropertyNewValue)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 * Read the comm property and delete it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 propInfo = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 result = XGetWindowProperty(dpy, commWindow, commProperty, 0L,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 (long)MAX_PROP_WORDS, True,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 XA_STRING, &actualType,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 &actualFormat, &numItems, &bytesAfter,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 &propInfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1145 // If the property doesn't exist or is improperly formed then ignore it.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146 if (result != Success || actualType != XA_STRING || actualFormat != 8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 if (propInfo != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 XFree(propInfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 }
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1152 if (immediate)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1153 server_parse_message(dpy, propInfo, numItems);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1154 else
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1155 save_in_queue(propInfo, numItems);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1156 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1157
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1158 /*
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1159 * Saves x clientserver commands in a queue so that they can be called when
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1160 * vim is idle.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1161 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1162 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1163 save_in_queue(char_u *propInfo, long_u len)
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1164 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1165 x_queue_T *node;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1166
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
1167 node = ALLOC_ONE(x_queue_T);
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1168 if (node == NULL)
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1169 return; // out of memory
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1170 node->propInfo = propInfo;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1171 node->len = len;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1172
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1173 if (head.next == NULL) // initialize circular queue
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1174 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1175 head.next = &head;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1176 head.prev = &head;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1177 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1178
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1179 // insert node at tail of queue
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1180 node->next = &head;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1181 node->prev = head.prev;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1182 head.prev->next = node;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1183 head.prev = node;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1184 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1185
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1186 /*
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1187 * Parses queued clientserver messages.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1188 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1189 void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1190 server_parse_messages(void)
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1191 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1192 x_queue_T *node;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1193
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1194 if (!X_DISPLAY)
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1195 return; // cannot happen?
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1196 while (head.next != NULL && head.next != &head)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1197 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1198 node = head.next;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1199 head.next = node->next;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1200 node->next->prev = node->prev;
7172
ad57f5b5bd6c commit https://github.com/vim/vim/commit/4e86150ec5b5158da92b28938ea55819dc890a14
Christian Brabandt <cb@256bit.org>
parents: 7123
diff changeset
1201 server_parse_message(X_DISPLAY, node->propInfo, node->len);
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1202 vim_free(node);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1203 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1204 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1205
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1206 /*
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1207 * Returns a non-zero value if there are clientserver messages waiting
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1208 * int the queue.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1209 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1210 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1211 server_waiting(void)
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1212 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1213 return head.next != NULL && head.next != &head;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1214 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1215
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1216 /*
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1217 * Prases a single clientserver message. A single message may contain multiple
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1218 * commands.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1219 * "propInfo" will be freed.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1220 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1221 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1222 server_parse_message(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1223 Display *dpy,
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1224 char_u *propInfo, // A string containing 0 or more X commands
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1225 long_u numItems) // The size of propInfo in bytes.
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1226 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1227 char_u *p;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1228 int code;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1229 char_u *tofree;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230
31287
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1231 #if defined(FEAT_EVAL)
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1232 ch_log(NULL, "server_parse_message() numItems: %ld", numItems);
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1233 #endif
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1234
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 * Several commands and results could arrive in the property at
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 * one time; each iteration through the outer loop handles a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 * single command or result.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 */
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1240 for (p = propInfo; (long_u)(p - propInfo) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 * Ignore leading NULs; each command or result starts with a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 * NUL so that no matter how badly formed a preceding command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 * is, we'll be able to tell that a new command/result is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 * starting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 if (*p == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253
31287
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1254 if ((*p == 'c' || *p == 'k') && p[1] == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 Window resWindow;
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1257 char_u *name, *script, *serial, *end;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 Bool asKeys = *p == 'k';
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1259 char_u *enc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 * This is an incoming command from some other application.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 * Iterate over all of its options. Stop when we reach
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 * the end of the property or something that doesn't look
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 * like an option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 resWindow = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270 serial = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 script = NULL;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1272 enc = NULL;
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1273 while ((long_u)(p - propInfo) < numItems && *p == '-')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 {
31287
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1275 #if defined(FEAT_EVAL)
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1276 ch_log(NULL, "server_parse_message() item: %c, %s", p[-2], p);
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1277 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 switch (p[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 case 'r':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 end = skipwhite(p + 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 resWindow = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 while (vim_isxdigit(*end))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 resWindow = 16 * resWindow + (long_u)hex2nr(*end);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 ++end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 if (end == p + 2 || *end != ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 resWindow = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 p = serial = end + 1;
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1293 clientWindow = resWindow; // Remember in global
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 case 'n':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 name = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 case 's':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 script = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 break;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1304 case 'E':
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1305 if (p[2] == ' ')
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1306 enc = p + 3;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1307 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 if (script == NULL || name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1317 if (serverName != NULL && STRICMP(name, serverName) == 0)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1318 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1319 script = serverConvert(enc, script, &tofree);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1320 if (asKeys)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1321 server_to_input_buf(script);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1322 else
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1323 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1324 char_u *res;
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1325
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1326 res = eval_client_expr_to_string(script);
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1327 if (resWindow != None)
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1328 {
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1329 garray_T reply;
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1330
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1331 // Initialize the result property.
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1332 ga_init2(&reply, 1, 100);
7009
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1333 (void)ga_grow(&reply, 50 + STRLEN(p_enc));
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1334 sprintf(reply.ga_data, "%cr%c-E %s%c-s %s%c-r ",
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1335 0, 0, p_enc, 0, serial, 0);
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1336 reply.ga_len = 14 + STRLEN(p_enc) + STRLEN(serial);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1337
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1338 // Evaluate the expression and return the result.
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1339 if (res != NULL)
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1340 ga_concat(&reply, res);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1341 else
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1342 {
31287
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1343 ga_concat(&reply,
fa309d9af73c patch 9.0.0977: it is not easy to see what client-server commands are doing
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
1344 (char_u *)_(e_invalid_expression_received));
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1345 ga_append(&reply, 0);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1346 ga_concat(&reply, (char_u *)"-c 1");
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1347 }
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1348 ga_append(&reply, NUL);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1349 (void)AppendPropCarefully(dpy, resWindow, commProperty,
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1350 reply.ga_data, reply.ga_len);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1351 ga_clear(&reply);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1352 }
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1353 vim_free(res);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1354 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1355 vim_free(tofree);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1356 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 else if (*p == 'r' && p[1] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1360 int serial, gotSerial;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1361 char_u *res;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1362 PendingCommand *pcPtr;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1363 char_u *enc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 * This is a reply to some command that we sent out. Iterate
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 * over all of its options. Stop when we reach the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 * property or something that doesn't look like an option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 gotSerial = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 res = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 code = 0;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1374 enc = NULL;
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1375 while ((long_u)(p - propInfo) < numItems && *p == '-')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 switch (p[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 case 'r':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 res = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 break;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1383 case 'E':
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1384 if (p[2] == ' ')
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1385 enc = p + 3;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1386 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 case 's':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 if (sscanf((char *)p + 2, " %d", &serial) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 gotSerial = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 case 'c':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 if (sscanf((char *)p + 2, " %d", &code) != 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 code = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 if (!gotSerial)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 * Give the result information to anyone who's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 * waiting for it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 for (pcPtr = pendingCommands; pcPtr != NULL; pcPtr = pcPtr->nextPtr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 if (serial != pcPtr->serial || pcPtr->result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 pcPtr->code = code;
7009
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1414 res = serverConvert(enc, res, &tofree);
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1415 if (tofree == NULL)
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1416 res = vim_strsave(res);
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1417 pcPtr->result = res;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 else if (*p == 'n' && p[1] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 Window win = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 unsigned int u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 int gotWindow;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 struct ServerReply *r;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1428 char_u *enc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 /*
10942
e05695e59f6d patch 8.0.0360: sometimes VimL is used instead of "Vim script"
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
1431 * This is a (n)otification. Sent with serverreply_send in Vim
e05695e59f6d patch 8.0.0360: sometimes VimL is used instead of "Vim script"
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
1432 * script. Execute any autocommand and save it for later retrieval
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 gotWindow = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 str = (char_u *)"";
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1437 enc = NULL;
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1438 while ((long_u)(p - propInfo) < numItems && *p == '-')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 switch (p[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 case 'n':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 str = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 break;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1446 case 'E':
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1447 if (p[2] == ' ')
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1448 enc = p + 3;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1449 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 case 'w':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 if (sscanf((char *)p + 2, " %x", &u) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 win = u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 gotWindow = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 if (!gotWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 continue;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1465 str = serverConvert(enc, str, &tofree);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 if ((r = ServerReplyFind(win, SROP_Add)) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 ga_concat(&(r->strings), str);
21
db5102f7e29f updated for version 7.0013
vimboss
parents: 7
diff changeset
1469 ga_append(&(r->strings), NUL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 }
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1471 {
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1472 char_u winstr[30];
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1473
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1474 sprintf((char *)winstr, "0x%x", (unsigned int)win);
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1475 apply_autocmds(EVENT_REMOTEREPLY, winstr, str, TRUE, curbuf);
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1476 }
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1477 vim_free(tofree);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1482 * Didn't recognize this thing. Just skip through the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 * null character and try again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 * Even if we get an 'r'(eply) we will throw it away as we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 * never specify (and thus expect) one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 XFree(propInfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 * Append a given property to a given window, but set up an X error handler so
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 * that if the append fails this procedure can return an error code rather
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 * than having Xlib panic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 * Return: 0 for OK, -1 for error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1502 AppendPropCarefully(
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1503 Display *dpy, // Display on which to operate.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1504 Window window, // Window whose property is to be modified.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1505 Atom property, // Name of property.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1506 char_u *value, // Characters to append to property.
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1507 int length) // How much to append
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 XChangeProperty(dpy, window, property, XA_STRING, 8,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 PropModeAppend, value, length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 (void) XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 return got_x_error ? -1 : 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 * Another X Error handler, just used to check for errors.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1525 x_error_check(Display *dpy UNUSED, XErrorEvent *error_event UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 got_x_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 * Check if "str" looks like it had a serial number appended.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 * Actually just checks if the name ends in a digit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1536 IsSerialName(char_u *str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 int len = STRLEN(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 return (len > 1 && vim_isdigit(str[len - 1]));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 }
18798
f0f9692d4487 patch 8.1.2387: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18642
diff changeset
1542 #endif // FEAT_CLIENTSERVER