1 /* Functions taken directly from X sources for use with the Microsoft W32 API.
2 Copyright (C) 1989, 1992, 1993, 1994, 1995, 1999 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. */
29 #include "blockinput.h"
33 #define myalloc(cb) GlobalAllocPtr (GPTR, cb)
34 #define myfree(lp) GlobalFreePtr (lp)
36 CRITICAL_SECTION critsect
;
37 extern HANDLE keyboard_handle
;
38 HANDLE input_available
= NULL
;
39 HANDLE interrupt_handle
= NULL
;
44 InitializeCriticalSection (&critsect
);
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
);
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
);
62 DeleteCriticalSection (&critsect
);
66 CloseHandle (input_available
);
67 input_available
= NULL
;
71 CloseHandle (interrupt_handle
);
72 interrupt_handle
= NULL
;
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
);
85 select_palette (FRAME_PTR f
, HDC hdc
)
87 if (!NILP (Vw32_enable_palette
))
88 f
->output_data
.w32
->old_palette
=
89 SelectPalette (hdc
, one_w32_display_info
.palette
, FALSE
);
91 f
->output_data
.w32
->old_palette
= NULL
;
93 if (RealizePalette (hdc
))
95 Lisp_Object frame
, framelist
;
96 FOR_EACH_FRAME (framelist
, frame
)
98 SET_FRAME_GARBAGED (XFRAME (frame
));
104 deselect_palette (FRAME_PTR f
, HDC hdc
)
106 if (f
->output_data
.w32
->old_palette
)
107 SelectPalette (hdc
, f
->output_data
.w32
->old_palette
, FALSE
);
110 /* Get a DC for frame and select palette for drawing; force an update of
111 all frames if palette's mapping changes. */
113 get_frame_dc (FRAME_PTR f
)
119 hdc
= GetDC (f
->output_data
.w32
->window_desc
);
121 /* If this gets called during startup before the frame is valid,
122 there is a chance of corrupting random data or crashing. */
124 select_palette (f
, hdc
);
130 release_frame_dc (FRAME_PTR f
, HDC hdc
)
134 deselect_palette (f
, hdc
);
135 ret
= ReleaseDC (f
->output_data
.w32
->window_desc
, hdc
);
142 typedef struct int_msg
145 struct int_msg
*lpNext
;
148 int_msg
*lpHead
= NULL
;
149 int_msg
*lpTail
= NULL
;
153 get_next_msg (lpmsg
, bWait
)
161 /* The while loop takes care of multiple sets */
163 while (!nQueue
&& bWait
)
166 WaitForSingleObject (input_available
, INFINITE
);
172 bcopy (&(lpHead
->w32msg
), lpmsg
, sizeof (W32Msg
));
175 int_msg
* lpCur
= lpHead
;
177 lpHead
= lpHead
->lpNext
;
188 ResetEvent (input_available
);
199 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
204 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
205 lpNew
->lpNext
= NULL
;
211 lpTail
->lpNext
= lpNew
;
219 SetEvent (input_available
);
227 prepend_msg (W32Msg
*lpmsg
)
229 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
234 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
239 lpNew
->lpNext
= lpHead
;
247 /* Process all messages in the current thread's queue. */
249 drain_message_queue ()
252 while (PeekMessage (&msg
, NULL
, 0, 0, PM_REMOVE
))
254 TranslateMessage (&msg
);
255 DispatchMessage (&msg
);
261 * XParseGeometry parses strings of the form
262 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
263 * width, height, xoffset, and yoffset are unsigned integers.
264 * Example: "=80x24+300-49"
265 * The equal sign is optional.
266 * It returns a bitmask that indicates which of the four values
267 * were actually found in the string. For each value found,
268 * the corresponding argument is updated; for each value
269 * not found, the corresponding argument is left unchanged.
273 read_integer (string
, NextString
)
274 register char *string
;
277 register int Result
= 0;
282 else if (*string
== '-')
287 for (; (*string
>= '0') && (*string
<= '9'); string
++)
289 Result
= (Result
* 10) + (*string
- '0');
291 *NextString
= string
;
299 XParseGeometry (string
, x
, y
, width
, height
)
302 unsigned int *width
, *height
; /* RETURN */
305 register char *strind
;
306 unsigned int tempWidth
, tempHeight
;
310 if ((string
== NULL
) || (*string
== '\0')) return (mask
);
312 string
++; /* ignore possible '=' at beg of geometry spec */
314 strind
= (char *)string
;
315 if (*strind
!= '+' && *strind
!= '-' && *strind
!= 'x')
317 tempWidth
= read_integer (strind
, &nextCharacter
);
318 if (strind
== nextCharacter
)
320 strind
= nextCharacter
;
324 if (*strind
== 'x' || *strind
== 'X')
327 tempHeight
= read_integer (strind
, &nextCharacter
);
328 if (strind
== nextCharacter
)
330 strind
= nextCharacter
;
334 if ((*strind
== '+') || (*strind
== '-'))
339 tempX
= -read_integer (strind
, &nextCharacter
);
340 if (strind
== nextCharacter
)
342 strind
= nextCharacter
;
349 tempX
= read_integer (strind
, &nextCharacter
);
350 if (strind
== nextCharacter
)
352 strind
= nextCharacter
;
355 if ((*strind
== '+') || (*strind
== '-'))
360 tempY
= -read_integer (strind
, &nextCharacter
);
361 if (strind
== nextCharacter
)
363 strind
= nextCharacter
;
370 tempY
= read_integer (strind
, &nextCharacter
);
371 if (strind
== nextCharacter
)
373 strind
= nextCharacter
;
379 /* If strind isn't at the end of the string the it's an invalid
380 geometry specification. */
382 if (*strind
!= '\0') return (0);
388 if (mask
& WidthValue
)
390 if (mask
& HeightValue
)
391 *height
= tempHeight
;
395 /* x_sync is a no-op on W32. */