16884
|
1 /* Functions taken directly from X sources for use with the Microsoft W32 API.
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2 Copyright (C) 1989, 1992, 1993, 1994, 1995, 1999 Free Software Foundation.
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
3
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
4 This file is part of GNU Emacs.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
5
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
6 GNU Emacs is free software; you can redistribute it and/or modify
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
7 it under the terms of the GNU General Public License as published by
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
8 the Free Software Foundation; either version 2, or (at your option)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
9 any later version.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
10
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
11 GNU Emacs is distributed in the hope that it will be useful,
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
14 GNU General Public License for more details.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
15
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
16 You should have received a copy of the GNU General Public License
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
17 along with GNU Emacs; see the file COPYING. If not, write to
|
14186
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
19 Boston, MA 02111-1307, USA. */
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
20
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
21 #include <config.h>
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
22 #include <signal.h>
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
23 #include <stdio.h>
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
24 #include "lisp.h"
|
31117
|
25 #include "keyboard.h"
|
15153
|
26 #include "frame.h"
|
23509
|
27 #include "charset.h"
|
|
28 #include "fontset.h"
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
29 #include "blockinput.h"
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
30 #include "w32term.h"
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
31 #include "windowsx.h"
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
32
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
33 #define myalloc(cb) GlobalAllocPtr (GPTR, cb)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
34 #define myfree(lp) GlobalFreePtr (lp)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
35
|
14352
|
36 CRITICAL_SECTION critsect;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
37 extern HANDLE keyboard_handle;
|
15153
|
38 HANDLE input_available = NULL;
|
22077
|
39 HANDLE interrupt_handle = NULL;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
40
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
41 void
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
42 init_crit ()
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
43 {
|
14352
|
44 InitializeCriticalSection (&critsect);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
45
|
15153
|
46 /* For safety, input_available should only be reset by get_next_msg
|
|
47 when the input queue is empty, so make it a manual reset event. */
|
|
48 keyboard_handle = input_available = CreateEvent (NULL, TRUE, FALSE, NULL);
|
22077
|
49
|
|
50 /* interrupt_handle is signalled when quit (C-g) is detected, so that
|
|
51 blocking system calls can be interrupted. We make it a manual
|
|
52 reset event, so that if we should ever have multiple threads
|
|
53 performing system calls, they will all be interrupted (I'm guessing
|
|
54 that would the right response). Note that we use PulseEvent to
|
|
55 signal this event, so that it never remains signalled. */
|
|
56 interrupt_handle = CreateEvent (NULL, TRUE, FALSE, NULL);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
57 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
58
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
59 void
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
60 delete_crit ()
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
61 {
|
14352
|
62 DeleteCriticalSection (&critsect);
|
15153
|
63
|
|
64 if (input_available)
|
|
65 {
|
|
66 CloseHandle (input_available);
|
|
67 input_available = NULL;
|
|
68 }
|
22077
|
69 if (interrupt_handle)
|
|
70 {
|
|
71 CloseHandle (interrupt_handle);
|
|
72 interrupt_handle = NULL;
|
|
73 }
|
|
74 }
|
|
75
|
|
76 void
|
|
77 signal_quit ()
|
|
78 {
|
|
79 /* Make sure this event never remains signalled; if the main thread
|
|
80 isn't in a blocking call, then this should do nothing. */
|
|
81 PulseEvent (interrupt_handle);
|
15153
|
82 }
|
|
83
|
|
84 void
|
|
85 select_palette (FRAME_PTR f, HDC hdc)
|
|
86 {
|
16588
|
87 if (!NILP (Vw32_enable_palette))
|
|
88 f->output_data.w32->old_palette =
|
|
89 SelectPalette (hdc, one_w32_display_info.palette, FALSE);
|
15153
|
90 else
|
16588
|
91 f->output_data.w32->old_palette = NULL;
|
15153
|
92
|
|
93 if (RealizePalette (hdc))
|
|
94 {
|
|
95 Lisp_Object frame, framelist;
|
|
96 FOR_EACH_FRAME (framelist, frame)
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
97 {
|
15153
|
98 SET_FRAME_GARBAGED (XFRAME (frame));
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
99 }
|
15153
|
100 }
|
|
101 }
|
|
102
|
|
103 void
|
|
104 deselect_palette (FRAME_PTR f, HDC hdc)
|
|
105 {
|
16588
|
106 if (f->output_data.w32->old_palette)
|
|
107 SelectPalette (hdc, f->output_data.w32->old_palette, FALSE);
|
15153
|
108 }
|
|
109
|
|
110 /* Get a DC for frame and select palette for drawing; force an update of
|
|
111 all frames if palette's mapping changes. */
|
|
112 HDC
|
|
113 get_frame_dc (FRAME_PTR f)
|
|
114 {
|
|
115 HDC hdc;
|
|
116
|
|
117 enter_crit ();
|
|
118
|
16588
|
119 hdc = GetDC (f->output_data.w32->window_desc);
|
15153
|
120 select_palette (f, hdc);
|
|
121
|
|
122 return hdc;
|
|
123 }
|
|
124
|
|
125 int
|
|
126 release_frame_dc (FRAME_PTR f, HDC hdc)
|
|
127 {
|
|
128 int ret;
|
|
129
|
|
130 deselect_palette (f, hdc);
|
16588
|
131 ret = ReleaseDC (f->output_data.w32->window_desc, hdc);
|
15153
|
132
|
|
133 leave_crit ();
|
|
134
|
|
135 return ret;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
136 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
137
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
138 typedef struct int_msg
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
139 {
|
16588
|
140 W32Msg w32msg;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
141 struct int_msg *lpNext;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
142 } int_msg;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
143
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
144 int_msg *lpHead = NULL;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
145 int_msg *lpTail = NULL;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
146 int nQueue = 0;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
147
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
148 BOOL
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
149 get_next_msg (lpmsg, bWait)
|
16588
|
150 W32Msg * lpmsg;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
151 BOOL bWait;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
152 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
153 BOOL bRet = FALSE;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
154
|
14352
|
155 enter_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
156
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
157 /* The while loop takes care of multiple sets */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
158
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
159 while (!nQueue && bWait)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
160 {
|
14352
|
161 leave_crit ();
|
15153
|
162 WaitForSingleObject (input_available, INFINITE);
|
14352
|
163 enter_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
164 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
165
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
166 if (nQueue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
167 {
|
16588
|
168 bcopy (&(lpHead->w32msg), lpmsg, sizeof (W32Msg));
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
169
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
170 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
171 int_msg * lpCur = lpHead;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
172
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
173 lpHead = lpHead->lpNext;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
174
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
175 myfree (lpCur);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
176 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
177
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
178 nQueue--;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
179
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
180 bRet = TRUE;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
181 }
|
15153
|
182
|
|
183 if (nQueue == 0)
|
|
184 ResetEvent (input_available);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
185
|
14352
|
186 leave_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
187
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
188 return (bRet);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
189 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
190
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
191 BOOL
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
192 post_msg (lpmsg)
|
16588
|
193 W32Msg * lpmsg;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
194 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
195 int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
196
|
15153
|
197 if (!lpNew)
|
|
198 return (FALSE);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
199
|
16588
|
200 bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg));
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
201 lpNew->lpNext = NULL;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
202
|
14352
|
203 enter_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
204
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
205 if (nQueue++)
|
14352
|
206 {
|
|
207 lpTail->lpNext = lpNew;
|
|
208 }
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
209 else
|
14352
|
210 {
|
|
211 lpHead = lpNew;
|
|
212 }
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
213
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
214 lpTail = lpNew;
|
15153
|
215 SetEvent (input_available);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
216
|
14352
|
217 leave_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
218
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
219 return (TRUE);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
220 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
221
|
14460
|
222 BOOL
|
16588
|
223 prepend_msg (W32Msg *lpmsg)
|
14460
|
224 {
|
|
225 int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
|
|
226
|
|
227 if (!lpNew)
|
|
228 return (FALSE);
|
|
229
|
16588
|
230 bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg));
|
14460
|
231
|
|
232 enter_crit ();
|
|
233
|
|
234 nQueue++;
|
|
235 lpNew->lpNext = lpHead;
|
|
236 lpHead = lpNew;
|
|
237
|
|
238 leave_crit ();
|
|
239
|
|
240 return (TRUE);
|
|
241 }
|
|
242
|
24917
|
243 /* Process all messages in the current thread's queue. */
|
|
244 void
|
|
245 drain_message_queue ()
|
|
246 {
|
|
247 MSG msg;
|
|
248 while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
|
|
249 {
|
|
250 TranslateMessage (&msg);
|
|
251 DispatchMessage (&msg);
|
|
252 }
|
|
253 }
|
|
254
|
|
255
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
256 /*
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
257 * XParseGeometry parses strings of the form
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
258 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
259 * width, height, xoffset, and yoffset are unsigned integers.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
260 * Example: "=80x24+300-49"
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
261 * The equal sign is optional.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
262 * It returns a bitmask that indicates which of the four values
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
263 * were actually found in the string. For each value found,
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
264 * the corresponding argument is updated; for each value
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
265 * not found, the corresponding argument is left unchanged.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
266 */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
267
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
268 static int
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
269 read_integer (string, NextString)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
270 register char *string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
271 char **NextString;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
272 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
273 register int Result = 0;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
274 int Sign = 1;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
275
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
276 if (*string == '+')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
277 string++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
278 else if (*string == '-')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
279 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
280 string++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
281 Sign = -1;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
282 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
283 for (; (*string >= '0') && (*string <= '9'); string++)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
284 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
285 Result = (Result * 10) + (*string - '0');
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
286 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
287 *NextString = string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
288 if (Sign >= 0)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
289 return (Result);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
290 else
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
291 return (-Result);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
292 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
293
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
294 int
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
295 XParseGeometry (string, x, y, width, height)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
296 char *string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
297 int *x, *y;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
298 unsigned int *width, *height; /* RETURN */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
299 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
300 int mask = NoValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
301 register char *strind;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
302 unsigned int tempWidth, tempHeight;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
303 int tempX, tempY;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
304 char *nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
305
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
306 if ((string == NULL) || (*string == '\0')) return (mask);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
307 if (*string == '=')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
308 string++; /* ignore possible '=' at beg of geometry spec */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
309
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
310 strind = (char *)string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
311 if (*strind != '+' && *strind != '-' && *strind != 'x')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
312 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
313 tempWidth = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
314 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
315 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
316 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
317 mask |= WidthValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
318 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
319
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
320 if (*strind == 'x' || *strind == 'X')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
321 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
322 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
323 tempHeight = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
324 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
325 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
326 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
327 mask |= HeightValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
328 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
329
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
330 if ((*strind == '+') || (*strind == '-'))
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
331 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
332 if (*strind == '-')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
333 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
334 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
335 tempX = -read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
336 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
337 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
338 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
339 mask |= XNegative;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
340
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
341 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
342 else
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
343 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
344 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
345 tempX = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
346 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
347 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
348 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
349 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
350 mask |= XValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
351 if ((*strind == '+') || (*strind == '-'))
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
352 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
353 if (*strind == '-')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
354 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
355 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
356 tempY = -read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
357 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
358 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
359 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
360 mask |= YNegative;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
361
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
362 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
363 else
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
364 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
365 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
366 tempY = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
367 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
368 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
369 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
370 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
371 mask |= YValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
372 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
373 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
374
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
375 /* If strind isn't at the end of the string the it's an invalid
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
376 geometry specification. */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
377
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
378 if (*strind != '\0') return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
379
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
380 if (mask & XValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
381 *x = tempX;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
382 if (mask & YValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
383 *y = tempY;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
384 if (mask & WidthValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
385 *width = tempWidth;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
386 if (mask & HeightValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
387 *height = tempHeight;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
388 return (mask);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
389 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
390
|
16588
|
391 /* x_sync is a no-op on W32. */
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
392 void
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
393 x_sync (f)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
394 void *f;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
395 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
396 }
|