Mercurial > sdl-ios-xcode
annotate src/video/windx5/SDL_dx5events.c @ 4170:092c0bc69155 SDL-1.2
Fixed bug #618
Description From Tim Angus 2008-08-30 12:23:56 (-) [reply]
As we all know SDL 1.2 doesn't handle dead keys well since one key press
potentially equals two (or more) characters. For example, on many layouts,
keying <backquote>,<space> results in <no character>,<backquote><space>. Since
the unicode member of the SDL_keysym struct only has room for one character,
only one can be returned.
On Linux, the first character is returned. On Windows however, unless the exact
number of characters generated by the keypress is 1, nothing is returned. The
following patch addresses this inconsistency.
Updated patch which includes a further fix to the handling of the numpad when
numlock is on. This further fix is courtesy Amanieu d'Antras.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 13 Apr 2009 08:42:09 +0000 |
parents | a6f635e5eaa6 |
children | 3012f1c37361 |
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 */ |
46 #define MAX_INPUTS 16 /* Maximum of 16-1 input devices */ | |
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 | |
0 | 152 (DISCL_FOREGROUND|DISCL_NONEXCLUSIVE), |
4167 | 153 (DISCL_FOREGROUND|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 } | |
267 /* Release DirectInput */ | |
268 IDirectInput_Release(dinput); | |
269 dinput = NULL; | |
270 } | |
271 } | |
272 | |
273 /* Flag to tell SDL whether or not we queued an event */ | |
274 static int posted = 0; | |
275 | |
276 /* Input event handler functions */ | |
277 static void handle_keyboard(const int numevents, DIDEVICEOBJECTDATA *keybuf) | |
278 { | |
279 int i; | |
280 SDL_keysym keysym; | |
281 | |
282 /* Translate keyboard messages */ | |
283 for ( i=0; i<numevents; ++i ) { | |
284 if ( keybuf[i].dwData & 0x80 ) { | |
285 posted = SDL_PrivateKeyboard(SDL_PRESSED, | |
286 TranslateKey(keybuf[i].dwOfs, &keysym, 1)); | |
287 } else { | |
288 posted = SDL_PrivateKeyboard(SDL_RELEASED, | |
289 TranslateKey(keybuf[i].dwOfs, &keysym, 0)); | |
290 } | |
291 } | |
292 } | |
4167 | 293 |
294 static void post_mouse_motion(int relative, Sint16 x, Sint16 y) | |
295 { | |
296 extern int mouse_relative; | |
297 | |
298 if ( SDL_GetAppState() & (SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS) == | |
299 (SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS) ) { | |
300 posted = SDL_PrivateMouseMotion( | |
301 0, relative, x, y); | |
302 | |
303 if ( !mouse_relative ) { | |
304 /* As DirectInput reads raw device coordinates, it has no notion of | |
305 * cursors or absolute position. We must assume responsibility for | |
306 * keeping track of this. */ | |
307 int current_x, current_y; | |
308 POINT cursor; | |
309 RECT trap; | |
310 RECT window; | |
311 int at_edge; | |
312 | |
313 /* Get the current cursor position */ | |
314 SDL_GetMouseState(¤t_x, ¤t_y); | |
315 cursor.x = current_x; | |
316 cursor.y = current_y; | |
317 ClientToScreen(SDL_Window, &cursor); | |
318 | |
319 /* Construct a 1 pixel square RECT that is used to confine the cursor | |
320 * pointer to a specific pixel using ClipCursor. This is used in | |
321 * preference to SetCursorPos as it avoids the cursor jumping around as | |
322 * both the OS and SDL attempt to move it simultaneously. */ | |
323 trap.left = cursor.x; | |
324 trap.top = cursor.y; | |
325 trap.right = cursor.x + 1; | |
326 trap.bottom = cursor.y + 1; | |
327 | |
328 GetClientRect(SDL_Window, &window); | |
329 window.right -= window.left; window.left = 0; | |
330 window.bottom -= window.top; window.top = 0; | |
331 | |
332 /* As we're assuming control over the cursor, we need to know when to | |
333 * relinquish control of it back to the operating system. This is when | |
334 * the cursor reaches the edge of the window. */ | |
335 at_edge = (current_x == window.left) || | |
336 (current_x == (window.right - 1)) || | |
337 (current_y == window.top) || | |
338 (current_y == (window.bottom - 1)); | |
339 | |
340 if ( at_edge ) { | |
341 ClipCursor(NULL); | |
342 } else { | |
343 ClipCursor(&trap); | |
344 } | |
345 } else { | |
346 /* When in relative mode, warp the OS's idea of where the cursor is to | |
347 * the center of the screen. This isn't really necessary as DirectInput | |
348 * reads from the hardware itself, but in case things go wrong, the | |
349 * cursor will be left in a sensible place. */ | |
350 POINT center; | |
351 center.x = (SDL_VideoSurface->w/2); | |
352 center.y = (SDL_VideoSurface->h/2); | |
353 ClientToScreen(SDL_Window, ¢er); | |
354 SetCursorPos(center.x, center.y); | |
355 } | |
356 } else { | |
357 /* No window or mouse focus, control is lost */ | |
358 mouse_lost = 1; | |
359 ClipCursor(NULL); | |
360 } | |
361 } | |
362 | |
0 | 363 static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *ptrbuf) |
364 { | |
365 int i; | |
366 Sint16 xrel, yrel; | |
367 Uint8 state; | |
368 Uint8 button; | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
369 DWORD timestamp = 0; |
0 | 370 |
717
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
371 /* 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
|
372 if (SDL_PublicSurface == NULL) { |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
373 return; |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
374 } |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
375 |
0 | 376 /* If the mouse was lost, regain some sense of mouse state */ |
4167 | 377 if ( mouse_lost && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { |
0 | 378 POINT mouse_pos; |
379 Uint8 old_state; | |
380 Uint8 new_state; | |
381 | |
382 /* Set ourselves up with the current cursor position */ | |
383 GetCursorPos(&mouse_pos); | |
384 ScreenToClient(SDL_Window, &mouse_pos); | |
4167 | 385 post_mouse_motion( 0, (Sint16)mouse_pos.x, (Sint16)mouse_pos.y); |
0 | 386 |
387 /* Check for mouse button changes */ | |
388 old_state = SDL_GetMouseState(NULL, NULL); | |
389 new_state = 0; | |
390 { /* Get the new DirectInput button state for the mouse */ | |
4167 | 391 #if DIRECTINPUT_VERSION >= 0x700 |
392 DIMOUSESTATE2 distate; | |
393 #else | |
0 | 394 DIMOUSESTATE distate; |
4167 | 395 #endif |
0 | 396 HRESULT result; |
397 | |
398 result=IDirectInputDevice2_GetDeviceState(SDL_DIdev[1], | |
399 sizeof(distate), &distate); | |
400 if ( result != DI_OK ) { | |
401 /* Try again next time */ | |
402 SetDIerror( | |
403 "IDirectInputDevice2::GetDeviceState", result); | |
404 return; | |
405 } | |
406 for ( i=3; i>=0; --i ) { | |
407 if ( (distate.rgbButtons[i]&0x80) == 0x80 ) { | |
408 new_state |= 0x01; | |
409 } | |
410 new_state <<= 1; | |
411 } | |
412 } | |
413 for ( i=0; i<8; ++i ) { | |
414 if ( (old_state&0x01) != (new_state&0x01) ) { | |
415 button = (Uint8)(i+1); | |
4167 | 416 /* Map DI button numbers to SDL */ |
417 switch ( button ) { | |
418 case 2: button = SDL_BUTTON_RIGHT; break; | |
419 case 3: button = SDL_BUTTON_MIDDLE; break; | |
420 case 4: button = SDL_BUTTON_X1; break; | |
421 case 5: button = SDL_BUTTON_X2; break; | |
422 default: break; | |
0 | 423 } |
424 if ( new_state & 0x01 ) { | |
425 /* Grab mouse so we get mouse-up */ | |
426 if ( ++mouse_pressed > 0 ) { | |
427 SetCapture(SDL_Window); | |
428 } | |
429 state = SDL_PRESSED; | |
430 } else { | |
431 /* Release mouse after all mouse-ups */ | |
432 if ( --mouse_pressed <= 0 ) { | |
433 ReleaseCapture(); | |
434 mouse_pressed = 0; | |
435 } | |
436 state = SDL_RELEASED; | |
437 } | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
438 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
|
439 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
|
440 else |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
441 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
|
442 } |
0 | 443 posted = SDL_PrivateMouseButton(state, button, |
444 0, 0); | |
445 } | |
446 old_state >>= 1; | |
447 new_state >>= 1; | |
448 } | |
449 mouse_lost = 0; | |
450 return; | |
451 } | |
452 | |
453 /* Translate mouse messages */ | |
454 xrel = 0; | |
455 yrel = 0; | |
456 for ( i=0; i<(int)numevents; ++i ) { | |
457 switch (ptrbuf[i].dwOfs) { | |
458 case DIMOFS_X: | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
459 if ( timestamp != ptrbuf[i].dwTimeStamp ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
460 if ( xrel || yrel ) { |
4167 | 461 post_mouse_motion(1, xrel, yrel); |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
462 xrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
463 yrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
464 } |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
465 timestamp = ptrbuf[i].dwTimeStamp; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
466 } |
0 | 467 xrel += (Sint16)ptrbuf[i].dwData; |
468 break; | |
469 case DIMOFS_Y: | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
470 if ( timestamp != ptrbuf[i].dwTimeStamp ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
471 if ( xrel || yrel ) { |
4167 | 472 post_mouse_motion(1, xrel, yrel); |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
473 xrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
474 yrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
475 } |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
476 timestamp = ptrbuf[i].dwTimeStamp; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
477 } |
0 | 478 yrel += (Sint16)ptrbuf[i].dwData; |
479 break; | |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
480 case DIMOFS_Z: |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
481 if ( xrel || yrel ) { |
4167 | 482 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
|
483 xrel = 0; |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
484 yrel = 0; |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
485 } |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
486 timestamp = 0; |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
487 if((int)ptrbuf[i].dwData > 0) |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
488 button = SDL_BUTTON_WHEELUP; |
332 | 489 else |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
490 button = SDL_BUTTON_WHEELDOWN; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
491 posted = SDL_PrivateMouseButton( |
332 | 492 SDL_PRESSED, button, 0, 0); |
493 posted |= SDL_PrivateMouseButton( | |
494 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
|
495 break; |
0 | 496 case DIMOFS_BUTTON0: |
497 case DIMOFS_BUTTON1: | |
498 case DIMOFS_BUTTON2: | |
499 case DIMOFS_BUTTON3: | |
4167 | 500 #if DIRECTINPUT_VERSION >= 0x700 |
501 case DIMOFS_BUTTON4: | |
502 case DIMOFS_BUTTON5: | |
503 case DIMOFS_BUTTON6: | |
504 case DIMOFS_BUTTON7: | |
505 #endif | |
0 | 506 if ( xrel || yrel ) { |
4167 | 507 post_mouse_motion(1, xrel, yrel); |
0 | 508 xrel = 0; |
509 yrel = 0; | |
510 } | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
511 timestamp = 0; |
0 | 512 button = (Uint8)(ptrbuf[i].dwOfs-DIMOFS_BUTTON0)+1; |
4167 | 513 /* Map DI button numbers to SDL */ |
514 switch ( button ) { | |
515 case 2: button = SDL_BUTTON_RIGHT; break; | |
516 case 3: button = SDL_BUTTON_MIDDLE; break; | |
517 case 4: button = SDL_BUTTON_X1; break; | |
518 case 5: button = SDL_BUTTON_X2; break; | |
519 default: break; | |
0 | 520 } |
521 if ( ptrbuf[i].dwData & 0x80 ) { | |
522 /* Grab mouse so we get mouse-up */ | |
523 if ( ++mouse_pressed > 0 ) { | |
524 SetCapture(SDL_Window); | |
525 } | |
526 state = SDL_PRESSED; | |
527 } else { | |
528 /* Release mouse after all mouse-ups */ | |
529 if ( --mouse_pressed <= 0 ) { | |
530 ReleaseCapture(); | |
531 mouse_pressed = 0; | |
532 } | |
533 state = SDL_RELEASED; | |
534 } | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
535 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
|
536 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
|
537 else |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
538 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
|
539 } |
0 | 540 posted = SDL_PrivateMouseButton(state, button, |
541 0, 0); | |
542 break; | |
543 } | |
544 } | |
545 if ( xrel || yrel ) { | |
4167 | 546 post_mouse_motion(1, xrel, yrel); |
0 | 547 } |
548 } | |
549 | |
550 /* The main Win32 event handler */ | |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
551 LRESULT DX5_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) |
0 | 552 { |
553 switch (msg) { | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
554 #ifdef WM_ACTIVATEAPP |
0 | 555 case WM_ACTIVATEAPP: { |
556 int i, active; | |
557 | |
558 active = (wParam && (GetForegroundWindow() == hwnd)); | |
559 if ( active ) { | |
560 for ( i=0; SDL_DIdev[i]; ++i ) { | |
561 IDirectInputDevice2_Acquire( | |
562 SDL_DIdev[i]); | |
563 } | |
564 } else { | |
565 for ( i=0; SDL_DIdev[i]; ++i ) { | |
566 IDirectInputDevice2_Unacquire( | |
567 SDL_DIdev[i]); | |
568 } | |
569 mouse_lost = 1; | |
570 } | |
571 } | |
572 break; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
573 #endif /* WM_ACTIVATEAPP */ |
0 | 574 |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
575 #ifdef WM_DISPLAYCHANGE |
0 | 576 case WM_DISPLAYCHANGE: { |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
577 WPARAM BitsPerPixel; |
0 | 578 WORD SizeX, SizeY; |
579 | |
580 /* Ack! The display changed size and/or depth! */ | |
581 SizeX = LOWORD(lParam); | |
582 SizeY = HIWORD(lParam); | |
583 BitsPerPixel = wParam; | |
584 /* We cause this message when we go fullscreen */ | |
585 } | |
586 break; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
587 #endif /* WM_DISPLAYCHANGE */ |
0 | 588 |
589 /* The keyboard is handled via DirectInput */ | |
590 case WM_SYSKEYUP: | |
1348
40d0975c1769
Date: Mon, 6 Feb 2006 11:41:04 -0500
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
591 case WM_SYSKEYDOWN: { |
40d0975c1769
Date: Mon, 6 Feb 2006 11:41:04 -0500
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
592 /* Pass syskey to DefWindwoProc (ALT-F4, etc.) */ |
40d0975c1769
Date: Mon, 6 Feb 2006 11:41:04 -0500
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
593 } |
40d0975c1769
Date: Mon, 6 Feb 2006 11:41:04 -0500
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
594 break; |
0 | 595 case WM_KEYUP: |
596 case WM_KEYDOWN: { | |
597 /* Ignore windows keyboard messages */; | |
598 } | |
599 return(0); | |
600 | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
601 #if defined(SC_SCREENSAVE) || defined(SC_MONITORPOWER) |
0 | 602 /* Don't allow screen savers or monitor power downs. |
603 This is because they quietly clear DirectX surfaces. | |
604 It would be better to allow the application to | |
605 decide whether or not to blow these off, but the | |
606 semantics of SDL_PrivateSysWMEvent() don't allow | |
607 the application that choice. | |
608 */ | |
609 case WM_SYSCOMMAND: { | |
610 if ((wParam&0xFFF0)==SC_SCREENSAVE || | |
611 (wParam&0xFFF0)==SC_MONITORPOWER) | |
612 return(0); | |
613 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
614 /* Fall through to default processing */ |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
615 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
616 #endif /* SC_SCREENSAVE || SC_MONITORPOWER */ |
0 | 617 |
618 default: { | |
619 /* Only post the event if we're watching for it */ | |
620 if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) { | |
621 SDL_SysWMmsg wmmsg; | |
622 | |
623 SDL_VERSION(&wmmsg.version); | |
624 wmmsg.hwnd = hwnd; | |
625 wmmsg.msg = msg; | |
626 wmmsg.wParam = wParam; | |
627 wmmsg.lParam = lParam; | |
628 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
|
629 |
721
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
630 /* 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
|
631 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
|
632 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
|
633 */ |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
634 } else if (userWindowProc) { |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
635 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
|
636 } |
0 | 637 } |
638 break; | |
639 } | |
640 return(DefWindowProc(hwnd, msg, wParam, lParam)); | |
641 } | |
642 | |
643 /* This function checks the windows message queue and DirectInput and returns | |
644 1 if there was input, 0 if there was no input, or -1 if the application has | |
645 posted a quit message. | |
646 */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
647 static int DX5_CheckInput(_THIS, int timeout, BOOL processInput) |
0 | 648 { |
649 MSG msg; | |
650 int i; | |
651 HRESULT result; | |
652 DWORD event; | |
653 | |
654 /* Check the normal windows queue (highest preference) */ | |
655 posted = 0; | |
656 while ( ! posted && | |
523
c210010f50f4
Fixed windows event handling for ActiveX controls (thanks Huib-Jan!)
Sam Lantinga <slouken@libsdl.org>
parents:
491
diff
changeset
|
657 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
|
658 if ( GetMessage(&msg, NULL, 0, 0) > 0 ) { |
0 | 659 DispatchMessage(&msg); |
660 } else { | |
661 return(-1); | |
662 } | |
663 } | |
664 if ( posted ) { | |
665 return(1); | |
666 } | |
667 | |
668 /* Pump the DirectInput flow */ | |
669 if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) { | |
670 for ( i=0; i<SDL_DIndev; ++i ) { | |
671 result = IDirectInputDevice2_Poll(SDL_DIdev[i]); | |
672 if ( (result == DIERR_INPUTLOST) || | |
673 (result == DIERR_NOTACQUIRED) ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
674 if ( SDL_strcmp(inputs[i].name, "mouse") == 0 ) { |
0 | 675 mouse_lost = 1; |
676 } | |
677 IDirectInputDevice2_Acquire(SDL_DIdev[i]); | |
678 IDirectInputDevice2_Poll(SDL_DIdev[i]); | |
679 } | |
680 } | |
681 } | |
682 | |
683 /* Wait for messages and input events */ | |
684 event = MsgWaitForMultipleObjects(SDL_DIndev, SDL_DIevt, FALSE, | |
685 timeout, QS_ALLEVENTS); | |
686 if ((event >= WAIT_OBJECT_0) && (event < (WAIT_OBJECT_0+SDL_DIndev))) { | |
687 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
|
688 static DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE]; |
0 | 689 |
690 event -= WAIT_OBJECT_0; | |
691 numevents = INPUT_QSIZE; | |
692 result = IDirectInputDevice2_GetDeviceData( | |
693 SDL_DIdev[event], sizeof(DIDEVICEOBJECTDATA), | |
694 evtbuf, &numevents, 0); | |
695 if ( (result == DIERR_INPUTLOST) || | |
696 (result == DIERR_NOTACQUIRED) ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
697 if ( SDL_strcmp(inputs[event].name, "mouse") == 0 ) { |
0 | 698 mouse_lost = 1; |
699 } | |
700 IDirectInputDevice2_Acquire(SDL_DIdev[event]); | |
701 result = IDirectInputDevice2_GetDeviceData( | |
702 SDL_DIdev[event], sizeof(DIDEVICEOBJECTDATA), | |
703 evtbuf, &numevents, 0); | |
704 } | |
705 /* Handle the events */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
706 if ( result == DI_OK && processInput ) { |
0 | 707 /* Note: This can post multiple events to event queue |
708 */ | |
709 (*SDL_DIfun[event])((int)numevents, evtbuf); | |
710 return(1); | |
711 } | |
712 } | |
713 if ( event != WAIT_TIMEOUT ) { | |
714 /* Maybe there was a windows message? */ | |
715 if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { | |
716 if ( GetMessage(&msg, NULL, 0, 0) > 0 ) { | |
717 DispatchMessage(&msg); | |
718 } else { | |
719 return(-1); | |
720 } | |
721 return(1); | |
722 } | |
723 } | |
724 return(0); | |
725 } | |
726 | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
727 /* 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
|
728 void DX5_DInputReset(_THIS, int fullscreen) |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
729 { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
730 DWORD level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
731 int i; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
732 HRESULT result; |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
733 HWND topwnd; |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
734 |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
735 for ( i=0; i<MAX_INPUTS; ++i ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
736 if ( SDL_DIdev[i] != NULL ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
737 if ( fullscreen ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
738 level = inputs[i].raw_level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
739 } else { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
740 level = inputs[i].win_level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
741 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
742 IDirectInputDevice2_Unacquire(SDL_DIdev[i]); |
1115
040aa1bea9fc
Fixed mismerged patch.
Ryan C. Gordon <icculus@icculus.org>
parents:
1114
diff
changeset
|
743 topwnd = GetTopLevelParent(SDL_Window); |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
744 result = IDirectInputDevice2_SetCooperativeLevel( |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
745 SDL_DIdev[i], topwnd, level); |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
746 IDirectInputDevice2_Acquire(SDL_DIdev[i]); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
747 if ( result != DI_OK ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
748 SetDIerror( |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
749 "DirectInputDevice::SetCooperativeLevel", result); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
750 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
751 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
752 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
753 mouse_lost = 1; |
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 /* Flush pending input */ |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
756 DX5_CheckInput(this, 0, FALSE); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
757 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
758 |
0 | 759 void DX5_PumpEvents(_THIS) |
760 { | |
761 /* Wait for messages and DirectInput */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
762 while ( DX5_CheckInput(this, 0, TRUE) > 0 ) { |
0 | 763 /* Loop and check again */; |
764 } | |
765 } | |
766 | |
767 void DX5_InitOSKeymap(_THIS) | |
768 { | |
275
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
769 #ifndef DIK_PAUSE |
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
770 #define DIK_PAUSE 0xC5 |
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
771 #endif |
327
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
772 #ifndef DIK_OEM_102 |
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
773 #define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ |
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
774 #endif |
0 | 775 int i; |
776 | |
777 /* Map the DIK scancodes to SDL keysyms */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
778 for ( i=0; i<SDL_arraysize(DIK_keymap); ++i ) |
0 | 779 DIK_keymap[i] = 0; |
780 | |
781 /* Defined DIK_* constants */ | |
782 DIK_keymap[DIK_ESCAPE] = SDLK_ESCAPE; | |
783 DIK_keymap[DIK_1] = SDLK_1; | |
784 DIK_keymap[DIK_2] = SDLK_2; | |
785 DIK_keymap[DIK_3] = SDLK_3; | |
786 DIK_keymap[DIK_4] = SDLK_4; | |
787 DIK_keymap[DIK_5] = SDLK_5; | |
788 DIK_keymap[DIK_6] = SDLK_6; | |
789 DIK_keymap[DIK_7] = SDLK_7; | |
790 DIK_keymap[DIK_8] = SDLK_8; | |
791 DIK_keymap[DIK_9] = SDLK_9; | |
792 DIK_keymap[DIK_0] = SDLK_0; | |
793 DIK_keymap[DIK_MINUS] = SDLK_MINUS; | |
794 DIK_keymap[DIK_EQUALS] = SDLK_EQUALS; | |
795 DIK_keymap[DIK_BACK] = SDLK_BACKSPACE; | |
796 DIK_keymap[DIK_TAB] = SDLK_TAB; | |
797 DIK_keymap[DIK_Q] = SDLK_q; | |
798 DIK_keymap[DIK_W] = SDLK_w; | |
799 DIK_keymap[DIK_E] = SDLK_e; | |
800 DIK_keymap[DIK_R] = SDLK_r; | |
801 DIK_keymap[DIK_T] = SDLK_t; | |
802 DIK_keymap[DIK_Y] = SDLK_y; | |
803 DIK_keymap[DIK_U] = SDLK_u; | |
804 DIK_keymap[DIK_I] = SDLK_i; | |
805 DIK_keymap[DIK_O] = SDLK_o; | |
806 DIK_keymap[DIK_P] = SDLK_p; | |
807 DIK_keymap[DIK_LBRACKET] = SDLK_LEFTBRACKET; | |
808 DIK_keymap[DIK_RBRACKET] = SDLK_RIGHTBRACKET; | |
809 DIK_keymap[DIK_RETURN] = SDLK_RETURN; | |
810 DIK_keymap[DIK_LCONTROL] = SDLK_LCTRL; | |
811 DIK_keymap[DIK_A] = SDLK_a; | |
812 DIK_keymap[DIK_S] = SDLK_s; | |
813 DIK_keymap[DIK_D] = SDLK_d; | |
814 DIK_keymap[DIK_F] = SDLK_f; | |
815 DIK_keymap[DIK_G] = SDLK_g; | |
816 DIK_keymap[DIK_H] = SDLK_h; | |
817 DIK_keymap[DIK_J] = SDLK_j; | |
818 DIK_keymap[DIK_K] = SDLK_k; | |
819 DIK_keymap[DIK_L] = SDLK_l; | |
820 DIK_keymap[DIK_SEMICOLON] = SDLK_SEMICOLON; | |
821 DIK_keymap[DIK_APOSTROPHE] = SDLK_QUOTE; | |
822 DIK_keymap[DIK_GRAVE] = SDLK_BACKQUOTE; | |
823 DIK_keymap[DIK_LSHIFT] = SDLK_LSHIFT; | |
824 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
|
825 DIK_keymap[DIK_OEM_102] = SDLK_LESS; |
0 | 826 DIK_keymap[DIK_Z] = SDLK_z; |
827 DIK_keymap[DIK_X] = SDLK_x; | |
828 DIK_keymap[DIK_C] = SDLK_c; | |
829 DIK_keymap[DIK_V] = SDLK_v; | |
830 DIK_keymap[DIK_B] = SDLK_b; | |
831 DIK_keymap[DIK_N] = SDLK_n; | |
832 DIK_keymap[DIK_M] = SDLK_m; | |
833 DIK_keymap[DIK_COMMA] = SDLK_COMMA; | |
834 DIK_keymap[DIK_PERIOD] = SDLK_PERIOD; | |
835 DIK_keymap[DIK_SLASH] = SDLK_SLASH; | |
836 DIK_keymap[DIK_RSHIFT] = SDLK_RSHIFT; | |
837 DIK_keymap[DIK_MULTIPLY] = SDLK_KP_MULTIPLY; | |
838 DIK_keymap[DIK_LMENU] = SDLK_LALT; | |
839 DIK_keymap[DIK_SPACE] = SDLK_SPACE; | |
840 DIK_keymap[DIK_CAPITAL] = SDLK_CAPSLOCK; | |
841 DIK_keymap[DIK_F1] = SDLK_F1; | |
842 DIK_keymap[DIK_F2] = SDLK_F2; | |
843 DIK_keymap[DIK_F3] = SDLK_F3; | |
844 DIK_keymap[DIK_F4] = SDLK_F4; | |
845 DIK_keymap[DIK_F5] = SDLK_F5; | |
846 DIK_keymap[DIK_F6] = SDLK_F6; | |
847 DIK_keymap[DIK_F7] = SDLK_F7; | |
848 DIK_keymap[DIK_F8] = SDLK_F8; | |
849 DIK_keymap[DIK_F9] = SDLK_F9; | |
850 DIK_keymap[DIK_F10] = SDLK_F10; | |
851 DIK_keymap[DIK_NUMLOCK] = SDLK_NUMLOCK; | |
852 DIK_keymap[DIK_SCROLL] = SDLK_SCROLLOCK; | |
853 DIK_keymap[DIK_NUMPAD7] = SDLK_KP7; | |
854 DIK_keymap[DIK_NUMPAD8] = SDLK_KP8; | |
855 DIK_keymap[DIK_NUMPAD9] = SDLK_KP9; | |
856 DIK_keymap[DIK_SUBTRACT] = SDLK_KP_MINUS; | |
857 DIK_keymap[DIK_NUMPAD4] = SDLK_KP4; | |
858 DIK_keymap[DIK_NUMPAD5] = SDLK_KP5; | |
859 DIK_keymap[DIK_NUMPAD6] = SDLK_KP6; | |
860 DIK_keymap[DIK_ADD] = SDLK_KP_PLUS; | |
861 DIK_keymap[DIK_NUMPAD1] = SDLK_KP1; | |
862 DIK_keymap[DIK_NUMPAD2] = SDLK_KP2; | |
863 DIK_keymap[DIK_NUMPAD3] = SDLK_KP3; | |
864 DIK_keymap[DIK_NUMPAD0] = SDLK_KP0; | |
865 DIK_keymap[DIK_DECIMAL] = SDLK_KP_PERIOD; | |
866 DIK_keymap[DIK_F11] = SDLK_F11; | |
867 DIK_keymap[DIK_F12] = SDLK_F12; | |
868 | |
869 DIK_keymap[DIK_F13] = SDLK_F13; | |
870 DIK_keymap[DIK_F14] = SDLK_F14; | |
871 DIK_keymap[DIK_F15] = SDLK_F15; | |
872 | |
873 DIK_keymap[DIK_NUMPADEQUALS] = SDLK_KP_EQUALS; | |
874 DIK_keymap[DIK_NUMPADENTER] = SDLK_KP_ENTER; | |
875 DIK_keymap[DIK_RCONTROL] = SDLK_RCTRL; | |
876 DIK_keymap[DIK_DIVIDE] = SDLK_KP_DIVIDE; | |
1526 | 877 DIK_keymap[DIK_SYSRQ] = SDLK_PRINT; |
0 | 878 DIK_keymap[DIK_RMENU] = SDLK_RALT; |
290
9a02597bc1b0
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
275
diff
changeset
|
879 DIK_keymap[DIK_PAUSE] = SDLK_PAUSE; |
0 | 880 DIK_keymap[DIK_HOME] = SDLK_HOME; |
881 DIK_keymap[DIK_UP] = SDLK_UP; | |
882 DIK_keymap[DIK_PRIOR] = SDLK_PAGEUP; | |
883 DIK_keymap[DIK_LEFT] = SDLK_LEFT; | |
884 DIK_keymap[DIK_RIGHT] = SDLK_RIGHT; | |
885 DIK_keymap[DIK_END] = SDLK_END; | |
886 DIK_keymap[DIK_DOWN] = SDLK_DOWN; | |
887 DIK_keymap[DIK_NEXT] = SDLK_PAGEDOWN; | |
888 DIK_keymap[DIK_INSERT] = SDLK_INSERT; | |
889 DIK_keymap[DIK_DELETE] = SDLK_DELETE; | |
890 DIK_keymap[DIK_LWIN] = SDLK_LMETA; | |
891 DIK_keymap[DIK_RWIN] = SDLK_RMETA; | |
892 DIK_keymap[DIK_APPS] = SDLK_MENU; | |
893 } | |
894 | |
895 static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym *keysym, int pressed) | |
896 { | |
897 /* Set the keysym information */ | |
898 keysym->scancode = (unsigned char)scancode; | |
899 keysym->sym = DIK_keymap[scancode]; | |
900 keysym->mod = KMOD_NONE; | |
901 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
|
902 if ( pressed && SDL_TranslateUNICODE ) { |
0 | 903 UINT vkey; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
904 #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
|
905 BYTE keystate[256]; |
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
906 Uint16 wchars[2]; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
907 #endif |
0 | 908 |
909 vkey = MapVirtualKey(scancode, 1); | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
910 #ifdef NO_GETKEYBOARDSTATE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
911 /* 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
|
912 keysym->unicode = vkey; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
913 #else |
0 | 914 GetKeyboardState(keystate); |
4170 | 915 /* Numlock isn't taken into account in ToUnicode, |
916 * so we handle it as a special case here */ | |
917 if ((keystate[VK_NUMLOCK] & 1) && vkey >= VK_NUMPAD0 && vkey <= VK_NUMPAD9) | |
918 { | |
919 keysym->unicode = vkey - VK_NUMPAD0 + '0'; | |
920 } | |
921 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
|
922 { |
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
923 keysym->unicode = wchars[0]; |
0 | 924 } |
1253
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
925 #endif /* NO_GETKEYBOARDSTATE */ |
0 | 926 } |
927 return(keysym); | |
928 } | |
929 | |
930 int DX5_CreateWindow(_THIS) | |
931 { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
932 char *windowid = SDL_getenv("SDL_WINDOWID"); |
0 | 933 int i; |
934 | |
935 /* Clear out DirectInput variables in case we fail */ | |
936 for ( i=0; i<MAX_INPUTS; ++i ) { | |
937 SDL_DIdev[i] = NULL; | |
938 SDL_DIevt[i] = NULL; | |
939 SDL_DIfun[i] = NULL; | |
940 } | |
941 | |
1288
ea3888b472bf
Cleaned up the app registration stuff a bit
Sam Lantinga <slouken@libsdl.org>
parents:
1280
diff
changeset
|
942 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
|
943 |
f61f045343d3
Re-query the SDL_WINDOWID each time we initialize the video
Sam Lantinga <slouken@libsdl.org>
parents:
1253
diff
changeset
|
944 SDL_windowid = (windowid != NULL); |
0 | 945 if ( SDL_windowid ) { |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
946 SDL_Window = (HWND)SDL_strtoull(windowid, NULL, 0); |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
947 if ( SDL_Window == NULL ) { |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
948 SDL_SetError("Couldn't get user specified window"); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
949 return(-1); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
950 } |
145
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
61
diff
changeset
|
951 |
458
a8a0a4f19df7
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
952 /* DJM: we want all event's for the user specified |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
953 window to be handled by SDL. |
458
a8a0a4f19df7
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
954 */ |
1472
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
955 userWindowProc = (WNDPROCTYPE)GetWindowLongPtr(SDL_Window, GWLP_WNDPROC); |
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
956 SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR)WinMessage); |
0 | 957 } else { |
958 SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, | |
959 (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
|
960 CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL); |
0 | 961 if ( SDL_Window == NULL ) { |
962 SDL_SetError("Couldn't create window"); | |
963 return(-1); | |
964 } | |
965 ShowWindow(SDL_Window, SW_HIDE); | |
966 } | |
967 | |
968 /* Initialize DirectInput */ | |
969 if ( DX5_DInputInit(this) < 0 ) { | |
970 return(-1); | |
971 } | |
972 | |
1523 | 973 /* JC 14 Mar 2006 |
974 Flush the message loop or this can cause big problems later | |
975 Especially if the user decides to use dialog boxes or assert()! | |
976 */ | |
977 WIN_FlushMessageQueue(); | |
978 | |
0 | 979 /* Ready to roll */ |
980 return(0); | |
981 } | |
982 | |
983 void DX5_DestroyWindow(_THIS) | |
984 { | |
985 /* Close down DirectInput */ | |
986 DX5_DInputQuit(this); | |
987 | |
988 /* Destroy our window */ | |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
989 if ( SDL_windowid ) { |
1472
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
990 SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR)userWindowProc); |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
991 } else { |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
992 DestroyWindow(SDL_Window); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
993 } |
1288
ea3888b472bf
Cleaned up the app registration stuff a bit
Sam Lantinga <slouken@libsdl.org>
parents:
1280
diff
changeset
|
994 SDL_UnregisterApp(); |
1523 | 995 |
996 /* JC 14 Mar 2006 | |
997 Flush the message loop or this can cause big problems later | |
998 Especially if the user decides to use dialog boxes or assert()! | |
999 */ | |
1000 WIN_FlushMessageQueue(); | |
0 | 1001 } |