Mercurial > emacs
annotate src/w32xfns.c @ 37678:ebec0594dece
(compile-files): Redirect output of chmod to
/dev/null.
| author | Gerd Moellmann <gerd@gnu.org> |
|---|---|
| date | Fri, 11 May 2001 10:53:56 +0000 |
| parents | 7a9bc23b91e7 |
| children | 23a1cea22d13 |
| rev | line source |
|---|---|
|
16884
36babc489b0c
Change all uses of win95, winnt, and win32
Geoff Voelker <voelker@cs.washington.edu>
parents:
16588
diff
changeset
|
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>
parents:
24917
diff
changeset
|
2 Copyright (C) 1989, 1992, 1993, 1994, 1995, 1999 Free Software Foundation. |
| 13434 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 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) | |
| 9 any later version. | |
| 10 | |
| 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. | |
| 15 | |
| 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 | |
|
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
13866
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
13866
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
| 13434 | 20 |
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
parents:
24917
diff
changeset
|
21 #include <config.h> |
| 13434 | 22 #include <signal.h> |
| 23 #include <stdio.h> | |
| 24 #include "lisp.h" | |
|
31117
f390b90e3495
Include keyboard.h before frame.h.
Andrew Innes <andrewi@gnu.org>
parents:
26088
diff
changeset
|
25 #include "keyboard.h" |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
26 #include "frame.h" |
|
23509
afcb561b535d
Include charset.h and fontset.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
22077
diff
changeset
|
27 #include "charset.h" |
|
afcb561b535d
Include charset.h and fontset.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
22077
diff
changeset
|
28 #include "fontset.h" |
| 13434 | 29 #include "blockinput.h" |
| 30 #include "w32term.h" | |
| 31 #include "windowsx.h" | |
| 32 | |
| 33 #define myalloc(cb) GlobalAllocPtr (GPTR, cb) | |
| 34 #define myfree(lp) GlobalFreePtr (lp) | |
| 35 | |
| 14352 | 36 CRITICAL_SECTION critsect; |
| 13434 | 37 extern HANDLE keyboard_handle; |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
38 HANDLE input_available = NULL; |
|
22077
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
39 HANDLE interrupt_handle = NULL; |
| 13434 | 40 |
| 41 void | |
| 42 init_crit () | |
| 43 { | |
| 14352 | 44 InitializeCriticalSection (&critsect); |
| 13434 | 45 |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
46 /* For safety, input_available should only be reset by get_next_msg |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
47 when the input queue is empty, so make it a manual reset event. */ |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
48 keyboard_handle = input_available = CreateEvent (NULL, TRUE, FALSE, NULL); |
|
22077
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
49 |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
50 /* interrupt_handle is signalled when quit (C-g) is detected, so that |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
51 blocking system calls can be interrupted. We make it a manual |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
52 reset event, so that if we should ever have multiple threads |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
53 performing system calls, they will all be interrupted (I'm guessing |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
54 that would the right response). Note that we use PulseEvent to |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
55 signal this event, so that it never remains signalled. */ |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
56 interrupt_handle = CreateEvent (NULL, TRUE, FALSE, NULL); |
| 13434 | 57 } |
| 58 | |
| 59 void | |
| 60 delete_crit () | |
| 61 { | |
| 14352 | 62 DeleteCriticalSection (&critsect); |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
63 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
64 if (input_available) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
65 { |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
66 CloseHandle (input_available); |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
67 input_available = NULL; |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
68 } |
|
22077
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
69 if (interrupt_handle) |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
70 { |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
71 CloseHandle (interrupt_handle); |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
72 interrupt_handle = NULL; |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
73 } |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
74 } |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
75 |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
76 void |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
77 signal_quit () |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
78 { |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
79 /* Make sure this event never remains signalled; if the main thread |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
80 isn't in a blocking call, then this should do nothing. */ |
|
ae5e3b23c7e2
(interrupt_handle): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
19715
diff
changeset
|
81 PulseEvent (interrupt_handle); |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
82 } |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
83 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
84 void |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
85 select_palette (FRAME_PTR f, HDC hdc) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
86 { |
|
34783
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
87 struct w32_display_info *display_info = FRAME_W32_DISPLAY_INFO (f); |
|
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
88 |
|
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
89 if (!display_info->has_palette) |
|
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
90 return; |
|
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
91 |
|
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
92 if (display_info->palette == 0) |
|
35943
7a9bc23b91e7
(select_palette): Do nothing if palette hasn't yet
Andrew Innes <andrewi@gnu.org>
parents:
34999
diff
changeset
|
93 return; |
|
34783
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
94 |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
95 if (!NILP (Vw32_enable_palette)) |
|
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
96 f->output_data.w32->old_palette = |
|
34783
9c0d7d896682
(select_palette): Avoid calling SelectPalette if
Andrew Innes <andrewi@gnu.org>
parents:
34094
diff
changeset
|
97 SelectPalette (hdc, display_info->palette, FALSE); |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
98 else |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
99 f->output_data.w32->old_palette = NULL; |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
100 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
101 if (RealizePalette (hdc)) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
102 { |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
103 Lisp_Object frame, framelist; |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
104 FOR_EACH_FRAME (framelist, frame) |
| 13434 | 105 { |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
106 SET_FRAME_GARBAGED (XFRAME (frame)); |
| 13434 | 107 } |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
108 } |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
109 } |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
110 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
111 void |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
112 deselect_palette (FRAME_PTR f, HDC hdc) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
113 { |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
114 if (f->output_data.w32->old_palette) |
|
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
115 SelectPalette (hdc, f->output_data.w32->old_palette, FALSE); |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
116 } |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
117 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
118 /* Get a DC for frame and select palette for drawing; force an update of |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
119 all frames if palette's mapping changes. */ |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
120 HDC |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
121 get_frame_dc (FRAME_PTR f) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
122 { |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
123 HDC hdc; |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
124 |
|
34999
549bbda5364a
(get_frame_dc): Abort if called on a non-w32 frame.
Andrew Innes <andrewi@gnu.org>
parents:
34783
diff
changeset
|
125 if (f->output_method != output_w32) |
|
549bbda5364a
(get_frame_dc): Abort if called on a non-w32 frame.
Andrew Innes <andrewi@gnu.org>
parents:
34783
diff
changeset
|
126 abort (); |
|
549bbda5364a
(get_frame_dc): Abort if called on a non-w32 frame.
Andrew Innes <andrewi@gnu.org>
parents:
34783
diff
changeset
|
127 |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
128 enter_crit (); |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
129 |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
130 hdc = GetDC (f->output_data.w32->window_desc); |
|
34094
59adbaee3092
(get_frame_dc): Avoid changing the palette on an invalid frame.
Jason Rumney <jasonr@gnu.org>
parents:
31117
diff
changeset
|
131 |
|
59adbaee3092
(get_frame_dc): Avoid changing the palette on an invalid frame.
Jason Rumney <jasonr@gnu.org>
parents:
31117
diff
changeset
|
132 /* If this gets called during startup before the frame is valid, |
|
59adbaee3092
(get_frame_dc): Avoid changing the palette on an invalid frame.
Jason Rumney <jasonr@gnu.org>
parents:
31117
diff
changeset
|
133 there is a chance of corrupting random data or crashing. */ |
|
59adbaee3092
(get_frame_dc): Avoid changing the palette on an invalid frame.
Jason Rumney <jasonr@gnu.org>
parents:
31117
diff
changeset
|
134 if (hdc) |
|
59adbaee3092
(get_frame_dc): Avoid changing the palette on an invalid frame.
Jason Rumney <jasonr@gnu.org>
parents:
31117
diff
changeset
|
135 select_palette (f, hdc); |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
136 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
137 return hdc; |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
138 } |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
139 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
140 int |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
141 release_frame_dc (FRAME_PTR f, HDC hdc) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
142 { |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
143 int ret; |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
144 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
145 deselect_palette (f, hdc); |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
146 ret = ReleaseDC (f->output_data.w32->window_desc, hdc); |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
147 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
148 leave_crit (); |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
149 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
150 return ret; |
| 13434 | 151 } |
| 152 | |
| 153 typedef struct int_msg | |
| 154 { | |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
155 W32Msg w32msg; |
| 13434 | 156 struct int_msg *lpNext; |
| 157 } int_msg; | |
| 158 | |
| 159 int_msg *lpHead = NULL; | |
| 160 int_msg *lpTail = NULL; | |
| 161 int nQueue = 0; | |
| 162 | |
| 163 BOOL | |
| 164 get_next_msg (lpmsg, bWait) | |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
165 W32Msg * lpmsg; |
| 13434 | 166 BOOL bWait; |
| 167 { | |
| 168 BOOL bRet = FALSE; | |
| 169 | |
| 14352 | 170 enter_crit (); |
| 13434 | 171 |
| 172 /* The while loop takes care of multiple sets */ | |
| 173 | |
| 174 while (!nQueue && bWait) | |
| 175 { | |
| 14352 | 176 leave_crit (); |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
177 WaitForSingleObject (input_available, INFINITE); |
| 14352 | 178 enter_crit (); |
| 13434 | 179 } |
| 180 | |
| 181 if (nQueue) | |
| 182 { | |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
183 bcopy (&(lpHead->w32msg), lpmsg, sizeof (W32Msg)); |
| 13434 | 184 |
| 185 { | |
| 186 int_msg * lpCur = lpHead; | |
| 187 | |
| 188 lpHead = lpHead->lpNext; | |
| 189 | |
| 190 myfree (lpCur); | |
| 191 } | |
| 192 | |
| 193 nQueue--; | |
| 194 | |
| 195 bRet = TRUE; | |
| 196 } | |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
197 |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
198 if (nQueue == 0) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
199 ResetEvent (input_available); |
| 13434 | 200 |
| 14352 | 201 leave_crit (); |
| 13434 | 202 |
| 203 return (bRet); | |
| 204 } | |
| 205 | |
| 206 BOOL | |
| 207 post_msg (lpmsg) | |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
208 W32Msg * lpmsg; |
| 13434 | 209 { |
| 210 int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg)); | |
| 211 | |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
212 if (!lpNew) |
|
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
213 return (FALSE); |
| 13434 | 214 |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
215 bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg)); |
| 13434 | 216 lpNew->lpNext = NULL; |
| 217 | |
| 14352 | 218 enter_crit (); |
| 13434 | 219 |
| 220 if (nQueue++) | |
| 14352 | 221 { |
| 222 lpTail->lpNext = lpNew; | |
| 223 } | |
| 13434 | 224 else |
| 14352 | 225 { |
| 226 lpHead = lpNew; | |
| 227 } | |
| 13434 | 228 |
| 229 lpTail = lpNew; | |
|
15153
c1494aa589e8
Include frame.h.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14460
diff
changeset
|
230 SetEvent (input_available); |
| 13434 | 231 |
| 14352 | 232 leave_crit (); |
| 13434 | 233 |
| 234 return (TRUE); | |
| 235 } | |
| 236 | |
|
14460
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
237 BOOL |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
238 prepend_msg (W32Msg *lpmsg) |
|
14460
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
239 { |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
240 int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg)); |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
241 |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
242 if (!lpNew) |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
243 return (FALSE); |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
244 |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
245 bcopy (lpmsg, &(lpNew->w32msg), sizeof (W32Msg)); |
|
14460
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
246 |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
247 enter_crit (); |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
248 |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
249 nQueue++; |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
250 lpNew->lpNext = lpHead; |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
251 lpHead = lpNew; |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
252 |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
253 leave_crit (); |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
254 |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
255 return (TRUE); |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
256 } |
|
61fc696a0c6a
(prepend_msg): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
14352
diff
changeset
|
257 |
|
24917
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
258 /* Process all messages in the current thread's queue. */ |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
259 void |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
260 drain_message_queue () |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
261 { |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
262 MSG msg; |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
263 while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
264 { |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
265 TranslateMessage (&msg); |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
266 DispatchMessage (&msg); |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
267 } |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
268 } |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
269 |
|
600578f35004
(drain_message_queue): New function.
Andrew Innes <andrewi@gnu.org>
parents:
23509
diff
changeset
|
270 |
| 13434 | 271 /* |
| 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. | |
| 281 */ | |
| 282 | |
| 283 static int | |
| 284 read_integer (string, NextString) | |
| 285 register char *string; | |
| 286 char **NextString; | |
| 287 { | |
| 288 register int Result = 0; | |
| 289 int Sign = 1; | |
| 290 | |
| 291 if (*string == '+') | |
| 292 string++; | |
| 293 else if (*string == '-') | |
| 294 { | |
| 295 string++; | |
| 296 Sign = -1; | |
| 297 } | |
| 298 for (; (*string >= '0') && (*string <= '9'); string++) | |
| 299 { | |
| 300 Result = (Result * 10) + (*string - '0'); | |
| 301 } | |
| 302 *NextString = string; | |
| 303 if (Sign >= 0) | |
| 304 return (Result); | |
| 305 else | |
| 306 return (-Result); | |
| 307 } | |
| 308 | |
| 309 int | |
| 310 XParseGeometry (string, x, y, width, height) | |
| 311 char *string; | |
| 312 int *x, *y; | |
| 313 unsigned int *width, *height; /* RETURN */ | |
| 314 { | |
| 315 int mask = NoValue; | |
| 316 register char *strind; | |
| 317 unsigned int tempWidth, tempHeight; | |
| 318 int tempX, tempY; | |
| 319 char *nextCharacter; | |
| 320 | |
| 321 if ((string == NULL) || (*string == '\0')) return (mask); | |
| 322 if (*string == '=') | |
| 323 string++; /* ignore possible '=' at beg of geometry spec */ | |
| 324 | |
| 325 strind = (char *)string; | |
| 326 if (*strind != '+' && *strind != '-' && *strind != 'x') | |
| 327 { | |
| 328 tempWidth = read_integer (strind, &nextCharacter); | |
| 329 if (strind == nextCharacter) | |
| 330 return (0); | |
| 331 strind = nextCharacter; | |
| 332 mask |= WidthValue; | |
| 333 } | |
| 334 | |
| 335 if (*strind == 'x' || *strind == 'X') | |
| 336 { | |
| 337 strind++; | |
| 338 tempHeight = read_integer (strind, &nextCharacter); | |
| 339 if (strind == nextCharacter) | |
| 340 return (0); | |
| 341 strind = nextCharacter; | |
| 342 mask |= HeightValue; | |
| 343 } | |
| 344 | |
| 345 if ((*strind == '+') || (*strind == '-')) | |
| 346 { | |
| 347 if (*strind == '-') | |
| 348 { | |
| 349 strind++; | |
| 350 tempX = -read_integer (strind, &nextCharacter); | |
| 351 if (strind == nextCharacter) | |
| 352 return (0); | |
| 353 strind = nextCharacter; | |
| 354 mask |= XNegative; | |
| 355 | |
| 356 } | |
| 357 else | |
| 358 { | |
| 359 strind++; | |
| 360 tempX = read_integer (strind, &nextCharacter); | |
| 361 if (strind == nextCharacter) | |
| 362 return (0); | |
| 363 strind = nextCharacter; | |
| 364 } | |
| 365 mask |= XValue; | |
| 366 if ((*strind == '+') || (*strind == '-')) | |
| 367 { | |
| 368 if (*strind == '-') | |
| 369 { | |
| 370 strind++; | |
| 371 tempY = -read_integer (strind, &nextCharacter); | |
| 372 if (strind == nextCharacter) | |
| 373 return (0); | |
| 374 strind = nextCharacter; | |
| 375 mask |= YNegative; | |
| 376 | |
| 377 } | |
| 378 else | |
| 379 { | |
| 380 strind++; | |
| 381 tempY = read_integer (strind, &nextCharacter); | |
| 382 if (strind == nextCharacter) | |
| 383 return (0); | |
| 384 strind = nextCharacter; | |
| 385 } | |
| 386 mask |= YValue; | |
| 387 } | |
| 388 } | |
| 389 | |
| 390 /* If strind isn't at the end of the string the it's an invalid | |
| 391 geometry specification. */ | |
| 392 | |
| 393 if (*strind != '\0') return (0); | |
| 394 | |
| 395 if (mask & XValue) | |
| 396 *x = tempX; | |
| 397 if (mask & YValue) | |
| 398 *y = tempY; | |
| 399 if (mask & WidthValue) | |
| 400 *width = tempWidth; | |
| 401 if (mask & HeightValue) | |
| 402 *height = tempHeight; | |
| 403 return (mask); | |
| 404 } | |
| 405 | |
|
16588
481b7874a1e9
Change identifiers of the form win32* to w32*.
Geoff Voelker <voelker@cs.washington.edu>
parents:
15153
diff
changeset
|
406 /* x_sync is a no-op on W32. */ |
| 13434 | 407 void |
| 408 x_sync (f) | |
| 409 void *f; | |
| 410 { | |
| 411 } |
