Mercurial > sdl-ios-xcode
annotate src/video/windx5/SDL_dx5events.c @ 3978:b966761fef6c SDL-1.2
Significantly improved XIM support.
Fixes Bugzilla #429.
Selected notes from the patch's README:
= FIXES =
This patch fixes the above issues as follows.
== X11 events ==
Moved XFilterEvent just after XNextEvent so that all events are passed
to it. Also, XFilterEvent will receive masks indicated by IM through
XNFilterEvents IC value as well as masks surpplied by SDL.
X11_KeyRepeat is called between XNextEvent and XFilterEvent, after
testing an event is a KeyRelease. I'm not 100% comfortable to do so,
but I couldn't find a better timing to call it, and use of the
function is inevitable.
== Xutf8LookupString ==
Used a longer buffer to receive UTF-8 string. If it is insufficient,
a dynamic storage of the requested size will be allocated. The
initial size of the buffer is set to 32, because the Japanese text
converted from the most widely used benchmark key sequence for
Japanese IM, "WATASHINONAMAEHANAKANODESU." has ten Japanese characters
in it, that occupies 30 bytes when encoded in UTF-8.
== SDL_keysym.unicode ==
On Windows version of SDL implementation, SDL_keysym.unicode stores
UTF-16 encoded unicode characters, one UTF-16 encoding unit per an SDL
event. A Unicode supplementary characters are sent to an application
as two events. (One with a high surrogate and another with a low
surrogate.) The behavior seems reasonable since it is upward
compatible with existing handling of BMP characters.
I wrote a UTF-8 to UTF-16 conversion function for the purpose. It is
designed with the execution speed in mind, having a minimum set of
features that my patch requires.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Mon, 25 Jun 2007 19:58:32 +0000 |
parents | eb2d5480ae95 |
children | c121d94672cb a1b03ba2fcd0 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1303
diff
changeset
|
3 Copyright (C) 1997-2006 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", | |
146 &GUID_SysMouse, &c_dfDIMouse, | |
147 (DISCL_FOREGROUND|DISCL_NONEXCLUSIVE), | |
148 (DISCL_FOREGROUND|DISCL_EXCLUSIVE), handle_mouse }, | |
149 { NULL, NULL, NULL, 0, 0, NULL } | |
150 }; | |
151 | |
152 static int DX5_DInputInit(_THIS) | |
153 { | |
154 int i; | |
155 LPDIRECTINPUTDEVICE device; | |
156 HRESULT result; | |
157 DIPROPDWORD dipdw; | |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
158 HWND topwnd; |
0 | 159 |
160 /* Create the DirectInput object */ | |
161 result = DInputCreate(SDL_Instance, DIRECTINPUT_VERSION, | |
162 &dinput, NULL); | |
163 if ( result != DI_OK ) { | |
164 SetDIerror("DirectInputCreate", result); | |
165 return(-1); | |
166 } | |
167 | |
168 /* Create all of our registered input devices */ | |
169 SDL_DIndev = 0; | |
170 for ( i=0; inputs[i].name; ++i ) { | |
171 /* Create the DirectInput device */ | |
172 result = IDirectInput_CreateDevice(dinput, inputs[i].guid, | |
173 &device, NULL); | |
174 if ( result != DI_OK ) { | |
175 SetDIerror("DirectInput::CreateDevice", result); | |
176 return(-1); | |
177 } | |
178 result = IDirectInputDevice_QueryInterface(device, | |
179 &IID_IDirectInputDevice2, (LPVOID *)&SDL_DIdev[i]); | |
180 IDirectInputDevice_Release(device); | |
181 if ( result != DI_OK ) { | |
182 SetDIerror("DirectInputDevice::QueryInterface", result); | |
183 return(-1); | |
184 } | |
1115
040aa1bea9fc
Fixed mismerged patch.
Ryan C. Gordon <icculus@icculus.org>
parents:
1114
diff
changeset
|
185 topwnd = GetTopLevelParent(SDL_Window); |
0 | 186 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
|
187 topwnd, inputs[i].win_level); |
0 | 188 if ( result != DI_OK ) { |
189 SetDIerror("DirectInputDevice::SetCooperativeLevel", | |
190 result); | |
191 return(-1); | |
192 } | |
193 result = IDirectInputDevice2_SetDataFormat(SDL_DIdev[i], | |
194 inputs[i].format); | |
195 if ( result != DI_OK ) { | |
196 SetDIerror("DirectInputDevice::SetDataFormat", result); | |
197 return(-1); | |
198 } | |
199 | |
200 /* 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
|
201 SDL_memset(&dipdw, 0, sizeof(dipdw)); |
0 | 202 dipdw.diph.dwSize = sizeof(dipdw); |
203 dipdw.diph.dwHeaderSize = sizeof(dipdw.diph); | |
204 dipdw.diph.dwObj = 0; | |
205 dipdw.diph.dwHow = DIPH_DEVICE; | |
206 dipdw.dwData = INPUT_QSIZE; | |
207 result = IDirectInputDevice2_SetProperty(SDL_DIdev[i], | |
208 DIPROP_BUFFERSIZE, &dipdw.diph); | |
209 if ( result != DI_OK ) { | |
210 SetDIerror("DirectInputDevice::SetProperty", result); | |
211 return(-1); | |
212 } | |
213 | |
214 /* Create an event to be signaled when input is ready */ | |
215 SDL_DIevt[i] = CreateEvent(NULL, FALSE, FALSE, NULL); | |
216 if ( SDL_DIevt[i] == NULL ) { | |
217 SDL_SetError("Couldn't create DirectInput event"); | |
218 return(-1); | |
219 } | |
220 result = IDirectInputDevice2_SetEventNotification(SDL_DIdev[i], | |
221 SDL_DIevt[i]); | |
222 if ( result != DI_OK ) { | |
223 SetDIerror("DirectInputDevice::SetEventNotification", | |
224 result); | |
225 return(-1); | |
226 } | |
227 SDL_DIfun[i] = inputs[i].fun; | |
228 | |
229 /* Acquire the device for input */ | |
230 IDirectInputDevice2_Acquire(SDL_DIdev[i]); | |
231 | |
232 /* Increment the number of devices we have */ | |
233 ++SDL_DIndev; | |
234 } | |
235 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
|
236 mouse_buttons_swapped = GetSystemMetrics(SM_SWAPBUTTON); |
0 | 237 |
238 /* DirectInput is ready! */ | |
239 return(0); | |
240 } | |
241 | |
242 /* Clean up DirectInput */ | |
243 static void DX5_DInputQuit(_THIS) | |
244 { | |
245 int i; | |
246 | |
247 if ( dinput != NULL ) { | |
248 /* Close and release all DirectInput devices */ | |
249 for ( i=0; i<MAX_INPUTS; ++i ) { | |
250 if ( SDL_DIdev[i] != NULL ) { | |
251 IDirectInputDevice2_Unacquire(SDL_DIdev[i]); | |
252 IDirectInputDevice2_SetEventNotification( | |
253 SDL_DIdev[i], NULL); | |
254 if ( SDL_DIevt[i] != NULL ) { | |
255 CloseHandle(SDL_DIevt[i]); | |
256 SDL_DIevt[i] = NULL; | |
257 } | |
258 IDirectInputDevice2_Release(SDL_DIdev[i]); | |
259 SDL_DIdev[i] = NULL; | |
260 } | |
261 } | |
262 /* Release DirectInput */ | |
263 IDirectInput_Release(dinput); | |
264 dinput = NULL; | |
265 } | |
266 } | |
267 | |
268 /* Flag to tell SDL whether or not we queued an event */ | |
269 static int posted = 0; | |
270 | |
271 /* Input event handler functions */ | |
272 static void handle_keyboard(const int numevents, DIDEVICEOBJECTDATA *keybuf) | |
273 { | |
274 int i; | |
275 SDL_keysym keysym; | |
276 | |
277 /* Translate keyboard messages */ | |
278 for ( i=0; i<numevents; ++i ) { | |
279 if ( keybuf[i].dwData & 0x80 ) { | |
280 posted = SDL_PrivateKeyboard(SDL_PRESSED, | |
281 TranslateKey(keybuf[i].dwOfs, &keysym, 1)); | |
282 } else { | |
283 posted = SDL_PrivateKeyboard(SDL_RELEASED, | |
284 TranslateKey(keybuf[i].dwOfs, &keysym, 0)); | |
285 } | |
286 } | |
287 } | |
288 static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *ptrbuf) | |
289 { | |
290 int i; | |
291 Sint16 xrel, yrel; | |
292 Uint8 state; | |
293 Uint8 button; | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
294 DWORD timestamp = 0; |
0 | 295 |
717
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
296 /* 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
|
297 if (SDL_PublicSurface == NULL) { |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
298 return; |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
299 } |
42ed44b2c8b6
Date: Sun, 14 Sep 2003 17:04:55 -0400
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
300 |
0 | 301 /* If we are in windowed mode, Windows is taking care of the mouse */ |
325
1b5457c0a8ad
Fixed the bug where mouse cursor and SDL mouse coordinates didn't match
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
302 if ( (SDL_PublicSurface->flags & SDL_OPENGL) || |
1b5457c0a8ad
Fixed the bug where mouse cursor and SDL mouse coordinates didn't match
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
303 !(SDL_PublicSurface->flags & SDL_FULLSCREEN) ) { |
0 | 304 return; |
305 } | |
306 | |
307 /* If the mouse was lost, regain some sense of mouse state */ | |
308 if ( mouse_lost ) { | |
309 POINT mouse_pos; | |
310 Uint8 old_state; | |
311 Uint8 new_state; | |
312 | |
313 /* Set ourselves up with the current cursor position */ | |
314 GetCursorPos(&mouse_pos); | |
315 ScreenToClient(SDL_Window, &mouse_pos); | |
316 posted = SDL_PrivateMouseMotion(0, 0, | |
317 (Sint16)mouse_pos.x, (Sint16)mouse_pos.y); | |
318 | |
319 /* Check for mouse button changes */ | |
320 old_state = SDL_GetMouseState(NULL, NULL); | |
321 new_state = 0; | |
322 { /* Get the new DirectInput button state for the mouse */ | |
323 DIMOUSESTATE distate; | |
324 HRESULT result; | |
325 | |
326 result=IDirectInputDevice2_GetDeviceState(SDL_DIdev[1], | |
327 sizeof(distate), &distate); | |
328 if ( result != DI_OK ) { | |
329 /* Try again next time */ | |
330 SetDIerror( | |
331 "IDirectInputDevice2::GetDeviceState", result); | |
332 return; | |
333 } | |
334 for ( i=3; i>=0; --i ) { | |
335 if ( (distate.rgbButtons[i]&0x80) == 0x80 ) { | |
336 new_state |= 0x01; | |
337 } | |
338 new_state <<= 1; | |
339 } | |
340 } | |
341 for ( i=0; i<8; ++i ) { | |
342 if ( (old_state&0x01) != (new_state&0x01) ) { | |
343 button = (Uint8)(i+1); | |
344 /* Button #2 on two button mice is button 3 | |
345 (the middle button is button 2) | |
346 */ | |
347 if ( button == 2 ) { | |
348 button = 3; | |
349 } else | |
350 if ( button == 3 ) { | |
351 button = 2; | |
352 } | |
353 if ( new_state & 0x01 ) { | |
354 /* Grab mouse so we get mouse-up */ | |
355 if ( ++mouse_pressed > 0 ) { | |
356 SetCapture(SDL_Window); | |
357 } | |
358 state = SDL_PRESSED; | |
359 } else { | |
360 /* Release mouse after all mouse-ups */ | |
361 if ( --mouse_pressed <= 0 ) { | |
362 ReleaseCapture(); | |
363 mouse_pressed = 0; | |
364 } | |
365 state = SDL_RELEASED; | |
366 } | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
367 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
|
368 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
|
369 else |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
370 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
|
371 } |
0 | 372 posted = SDL_PrivateMouseButton(state, button, |
373 0, 0); | |
374 } | |
375 old_state >>= 1; | |
376 new_state >>= 1; | |
377 } | |
378 mouse_lost = 0; | |
379 return; | |
380 } | |
381 | |
382 /* Translate mouse messages */ | |
383 xrel = 0; | |
384 yrel = 0; | |
385 for ( i=0; i<(int)numevents; ++i ) { | |
386 switch (ptrbuf[i].dwOfs) { | |
387 case DIMOFS_X: | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
388 if ( timestamp != ptrbuf[i].dwTimeStamp ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
389 if ( xrel || yrel ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
390 posted = SDL_PrivateMouseMotion( |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
391 0, 1, xrel, yrel); |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
392 xrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
393 yrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
394 } |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
395 timestamp = ptrbuf[i].dwTimeStamp; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
396 } |
0 | 397 xrel += (Sint16)ptrbuf[i].dwData; |
398 break; | |
399 case DIMOFS_Y: | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
400 if ( timestamp != ptrbuf[i].dwTimeStamp ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
401 if ( xrel || yrel ) { |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
402 posted = SDL_PrivateMouseMotion( |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
403 0, 1, xrel, yrel); |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
404 xrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
405 yrel = 0; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
406 } |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
407 timestamp = ptrbuf[i].dwTimeStamp; |
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
408 } |
0 | 409 yrel += (Sint16)ptrbuf[i].dwData; |
410 break; | |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
411 case DIMOFS_Z: |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
412 if ( xrel || yrel ) { |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
413 posted = SDL_PrivateMouseMotion( |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
414 0, 1, xrel, yrel); |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
415 xrel = 0; |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
416 yrel = 0; |
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
417 } |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
418 timestamp = 0; |
61
994ed1d668e7
Mouse wheel sends mouse button (4/5) events on Windows
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
419 if((int)ptrbuf[i].dwData > 0) |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
420 button = SDL_BUTTON_WHEELUP; |
332 | 421 else |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
422 button = SDL_BUTTON_WHEELDOWN; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
423 posted = SDL_PrivateMouseButton( |
332 | 424 SDL_PRESSED, button, 0, 0); |
425 posted |= SDL_PrivateMouseButton( | |
426 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
|
427 break; |
0 | 428 case DIMOFS_BUTTON0: |
429 case DIMOFS_BUTTON1: | |
430 case DIMOFS_BUTTON2: | |
431 case DIMOFS_BUTTON3: | |
432 if ( xrel || yrel ) { | |
433 posted = SDL_PrivateMouseMotion( | |
434 0, 1, xrel, yrel); | |
435 xrel = 0; | |
436 yrel = 0; | |
437 } | |
536
bf7f477fb2b2
Fixed potential dropped events under DirectInput
Sam Lantinga <slouken@libsdl.org>
parents:
523
diff
changeset
|
438 timestamp = 0; |
0 | 439 button = (Uint8)(ptrbuf[i].dwOfs-DIMOFS_BUTTON0)+1; |
440 /* Button #2 on two button mice is button 3 | |
441 (the middle button is button 2) | |
442 */ | |
443 if ( button == 2 ) { | |
444 button = 3; | |
445 } else | |
446 if ( button == 3 ) { | |
447 button = 2; | |
448 } | |
449 if ( ptrbuf[i].dwData & 0x80 ) { | |
450 /* Grab mouse so we get mouse-up */ | |
451 if ( ++mouse_pressed > 0 ) { | |
452 SetCapture(SDL_Window); | |
453 } | |
454 state = SDL_PRESSED; | |
455 } else { | |
456 /* Release mouse after all mouse-ups */ | |
457 if ( --mouse_pressed <= 0 ) { | |
458 ReleaseCapture(); | |
459 mouse_pressed = 0; | |
460 } | |
461 state = SDL_RELEASED; | |
462 } | |
491
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
463 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
|
464 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
|
465 else |
da6a7e859616
Applied John Popplewell's fix for left-handed mice under Windows.
Sam Lantinga <slouken@libsdl.org>
parents:
460
diff
changeset
|
466 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
|
467 } |
0 | 468 posted = SDL_PrivateMouseButton(state, button, |
469 0, 0); | |
470 break; | |
471 } | |
472 } | |
473 if ( xrel || yrel ) { | |
474 posted = SDL_PrivateMouseMotion( 0, 1, xrel, yrel); | |
475 } | |
476 } | |
477 | |
478 /* The main Win32 event handler */ | |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
479 LRESULT DX5_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) |
0 | 480 { |
481 switch (msg) { | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
482 #ifdef WM_ACTIVATEAPP |
0 | 483 case WM_ACTIVATEAPP: { |
484 int i, active; | |
485 | |
486 active = (wParam && (GetForegroundWindow() == hwnd)); | |
487 if ( active ) { | |
488 for ( i=0; SDL_DIdev[i]; ++i ) { | |
489 IDirectInputDevice2_Acquire( | |
490 SDL_DIdev[i]); | |
491 } | |
492 } else { | |
493 for ( i=0; SDL_DIdev[i]; ++i ) { | |
494 IDirectInputDevice2_Unacquire( | |
495 SDL_DIdev[i]); | |
496 } | |
497 mouse_lost = 1; | |
498 } | |
499 } | |
500 break; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
501 #endif /* WM_ACTIVATEAPP */ |
0 | 502 |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
503 #ifdef WM_DISPLAYCHANGE |
0 | 504 case WM_DISPLAYCHANGE: { |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
505 WPARAM BitsPerPixel; |
0 | 506 WORD SizeX, SizeY; |
507 | |
508 /* Ack! The display changed size and/or depth! */ | |
509 SizeX = LOWORD(lParam); | |
510 SizeY = HIWORD(lParam); | |
511 BitsPerPixel = wParam; | |
512 /* We cause this message when we go fullscreen */ | |
513 } | |
514 break; | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
515 #endif /* WM_DISPLAYCHANGE */ |
0 | 516 |
517 /* The keyboard is handled via DirectInput */ | |
518 case WM_SYSKEYUP: | |
1348
40d0975c1769
Date: Mon, 6 Feb 2006 11:41:04 -0500
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
519 case WM_SYSKEYDOWN: { |
40d0975c1769
Date: Mon, 6 Feb 2006 11:41:04 -0500
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
520 /* 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
|
521 } |
40d0975c1769
Date: Mon, 6 Feb 2006 11:41:04 -0500
Sam Lantinga <slouken@libsdl.org>
parents:
1338
diff
changeset
|
522 break; |
0 | 523 case WM_KEYUP: |
524 case WM_KEYDOWN: { | |
525 /* Ignore windows keyboard messages */; | |
526 } | |
527 return(0); | |
528 | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
529 #if defined(SC_SCREENSAVE) || defined(SC_MONITORPOWER) |
0 | 530 /* Don't allow screen savers or monitor power downs. |
531 This is because they quietly clear DirectX surfaces. | |
532 It would be better to allow the application to | |
533 decide whether or not to blow these off, but the | |
534 semantics of SDL_PrivateSysWMEvent() don't allow | |
535 the application that choice. | |
536 */ | |
537 case WM_SYSCOMMAND: { | |
538 if ((wParam&0xFFF0)==SC_SCREENSAVE || | |
539 (wParam&0xFFF0)==SC_MONITORPOWER) | |
540 return(0); | |
541 } | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
542 /* Fall through to default processing */ |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
543 |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
544 #endif /* SC_SCREENSAVE || SC_MONITORPOWER */ |
0 | 545 |
546 default: { | |
547 /* Only post the event if we're watching for it */ | |
548 if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) { | |
549 SDL_SysWMmsg wmmsg; | |
550 | |
551 SDL_VERSION(&wmmsg.version); | |
552 wmmsg.hwnd = hwnd; | |
553 wmmsg.msg = msg; | |
554 wmmsg.wParam = wParam; | |
555 wmmsg.lParam = lParam; | |
556 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
|
557 |
721
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
558 /* 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
|
559 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
|
560 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
|
561 */ |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
562 } else if (userWindowProc) { |
ab0656314eef
Date: Thu, 18 Sep 2003 14:24:35 -0400
Sam Lantinga <slouken@libsdl.org>
parents:
717
diff
changeset
|
563 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
|
564 } |
0 | 565 } |
566 break; | |
567 } | |
568 return(DefWindowProc(hwnd, msg, wParam, lParam)); | |
569 } | |
570 | |
571 /* This function checks the windows message queue and DirectInput and returns | |
572 1 if there was input, 0 if there was no input, or -1 if the application has | |
573 posted a quit message. | |
574 */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
575 static int DX5_CheckInput(_THIS, int timeout, BOOL processInput) |
0 | 576 { |
577 MSG msg; | |
578 int i; | |
579 HRESULT result; | |
580 DWORD event; | |
581 | |
582 /* Check the normal windows queue (highest preference) */ | |
583 posted = 0; | |
584 while ( ! posted && | |
523
c210010f50f4
Fixed windows event handling for ActiveX controls (thanks Huib-Jan!)
Sam Lantinga <slouken@libsdl.org>
parents:
491
diff
changeset
|
585 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
|
586 if ( GetMessage(&msg, NULL, 0, 0) > 0 ) { |
0 | 587 DispatchMessage(&msg); |
588 } else { | |
589 return(-1); | |
590 } | |
591 } | |
592 if ( posted ) { | |
593 return(1); | |
594 } | |
595 | |
596 /* Pump the DirectInput flow */ | |
597 if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) { | |
598 for ( i=0; i<SDL_DIndev; ++i ) { | |
599 result = IDirectInputDevice2_Poll(SDL_DIdev[i]); | |
600 if ( (result == DIERR_INPUTLOST) || | |
601 (result == DIERR_NOTACQUIRED) ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
602 if ( SDL_strcmp(inputs[i].name, "mouse") == 0 ) { |
0 | 603 mouse_lost = 1; |
604 } | |
605 IDirectInputDevice2_Acquire(SDL_DIdev[i]); | |
606 IDirectInputDevice2_Poll(SDL_DIdev[i]); | |
607 } | |
608 } | |
609 } | |
610 | |
611 /* Wait for messages and input events */ | |
612 event = MsgWaitForMultipleObjects(SDL_DIndev, SDL_DIevt, FALSE, | |
613 timeout, QS_ALLEVENTS); | |
614 if ((event >= WAIT_OBJECT_0) && (event < (WAIT_OBJECT_0+SDL_DIndev))) { | |
615 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
|
616 static DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE]; |
0 | 617 |
618 event -= WAIT_OBJECT_0; | |
619 numevents = INPUT_QSIZE; | |
620 result = IDirectInputDevice2_GetDeviceData( | |
621 SDL_DIdev[event], sizeof(DIDEVICEOBJECTDATA), | |
622 evtbuf, &numevents, 0); | |
623 if ( (result == DIERR_INPUTLOST) || | |
624 (result == DIERR_NOTACQUIRED) ) { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
625 if ( SDL_strcmp(inputs[event].name, "mouse") == 0 ) { |
0 | 626 mouse_lost = 1; |
627 } | |
628 IDirectInputDevice2_Acquire(SDL_DIdev[event]); | |
629 result = IDirectInputDevice2_GetDeviceData( | |
630 SDL_DIdev[event], sizeof(DIDEVICEOBJECTDATA), | |
631 evtbuf, &numevents, 0); | |
632 } | |
633 /* Handle the events */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
634 if ( result == DI_OK && processInput ) { |
0 | 635 /* Note: This can post multiple events to event queue |
636 */ | |
637 (*SDL_DIfun[event])((int)numevents, evtbuf); | |
638 return(1); | |
639 } | |
640 } | |
641 if ( event != WAIT_TIMEOUT ) { | |
642 /* Maybe there was a windows message? */ | |
643 if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) { | |
644 if ( GetMessage(&msg, NULL, 0, 0) > 0 ) { | |
645 DispatchMessage(&msg); | |
646 } else { | |
647 return(-1); | |
648 } | |
649 return(1); | |
650 } | |
651 } | |
652 return(0); | |
653 } | |
654 | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
655 /* 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
|
656 void DX5_DInputReset(_THIS, int fullscreen) |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
657 { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
658 DWORD level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
659 int i; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
660 HRESULT result; |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
661 HWND topwnd; |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
662 |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
663 for ( i=0; i<MAX_INPUTS; ++i ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
664 if ( SDL_DIdev[i] != NULL ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
665 if ( fullscreen ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
666 level = inputs[i].raw_level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
667 } else { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
668 level = inputs[i].win_level; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
669 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
670 IDirectInputDevice2_Unacquire(SDL_DIdev[i]); |
1115
040aa1bea9fc
Fixed mismerged patch.
Ryan C. Gordon <icculus@icculus.org>
parents:
1114
diff
changeset
|
671 topwnd = GetTopLevelParent(SDL_Window); |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
672 result = IDirectInputDevice2_SetCooperativeLevel( |
970
fb8b91365766
Date: Tue, 19 Oct 2004 23:04:58 -0700
Sam Lantinga <slouken@libsdl.org>
parents:
833
diff
changeset
|
673 SDL_DIdev[i], topwnd, level); |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
674 IDirectInputDevice2_Acquire(SDL_DIdev[i]); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
675 if ( result != DI_OK ) { |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
676 SetDIerror( |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
677 "DirectInputDevice::SetCooperativeLevel", result); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
678 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
679 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
680 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
681 mouse_lost = 1; |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
682 |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
683 /* Flush pending input */ |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
684 DX5_CheckInput(this, 0, FALSE); |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
685 } |
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
686 |
0 | 687 void DX5_PumpEvents(_THIS) |
688 { | |
689 /* Wait for messages and DirectInput */ | |
460
a888b3ae31ff
Reset mouse state when changing video modes
Sam Lantinga <slouken@libsdl.org>
parents:
458
diff
changeset
|
690 while ( DX5_CheckInput(this, 0, TRUE) > 0 ) { |
0 | 691 /* Loop and check again */; |
692 } | |
693 } | |
694 | |
695 void DX5_InitOSKeymap(_THIS) | |
696 { | |
275
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
697 #ifndef DIK_PAUSE |
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
698 #define DIK_PAUSE 0xC5 |
53fc686e9428
Added support for the pause key under DirectX
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
699 #endif |
327
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
700 #ifndef DIK_OEM_102 |
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
701 #define DIK_OEM_102 0x56 /* < > | on UK/Germany keyboards */ |
13fc64213765
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
325
diff
changeset
|
702 #endif |
0 | 703 int i; |
704 | |
705 /* Map the DIK scancodes to SDL keysyms */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
706 for ( i=0; i<SDL_arraysize(DIK_keymap); ++i ) |
0 | 707 DIK_keymap[i] = 0; |
708 | |
709 /* Defined DIK_* constants */ | |
710 DIK_keymap[DIK_ESCAPE] = SDLK_ESCAPE; | |
711 DIK_keymap[DIK_1] = SDLK_1; | |
712 DIK_keymap[DIK_2] = SDLK_2; | |
713 DIK_keymap[DIK_3] = SDLK_3; | |
714 DIK_keymap[DIK_4] = SDLK_4; | |
715 DIK_keymap[DIK_5] = SDLK_5; | |
716 DIK_keymap[DIK_6] = SDLK_6; | |
717 DIK_keymap[DIK_7] = SDLK_7; | |
718 DIK_keymap[DIK_8] = SDLK_8; | |
719 DIK_keymap[DIK_9] = SDLK_9; | |
720 DIK_keymap[DIK_0] = SDLK_0; | |
721 DIK_keymap[DIK_MINUS] = SDLK_MINUS; | |
722 DIK_keymap[DIK_EQUALS] = SDLK_EQUALS; | |
723 DIK_keymap[DIK_BACK] = SDLK_BACKSPACE; | |
724 DIK_keymap[DIK_TAB] = SDLK_TAB; | |
725 DIK_keymap[DIK_Q] = SDLK_q; | |
726 DIK_keymap[DIK_W] = SDLK_w; | |
727 DIK_keymap[DIK_E] = SDLK_e; | |
728 DIK_keymap[DIK_R] = SDLK_r; | |
729 DIK_keymap[DIK_T] = SDLK_t; | |
730 DIK_keymap[DIK_Y] = SDLK_y; | |
731 DIK_keymap[DIK_U] = SDLK_u; | |
732 DIK_keymap[DIK_I] = SDLK_i; | |
733 DIK_keymap[DIK_O] = SDLK_o; | |
734 DIK_keymap[DIK_P] = SDLK_p; | |
735 DIK_keymap[DIK_LBRACKET] = SDLK_LEFTBRACKET; | |
736 DIK_keymap[DIK_RBRACKET] = SDLK_RIGHTBRACKET; | |
737 DIK_keymap[DIK_RETURN] = SDLK_RETURN; | |
738 DIK_keymap[DIK_LCONTROL] = SDLK_LCTRL; | |
739 DIK_keymap[DIK_A] = SDLK_a; | |
740 DIK_keymap[DIK_S] = SDLK_s; | |
741 DIK_keymap[DIK_D] = SDLK_d; | |
742 DIK_keymap[DIK_F] = SDLK_f; | |
743 DIK_keymap[DIK_G] = SDLK_g; | |
744 DIK_keymap[DIK_H] = SDLK_h; | |
745 DIK_keymap[DIK_J] = SDLK_j; | |
746 DIK_keymap[DIK_K] = SDLK_k; | |
747 DIK_keymap[DIK_L] = SDLK_l; | |
748 DIK_keymap[DIK_SEMICOLON] = SDLK_SEMICOLON; | |
749 DIK_keymap[DIK_APOSTROPHE] = SDLK_QUOTE; | |
750 DIK_keymap[DIK_GRAVE] = SDLK_BACKQUOTE; | |
751 DIK_keymap[DIK_LSHIFT] = SDLK_LSHIFT; | |
752 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
|
753 DIK_keymap[DIK_OEM_102] = SDLK_LESS; |
0 | 754 DIK_keymap[DIK_Z] = SDLK_z; |
755 DIK_keymap[DIK_X] = SDLK_x; | |
756 DIK_keymap[DIK_C] = SDLK_c; | |
757 DIK_keymap[DIK_V] = SDLK_v; | |
758 DIK_keymap[DIK_B] = SDLK_b; | |
759 DIK_keymap[DIK_N] = SDLK_n; | |
760 DIK_keymap[DIK_M] = SDLK_m; | |
761 DIK_keymap[DIK_COMMA] = SDLK_COMMA; | |
762 DIK_keymap[DIK_PERIOD] = SDLK_PERIOD; | |
763 DIK_keymap[DIK_SLASH] = SDLK_SLASH; | |
764 DIK_keymap[DIK_RSHIFT] = SDLK_RSHIFT; | |
765 DIK_keymap[DIK_MULTIPLY] = SDLK_KP_MULTIPLY; | |
766 DIK_keymap[DIK_LMENU] = SDLK_LALT; | |
767 DIK_keymap[DIK_SPACE] = SDLK_SPACE; | |
768 DIK_keymap[DIK_CAPITAL] = SDLK_CAPSLOCK; | |
769 DIK_keymap[DIK_F1] = SDLK_F1; | |
770 DIK_keymap[DIK_F2] = SDLK_F2; | |
771 DIK_keymap[DIK_F3] = SDLK_F3; | |
772 DIK_keymap[DIK_F4] = SDLK_F4; | |
773 DIK_keymap[DIK_F5] = SDLK_F5; | |
774 DIK_keymap[DIK_F6] = SDLK_F6; | |
775 DIK_keymap[DIK_F7] = SDLK_F7; | |
776 DIK_keymap[DIK_F8] = SDLK_F8; | |
777 DIK_keymap[DIK_F9] = SDLK_F9; | |
778 DIK_keymap[DIK_F10] = SDLK_F10; | |
779 DIK_keymap[DIK_NUMLOCK] = SDLK_NUMLOCK; | |
780 DIK_keymap[DIK_SCROLL] = SDLK_SCROLLOCK; | |
781 DIK_keymap[DIK_NUMPAD7] = SDLK_KP7; | |
782 DIK_keymap[DIK_NUMPAD8] = SDLK_KP8; | |
783 DIK_keymap[DIK_NUMPAD9] = SDLK_KP9; | |
784 DIK_keymap[DIK_SUBTRACT] = SDLK_KP_MINUS; | |
785 DIK_keymap[DIK_NUMPAD4] = SDLK_KP4; | |
786 DIK_keymap[DIK_NUMPAD5] = SDLK_KP5; | |
787 DIK_keymap[DIK_NUMPAD6] = SDLK_KP6; | |
788 DIK_keymap[DIK_ADD] = SDLK_KP_PLUS; | |
789 DIK_keymap[DIK_NUMPAD1] = SDLK_KP1; | |
790 DIK_keymap[DIK_NUMPAD2] = SDLK_KP2; | |
791 DIK_keymap[DIK_NUMPAD3] = SDLK_KP3; | |
792 DIK_keymap[DIK_NUMPAD0] = SDLK_KP0; | |
793 DIK_keymap[DIK_DECIMAL] = SDLK_KP_PERIOD; | |
794 DIK_keymap[DIK_F11] = SDLK_F11; | |
795 DIK_keymap[DIK_F12] = SDLK_F12; | |
796 | |
797 DIK_keymap[DIK_F13] = SDLK_F13; | |
798 DIK_keymap[DIK_F14] = SDLK_F14; | |
799 DIK_keymap[DIK_F15] = SDLK_F15; | |
800 | |
801 DIK_keymap[DIK_NUMPADEQUALS] = SDLK_KP_EQUALS; | |
802 DIK_keymap[DIK_NUMPADENTER] = SDLK_KP_ENTER; | |
803 DIK_keymap[DIK_RCONTROL] = SDLK_RCTRL; | |
804 DIK_keymap[DIK_DIVIDE] = SDLK_KP_DIVIDE; | |
1526 | 805 DIK_keymap[DIK_SYSRQ] = SDLK_PRINT; |
0 | 806 DIK_keymap[DIK_RMENU] = SDLK_RALT; |
290
9a02597bc1b0
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
275
diff
changeset
|
807 DIK_keymap[DIK_PAUSE] = SDLK_PAUSE; |
0 | 808 DIK_keymap[DIK_HOME] = SDLK_HOME; |
809 DIK_keymap[DIK_UP] = SDLK_UP; | |
810 DIK_keymap[DIK_PRIOR] = SDLK_PAGEUP; | |
811 DIK_keymap[DIK_LEFT] = SDLK_LEFT; | |
812 DIK_keymap[DIK_RIGHT] = SDLK_RIGHT; | |
813 DIK_keymap[DIK_END] = SDLK_END; | |
814 DIK_keymap[DIK_DOWN] = SDLK_DOWN; | |
815 DIK_keymap[DIK_NEXT] = SDLK_PAGEDOWN; | |
816 DIK_keymap[DIK_INSERT] = SDLK_INSERT; | |
817 DIK_keymap[DIK_DELETE] = SDLK_DELETE; | |
818 DIK_keymap[DIK_LWIN] = SDLK_LMETA; | |
819 DIK_keymap[DIK_RWIN] = SDLK_RMETA; | |
820 DIK_keymap[DIK_APPS] = SDLK_MENU; | |
821 } | |
822 | |
823 static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym *keysym, int pressed) | |
824 { | |
825 /* Set the keysym information */ | |
826 keysym->scancode = (unsigned char)scancode; | |
827 keysym->sym = DIK_keymap[scancode]; | |
828 keysym->mod = KMOD_NONE; | |
829 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
|
830 if ( pressed && SDL_TranslateUNICODE ) { |
0 | 831 UINT vkey; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
832 #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
|
833 BYTE keystate[256]; |
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
834 Uint16 wchars[2]; |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
835 #endif |
0 | 836 |
837 vkey = MapVirtualKey(scancode, 1); | |
453
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
838 #ifdef NO_GETKEYBOARDSTATE |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
839 /* 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
|
840 keysym->unicode = vkey; |
a6fa62b1be09
Updated for embedded Visual C++ 4.0
Sam Lantinga <slouken@libsdl.org>
parents:
332
diff
changeset
|
841 #else |
0 | 842 GetKeyboardState(keystate); |
1253
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
843 if (SDL_ToUnicode(vkey, scancode, keystate, wchars, sizeof(wchars)/sizeof(wchars[0]), 0) == 1) |
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
844 { |
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
845 keysym->unicode = wchars[0]; |
0 | 846 } |
1253
7c7ddaf195bf
Implemented ToUnicode() support on Windows 95/98/ME/NT/2000/XP
Sam Lantinga <slouken@libsdl.org>
parents:
1115
diff
changeset
|
847 #endif /* NO_GETKEYBOARDSTATE */ |
0 | 848 } |
849 return(keysym); | |
850 } | |
851 | |
852 int DX5_CreateWindow(_THIS) | |
853 { | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
854 char *windowid = SDL_getenv("SDL_WINDOWID"); |
0 | 855 int i; |
856 | |
857 /* Clear out DirectInput variables in case we fail */ | |
858 for ( i=0; i<MAX_INPUTS; ++i ) { | |
859 SDL_DIdev[i] = NULL; | |
860 SDL_DIevt[i] = NULL; | |
861 SDL_DIfun[i] = NULL; | |
862 } | |
863 | |
1288
ea3888b472bf
Cleaned up the app registration stuff a bit
Sam Lantinga <slouken@libsdl.org>
parents:
1280
diff
changeset
|
864 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
|
865 |
f61f045343d3
Re-query the SDL_WINDOWID each time we initialize the video
Sam Lantinga <slouken@libsdl.org>
parents:
1253
diff
changeset
|
866 SDL_windowid = (windowid != NULL); |
0 | 867 if ( SDL_windowid ) { |
1456
84de7511f79f
Fixed a bunch of 64-bit compatibility problems
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
868 SDL_Window = (HWND)SDL_strtoull(windowid, NULL, 0); |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
869 if ( SDL_Window == NULL ) { |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
870 SDL_SetError("Couldn't get user specified window"); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
871 return(-1); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
872 } |
145
29a638dc26db
Applied David MacCormack's patch to fix SDL_WINDOWID on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
61
diff
changeset
|
873 |
458
a8a0a4f19df7
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
874 /* DJM: we want all event's for the user specified |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
875 window to be handled by SDL. |
458
a8a0a4f19df7
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
453
diff
changeset
|
876 */ |
1472
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
877 userWindowProc = (WNDPROCTYPE)GetWindowLongPtr(SDL_Window, GWLP_WNDPROC); |
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
878 SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR)WinMessage); |
0 | 879 } else { |
880 SDL_Window = CreateWindow(SDL_Appname, SDL_Appname, | |
881 (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
|
882 CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL); |
0 | 883 if ( SDL_Window == NULL ) { |
884 SDL_SetError("Couldn't create window"); | |
885 return(-1); | |
886 } | |
887 ShowWindow(SDL_Window, SW_HIDE); | |
888 } | |
889 | |
890 /* Initialize DirectInput */ | |
891 if ( DX5_DInputInit(this) < 0 ) { | |
892 return(-1); | |
893 } | |
894 | |
1523 | 895 /* JC 14 Mar 2006 |
896 Flush the message loop or this can cause big problems later | |
897 Especially if the user decides to use dialog boxes or assert()! | |
898 */ | |
899 WIN_FlushMessageQueue(); | |
900 | |
0 | 901 /* Ready to roll */ |
902 return(0); | |
903 } | |
904 | |
905 void DX5_DestroyWindow(_THIS) | |
906 { | |
907 /* Close down DirectInput */ | |
908 DX5_DInputQuit(this); | |
909 | |
910 /* Destroy our window */ | |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
911 if ( SDL_windowid ) { |
1472
4aac8563c296
Fixed more Win64 portability issues
Sam Lantinga <slouken@libsdl.org>
parents:
1456
diff
changeset
|
912 SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR)userWindowProc); |
975
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
913 } else { |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
914 DestroyWindow(SDL_Window); |
add87cc1de0a
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
970
diff
changeset
|
915 } |
1288
ea3888b472bf
Cleaned up the app registration stuff a bit
Sam Lantinga <slouken@libsdl.org>
parents:
1280
diff
changeset
|
916 SDL_UnregisterApp(); |
1523 | 917 |
918 /* JC 14 Mar 2006 | |
919 Flush the message loop or this can cause big problems later | |
920 Especially if the user decides to use dialog boxes or assert()! | |
921 */ | |
922 WIN_FlushMessageQueue(); | |
0 | 923 } |