Mercurial > sdl-ios-xcode
annotate src/video/windx5/SDL_dx5events.c @ 4391:07b330419439 SDL-1.2
Fixed bug #849 some more:
Tim Angus 2009-11-26 14:41:04 PST
Fix to the cursor not being responsive when the app doesn't have
SDL_APPINPUTFOCUS
The problems with the directx driver are similar to the ones I introduced in
the windib driver with r4478. Basically if the application did not have focus,
the mouse position is not updated. It's not really that the mouse cursor was
invisible, it's that it is stuck underneath another window where you can't see
it. This behaviour predates my r4478 changes and is the reason I unwittingly
broke the windib driver as I had been replicating the way the directx driver
deals with focus. Prior to r4478 the directx driver could not be used in
windowed mode, so the broken focusing would not have actually been observable.
Anyway, the attached patch makes the directx driver behaves like the windib
driver in terms of focus.
Time for 1.2.15? ;)
I've added an additional change of moving the calls to WIN_GrabInput that are
made on WM_ACTIVATE messages so that they only occur when the state is
SDL_APPINPUTFOCUS. When a fullscreen application is minimised using alt-tab, it
still receives WM_ACTIVATE messages when other applications are selected. If
WIN_GrabInput is called when the SDL application doesn't have input focus, bad
things happen; it shouldn't be being called at all.
I've also added a line to make sure that SDL_APPMOUSEFOCUS state is dropped
when the application is minimised following an alt-tab.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 11 Dec 2009 15:24:53 +0000 |
parents | 6800e2560310 |
children | 9afe12fb4c41 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
4159 | 3 Copyright (C) 1997-2009 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1303
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1303
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1303
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1303
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1303
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1303
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
145
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1379
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* CAUTION!!!! If you modify this file, check ../windib/SDL_sysevents.c */ | |
25 | |
26 #include "directx.h" | |
27 | |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1348
diff
changeset
|
28 #include "SDL_main.h" |
0 | 29 #include "SDL_events.h" |
30 #include "SDL_video.h" | |
31 #include "SDL_syswm.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
32 #include "../../events/SDL_sysevents.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
33 #include "../../events/SDL_events_c.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
34 #include "../wincommon/SDL_lowvideo.h" |
0 | 35 #include "SDL_dx5video.h" |
36 | |
37 #ifndef WM_APP | |
38 #define WM_APP 0x8000 | |
39 #endif | |
40 | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
41 #ifdef _WIN32_WCE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
42 #define NO_GETKEYBOARDSTATE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
43 #endif |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
44 |
0 | 45 /* The keyboard and mouse device input */ |
4237
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
46 #define MAX_INPUTS 2 |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
47 #define INPUT_QSIZE 512 /* Buffer up to 512 input messages */ |
0 | 48 |
49 static LPDIRECTINPUT dinput = NULL; | |
50 static LPDIRECTINPUTDEVICE2 SDL_DIdev[MAX_INPUTS]; | |
51 static HANDLE SDL_DIevt[MAX_INPUTS]; | |
52 static void (*SDL_DIfun[MAX_INPUTS])(const int, DIDEVICEOBJECTDATA *); | |
53 static int SDL_DIndev = 0; | |
54 static int mouse_lost; | |
55 static int mouse_pressed; | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
56 static int mouse_buttons_swapped = 0; |
0 | 57 |
58 /* The translation table from a DirectInput scancode to an SDL keysym */ | |
59 static SDLKey DIK_keymap[256]; | |
60 static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym *keysym, int pressed); | |
61 | |
145
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
61
diff
changeset
|
62 /* DJM: If the user setup the window for us, we want to save his window proc, |
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
61
diff
changeset
|
63 and give him a chance to handle some messages. */ |
1303
52b5afd7ecee
Date: Tue, 05 Jul 2005 21:43:26 +1000
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
64 #ifdef STRICT |
52b5afd7ecee
Date: Tue, 05 Jul 2005 21:43:26 +1000
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
65 #define WNDPROCTYPE WNDPROC |
52b5afd7ecee
Date: Tue, 05 Jul 2005 21:43:26 +1000
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
66 #else |
52b5afd7ecee
Date: Tue, 05 Jul 2005 21:43:26 +1000
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
67 #define WNDPROCTYPE FARPROC |
52b5afd7ecee
Date: Tue, 05 Jul 2005 21:43:26 +1000
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
68 #endif |
52b5afd7ecee
Date: Tue, 05 Jul 2005 21:43:26 +1000
Sam Lantinga <slouken@libsdl.org>
parents:
1288
diff
changeset
|
69 static WNDPROCTYPE userWindowProc = NULL; |
145
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
61
diff
changeset
|
70 |
1114
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
71 static HWND GetTopLevelParent(HWND hWnd) |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
72 { |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
73 HWND hParentWnd; |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
74 while (1) |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
75 { |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
76 hParentWnd = GetParent(hWnd); |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
77 if (hParentWnd == NULL) |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
78 break; |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
79 hWnd = hParentWnd; |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
80 } |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
81 return hWnd; |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
82 } |
242a35a85852
Patches to make SDL compatible with Win95 again.
Ryan C. Gordon <icculus@icculus.org>
parents:
975
diff
changeset
|
83 |
0 | 84 /* Convert a DirectInput return code to a text message */ |
85 static void SetDIerror(char *function, int code) | |
86 { | |
87 static char *error; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
88 static char errbuf[1024]; |
0 | 89 |
90 errbuf[0] = 0; | |
91 switch (code) { | |
92 case DIERR_GENERIC: | |
93 error = "Undefined error!"; | |
94 break; | |
95 case DIERR_OLDDIRECTINPUTVERSION: | |
96 error = "Your version of DirectInput needs upgrading"; | |
97 break; | |
98 case DIERR_INVALIDPARAM: | |
99 error = "Invalid parameters"; | |
100 break; | |
101 case DIERR_OUTOFMEMORY: | |
102 error = "Out of memory"; | |
103 break; | |
104 case DIERR_DEVICENOTREG: | |
105 error = "Device not registered"; | |
106 break; | |
107 case DIERR_NOINTERFACE: | |
108 error = "Interface not supported"; | |
109 break; | |
110 case DIERR_NOTINITIALIZED: | |
111 error = "Device not initialized"; | |
112 break; | |
113 default: | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
114 SDL_snprintf(errbuf, SDL_arraysize(errbuf), |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
115 "%s: Unknown DirectInput error: 0x%x", |
0 | 116 function, code); |
117 break; | |
118 } | |
119 if ( ! errbuf[0] ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
120 SDL_snprintf(errbuf, SDL_arraysize(errbuf), "%s: %s", function, error); |
0 | 121 } |
122 SDL_SetError("%s", errbuf); | |
123 return; | |
124 } | |
125 | |
126 /* Initialize DirectInput | |
127 Note: If NONEXCLUSIVE access is requested for the devices, normal | |
128 windows input messages will continue to be generated for that | |
129 input device, in addition to DirectInput messages. | |
130 */ | |
131 static void handle_keyboard(const int numevents, DIDEVICEOBJECTDATA *events); | |
132 static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *events); | |
133 struct { | |
134 char *name; | |
135 REFGUID guid; | |
136 LPCDIDATAFORMAT format; | |
137 DWORD win_level; | |
138 DWORD raw_level; | |
139 void (*fun)(const int numevents, DIDEVICEOBJECTDATA *events); | |
140 } inputs[] = { | |
141 { "keyboard", | |
142 &GUID_SysKeyboard, &c_dfDIKeyboard, | |
143 (DISCL_FOREGROUND|DISCL_NONEXCLUSIVE), | |
144 (DISCL_FOREGROUND|DISCL_NONEXCLUSIVE), handle_keyboard }, | |
145 { "mouse", | |
4167 | 146 &GUID_SysMouse, |
147 #if DIRECTINPUT_VERSION >= 0x700 | |
148 &c_dfDIMouse2, | |
149 #else | |
150 &c_dfDIMouse, | |
151 #endif | |
4391
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
152 (DISCL_BACKGROUND|DISCL_NONEXCLUSIVE), |
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
153 (DISCL_BACKGROUND|DISCL_NONEXCLUSIVE), handle_mouse }, |
0 | 154 { NULL, NULL, NULL, 0, 0, NULL } |
155 }; | |
156 | |
157 static int DX5_DInputInit(_THIS) | |
158 { | |
159 int i; | |
160 LPDIRECTINPUTDEVICE device; | |
161 HRESULT result; | |
162 DIPROPDWORD dipdw; | |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
163 HWND topwnd; |
0 | 164 |
165 /* Create the DirectInput object */ | |
166 result = DInputCreate(SDL_Instance, DIRECTINPUT_VERSION, | |
167 &dinput, NULL); | |
168 if ( result != DI_OK ) { | |
169 SetDIerror("DirectInputCreate", result); | |
170 return(-1); | |
171 } | |
172 | |
173 /* Create all of our registered input devices */ | |
174 SDL_DIndev = 0; | |
175 for ( i=0; inputs[i].name; ++i ) { | |
176 /* Create the DirectInput device */ | |
177 result = IDirectInput_CreateDevice(dinput, inputs[i].guid, | |
178 &device, NULL); | |
179 if ( result != DI_OK ) { | |
180 SetDIerror("DirectInput::CreateDevice", result); | |
181 return(-1); | |
182 } | |
183 result = IDirectInputDevice_QueryInterface(device, | |
184 &IID_IDirectInputDevice2, (LPVOID *)&SDL_DIdev[i]); | |
185 IDirectInputDevice_Release(device); | |
186 if ( result != DI_OK ) { | |
187 SetDIerror("DirectInputDevice::QueryInterface", result); | |
188 return(-1); | |
189 } | |
1115
040aa1bea9fc
Fixed mismerged patch.
Ryan C. Gordon <icculus@icculus.org>
parents:
1114
diff
changeset
|
190 topwnd = GetTopLevelParent(SDL_Window); |
0 | 191 result = IDirectInputDevice2_SetCooperativeLevel(SDL_DIdev[i], |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
192 topwnd, inputs[i].win_level); |
0 | 193 if ( result != DI_OK ) { |
194 SetDIerror("DirectInputDevice::SetCooperativeLevel", | |
195 result); | |
196 return(-1); | |
197 } | |
198 result = IDirectInputDevice2_SetDataFormat(SDL_DIdev[i], | |
199 inputs[i].format); | |
200 if ( result != DI_OK ) { | |
201 SetDIerror("DirectInputDevice::SetDataFormat", result); | |
202 return(-1); | |
203 } | |
204 | |
205 /* Set buffered input -- we aren't polling */ | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
206 SDL_memset(&dipdw, 0, sizeof(dipdw)); |
0 | 207 dipdw.diph.dwSize = sizeof(dipdw); |
208 dipdw.diph.dwHeaderSize = sizeof(dipdw.diph); | |
209 dipdw.diph.dwObj = 0; | |
210 dipdw.diph.dwHow = DIPH_DEVICE; | |
211 dipdw.dwData = INPUT_QSIZE; | |
212 result = IDirectInputDevice2_SetProperty(SDL_DIdev[i], | |
213 DIPROP_BUFFERSIZE, &dipdw.diph); | |
214 if ( result != DI_OK ) { | |
215 SetDIerror("DirectInputDevice::SetProperty", result); | |
216 return(-1); | |
217 } | |
218 | |
219 /* Create an event to be signaled when input is ready */ | |
220 SDL_DIevt[i] = CreateEvent(NULL, FALSE, FALSE, NULL); | |
221 if ( SDL_DIevt[i] == NULL ) { | |
222 SDL_SetError("Couldn't create DirectInput event"); | |
223 return(-1); | |
224 } | |
225 result = IDirectInputDevice2_SetEventNotification(SDL_DIdev[i], | |
226 SDL_DIevt[i]); | |
227 if ( result != DI_OK ) { | |
228 SetDIerror("DirectInputDevice::SetEventNotification", | |
229 result); | |
230 return(-1); | |
231 } | |
232 SDL_DIfun[i] = inputs[i].fun; | |
233 | |
234 /* Acquire the device for input */ | |
235 IDirectInputDevice2_Acquire(SDL_DIdev[i]); | |
236 | |
237 /* Increment the number of devices we have */ | |
238 ++SDL_DIndev; | |
239 } | |
240 mouse_pressed = 0; | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
241 mouse_buttons_swapped = GetSystemMetrics(SM_SWAPBUTTON); |
0 | 242 |
243 /* DirectInput is ready! */ | |
244 return(0); | |
245 } | |
246 | |
247 /* Clean up DirectInput */ | |
248 static void DX5_DInputQuit(_THIS) | |
249 { | |
250 int i; | |
251 | |
252 if ( dinput != NULL ) { | |
253 /* Close and release all DirectInput devices */ | |
254 for ( i=0; i<MAX_INPUTS; ++i ) { | |
255 if ( SDL_DIdev[i] != NULL ) { | |
256 IDirectInputDevice2_Unacquire(SDL_DIdev[i]); | |
257 IDirectInputDevice2_SetEventNotification( | |
258 SDL_DIdev[i], NULL); | |
259 if ( SDL_DIevt[i] != NULL ) { | |
260 CloseHandle(SDL_DIevt[i]); | |
261 SDL_DIevt[i] = NULL; | |
262 } | |
263 IDirectInputDevice2_Release(SDL_DIdev[i]); | |
264 SDL_DIdev[i] = NULL; | |
265 } | |
266 } | |
4237
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
267 SDL_DIndev = 0; |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
268 |
0 | 269 /* Release DirectInput */ |
270 IDirectInput_Release(dinput); | |
271 dinput = NULL; | |
272 } | |
273 } | |
274 | |
275 /* Flag to tell SDL whether or not we queued an event */ | |
276 static int posted = 0; | |
277 | |
278 /* Input event handler functions */ | |
279 static void handle_keyboard(const int numevents, DIDEVICEOBJECTDATA *keybuf) | |
280 { | |
281 int i; | |
282 SDL_keysym keysym; | |
283 | |
284 /* Translate keyboard messages */ | |
285 for ( i=0; i<numevents; ++i ) { | |
286 if ( keybuf[i].dwData & 0x80 ) { | |
287 posted = SDL_PrivateKeyboard(SDL_PRESSED, | |
288 TranslateKey(keybuf[i].dwOfs, &keysym, 1)); | |
289 } else { | |
290 posted = SDL_PrivateKeyboard(SDL_RELEASED, | |
291 TranslateKey(keybuf[i].dwOfs, &keysym, 0)); | |
292 } | |
293 } | |
294 } | |
4167 | 295 |
296 static void post_mouse_motion(int relative, Sint16 x, Sint16 y) | |
297 { | |
298 extern int mouse_relative; | |
299 | |
4391
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
300 if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) { |
4167 | 301 posted = SDL_PrivateMouseMotion( |
302 0, relative, x, y); | |
303 | |
304 if ( !mouse_relative ) { | |
305 /* As DirectInput reads raw device coordinates, it has no notion of | |
306 * cursors or absolute position. We must assume responsibility for | |
307 * keeping track of this. */ | |
308 int current_x, current_y; | |
309 POINT cursor; | |
310 RECT trap; | |
311 RECT window; | |
312 int at_edge; | |
313 | |
314 /* Get the current cursor position */ | |
315 SDL_GetMouseState(¤t_x, ¤t_y); | |
316 cursor.x = current_x; | |
317 cursor.y = current_y; | |
318 ClientToScreen(SDL_Window, &cursor); | |
319 | |
320 /* Construct a 1 pixel square RECT that is used to confine the cursor | |
321 * pointer to a specific pixel using ClipCursor. This is used in | |
322 * preference to SetCursorPos as it avoids the cursor jumping around as | |
323 * both the OS and SDL attempt to move it simultaneously. */ | |
324 trap.left = cursor.x; | |
325 trap.top = cursor.y; | |
326 trap.right = cursor.x + 1; | |
327 trap.bottom = cursor.y + 1; | |
328 | |
329 GetClientRect(SDL_Window, &window); | |
330 window.right -= window.left; window.left = 0; | |
331 window.bottom -= window.top; window.top = 0; | |
332 | |
333 /* As we're assuming control over the cursor, we need to know when to | |
334 * relinquish control of it back to the operating system. This is when | |
335 * the cursor reaches the edge of the window. */ | |
336 at_edge = (current_x == window.left) || | |
337 (current_x == (window.right - 1)) || | |
338 (current_y == window.top) || | |
339 (current_y == (window.bottom - 1)); | |
340 | |
341 if ( at_edge ) { | |
342 ClipCursor(NULL); | |
343 } else { | |
344 ClipCursor(&trap); | |
345 } | |
346 } else { | |
347 /* When in relative mode, warp the OS's idea of where the cursor is to | |
348 * the center of the screen. This isn't really necessary as DirectInput | |
349 * reads from the hardware itself, but in case things go wrong, the | |
350 * cursor will be left in a sensible place. */ | |
351 POINT center; | |
352 center.x = (SDL_VideoSurface->w/2); | |
353 center.y = (SDL_VideoSurface->h/2); | |
354 ClientToScreen(SDL_Window, ¢er); | |
355 SetCursorPos(center.x, center.y); | |
356 } | |
357 } | |
358 } | |
359 | |
0 | 360 static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *ptrbuf) |
361 { | |
362 int i; | |
363 Sint16 xrel, yrel; | |
364 Uint8 state; | |
365 Uint8 button; | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
366 DWORD timestamp = 0; |
0 | 367 |
717
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
368 /* Sanity check. Mailing list reports this being NULL unexpectedly. */ |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
369 if (SDL_PublicSurface == NULL) { |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
370 return; |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
371 } |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
372 |
4391
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
373 /* If mouse focus has been lost, make sure we release the cursor. */ |
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
374 if ( !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { |
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
375 mouse_lost = 1; |
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
376 ClipCursor(NULL); |
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
377 } |
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
378 |
0 | 379 /* If the mouse was lost, regain some sense of mouse state */ |
4167 | 380 if ( mouse_lost && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { |
0 | 381 POINT mouse_pos; |
382 Uint8 old_state; | |
383 Uint8 new_state; | |
384 | |
385 /* Set ourselves up with the current cursor position */ | |
386 GetCursorPos(&mouse_pos); | |
387 ScreenToClient(SDL_Window, &mouse_pos); | |
4167 | 388 post_mouse_motion( 0, (Sint16)mouse_pos.x, (Sint16)mouse_pos.y); |
0 | 389 |
390 /* Check for mouse button changes */ | |
391 old_state = SDL_GetMouseState(NULL, NULL); | |
392 new_state = 0; | |
393 { /* Get the new DirectInput button state for the mouse */ | |
4167 | 394 #if DIRECTINPUT_VERSION >= 0x700 |
395 DIMOUSESTATE2 distate; | |
396 #else | |
0 | 397 DIMOUSESTATE distate; |
4167 | 398 #endif |
0 | 399 HRESULT result; |
400 | |
401 result=IDirectInputDevice2_GetDeviceState(SDL_DIdev[1], | |
402 sizeof(distate), &distate); | |
403 if ( result != DI_OK ) { | |
404 /* Try again next time */ | |
405 SetDIerror( | |
406 "IDirectInputDevice2::GetDeviceState", result); | |
407 return; | |
408 } | |
409 for ( i=3; i>=0; --i ) { | |
410 if ( (distate.rgbButtons[i]&0x80) == 0x80 ) { | |
411 new_state |= 0x01; | |
412 } | |
413 new_state <<= 1; | |
414 } | |
415 } | |
416 for ( i=0; i<8; ++i ) { | |
417 if ( (old_state&0x01) != (new_state&0x01) ) { | |
418 button = (Uint8)(i+1); | |
4167 | 419 /* Map DI button numbers to SDL */ |
420 switch ( button ) { | |
421 case 2: button = SDL_BUTTON_RIGHT; break; | |
422 case 3: button = SDL_BUTTON_MIDDLE; break; | |
423 case 4: button = SDL_BUTTON_X1; break; | |
424 case 5: button = SDL_BUTTON_X2; break; | |
425 default: break; | |
0 | 426 } |
427 if ( new_state & 0x01 ) { | |
428 /* Grab mouse so we get mouse-up */ | |
429 if ( ++mouse_pressed > 0 ) { | |
430 SetCapture(SDL_Window); | |
431 } | |
432 state = SDL_PRESSED; | |
433 } else { | |
434 /* Release mouse after all mouse-ups */ | |
435 if ( --mouse_pressed <= 0 ) { | |
436 ReleaseCapture(); | |
437 mouse_pressed = 0; | |
438 } | |
439 state = SDL_RELEASED; | |
440 } | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
441 if ( mouse_buttons_swapped ) { |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
442 if ( button == 1 ) button = 3; |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
443 else |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
444 if ( button == 3 ) button = 1; |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
445 } |
0 | 446 posted = SDL_PrivateMouseButton(state, button, |
447 0, 0); | |
448 } | |
449 old_state >>= 1; | |
450 new_state >>= 1; | |
451 } | |
452 mouse_lost = 0; | |
453 return; | |
454 } | |
455 | |
456 /* Translate mouse messages */ | |
457 xrel = 0; | |
458 yrel = 0; | |
459 for ( i=0; i<(int)numevents; ++i ) { | |
460 switch (ptrbuf[i].dwOfs) { | |
461 case DIMOFS_X: | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
462 if ( timestamp != ptrbuf[i].dwTimeStamp ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
463 if ( xrel || yrel ) { |
4167 | 464 post_mouse_motion(1, xrel, yrel); |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
465 xrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
466 yrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
467 } |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
468 timestamp = ptrbuf[i].dwTimeStamp; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
469 } |
0 | 470 xrel += (Sint16)ptrbuf[i].dwData; |
471 break; | |
472 case DIMOFS_Y: | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
473 if ( timestamp != ptrbuf[i].dwTimeStamp ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
474 if ( xrel || yrel ) { |
4167 | 475 post_mouse_motion(1, xrel, yrel); |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
476 xrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
477 yrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
478 } |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
479 timestamp = ptrbuf[i].dwTimeStamp; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
480 } |
0 | 481 yrel += (Sint16)ptrbuf[i].dwData; |
482 break; | |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
483 case DIMOFS_Z: |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
484 if ( xrel || yrel ) { |
4167 | 485 post_mouse_motion(1, xrel, yrel); |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
486 xrel = 0; |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
487 yrel = 0; |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
488 } |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
489 timestamp = 0; |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
490 if((int)ptrbuf[i].dwData > 0) |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
491 button = SDL_BUTTON_WHEELUP; |
332 | 492 else |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
493 button = SDL_BUTTON_WHEELDOWN; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
494 posted = SDL_PrivateMouseButton( |
332 | 495 SDL_PRESSED, button, 0, 0); |
496 posted |= SDL_PrivateMouseButton( | |
497 SDL_RELEASED, button, 0, 0); | |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
498 break; |
0 | 499 case DIMOFS_BUTTON0: |
500 case DIMOFS_BUTTON1: | |
501 case DIMOFS_BUTTON2: | |
502 case DIMOFS_BUTTON3: | |
4167 | 503 #if DIRECTINPUT_VERSION >= 0x700 |
504 case DIMOFS_BUTTON4: | |
505 case DIMOFS_BUTTON5: | |
506 case DIMOFS_BUTTON6: | |
507 case DIMOFS_BUTTON7: | |
508 #endif | |
0 | 509 if ( xrel || yrel ) { |
4167 | 510 post_mouse_motion(1, xrel, yrel); |
0 | 511 xrel = 0; |
512 yrel = 0; | |
513 } | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
514 timestamp = 0; |
0 | 515 button = (Uint8)(ptrbuf[i].dwOfs-DIMOFS_BUTTON0)+1; |
4167 | 516 /* Map DI button numbers to SDL */ |
517 switch ( button ) { | |
518 case 2: button = SDL_BUTTON_RIGHT; break; | |
519 case 3: button = SDL_BUTTON_MIDDLE; break; | |
520 case 4: button = SDL_BUTTON_X1; break; | |
521 case 5: button = SDL_BUTTON_X2; break; | |
522 default: break; | |
0 | 523 } |
524 if ( ptrbuf[i].dwData & 0x80 ) { | |
525 /* Grab mouse so we get mouse-up */ | |
526 if ( ++mouse_pressed > 0 ) { | |
527 SetCapture(SDL_Window); | |
528 } | |
529 state = SDL_PRESSED; | |
530 } else { | |
531 /* Release mouse after all mouse-ups */ | |
532 if ( --mouse_pressed <= 0 ) { | |
533 ReleaseCapture(); | |
534 mouse_pressed = 0; | |
535 } | |
536 state = SDL_RELEASED; | |
537 } | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
538 if ( mouse_buttons_swapped ) { |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
539 if ( button == 1 ) button = 3; |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
540 else |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
541 if ( button == 3 ) button = 1; |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
542 } |
0 | 543 posted = SDL_PrivateMouseButton(state, button, |
544 0, 0); | |
545 break; | |
546 } | |
547 } | |
548 if ( xrel || yrel ) { | |
4167 | 549 post_mouse_motion(1, xrel, yrel); |
0 | 550 } |
551 } | |
552 | |
553 /* The main Win32 event handler */ | |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
554 LRESULT DX5_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) |
0 | 555 { |
556 switch (msg) { | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
557 #ifdef WM_ACTIVATEAPP |
0 | 558 case WM_ACTIVATEAPP: { |
559 int i, active; | |
560 | |
561 active = (wParam && (GetForegroundWindow() == hwnd)); | |
562 if ( active ) { | |
4383 | 563 for ( i=0; i<MAX_INPUTS; ++i ) { |
564 if (SDL_DIdev[i] != NULL) | |
565 IDirectInputDevice2_Acquire( | |
0 | 566 SDL_DIdev[i]); |
567 } | |
568 } else { | |
4383 | 569 for ( i=0; i<MAX_INPUTS; ++i ) { |
570 if (SDL_DIdev[i] != NULL) | |
571 IDirectInputDevice2_Unacquire( | |
0 | 572 SDL_DIdev[i]); |
573 } | |
574 mouse_lost = 1; | |
575 } | |
576 } | |
577 break; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
578 #endif /* WM_ACTIVATEAPP */ |
0 | 579 |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
580 #ifdef WM_DISPLAYCHANGE |
0 | 581 case WM_DISPLAYCHANGE: { |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
582 WPARAM BitsPerPixel; |
0 | 583 WORD SizeX, SizeY; |
584 | |
585 /* Ack! The display changed size and/or depth! */ | |
586 SizeX = LOWORD(lParam); | |
587 SizeY = HIWORD(lParam); | |
588 BitsPerPixel = wParam; | |
589 /* We cause this message when we go fullscreen */ | |
590 } | |
591 break; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
592 #endif /* WM_DISPLAYCHANGE */ |
0 | 593 |
594 /* The keyboard is handled via DirectInput */ | |
595 case WM_SYSKEYUP: | |
4171 | 596 case WM_SYSKEYDOWN: |
0 | 597 case WM_KEYUP: |
598 case WM_KEYDOWN: { | |
599 /* Ignore windows keyboard messages */; | |
600 } | |
601 return(0); | |
602 | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
603 #if defined(SC_SCREENSAVE) || defined(SC_MONITORPOWER) |
0 | 604 /* Don't allow screen savers or monitor power downs. |
605 This is because they quietly clear DirectX surfaces. | |
606 It would be better to allow the application to | |
607 decide whether or not to blow these off, but the | |
608 semantics of SDL_PrivateSysWMEvent() don't allow | |
609 the application that choice. | |
610 */ | |
611 case WM_SYSCOMMAND: { | |
612 if ((wParam&0xFFF0)==SC_SCREENSAVE || | |
613 (wParam&0xFFF0)==SC_MONITORPOWER) | |
614 return(0); | |
615 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
616 /* Fall through to default processing */ |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
617 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
618 #endif /* SC_SCREENSAVE || SC_MONITORPOWER */ |
0 | 619 |
620 default: { | |
621 /* Only post the event if we're watching for it */ | |
622 if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) { | |
623 SDL_SysWMmsg wmmsg; | |
624 | |
625 SDL_VERSION(&wmmsg.version); | |
626 wmmsg.hwnd = hwnd; | |
627 wmmsg.msg = msg; | |
628 wmmsg.wParam = wParam; | |
629 wmmsg.lParam = lParam; | |
630 posted = SDL_PrivateSysWMEvent(&wmmsg); | |
145
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
61
diff
changeset
|
631 |
721
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
632 /* DJM: If the user isn't watching for private |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
633 messages in her SDL event loop, then pass it |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
634 along to any win32 specific window proc. |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
635 */ |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
636 } else if (userWindowProc) { |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
637 return CallWindowProc(userWindowProc, hwnd, msg, wParam, lParam); |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
638 } |
0 | 639 } |
640 break; | |
641 } | |
642 return(DefWindowProc(hwnd, msg, wParam, lParam)); | |
643 } | |
644 | |
645 /* This function checks the windows message queue and DirectInput and returns | |
646 1 if there was input, 0 if there was no input, or -1 if the application has | |
647 posted a quit message. | |
648 */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
649 static int DX5_CheckInput(_THIS, int timeout, BOOL processInput) |
0 | 650 { |
651 MSG msg; | |
652 int i; | |
653 HRESULT result; | |
654 DWORD event; | |
655 | |
656 /* Check the normal windows queue (highest preference) */ | |
657 posted = 0; | |
658 while ( ! posted && | |
523
c210010f50f4
Fixed windows event handling for ActiveX controls (thanks Huib-Jan!)
Sam Lantinga <slouken@libsdl.org>
parents:
491
diff
changeset
|
659 PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { |
c210010f50f4
Fixed windows event handling for ActiveX controls (thanks Huib-Jan!)
Sam Lantinga <slouken@libsdl.org>
parents:
491
diff
changeset
|
660 if ( GetMessage(&msg, NULL, 0, 0) > 0 ) { |
0 | 661 DispatchMessage(&msg); |
662 } else { | |
663 return(-1); | |
664 } | |
665 } | |
666 if ( posted ) { | |
667 return(1); | |
668 } | |
669 | |
670 /* Pump the DirectInput flow */ | |
4391
07b330419439
Fixed bug #849 some more:
Sam Lantinga <slouken@libsdl.org>
parents:
4384
diff
changeset
|
671 if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) { |
4237
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
672 for ( i=0; i<MAX_INPUTS; ++i ) { |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
673 if ( SDL_DIdev[i] != NULL ) { |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
674 result = IDirectInputDevice2_Poll(SDL_DIdev[i]); |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
675 if ( (result == DIERR_INPUTLOST) || |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
676 (result == DIERR_NOTACQUIRED) ) { |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
677 if ( SDL_strcmp(inputs[i].name, "mouse") == 0 ) { |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
678 mouse_lost = 1; |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
679 } |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
680 IDirectInputDevice2_Acquire(SDL_DIdev[i]); |
0adda8ff43ef
Potentially fixed bug #774
Sam Lantinga <slouken@libsdl.org>
parents:
4191
diff
changeset
|
681 IDirectInputDevice2_Poll(SDL_DIdev[i]); |
0 | 682 } |
683 } | |
684 } | |
685 } | |
686 | |
687 /* Wait for messages and input events */ | |
688 event = MsgWaitForMultipleObjects(SDL_DIndev, SDL_DIevt, FALSE, | |
689 timeout, QS_ALLEVENTS); | |
690 if ((event >= WAIT_OBJECT_0) && (event < (WAIT_OBJECT_0+SDL_DIndev))) { | |
691 DWORD numevents; | |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
692 static DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE]; |
0 | 693 |
694 event -= WAIT_OBJECT_0; | |
695 numevents = INPUT_QSIZE; | |
696 result = IDirectInputDevice2_GetDeviceData( | |
697 SDL_DIdev[event], sizeof(DIDEVICEOBJECTDATA), | |
698 evtbuf, &numevents, 0); | |
699 if ( (result == DIERR_INPUTLOST) || | |
700 (result == DIERR_NOTACQUIRED) ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
701 if ( SDL_strcmp(inputs[event].name, "mouse") == 0 ) { |
0 | 702 mouse_lost = 1; |
703 } | |
704 IDirectInputDevice2_Acquire(SDL_DIdev[event]); | |
705 result = IDirectInputDevice2_GetDeviceData( | |
706 SDL_DIdev[event], sizeof(DIDEVICEOBJECTDATA), | |
707 evtbuf, &numevents, 0); | |
708 } | |
709 /* Handle the events */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
710 if ( result == DI_OK && processInput ) { |
0 | 711 /* Note: This can post multiple events to event queue |
712 */ | |
713 (*SDL_DIfun[event])((int)numevents, evtbuf); | |
714 return(1); | |
715 } | |
716 } | |
717 if ( event != WAIT_TIMEOUT ) { | |
718 /* Maybe there was a windows message? */ | |
4384
6800e2560310
Fixed bugs #882 and 865, re-opening bug #634
Sam Lantinga <slouken@libsdl.org>
parents:
4383
diff
changeset
|
719 if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { |
0 | 720 if ( GetMessage(&msg, NULL, 0, 0) > 0 ) { |
721 DispatchMessage(&msg); | |
722 } else { | |
723 return(-1); | |
724 } | |
725 return(1); | |
726 } | |
727 } | |
728 return(0); | |
729 } | |
730 | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
731 /* Change cooperative level based on whether or not we are fullscreen */ |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
732 void DX5_DInputReset(_THIS, int fullscreen) |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
733 { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
734 DWORD level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
735 int i; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
736 HRESULT result; |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
737 HWND topwnd; |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
738 |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
739 for ( i=0; i<MAX_INPUTS; ++i ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
740 if ( SDL_DIdev[i] != NULL ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
741 if ( fullscreen ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
742 level = inputs[i].raw_level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
743 } else { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
744 level = inputs[i].win_level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
745 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
746 IDirectInputDevice2_Unacquire(SDL_DIdev[i]); |
1115
040aa1bea9fc
Fixed mismerged patch.
Ryan C. Gordon <icculus@icculus.org>
parents:
1114
diff
changeset
|
747 topwnd = GetTopLevelParent(SDL_Window); |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
748 result = IDirectInputDevice2_SetCooperativeLevel( |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
749 SDL_DIdev[i], topwnd, level); |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
750 IDirectInputDevice2_Acquire(SDL_DIdev[i]); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
751 if ( result != DI_OK ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
752 SetDIerror( |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
753 "DirectInputDevice::SetCooperativeLevel", result); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
754 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
755 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
756 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
757 mouse_lost = 1; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
758 |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
759 /* Flush pending input */ |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
760 DX5_CheckInput(this, 0, FALSE); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
761 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
762 |
0 | 763 void DX5_PumpEvents(_THIS) |
764 { | |
765 /* Wait for messages and DirectInput */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
766 while ( DX5_CheckInput(this, 0, TRUE) > 0 ) { |
0 | 767 /* Loop and check again */; |
768 } | |
769 } | |
770 | |
771 void DX5_InitOSKeymap(_THIS) | |
772 { | |
275
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
773 #ifndef DIK_PAUSE |
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
774 #define DIK_PAUSE 0xC5 |
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
775 #endif |
327
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
776 #ifndef DIK_OEM_102 |
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
777 #define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ |
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
778 #endif |
0 | 779 int i; |
780 | |
781 /* Map the DIK scancodes to SDL keysyms */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
782 for ( i=0; i<SDL_arraysize(DIK_keymap); ++i ) |
0 | 783 DIK_keymap[i] = 0; |
784 | |
785 /* Defined DIK_* constants */ | |
786 DIK_keymap[DIK_ESCAPE] = SDLK_ESCAPE; | |
787 DIK_keymap[DIK_1] = SDLK_1; | |
788 DIK_keymap[DIK_2] = SDLK_2; | |
789 DIK_keymap[DIK_3] = SDLK_3; | |
790 DIK_keymap[DIK_4] = SDLK_4; | |
791 DIK_keymap[DIK_5] = SDLK_5; | |
792 DIK_keymap[DIK_6] = SDLK_6; | |
793 DIK_keymap[DIK_7] = SDLK_7; | |
794 DIK_keymap[DIK_8] = SDLK_8; | |
795 DIK_keymap[DIK_9] = SDLK_9; | |
796 DIK_keymap[DIK_0] = SDLK_0; | |
797 DIK_keymap[DIK_MINUS] = SDLK_MINUS; | |
798 DIK_keymap[DIK_EQUALS] = SDLK_EQUALS; | |
799 DIK_keymap[DIK_BACK] = SDLK_BACKSPACE; | |
800 DIK_keymap[DIK_TAB] = SDLK_TAB; | |
801 DIK_keymap[DIK_Q] = SDLK_q; | |
802 DIK_keymap[DIK_W] = SDLK_w; | |
803 DIK_keymap[DIK_E] = SDLK_e; | |
804 DIK_keymap[DIK_R] = SDLK_r; | |
805 DIK_keymap[DIK_T] = SDLK_t; | |
806 DIK_keymap[DIK_Y] = SDLK_y; | |
807 DIK_keymap[DIK_U] = SDLK_u; | |
808 DIK_keymap[DIK_I] = SDLK_i; | |
809 DIK_keymap[DIK_O] = SDLK_o; | |
810 DIK_keymap[DIK_P] = SDLK_p; | |
811 DIK_keymap[DIK_LBRACKET] = SDLK_LEFTBRACKET; | |
812 DIK_keymap[DIK_RBRACKET] = SDLK_RIGHTBRACKET; | |
813 DIK_keymap[DIK_RETURN] = SDLK_RETURN; | |
814 DIK_keymap[DIK_LCONTROL] = SDLK_LCTRL; | |
815 DIK_keymap[DIK_A] = SDLK_a; | |
816 DIK_keymap[DIK_S] = SDLK_s; | |
817 DIK_keymap[DIK_D] = SDLK_d; | |
818 DIK_keymap[DIK_F] = SDLK_f; | |
819 DIK_keymap[DIK_G] = SDLK_g; | |
820 DIK_keymap[DIK_H] = SDLK_h; | |
821 DIK_keymap[DIK_J] = SDLK_j; | |
822 DIK_keymap[DIK_K] = SDLK_k; | |
823 DIK_keymap[DIK_L] = SDLK_l; | |
824 DIK_keymap[DIK_SEMICOLON] = SDLK_SEMICOLON; | |
825 DIK_keymap[DIK_APOSTROPHE] = SDLK_QUOTE; | |
826 DIK_keymap[DIK_GRAVE] = SDLK_BACKQUOTE; | |
827 DIK_keymap[DIK_LSHIFT] = SDLK_LSHIFT; | |
828 DIK_keymap[DIK_BACKSLASH] = SDLK_BACKSLASH; | |
1852
eb2d5480ae95
Try to keep SDL keysyms sane regardless of keyboard layout in windib target.
Ryan C. Gordon <icculus@icculus.org>
parents:
1526
diff
changeset
|
829 DIK_keymap[DIK_OEM_102] = SDLK_LESS; |
0 | 830 DIK_keymap[DIK_Z] = SDLK_z; |
831 DIK_keymap[DIK_X] = SDLK_x; | |
832 DIK_keymap[DIK_C] = SDLK_c; | |
833 DIK_keymap[DIK_V] = SDLK_v; | |
834 DIK_keymap[DIK_B] = SDLK_b; | |
835 DIK_keymap[DIK_N] = SDLK_n; | |
836 DIK_keymap[DIK_M] = SDLK_m; | |
837 DIK_keymap[DIK_COMMA] = SDLK_COMMA; | |
838 DIK_keymap[DIK_PERIOD] = SDLK_PERIOD; | |
839 DIK_keymap[DIK_SLASH] = SDLK_SLASH; | |
840 DIK_keymap[DIK_RSHIFT] = SDLK_RSHIFT; | |
841 DIK_keymap[DIK_MULTIPLY] = SDLK_KP_MULTIPLY; | |
842 DIK_keymap[DIK_LMENU] = SDLK_LALT; | |
843 DIK_keymap[DIK_SPACE] = SDLK_SPACE; | |
844 DIK_keymap[DIK_CAPITAL] = SDLK_CAPSLOCK; | |
845 DIK_keymap[DIK_F1] = SDLK_F1; | |
846 DIK_keymap[DIK_F2] = SDLK_F2; | |
847 DIK_keymap[DIK_F3] = SDLK_F3; | |
848 DIK_keymap[DIK_F4] = SDLK_F4; | |
849 DIK_keymap[DIK_F5] = SDLK_F5; | |
850 DIK_keymap[DIK_F6] = SDLK_F6; | |
851 DIK_keymap[DIK_F7] = SDLK_F7; | |
852 DIK_keymap[DIK_F8] = SDLK_F8; | |
853 DIK_keymap[DIK_F9] = SDLK_F9; | |
854 DIK_keymap[DIK_F10] = SDLK_F10; | |
855 DIK_keymap[DIK_NUMLOCK] = SDLK_NUMLOCK; | |
856 DIK_keymap[DIK_SCROLL] = SDLK_SCROLLOCK; | |
857 DIK_keymap[DIK_NUMPAD7] = SDLK_KP7; | |
858 DIK_keymap[DIK_NUMPAD8] = SDLK_KP8; | |
859 DIK_keymap[DIK_NUMPAD9] = SDLK_KP9; | |
860 DIK_keymap[DIK_SUBTRACT] = SDLK_KP_MINUS; | |
861 DIK_keymap[DIK_NUMPAD4] = SDLK_KP4; | |
862 DIK_keymap[DIK_NUMPAD5] = SDLK_KP5; | |
863 DIK_keymap[DIK_NUMPAD6] = SDLK_KP6; | |
864 DIK_keymap[DIK_ADD] = SDLK_KP_PLUS; | |
865 DIK_keymap[DIK_NUMPAD1] = SDLK_KP1; | |
866 DIK_keymap[DIK_NUMPAD2] = SDLK_KP2; | |
867 DIK_keymap[DIK_NUMPAD3] = SDLK_KP3; | |
868 DIK_keymap[DIK_NUMPAD0] = SDLK_KP0; | |
869 DIK_keymap[DIK_DECIMAL] = SDLK_KP_PERIOD; | |
870 DIK_keymap[DIK_F11] = SDLK_F11; | |
871 DIK_keymap[DIK_F12] = SDLK_F12; | |
872 | |
873 DIK_keymap[DIK_F13] = SDLK_F13; | |
874 DIK_keymap[DIK_F14] = SDLK_F14; | |
875 DIK_keymap[DIK_F15] = SDLK_F15; | |
876 | |
877 DIK_keymap[DIK_NUMPADEQUALS] = SDLK_KP_EQUALS; | |
878 DIK_keymap[DIK_NUMPADENTER] = SDLK_KP_ENTER; | |
879 DIK_keymap[DIK_RCONTROL] = SDLK_RCTRL; | |
880 DIK_keymap[DIK_DIVIDE] = SDLK_KP_DIVIDE; | |
1526 | 881 DIK_keymap[DIK_SYSRQ] = SDLK_PRINT; |
0 | 882 DIK_keymap[DIK_RMENU] = SDLK_RALT; |
290
9a02597bc1b0
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
275
diff
changeset
|
883 DIK_keymap[DIK_PAUSE] = SDLK_PAUSE; |
0 | 884 DIK_keymap[DIK_HOME] = SDLK_HOME; |
885 DIK_keymap[DIK_UP] = SDLK_UP; | |
886 DIK_keymap[DIK_PRIOR] = SDLK_PAGEUP; | |
887 DIK_keymap[DIK_LEFT] = SDLK_LEFT; | |
888 DIK_keymap[DIK_RIGHT] = SDLK_RIGHT; | |
889 DIK_keymap[DIK_END] = SDLK_END; | |
890 DIK_keymap[DIK_DOWN] = SDLK_DOWN; | |
891 DIK_keymap[DIK_NEXT] = SDLK_PAGEDOWN; | |
892 DIK_keymap[DIK_INSERT] = SDLK_INSERT; | |
893 DIK_keymap[DIK_DELETE] = SDLK_DELETE; | |
894 DIK_keymap[DIK_LWIN] = SDLK_LMETA; | |
895 DIK_keymap[DIK_RWIN] = SDLK_RMETA; | |
896 DIK_keymap[DIK_APPS] = SDLK_MENU; | |
897 } | |
898 | |
899 static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym *keysym, int pressed) | |
900 { | |
901 /* Set the keysym information */ | |
902 keysym->scancode = (unsigned char)scancode; | |
903 keysym->sym = DIK_keymap[scancode]; | |
904 keysym->mod = KMOD_NONE; | |
905 keysym->unicode = 0; | |
1253
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
906 if ( pressed && SDL_TranslateUNICODE ) { |
0 | 907 UINT vkey; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
908 #ifndef NO_GETKEYBOARDSTATE |
1253
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
909 BYTE keystate[256]; |
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
910 Uint16 wchars[2]; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
911 #endif |
0 | 912 |
913 vkey = MapVirtualKey(scancode, 1); | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
914 #ifdef NO_GETKEYBOARDSTATE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
915 /* Uh oh, better hope the vkey is close enough.. */ |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
916 keysym->unicode = vkey; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
917 #else |
0 | 918 GetKeyboardState(keystate); |
4170 | 919 /* Numlock isn't taken into account in ToUnicode, |
920 * so we handle it as a special case here */ | |
921 if ((keystate[VK_NUMLOCK] & 1) && vkey >= VK_NUMPAD0 && vkey <= VK_NUMPAD9) | |
922 { | |
923 keysym->unicode = vkey - VK_NUMPAD0 + '0'; | |
924 } | |
925 else if (SDL_ToUnicode(vkey, scancode, keystate, wchars, sizeof(wchars)/sizeof(wchars[0]), 0) > 0) | |
1253
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
926 { |
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
927 keysym->unicode = wchars[0]; |
0 | 928 } |
1253
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
929 #endif /* NO_GETKEYBOARDSTATE */ |
0 | 930 } |
931 return(keysym); | |
932 } | |
933 | |
934 int DX5_CreateWindow(_THIS) | |
935 { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
936 char *windowid = SDL_getenv("SDL_WINDOWID"); |
0 | 937 int i; |
938 | |
939 /* Clear out DirectInput variables in case we fail */ | |
940 for ( i=0; i<MAX_INPUTS; ++i ) { | |
941 SDL_DIdev[i] = NULL; | |
942 SDL_DIevt[i] = NULL; | |
943 SDL_DIfun[i] = NULL; | |
944 } | |
945 | |
1288
ea3888b472bf
Cleaned up the app registration stuff a bit
Sam Lantinga <slouken@libsdl.org>
parents:
1280
diff
changeset
|
946 SDL_RegisterApp(NULL, 0, 0); |
1280
f61f045343d3
Re-query the SDL_WINDOWID each time we initialize the video
Sam Lantinga <slouken@libsdl.org>
parents:
1253
diff
changeset
|
947 |
f61f045343d3
Re-query the SDL_WINDOWID each time we initialize the video
Sam Lantinga <slouken@libsdl.org>
parents:
1253
diff
changeset
|
948 SDL_windowid = (windowid != NULL); |
0 | 949 if ( SDL_windowid ) { |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
950 SDL_Window = (HWND)SDL_strtoull(windowid, NULL, 0); |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
951 if ( SDL_Window == NULL ) { |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
952 SDL_SetError("Couldn't get user specified window"); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
953 return(-1); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
954 } |
145
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
61
diff
changeset
|
955 |
458
a8a0a4f19df7
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
956 /* DJM: we want all event's for the user specified |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
957 window to be handled by SDL. |
458
a8a0a4f19df7
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
958 */ |
1472
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
959 userWindowProc = (WNDPROCTYPE)GetWindowLongPtr(SDL_Window, GWLP_WNDPROC); |
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
960 SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR)WinMessage); |
0 | 961 } else { |
962 SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, | |
963 (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX), | |
833
31fa08b36380
Added support for SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
964 CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL); |
0 | 965 if ( SDL_Window == NULL ) { |
966 SDL_SetError("Couldn't create window"); | |
967 return(-1); | |
968 } | |
969 ShowWindow(SDL_Window, SW_HIDE); | |
970 } | |
971 | |
972 /* Initialize DirectInput */ | |
973 if ( DX5_DInputInit(this) < 0 ) { | |
974 return(-1); | |
975 } | |
976 | |
1523 | 977 /* JC 14 Mar 2006 |
978 Flush the message loop or this can cause big problems later | |
979 Especially if the user decides to use dialog boxes or assert()! | |
980 */ | |
981 WIN_FlushMessageQueue(); | |
982 | |
0 | 983 /* Ready to roll */ |
984 return(0); | |
985 } | |
986 | |
987 void DX5_DestroyWindow(_THIS) | |
988 { | |
989 /* Close down DirectInput */ | |
990 DX5_DInputQuit(this); | |
991 | |
992 /* Destroy our window */ | |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
993 if ( SDL_windowid ) { |
1472
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
994 SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR)userWindowProc); |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
995 } else { |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
996 DestroyWindow(SDL_Window); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
997 } |
1288
ea3888b472bf
Cleaned up the app registration stuff a bit
Sam Lantinga <slouken@libsdl.org>
parents:
1280
diff
changeset
|
998 SDL_UnregisterApp(); |
1523 | 999 |
1000 /* JC 14 Mar 2006 | |
1001 Flush the message loop or this can cause big problems later | |
1002 Especially if the user decides to use dialog boxes or assert()! | |
1003 */ | |
1004 WIN_FlushMessageQueue(); | |
0 | 1005 } |