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 {
|
34783
|
87 struct w32_display_info *display_info = FRAME_W32_DISPLAY_INFO (f);
|
|
88
|
|
89 if (!display_info->has_palette)
|
|
90 return;
|
|
91
|
|
92 if (display_info->palette == 0)
|
35943
|
93 return;
|
34783
|
94
|
16588
|
95 if (!NILP (Vw32_enable_palette))
|
|
96 f->output_data.w32->old_palette =
|
34783
|
97 SelectPalette (hdc, display_info->palette, FALSE);
|
15153
|
98 else
|
16588
|
99 f->output_data.w32->old_palette = NULL;
|
15153
|
100
|
|
101 if (RealizePalette (hdc))
|
|
102 {
|
|
103 Lisp_Object frame, framelist;
|
|
104 FOR_EACH_FRAME (framelist, frame)
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
105 {
|
15153
|
106 SET_FRAME_GARBAGED (XFRAME (frame));
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
107 }
|
15153
|
108 }
|
|
109 }
|
|
110
|
|
111 void
|
|
112 deselect_palette (FRAME_PTR f, HDC hdc)
|
|
113 {
|
16588
|
114 if (f->output_data.w32->old_palette)
|
|
115 SelectPalette (hdc, f->output_data.w32->old_palette, FALSE);
|
15153
|
116 }
|
|
117
|
|
118 /* Get a DC for frame and select palette for drawing; force an update of
|
|
119 all frames if palette's mapping changes. */
|
|
120 HDC
|
|
121 get_frame_dc (FRAME_PTR f)
|
|
122 {
|
|
123 HDC hdc;
|
|
124
|
34999
|
125 if (f->output_method != output_w32)
|
|
126 abort ();
|
|
127
|
15153
|
128 enter_crit ();
|
|
129
|
16588
|
130 hdc = GetDC (f->output_data.w32->window_desc);
|
34094
|
131
|
|
132 /* If this gets called during startup before the frame is valid,
|
|
133 there is a chance of corrupting random data or crashing. */
|
|
134 if (hdc)
|
|
135 select_palette (f, hdc);
|
15153
|
136
|
|
137 return hdc;
|
|
138 }
|
|
139
|
|
140 int
|
|
141 release_frame_dc (FRAME_PTR f, HDC hdc)
|
|
142 {
|
|
143 int ret;
|
|
144
|
|
145 deselect_palette (f, hdc);
|
16588
|
146 ret = ReleaseDC (f->output_data.w32->window_desc, hdc);
|
15153
|
147
|
|
148 leave_crit ();
|
|
149
|
|
150 return ret;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
151 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
152
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
153 typedef struct int_msg
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
154 {
|
16588
|
155 W32Msg w32msg;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
156 struct int_msg *lpNext;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
157 } int_msg;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
158
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
159 int_msg *lpHead = NULL;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
160 int_msg *lpTail = NULL;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
161 int nQueue = 0;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
162
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
163 BOOL
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
164 get_next_msg (lpmsg, bWait)
|
16588
|
165 W32Msg * lpmsg;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
166 BOOL bWait;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
167 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
168 BOOL bRet = FALSE;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
169
|
14352
|
170 enter_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
171
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
172 /* The while loop takes care of multiple sets */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
173
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
174 while (!nQueue && bWait)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
175 {
|
14352
|
176 leave_crit ();
|
15153
|
177 WaitForSingleObject (input_available, INFINITE);
|
14352
|
178 enter_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
179 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
180
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
181 if (nQueue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
182 {
|
16588
|
183 bcopy (&(lpHead->w32msg), lpmsg, sizeof (W32Msg));
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
184
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
185 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
186 int_msg * lpCur = lpHead;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
187
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
188 lpHead = lpHead->lpNext;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
189
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
190 myfree (lpCur);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
191 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
192
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
193 nQueue--;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
194
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
195 bRet = TRUE;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
196 }
|
15153
|
197
|
|
198 if (nQueue == 0)
|
|
199 ResetEvent (input_available);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
200
|
14352
|
201 leave_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
202
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
203 return (bRet);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
204 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
205
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
206 BOOL
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
207 post_msg (lpmsg)
|
16588
|
208 W32Msg * lpmsg;
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
209 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
210 int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
211
|
15153
|
212 if (!lpNew)
|
|
213 return (FALSE);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
214
|
16588
|
215 bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg));
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
216 lpNew->lpNext = NULL;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
217
|
14352
|
218 enter_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
219
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
220 if (nQueue++)
|
14352
|
221 {
|
|
222 lpTail->lpNext = lpNew;
|
|
223 }
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
224 else
|
14352
|
225 {
|
|
226 lpHead = lpNew;
|
|
227 }
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
228
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
229 lpTail = lpNew;
|
15153
|
230 SetEvent (input_available);
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
231
|
14352
|
232 leave_crit ();
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
233
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
234 return (TRUE);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
235 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
236
|
14460
|
237 BOOL
|
16588
|
238 prepend_msg (W32Msg *lpmsg)
|
14460
|
239 {
|
|
240 int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
|
|
241
|
|
242 if (!lpNew)
|
|
243 return (FALSE);
|
|
244
|
16588
|
245 bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg));
|
14460
|
246
|
|
247 enter_crit ();
|
|
248
|
|
249 nQueue++;
|
|
250 lpNew->lpNext = lpHead;
|
|
251 lpHead = lpNew;
|
|
252
|
|
253 leave_crit ();
|
|
254
|
|
255 return (TRUE);
|
|
256 }
|
|
257
|
24917
|
258 /* Process all messages in the current thread's queue. */
|
|
259 void
|
|
260 drain_message_queue ()
|
|
261 {
|
|
262 MSG msg;
|
|
263 while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
|
|
264 {
|
|
265 TranslateMessage (&msg);
|
|
266 DispatchMessage (&msg);
|
|
267 }
|
|
268 }
|
|
269
|
|
270
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
271 /*
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
272 * XParseGeometry parses strings of the form
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
273 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
274 * width, height, xoffset, and yoffset are unsigned integers.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
275 * Example: "=80x24+300-49"
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
276 * The equal sign is optional.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
277 * It returns a bitmask that indicates which of the four values
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
278 * were actually found in the string. For each value found,
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
279 * the corresponding argument is updated; for each value
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
280 * not found, the corresponding argument is left unchanged.
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
281 */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
282
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
283 static int
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
284 read_integer (string, NextString)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
285 register char *string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
286 char **NextString;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
287 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
288 register int Result = 0;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
289 int Sign = 1;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
290
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
291 if (*string == '+')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
292 string++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
293 else if (*string == '-')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
294 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
295 string++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
296 Sign = -1;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
297 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
298 for (; (*string >= '0') && (*string <= '9'); string++)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
299 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
300 Result = (Result * 10) + (*string - '0');
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
301 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
302 *NextString = string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
303 if (Sign >= 0)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
304 return (Result);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
305 else
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
306 return (-Result);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
307 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
308
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
309 int
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
310 XParseGeometry (string, x, y, width, height)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
311 char *string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
312 int *x, *y;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
313 unsigned int *width, *height; /* RETURN */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
314 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
315 int mask = NoValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
316 register char *strind;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
317 unsigned int tempWidth, tempHeight;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
318 int tempX, tempY;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
319 char *nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
320
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
321 if ((string == NULL) || (*string == '\0')) return (mask);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
322 if (*string == '=')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
323 string++; /* ignore possible '=' at beg of geometry spec */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
324
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
325 strind = (char *)string;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
326 if (*strind != '+' && *strind != '-' && *strind != 'x')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
327 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
328 tempWidth = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
329 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
330 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
331 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
332 mask |= WidthValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
333 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
334
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
335 if (*strind == 'x' || *strind == 'X')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
336 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
337 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
338 tempHeight = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
339 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
340 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
341 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
342 mask |= HeightValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
343 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
344
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
345 if ((*strind == '+') || (*strind == '-'))
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
346 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
347 if (*strind == '-')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
348 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
349 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
350 tempX = -read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
351 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
352 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
353 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
354 mask |= XNegative;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
355
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
356 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
357 else
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
358 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
359 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
360 tempX = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
361 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
362 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
363 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
364 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
365 mask |= XValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
366 if ((*strind == '+') || (*strind == '-'))
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
367 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
368 if (*strind == '-')
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
369 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
370 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
371 tempY = -read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
372 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
373 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
374 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
375 mask |= YNegative;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
376
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
377 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
378 else
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
379 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
380 strind++;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
381 tempY = read_integer (strind, &nextCharacter);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
382 if (strind == nextCharacter)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
383 return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
384 strind = nextCharacter;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
385 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
386 mask |= YValue;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
387 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
388 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
389
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
390 /* If strind isn't at the end of the string the it's an invalid
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
391 geometry specification. */
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
392
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
393 if (*strind != '\0') return (0);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
394
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
395 if (mask & XValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
396 *x = tempX;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
397 if (mask & YValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
398 *y = tempY;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
399 if (mask & WidthValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
400 *width = tempWidth;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
401 if (mask & HeightValue)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
402 *height = tempHeight;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
403 return (mask);
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
404 }
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
405
|
16588
|
406 /* x_sync is a no-op on W32. */
|
13434
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
407 void
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
408 x_sync (f)
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
409 void *f;
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
410 {
|
Geoff Voelker <voelker@cs.washington.edu>
parents:
diff
changeset
|
411 }
|