1 /* Functions taken directly from X sources for use with the Microsoft W32 API.
2 Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
26 #include "blockinput.h"
30 #define myalloc(cb) GlobalAllocPtr (GPTR, cb)
31 #define myfree(lp) GlobalFreePtr (lp)
33 CRITICAL_SECTION critsect
;
34 extern HANDLE keyboard_handle
;
35 HANDLE input_available
= NULL
;
36 HANDLE interrupt_handle
= NULL
;
41 InitializeCriticalSection (&critsect
);
43 /* For safety, input_available should only be reset by get_next_msg
44 when the input queue is empty, so make it a manual reset event. */
45 keyboard_handle
= input_available
= CreateEvent (NULL
, TRUE
, FALSE
, NULL
);
47 /* interrupt_handle is signalled when quit (C-g) is detected, so that
48 blocking system calls can be interrupted. We make it a manual
49 reset event, so that if we should ever have multiple threads
50 performing system calls, they will all be interrupted (I'm guessing
51 that would the right response). Note that we use PulseEvent to
52 signal this event, so that it never remains signalled. */
53 interrupt_handle
= CreateEvent (NULL
, TRUE
, FALSE
, NULL
);
59 DeleteCriticalSection (&critsect
);
63 CloseHandle (input_available
);
64 input_available
= NULL
;
68 CloseHandle (interrupt_handle
);
69 interrupt_handle
= NULL
;
76 /* Make sure this event never remains signalled; if the main thread
77 isn't in a blocking call, then this should do nothing. */
78 PulseEvent (interrupt_handle
);
82 select_palette (FRAME_PTR f
, HDC hdc
)
84 if (!NILP (Vw32_enable_palette
))
85 f
->output_data
.w32
->old_palette
=
86 SelectPalette (hdc
, one_w32_display_info
.palette
, FALSE
);
88 f
->output_data
.w32
->old_palette
= NULL
;
90 if (RealizePalette (hdc
))
92 Lisp_Object frame
, framelist
;
93 FOR_EACH_FRAME (framelist
, frame
)
95 SET_FRAME_GARBAGED (XFRAME (frame
));
101 deselect_palette (FRAME_PTR f
, HDC hdc
)
103 if (f
->output_data
.w32
->old_palette
)
104 SelectPalette (hdc
, f
->output_data
.w32
->old_palette
, FALSE
);
107 /* Get a DC for frame and select palette for drawing; force an update of
108 all frames if palette's mapping changes. */
110 get_frame_dc (FRAME_PTR f
)
116 hdc
= GetDC (f
->output_data
.w32
->window_desc
);
117 select_palette (f
, hdc
);
123 release_frame_dc (FRAME_PTR f
, HDC hdc
)
127 deselect_palette (f
, hdc
);
128 ret
= ReleaseDC (f
->output_data
.w32
->window_desc
, hdc
);
135 typedef struct int_msg
138 struct int_msg
*lpNext
;
141 int_msg
*lpHead
= NULL
;
142 int_msg
*lpTail
= NULL
;
146 get_next_msg (lpmsg
, bWait
)
154 /* The while loop takes care of multiple sets */
156 while (!nQueue
&& bWait
)
159 WaitForSingleObject (input_available
, INFINITE
);
165 bcopy (&(lpHead
->w32msg
), lpmsg
, sizeof (W32Msg
));
168 int_msg
* lpCur
= lpHead
;
170 lpHead
= lpHead
->lpNext
;
181 ResetEvent (input_available
);
192 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
197 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
198 lpNew
->lpNext
= NULL
;
204 lpTail
->lpNext
= lpNew
;
212 SetEvent (input_available
);
220 prepend_msg (W32Msg
*lpmsg
)
222 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
227 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
232 lpNew
->lpNext
= lpHead
;
241 * XParseGeometry parses strings of the form
242 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
243 * width, height, xoffset, and yoffset are unsigned integers.
244 * Example: "=80x24+300-49"
245 * The equal sign is optional.
246 * It returns a bitmask that indicates which of the four values
247 * were actually found in the string. For each value found,
248 * the corresponding argument is updated; for each value
249 * not found, the corresponding argument is left unchanged.
253 read_integer (string
, NextString
)
254 register char *string
;
257 register int Result
= 0;
262 else if (*string
== '-')
267 for (; (*string
>= '0') && (*string
<= '9'); string
++)
269 Result
= (Result
* 10) + (*string
- '0');
271 *NextString
= string
;
279 XParseGeometry (string
, x
, y
, width
, height
)
282 unsigned int *width
, *height
; /* RETURN */
285 register char *strind
;
286 unsigned int tempWidth
, tempHeight
;
290 if ((string
== NULL
) || (*string
== '\0')) return (mask
);
292 string
++; /* ignore possible '=' at beg of geometry spec */
294 strind
= (char *)string
;
295 if (*strind
!= '+' && *strind
!= '-' && *strind
!= 'x')
297 tempWidth
= read_integer (strind
, &nextCharacter
);
298 if (strind
== nextCharacter
)
300 strind
= nextCharacter
;
304 if (*strind
== 'x' || *strind
== 'X')
307 tempHeight
= read_integer (strind
, &nextCharacter
);
308 if (strind
== nextCharacter
)
310 strind
= nextCharacter
;
314 if ((*strind
== '+') || (*strind
== '-'))
319 tempX
= -read_integer (strind
, &nextCharacter
);
320 if (strind
== nextCharacter
)
322 strind
= nextCharacter
;
329 tempX
= read_integer (strind
, &nextCharacter
);
330 if (strind
== nextCharacter
)
332 strind
= nextCharacter
;
335 if ((*strind
== '+') || (*strind
== '-'))
340 tempY
= -read_integer (strind
, &nextCharacter
);
341 if (strind
== nextCharacter
)
343 strind
= nextCharacter
;
350 tempY
= read_integer (strind
, &nextCharacter
);
351 if (strind
== nextCharacter
)
353 strind
= nextCharacter
;
359 /* If strind isn't at the end of the string the it's an invalid
360 geometry specification. */
362 if (*strind
!= '\0') return (0);
368 if (mask
& WidthValue
)
370 if (mask
& HeightValue
)
371 *height
= tempHeight
;
375 /* x_sync is a no-op on W32. */