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