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 struct w32_display_info
*display_info
= FRAME_W32_DISPLAY_INFO (f
);
89 if (!display_info
->has_palette
)
92 if (display_info
->palette
== 0)
95 if (!NILP (Vw32_enable_palette
))
96 f
->output_data
.w32
->old_palette
=
97 SelectPalette (hdc
, display_info
->palette
, FALSE
);
99 f
->output_data
.w32
->old_palette
= NULL
;
101 if (RealizePalette (hdc
))
103 Lisp_Object frame
, framelist
;
104 FOR_EACH_FRAME (framelist
, frame
)
106 SET_FRAME_GARBAGED (XFRAME (frame
));
112 deselect_palette (FRAME_PTR f
, HDC hdc
)
114 if (f
->output_data
.w32
->old_palette
)
115 SelectPalette (hdc
, f
->output_data
.w32
->old_palette
, FALSE
);
118 /* Get a DC for frame and select palette for drawing; force an update of
119 all frames if palette's mapping changes. */
121 get_frame_dc (FRAME_PTR f
)
125 if (f
->output_method
!= output_w32
)
130 hdc
= GetDC (f
->output_data
.w32
->window_desc
);
132 /* If this gets called during startup before the frame is valid,
133 there is a chance of corrupting random data or crashing. */
135 select_palette (f
, hdc
);
141 release_frame_dc (FRAME_PTR f
, HDC hdc
)
145 deselect_palette (f
, hdc
);
146 ret
= ReleaseDC (f
->output_data
.w32
->window_desc
, hdc
);
153 typedef struct int_msg
156 struct int_msg
*lpNext
;
159 int_msg
*lpHead
= NULL
;
160 int_msg
*lpTail
= NULL
;
164 get_next_msg (lpmsg
, bWait
)
172 /* The while loop takes care of multiple sets */
174 while (!nQueue
&& bWait
)
177 WaitForSingleObject (input_available
, INFINITE
);
183 bcopy (&(lpHead
->w32msg
), lpmsg
, sizeof (W32Msg
));
186 int_msg
* lpCur
= lpHead
;
188 lpHead
= lpHead
->lpNext
;
199 ResetEvent (input_available
);
210 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
215 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
216 lpNew
->lpNext
= NULL
;
222 lpTail
->lpNext
= lpNew
;
230 SetEvent (input_available
);
238 prepend_msg (W32Msg
*lpmsg
)
240 int_msg
* lpNew
= (int_msg
*) myalloc (sizeof (int_msg
));
245 bcopy (lpmsg
, &(lpNew
->w32msg
), sizeof (W32Msg
));
250 lpNew
->lpNext
= lpHead
;
258 /* Process all messages in the current thread's queue. */
260 drain_message_queue ()
263 while (PeekMessage (&msg
, NULL
, 0, 0, PM_REMOVE
))
265 TranslateMessage (&msg
);
266 DispatchMessage (&msg
);
272 * XParseGeometry parses strings of the form
273 * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
274 * width, height, xoffset, and yoffset are unsigned integers.
275 * Example: "=80x24+300-49"
276 * The equal sign is optional.
277 * It returns a bitmask that indicates which of the four values
278 * were actually found in the string. For each value found,
279 * the corresponding argument is updated; for each value
280 * not found, the corresponding argument is left unchanged.
284 read_integer (string
, NextString
)
285 register char *string
;
288 register int Result
= 0;
293 else if (*string
== '-')
298 for (; (*string
>= '0') && (*string
<= '9'); string
++)
300 Result
= (Result
* 10) + (*string
- '0');
302 *NextString
= string
;
310 XParseGeometry (string
, x
, y
, width
, height
)
313 unsigned int *width
, *height
; /* RETURN */
316 register char *strind
;
317 unsigned int tempWidth
, tempHeight
;
321 if ((string
== NULL
) || (*string
== '\0')) return (mask
);
323 string
++; /* ignore possible '=' at beg of geometry spec */
325 strind
= (char *)string
;
326 if (*strind
!= '+' && *strind
!= '-' && *strind
!= 'x')
328 tempWidth
= read_integer (strind
, &nextCharacter
);
329 if (strind
== nextCharacter
)
331 strind
= nextCharacter
;
335 if (*strind
== 'x' || *strind
== 'X')
338 tempHeight
= read_integer (strind
, &nextCharacter
);
339 if (strind
== nextCharacter
)
341 strind
= nextCharacter
;
345 if ((*strind
== '+') || (*strind
== '-'))
350 tempX
= -read_integer (strind
, &nextCharacter
);
351 if (strind
== nextCharacter
)
353 strind
= nextCharacter
;
360 tempX
= read_integer (strind
, &nextCharacter
);
361 if (strind
== nextCharacter
)
363 strind
= nextCharacter
;
366 if ((*strind
== '+') || (*strind
== '-'))
371 tempY
= -read_integer (strind
, &nextCharacter
);
372 if (strind
== nextCharacter
)
374 strind
= nextCharacter
;
381 tempY
= read_integer (strind
, &nextCharacter
);
382 if (strind
== nextCharacter
)
384 strind
= nextCharacter
;
390 /* If strind isn't at the end of the string the it's an invalid
391 geometry specification. */
393 if (*strind
!= '\0') return (0);
399 if (mask
& WidthValue
)
401 if (mask
& HeightValue
)
402 *height
= tempHeight
;
406 /* x_sync is a no-op on W32. */