annotate src/if_xcmdsrv.c @ 16150:b23048205589 v8.1.1080

patch 8.1.1080: when a screendump test fails, moving the file is a hassle commit https://github.com/vim/vim/commit/ef7f0e367eeaf6fb31b1caa0e3de1a4b07e86af3 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 30 15:59:51 2019 +0100 patch 8.1.1080: when a screendump test fails, moving the file is a hassle Problem: When a screendump test fails, moving the file is a hassle. Solution: Instead of appending ".failed" to the file name, keep the same file name but put the screendump in the "failed" directory. Then the file name only needs to be typed once when moving a screendump.
author Bram Moolenaar <Bram@vim.org>
date Sat, 30 Mar 2019 16:00:06 +0100
parents 536dd2bc5ac9
children ef00b6bc186b
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 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 int serial; /* Serial number expected in result. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 int code; /* Result Code. 0 is OK */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 char_u *result; /* String result for command (malloc'ed).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 * NULL means command still pending. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 struct PendingCommand *nextPtr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 /* Next in list of all outstanding commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 * NULL means end of list. */
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;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 /* List of all commands currently
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 * being waited for. */
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
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
182 /* dummy node, header for circular queue */
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 /* Private variables for the "server" functionality */
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 static char_u *empty_prop = (char_u *)""; /* empty GetRegProp() result */
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(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
216 Display *dpy, /* display to register with */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
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);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 if (res < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 i = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 if (res < -1 || i >= 1000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 {
15547
1dd0a47f4be2 patch 8.1.0781: build error when using if_xcmdsrv.c
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
231 msg_attr(_("Unable to register a command server name"),
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 10942
diff changeset
232 HL_ATTR(HLF_W));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 p = alloc(STRLEN(name) + 10);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 res = -10;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 sprintf((char *)p, "%s%d", name, i++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 res = DoRegisterName(dpy, p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 while (res < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
253 DoRegisterName(Display *dpy, char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 Window w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 #define MAX_NAME_LENGTH 100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 char_u propInfo[MAX_NAME_LENGTH + 20];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 if (commProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 return -2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 }
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 * Make sure the name is unique, and append info about it to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 * the registry property. It's important to lock the server
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 * here to prevent conflicting changes to the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 * WARNING: Do not step through this while debugging, it will hangup the X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 * server!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 XGrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 w = LookupName(dpy, name, FALSE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 if (w != (Window)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 Status status;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 int dummyInt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 unsigned int dummyUns;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 Window dummyWin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 * The name is currently registered. See if the commWindow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 * associated with the name exists. If not, or if the commWindow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 * is *our* commWindow, then just unregister the old name (this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 * could happen if an application dies without cleaning up the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 * registry).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 status = XGetGeometry(dpy, w, &dummyWin, &dummyInt, &dummyInt,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 &dummyUns, &dummyUns, &dummyUns, &dummyUns);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 (void)XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 if (status != Success && w != commWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 XFlush(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 (void)LookupName(dpy, name, /*delete=*/TRUE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 sprintf((char *)propInfo, "%x %.*s", (int_u)commWindow,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 MAX_NAME_LENGTH, name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, 8,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 PropModeAppend, propInfo, STRLEN(propInfo) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 (void)XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 if (!got_x_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 set_vim_var_string(VV_SEND_SERVER, name, -1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 serverName = vim_strsave(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 #ifdef FEAT_TITLE
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 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 return -2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 #if defined(FEAT_GUI) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 * Clean out new ID from registry and set it as comm win.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 * Change any registered window ID.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
331 serverChangeRegisteredWindow(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
332 Display *dpy, /* Display to register with */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
333 Window newwin) /* Re-register to this ID */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 char_u propInfo[MAX_NAME_LENGTH + 20];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 commWindow = newwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 /* Always call SendInit() here, to make sure commWindow is marked as a Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 * window. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344 /* WARNING: Do not step through this while debugging, it will hangup the X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 * server! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 XGrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 DeleteAnyLingerer(dpy, newwin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 if (serverName != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 /* Reinsert name if we was already registered */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 (void)LookupName(dpy, serverName, /*delete=*/TRUE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 sprintf((char *)propInfo, "%x %.*s",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353 (int_u)newwin, MAX_NAME_LENGTH, serverName);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING, 8,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 PropModeAppend, (char_u *)propInfo,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 STRLEN(propInfo) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 * Send to an instance of Vim via the X display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 * Returns 0 for OK, negative for an error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
367 serverSendToVim(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
368 Display *dpy, /* Where to send. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
369 char_u *name, /* Where to send. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
370 char_u *cmd, /* What to send. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
371 char_u **result, /* Result of eval'ed expression */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
372 Window *server, /* Actual ID of receiving app */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
373 Bool asExpr, /* Interpret as keystrokes or expr ? */
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
374 int timeout, /* seconds to wait or zero */
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
375 Bool localLoop, /* Throw away everything but result */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
376 int silent) /* don't complain about no server */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 Window w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 char_u *property;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 int length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 int res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 static int serial = 0; /* Running count of sent commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 * Used to give each command a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 * different serial number. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 PendingCommand pending;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 char_u *loosename = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 if (result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 *result = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 if (name == NULL || *name == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 name = (char_u *)"GVIM"; /* use a default name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 if (commProperty == None && dpy != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 /* Execute locally if no display or target is ourselves */
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);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 /* Check that the window is hot */
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)
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 14862
diff changeset
430 semsg(_(e_noserver), 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;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
444 property = (char_u *)alloc((unsigned)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);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 /* Add a back reference to our comm window */
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);
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 41
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 {
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 14862
diff changeset
461 emsg(_("E248: Failed to send command to the 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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 if (!asExpr) /* There is no answer for this - Keys are sent async */
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 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 if (result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 *result = pending.result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 vim_free(pending.result);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 return pending.code == 0 ? 0 : -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
508 WaitForPend(void *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 PendingCommand *pending = (PendingCommand *) p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 return pending->result != NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 * Return TRUE if window "w" exists and has a "Vim" property on it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
518 WindowValid(Display *dpy, Window w)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 Atom *plist;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 int numProp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 got_x_error = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 plist = XListProperties(dpy, w, &numProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 if (plist == NULL || got_x_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 for (i = 0; i < numProp; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 if (plist[i] == vimProperty)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 XFree(plist);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 XFree(plist);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 * Enter a loop processing X events & polling chars until we see a result
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
547 ServerWait(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
548 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
549 Window w,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
550 EndCond endCond,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
551 void *endData,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
552 int localLoop,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
553 int seconds)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 time_t start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 time_t now;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 XEvent event;
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
558
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
559 #define UI_MSEC_DELAY 50
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
560 #define SEND_MSEC_POLL 500
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
561 #ifndef HAVE_SELECT
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
562 struct pollfd fds;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
563
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
564 fds.fd = ConnectionNumber(dpy);
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
565 fds.events = POLLIN;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
566 #else
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
567 fd_set fds;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
568 struct timeval tv;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
569
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
570 tv.tv_sec = 0;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
571 tv.tv_usec = SEND_MSEC_POLL * 1000;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
572 FD_ZERO(&fds);
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
573 FD_SET(ConnectionNumber(dpy), &fds);
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
574 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 time(&start);
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
577 while (TRUE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 {
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
579 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
580 serverEventProc(dpy, &event, 1);
8732
29765df3a866 commit https://github.com/vim/vim/commit/1e7885abe8daa793fd9328d0fd6c456214cb467e
Christian Brabandt <cb@256bit.org>
parents: 7823
diff changeset
581 server_parse_messages();
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
582
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
583 if (endCond(endData) != 0)
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
584 break;
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
585 if (!WindowValid(dpy, w))
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
586 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 time(&now);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 if (seconds >= 0 && (now - start) >= seconds)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 break;
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
590
11181
13544aa85dc0 patch 8.0.0477: the client-server test may hang when failing
Christian Brabandt <cb@256bit.org>
parents: 11177
diff changeset
591 #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
592 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
593 #endif
13544aa85dc0 patch 8.0.0477: the client-server test may hang when failing
Christian Brabandt <cb@256bit.org>
parents: 11177
diff changeset
594
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
595 /* Just look out for the answer without calling back into Vim */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 if (localLoop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 #ifndef HAVE_SELECT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 if (poll(&fds, 1, SEND_MSEC_POLL) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 #else
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
602 if (select(FD_SETSIZE, &fds, NULL, NULL, &tv) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 break;
3670
928e7cef8836 updated for version 7.3.595
Bram Moolenaar <bram@vim.org>
parents: 3668
diff changeset
610 ui_delay((long)UI_MSEC_DELAY, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 * Fetch a list of all the Vim instance names currently registered for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 * display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 * Returns a newline separated list in allocated memory or NULL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 char_u *
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
624 serverGetVimNames(Display *dpy)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 char_u *regProp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 char_u *entry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 long_u numItems;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 int_u w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 garray_T ga;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 if (registryProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 * Read the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 if (GetRegProp(dpy, &regProp, &numItems, TRUE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 * Scan all of the names out of the property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 ga_init2(&ga, 1, 100);
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
649 for (p = regProp; (long_u)(p - regProp) < numItems; p++)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 while (*p != 0 && !isspace(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 if (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 w = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 sscanf((char *)entry, "%x", &w);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 if (WindowValid(dpy, (Window)w))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 ga_concat(&ga, p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 ga_concat(&ga, (char_u *)"\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 if (regProp != empty_prop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 XFree(regProp);
21
db5102f7e29f updated for version 7.0013
vimboss
parents: 7
diff changeset
669 ga_append(&ga, NUL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 return ga.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 /* ----------------------------------------------------------
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 * Reply stuff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 static struct ServerReply *
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
678 ServerReplyFind(Window w, enum ServerReplyOp op)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 struct ServerReply *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 struct ServerReply e;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 p = (struct ServerReply *) serverReply.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 for (i = 0; i < serverReply.ga_len; i++, p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 if (p->id == w)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 if (i >= serverReply.ga_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 if (p == NULL && op == SROP_Add)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 if (serverReply.ga_growsize == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 ga_init2(&serverReply, sizeof(struct ServerReply), 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 if (ga_grow(&serverReply, 1) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 p = ((struct ServerReply *) serverReply.ga_data)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 + serverReply.ga_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 e.id = w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 ga_init2(&e.strings, 1, 100);
1740
17b96d8dcc5c updated for version 7.2-038
vimboss
parents: 1698
diff changeset
701 mch_memmove(p, &e, sizeof(e));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 serverReply.ga_len++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 else if (p != NULL && op == SROP_Delete)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 ga_clear(&p->strings);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
708 mch_memmove(p, p + 1, (serverReply.ga_len - i - 1) * sizeof(*p));
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 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 * Convert string to windowid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 * Issue an error if the id is invalid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 Window
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
720 serverStrToWin(char_u *str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 unsigned id = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 sscanf((char *)str, "0x%x", &id);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 if (id == None)
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 14862
diff changeset
726 semsg(_("E573: Invalid server id used: %s"), str);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 return (Window)id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 /*
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
732 * Send a reply string (notification) to client with id "name".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 * Return -1 if the window is invalid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
736 serverSendReply(char_u *name, char_u *str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 char_u *property;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 int length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 int res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 Display *dpy = X_DISPLAY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 Window win = serverStrToWin(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 if (commProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 if (SendInit(dpy) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 return -2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 if (!WindowValid(dpy, win))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 41
diff changeset
752 length = STRLEN(p_enc) + STRLEN(str) + 14;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
753 if ((property = (char_u *)alloc((unsigned)length + 30)) != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
755 sprintf((char *)property, "%cn%c-E %s%c-n %s%c-w %x",
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
756 0, 0, p_enc, 0, str, 0, (unsigned int)commWindow);
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 41
diff changeset
757 /* Add length of what "%x" resulted in. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758 length += STRLEN(property + length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 res = AppendPropCarefully(dpy, win, commProperty, property, length + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 vim_free(property);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761 return res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
767 WaitForReply(void *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 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
770
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 return ServerReplyFind(*w, SROP_Find) != NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 * 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
776 * When "timeout" is non-zero wait up to this many seconds.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777 * Return 0 and the malloc'ed string when a reply is available.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 * Return -1 if the window becomes invalid while waiting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
780 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
781 serverReadReply(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
782 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
783 Window win,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
784 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
785 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
786 int timeout)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 struct ServerReply *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791
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 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
793 timeout > 0 ? timeout : -1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 if ((p = ServerReplyFind(win, SROP_Find)) != NULL && p->strings.ga_len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 *str = vim_strsave(p->strings.ga_data);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798 len = STRLEN(*str) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
799 if (len < p->strings.ga_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 s = (char_u *) p->strings.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 mch_memmove(s, s + len, p->strings.ga_len - len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 p->strings.ga_len -= len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 /* Last string read. Remove from list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 ga_clear(&p->strings);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 ServerReplyFind(win, SROP_Delete);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
812 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
815
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 * Check for replies from id (win).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 * Return TRUE and a non-malloc'ed string if there is. Else return FALSE.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
821 serverPeekReply(Display *dpy, Window win, char_u **str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 struct ServerReply *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 if ((p = ServerReplyFind(win, SROP_Find)) != NULL && p->strings.ga_len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 if (str != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 *str = p->strings.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 if (!WindowValid(dpy, win))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 * Initialize the communication channels for sending commands and receiving
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 * results.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
842 SendInit(Display *dpy)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 * Create the window used for communication, and set up an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 * event handler for it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
849 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
850 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
851 got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
852
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
853 if (commProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 commProperty = XInternAtom(dpy, "Comm", False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
855 if (vimProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856 vimProperty = XInternAtom(dpy, "Vim", False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857 if (registryProperty == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 registryProperty = XInternAtom(dpy, "VimRegistry", False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
860 if (commWindow == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
861 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 commWindow = XCreateSimpleWindow(dpy, XDefaultRootWindow(dpy),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863 getpid(), 0, 10, 10, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
864 WhitePixel(dpy, DefaultScreen(dpy)),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 WhitePixel(dpy, DefaultScreen(dpy)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866 XSelectInput(dpy, commWindow, PropertyChangeMask);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 /* WARNING: Do not step through this while debugging, it will hangup
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 * the X server! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 XGrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870 DeleteAnyLingerer(dpy, commWindow);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 XUngrabServer(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
874 /* Make window recognizable as a vim window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 XChangeProperty(dpy, commWindow, vimProperty, XA_STRING,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 8, PropModeReplace, (char_u *)VIM_VERSION_SHORT,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877 (int)STRLEN(VIM_VERSION_SHORT) + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880 (void)XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 return got_x_error ? -1 : 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 * Given a server name, see if the name exists in the registry for a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 * particular display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 * If the given name is registered, return the ID of the window associated
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 * with the name. If the name isn't registered, then return 0.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 * Side effects:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 * If the registry property is improperly formed, then it is deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 * If "delete" is non-zero, then if the named server is found it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 * removed from the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 static Window
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
898 LookupName(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
899 Display *dpy, /* Display whose registry to check. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
900 char_u *name, /* Name of a server. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
901 int delete, /* If non-zero, delete info about name. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
902 char_u **loose) /* Do another search matching -999 if not found
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903 Return result here if a match is found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
905 char_u *regProp, *entry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907 long_u numItems;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 int_u returnValue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 * Read the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 if (GetRegProp(dpy, &regProp, &numItems, FALSE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 * Scan the property for the desired name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 returnValue = (int_u)None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 entry = NULL; /* Not needed, but eliminates compiler warning. */
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
921 for (p = regProp; (long_u)(p - regProp) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 while (*p != 0 && !isspace(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 if (*p != 0 && STRICMP(name, p + 1) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928 sscanf((char *)entry, "%x", &returnValue);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 if (loose != NULL && returnValue == (int_u)None && !IsSerialName(name))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 {
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
938 for (p = regProp; (long_u)(p - regProp) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 while (*p != 0 && !isspace(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 if (*p != 0 && IsSerialName(p + 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 && STRNICMP(name, p + 1, STRLEN(name)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 sscanf((char *)entry, "%x", &returnValue);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 *loose = vim_strsave(p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 * Delete the property, if that is desired (copy down the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 * remainder of the registry property to overlay the deleted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 * info, then rewrite the property).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 if (delete && returnValue != (int_u)None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 int count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 count = numItems - (p - regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 if (count > 0)
1740
17b96d8dcc5c updated for version 7.2-038
vimboss
parents: 1698
diff changeset
970 mch_memmove(entry, p, count);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 8, PropModeReplace, regProp,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 (int)(numItems - (p - entry)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 if (regProp != empty_prop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 XFree(regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 return (Window)returnValue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 /*
1197
b7ad1c609161 updated for version 7.1b
vimboss
parents: 1121
diff changeset
983 * Delete any lingering occurrence of window id. We promise that any
b7ad1c609161 updated for version 7.1b
vimboss
parents: 1121
diff changeset
984 * 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
985 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 * This is necessary in the following scenario:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 * 1. There is an old windowid for an exit'ed vim in the registry
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 * 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
989 * 3. The window will mistakenly be regarded valid because of own commWindow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
992 DeleteAnyLingerer(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
993 Display *dpy, /* Display whose registry to check. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
994 Window win) /* Window to remove */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 char_u *regProp, *entry = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 long_u numItems;
28
726bdc53fa49 updated for version 7.0018
vimboss
parents: 21
diff changeset
999 int_u wwin;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 * Read the registry property.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004 if (GetRegProp(dpy, &regProp, &numItems, FALSE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 /* Scan the property for the window id. */
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1008 for (p = regProp; (long_u)(p - regProp) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 if (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 {
28
726bdc53fa49 updated for version 7.0018
vimboss
parents: 21
diff changeset
1012 sscanf((char *)p, "%x", &wwin);
726bdc53fa49 updated for version 7.0018
vimboss
parents: 21
diff changeset
1013 if ((Window)wwin == win)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 int lastHalf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 /* Copy down the remainder to delete entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 entry = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 lastHalf = numItems - (p - regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 if (lastHalf > 0)
1740
17b96d8dcc5c updated for version 7.2-038
vimboss
parents: 1698
diff changeset
1024 mch_memmove(entry, p, lastHalf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 numItems = (entry - regProp) + lastHalf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 p = entry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 if (entry != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038 XA_STRING, 8, PropModeReplace, regProp,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1039 (int)(p - regProp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 if (regProp != empty_prop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 XFree(regProp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 * Read the registry property. Delete it when it's formatted wrong.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 * Return the property in "regPropp". "empty_prop" is used when it doesn't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 * exist yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 * Return OK when successful.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1054 GetRegProp(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1055 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1056 char_u **regPropp,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1057 long_u *numItemsp,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1058 int domsg) /* When TRUE give error message. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 int result, actualFormat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 long_u bytesAfter;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 Atom actualType;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1063 XErrorHandler old_handler;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065 *regPropp = NULL;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1066 old_handler = XSetErrorHandler(x_error_check);
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1067 got_x_error = FALSE;
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1068
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 result = XGetWindowProperty(dpy, RootWindow(dpy, 0), registryProperty, 0L,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 (long)MAX_PROP_WORDS, False,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 XA_STRING, &actualType,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 &actualFormat, numItemsp, &bytesAfter,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073 regPropp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1075 XSync(dpy, FALSE);
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1076 (void)XSetErrorHandler(old_handler);
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1077 if (got_x_error)
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1078 return FAIL;
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 502
diff changeset
1079
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 if (actualType == None)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1082 /* No prop yet. Logically equal to the empty list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083 *numItemsp = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 *regPropp = empty_prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 /* If the property is improperly formed, then delete it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 if (result != Success || actualFormat != 8 || actualType != XA_STRING)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 if (*regPropp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 XFree(*regPropp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 XDeleteProperty(dpy, RootWindow(dpy, 0), registryProperty);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 if (domsg)
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 14862
diff changeset
1095 emsg(_("E251: VIM instance registry property is badly formed. Deleted!"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1101
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 /*
1197
b7ad1c609161 updated for version 7.1b
vimboss
parents: 1121
diff changeset
1103 * This procedure is invoked by the various X event loops throughout Vims when
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 * 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
1105 * 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
1106 * 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
1107 * 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
1108 * response.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1111 serverEventProc(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1112 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1113 XEvent *eventPtr, /* Information about event. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1114 int immediate) /* Run event immediately. Should mostly be 0. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 char_u *propInfo;
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1117 int result, actualFormat;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 long_u numItems, bytesAfter;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 Atom actualType;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 if (eventPtr != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 if (eventPtr->xproperty.atom != commProperty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 || eventPtr->xproperty.state != PropertyNewValue)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 * Read the comm property and delete it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 propInfo = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 result = XGetWindowProperty(dpy, commWindow, commProperty, 0L,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 (long)MAX_PROP_WORDS, True,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 XA_STRING, &actualType,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 &actualFormat, &numItems, &bytesAfter,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 &propInfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 /* If the property doesn't exist or is improperly formed then ignore it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 if (result != Success || actualType != XA_STRING || actualFormat != 8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 if (propInfo != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 XFree(propInfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 }
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1145 if (immediate)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1146 server_parse_message(dpy, propInfo, numItems);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1147 else
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1148 save_in_queue(propInfo, numItems);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1149 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1150
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1151 /*
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1152 * 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
1153 * vim is idle.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1154 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1155 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1156 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
1157 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1158 x_queue_T *node;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1159
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1160 node = (x_queue_T *)alloc(sizeof(x_queue_T));
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1161 if (node == NULL)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1162 return; /* out of memory */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1163 node->propInfo = propInfo;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1164 node->len = len;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1165
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1166 if (head.next == NULL) /* initialize circular queue */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1167 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1168 head.next = &head;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1169 head.prev = &head;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1170 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1171
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1172 /* insert node at tail of queue */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1173 node->next = &head;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1174 node->prev = head.prev;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1175 head.prev->next = node;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1176 head.prev = node;
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
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1179 /*
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1180 * Parses queued clientserver messages.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1181 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1182 void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1183 server_parse_messages(void)
7109
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 x_queue_T *node;
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 if (!X_DISPLAY)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1188 return; /* cannot happen? */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1189 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
1190 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1191 node = head.next;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1192 head.next = node->next;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1193 node->next->prev = node->prev;
7172
ad57f5b5bd6c commit https://github.com/vim/vim/commit/4e86150ec5b5158da92b28938ea55819dc890a14
Christian Brabandt <cb@256bit.org>
parents: 7123
diff changeset
1194 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
1195 vim_free(node);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1196 }
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
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1199 /*
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1200 * 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
1201 * int the queue.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1202 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1203 int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1204 server_waiting(void)
7109
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 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
1207 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1208
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 * 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
1211 * commands.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1212 * "propInfo" will be freed.
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1213 */
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1214 static void
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1215 server_parse_message(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1216 Display *dpy,
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1217 char_u *propInfo, /* A string containing 0 or more X commands */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1218 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
1219 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1220 char_u *p;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1221 int code;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1222 char_u *tofree;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 * Several commands and results could arrive in the property at
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 * one time; each iteration through the outer loop handles a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227 * single command or result.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 */
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1229 for (p = propInfo; (long_u)(p - propInfo) < numItems; )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232 * Ignore leading NULs; each command or result starts with a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 * NUL so that no matter how badly formed a preceding command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 * is, we'll be able to tell that a new command/result is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 * starting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 if (*p == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 continue;
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 if ((*p == 'c' || *p == 'k') && (p[1] == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 Window resWindow;
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1246 char_u *name, *script, *serial, *end;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 Bool asKeys = *p == 'k';
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1248 char_u *enc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 * This is an incoming command from some other application.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 * Iterate over all of its options. Stop when we reach
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 * the end of the property or something that doesn't look
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 * like an option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 resWindow = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 serial = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 script = NULL;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1261 enc = NULL;
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1262 while ((long_u)(p - propInfo) < numItems && *p == '-')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 switch (p[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 case 'r':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 end = skipwhite(p + 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 resWindow = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 while (vim_isxdigit(*end))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 resWindow = 16 * resWindow + (long_u)hex2nr(*end);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 ++end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 if (end == p + 2 || *end != ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 resWindow = None;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 p = serial = end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 clientWindow = resWindow; /* Remember in global */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 case 'n':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 name = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 case 's':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 script = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 break;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1290 case 'E':
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1291 if (p[2] == ' ')
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1292 enc = p + 3;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1293 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 if (script == NULL || name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1303 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
1304 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1305 script = serverConvert(enc, script, &tofree);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1306 if (asKeys)
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1307 server_to_input_buf(script);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1308 else
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1309 {
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1310 char_u *res;
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1311
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1312 res = eval_client_expr_to_string(script);
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1313 if (resWindow != None)
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1314 {
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1315 garray_T reply;
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1316
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1317 /* Initialize the result property. */
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1318 ga_init2(&reply, 1, 100);
7009
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1319 (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
1320 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
1321 0, 0, p_enc, 0, serial, 0);
3668
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1322 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
1323
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1324 /* Evaluate the expression and return the result. */
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1325 if (res != NULL)
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1326 ga_concat(&reply, res);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1327 else
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 ga_concat(&reply, (char_u *)_(e_invexprmsg));
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1330 ga_append(&reply, 0);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1331 ga_concat(&reply, (char_u *)"-c 1");
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1332 }
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1333 ga_append(&reply, NUL);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1334 (void)AppendPropCarefully(dpy, resWindow, commProperty,
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1335 reply.ga_data, reply.ga_len);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1336 ga_clear(&reply);
5e7b500dbb7e updated for version 7.3.594
Bram Moolenaar <bram@vim.org>
parents: 2109
diff changeset
1337 }
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1338 vim_free(res);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1339 }
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1340 vim_free(tofree);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
1341 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 else if (*p == 'r' && p[1] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1345 int serial, gotSerial;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1346 char_u *res;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1347 PendingCommand *pcPtr;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1348 char_u *enc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 * This is a reply to some command that we sent out. Iterate
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 * over all of its options. Stop when we reach the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 * property or something that doesn't look like an option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 gotSerial = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 res = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 code = 0;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1359 enc = NULL;
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1360 while ((long_u)(p - propInfo) < numItems && *p == '-')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 switch (p[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 case 'r':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 res = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 break;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1368 case 'E':
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1369 if (p[2] == ' ')
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1370 enc = p + 3;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1371 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 case 's':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 if (sscanf((char *)p + 2, " %d", &serial) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 gotSerial = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 case 'c':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 if (sscanf((char *)p + 2, " %d", &code) != 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 code = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 if (!gotSerial)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 * Give the result information to anyone who's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 * waiting for it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 for (pcPtr = pendingCommands; pcPtr != NULL; pcPtr = pcPtr->nextPtr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 if (serial != pcPtr->serial || pcPtr->result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 pcPtr->code = code;
7009
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1399 res = serverConvert(enc, res, &tofree);
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1400 if (tofree == NULL)
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1401 res = vim_strsave(res);
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 3670
diff changeset
1402 pcPtr->result = res;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 else if (*p == 'n' && p[1] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 Window win = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 unsigned int u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 int gotWindow;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412 struct ServerReply *r;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1413 char_u *enc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 /*
10942
e05695e59f6d patch 8.0.0360: sometimes VimL is used instead of "Vim script"
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
1416 * 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
1417 * script. Execute any autocommand and save it for later retrieval
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 gotWindow = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 str = (char_u *)"";
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1422 enc = NULL;
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1740
diff changeset
1423 while ((long_u)(p - propInfo) < numItems && *p == '-')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 switch (p[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 case 'n':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 if (p[2] == ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 str = p + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 break;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1431 case 'E':
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1432 if (p[2] == ' ')
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1433 enc = p + 3;
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1434 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 case 'w':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 if (sscanf((char *)p + 2, " %x", &u) == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 win = u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 gotWindow = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 if (!gotWindow)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 continue;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1450 str = serverConvert(enc, str, &tofree);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 if ((r = ServerReplyFind(win, SROP_Add)) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 ga_concat(&(r->strings), str);
21
db5102f7e29f updated for version 7.0013
vimboss
parents: 7
diff changeset
1454 ga_append(&(r->strings), NUL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 }
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1456 {
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1457 char_u winstr[30];
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1458
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1459 sprintf((char *)winstr, "0x%x", (unsigned int)win);
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1460 apply_autocmds(EVENT_REMOTEREPLY, winstr, str, TRUE, curbuf);
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1197
diff changeset
1461 }
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 28
diff changeset
1462 vim_free(tofree);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 * Didn't recognize this thing. Just skip through the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 * null character and try again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469 * Even if we get an 'r'(eply) we will throw it away as we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 * never specify (and thus expect) one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472 while (*p != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 XFree(propInfo);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 * 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
1482 * that if the append fails this procedure can return an error code rather
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 * than having Xlib panic.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 * Return: 0 for OK, -1 for error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1487 AppendPropCarefully(
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1488 Display *dpy, /* Display on which to operate. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1489 Window window, /* Window whose property is to be modified. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1490 Atom property, /* Name of property. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1491 char_u *value, /* Characters to append to property. */
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1492 int length) /* How much to append */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 XErrorHandler old_handler;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 XChangeProperty(dpy, window, property, XA_STRING, 8,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 PropModeAppend, value, length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 (void) XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 return got_x_error ? -1 : 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 * Another X Error handler, just used to check for errors.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1510 x_error_check(Display *dpy UNUSED, XErrorEvent *error_event UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 got_x_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 * Check if "str" looks like it had a serial number appended.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 * Actually just checks if the name ends in a digit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 static int
7823
bcef391c101c commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1521 IsSerialName(char_u *str)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 int len = STRLEN(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 return (len > 1 && vim_isdigit(str[len - 1]));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 #endif /* FEAT_CLIENTSERVER */