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. */
28 #include "blockinput.h"
32 #define myalloc(cb) GlobalAllocPtr (GPTR, cb)
33 #define myfree(lp) GlobalFreePtr (lp)
35 CRITICAL_SECTION critsect
;
36 extern HANDLE keyboard_handle
;
37 HANDLE input_available
= NULL
;
38 HANDLE interrupt_handle
= NULL
;
43 InitializeCriticalSection (&critsect
);
45 /* For safety, input_available should only be reset by get_next_msg
46 when the input queue is empty, so make it a manual reset event. */
47 keyboard_handle
= input_available
= CreateEvent (NULL
, TRUE
, FALSE
, NULL
);
49 /* interrupt_handle is signalled when quit (C-g) is detected, so that
50 blocking system calls can be interrupted. We make it a manual
51 reset event, so that if we should ever have multiple threads
52 performing system calls, they will all be interrupted (I'm guessing
53 that would the right response). Note that we use PulseEvent to
54 signal this event, so that it never remains signalled. */
55 interrupt_handle
= CreateEvent (NULL
, TRUE
, FALSE
, NULL
);
61 DeleteCriticalSection (&critsect
);
65 CloseHandle (input_available
);
66 input_available
= NULL
;
70 CloseHandle (interrupt_handle
);
71 interrupt_handle
= NULL
;
78 /* Make sure this event never remains signalled; if the main thread
79 isn't in a blocking call, then this should do nothing. */
80 PulseEvent (interrupt_handle
);
84 select_palette (FRAME_PTR f
, HDC hdc
)
86 if (!NILP (Vw32_enable_palette
))
87 f
->output_data
.w32
->old_palette
=
88 SelectPalette (hdc
, one_w32_display_info
.palette
, FALSE
);
90 f
->output_data
.w32
->old_palette
= NULL
;
92 if (RealizePalette (hdc
))
94 Lisp_Object frame
, framelist
;
95 FOR_EACH_FRAME (framelist
, frame
)
97 SET_FRAME_GARBAGED (XFRAME (frame
));
103 deselect_palette (FRAME_PTR f
, HDC hdc
)
105 if (f
->output_data
.w32
->old_palette
)
106 SelectPalette (hdc
, f
->output_data
.w32
->old_palette
, FALSE
);
109 /* Get a DC for frame and select palette for drawing; force an update of
110 all frames if palette's mapping changes. */
112 get_frame_dc (FRAME_PTR f
)
118 hdc
= GetDC (f
->output_data
.w32
->window_desc
);
119 select_palette (f
, hdc
);
125 release_frame_dc (FRAME_PTR f
, HDC hdc
)
129 deselect_palette (f
, hdc
);
130 ret
= ReleaseDC (f
->output_data
.w32
->window_desc
, hdc
);
137 typedef struct int_msg
140 struct int_msg
*lpNext
;
143 int_msg
*lpHead
= NULL
;
144 int_msg
*lpTail
= NULL
;
148 get_next_msg (lpmsg
, bWait
)
156 /* The while loop takes care of multiple sets */
158 while (!nQueue
&& bWait
)
161 WaitForSingleObject (input_available
, INFINITE
);
167 bcopy (&(lpHead
->w32msg
), lpmsg
, sizeof (W32Msg
));
170 int_msg
* lpCur
= lpHead
;
172 lpHead
= lpHead
->lpNext
;
183 ResetEvent (input_available
);
194 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
199 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
200 lpNew
->lpNext
= NULL
;
206 lpTail
->lpNext
= lpNew
;
214 SetEvent (input_available
);
222 prepend_msg (W32Msg
*lpmsg
)
224 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
229 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
234 lpNew
->lpNext
= lpHead
;
242 /* Process all messages in the current thread's queue. */
244 drain_message_queue ()
247 while (PeekMessage (&msg
, NULL
, 0, 0, PM_REMOVE
))
249 TranslateMessage (&msg
);
250 DispatchMessage (&msg
);
256 * XParseGeometry parses strings of the form
257 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
258 * width, height, xoffset, and yoffset are unsigned integers.
259 * Example: "=80x24+300-49"
260 * The equal sign is optional.
261 * It returns a bitmask that indicates which of the four values
262 * were actually found in the string. For each value found,
263 * the corresponding argument is updated; for each value
264 * not found, the corresponding argument is left unchanged.
268 read_integer (string
, NextString
)
269 register char *string
;
272 register int Result
= 0;
277 else if (*string
== '-')
282 for (; (*string
>= '0') && (*string
<= '9'); string
++)
284 Result
= (Result
* 10) + (*string
- '0');
286 *NextString
= string
;
294 XParseGeometry (string
, x
, y
, width
, height
)
297 unsigned int *width
, *height
; /* RETURN */
300 register char *strind
;
301 unsigned int tempWidth
, tempHeight
;
305 if ((string
== NULL
) || (*string
== '\0')) return (mask
);
307 string
++; /* ignore possible '=' at beg of geometry spec */
309 strind
= (char *)string
;
310 if (*strind
!= '+' && *strind
!= '-' && *strind
!= 'x')
312 tempWidth
= read_integer (strind
, &nextCharacter
);
313 if (strind
== nextCharacter
)
315 strind
= nextCharacter
;
319 if (*strind
== 'x' || *strind
== 'X')
322 tempHeight
= read_integer (strind
, &nextCharacter
);
323 if (strind
== nextCharacter
)
325 strind
= nextCharacter
;
329 if ((*strind
== '+') || (*strind
== '-'))
334 tempX
= -read_integer (strind
, &nextCharacter
);
335 if (strind
== nextCharacter
)
337 strind
= nextCharacter
;
344 tempX
= read_integer (strind
, &nextCharacter
);
345 if (strind
== nextCharacter
)
347 strind
= nextCharacter
;
350 if ((*strind
== '+') || (*strind
== '-'))
355 tempY
= -read_integer (strind
, &nextCharacter
);
356 if (strind
== nextCharacter
)
358 strind
= nextCharacter
;
365 tempY
= read_integer (strind
, &nextCharacter
);
366 if (strind
== nextCharacter
)
368 strind
= nextCharacter
;
374 /* If strind isn't at the end of the string the it's an invalid
375 geometry specification. */
377 if (*strind
!= '\0') return (0);
383 if (mask
& WidthValue
)
385 if (mask
& HeightValue
)
386 *height
= tempHeight
;
390 /* x_sync is a no-op on W32. */