Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11events.c @ 3957:b1d5b56aa549 SDL-1.2
Date: Mon, 4 Jun 2007 06:17:59 +0000 (UTC)
From: George Gensure <werkt0@gmail.com>
Subject: [SDL] error removal patch for SDL_x11dyn.c
I found that calling SDL_GetError when an error hasn't necessarily occurred is
still reporting problems from loadso regarding dynamic functions in X11. I've
added the following to my local copy to avoid revealing the 'many library
lookup' approach adopted by x11dyn.c:
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Wed, 13 Jun 2007 07:54:10 +0000 |
parents | c5c3c772f5aa |
children | b966761fef6c |
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:
1196
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:
1196
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:
1196
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:
1196
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:
1196
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:
1196
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:
1196
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:
161
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 /* Handle the event stream, converting X11 events into SDL events */ | |
25 | |
26 #include <setjmp.h> | |
27 #include <X11/Xlib.h> | |
28 #include <X11/Xutil.h> | |
29 #include <X11/keysym.h> | |
30 #ifdef __SVR4 | |
31 #include <X11/Sunkeysym.h> | |
32 #endif | |
75
b0ae59d0f3ee
Added patches from FreeBSD ports
Sam Lantinga <slouken@lokigames.com>
parents:
14
diff
changeset
|
33 #include <sys/types.h> |
0 | 34 #include <sys/time.h> |
75
b0ae59d0f3ee
Added patches from FreeBSD ports
Sam Lantinga <slouken@lokigames.com>
parents:
14
diff
changeset
|
35 #include <unistd.h> |
0 | 36 |
1359
1e4ba2e063b4
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
37 #include "SDL_timer.h" |
0 | 38 #include "SDL_syswm.h" |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1359
diff
changeset
|
39 #include "../SDL_sysvideo.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1359
diff
changeset
|
40 #include "../../events/SDL_sysevents.h" |
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1359
diff
changeset
|
41 #include "../../events/SDL_events_c.h" |
0 | 42 #include "SDL_x11video.h" |
43 #include "SDL_x11dga_c.h" | |
44 #include "SDL_x11modes_c.h" | |
45 #include "SDL_x11image_c.h" | |
46 #include "SDL_x11gamma_c.h" | |
47 #include "SDL_x11wm_c.h" | |
48 #include "SDL_x11mouse_c.h" | |
49 #include "SDL_x11events_c.h" | |
50 | |
51 | |
14
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
52 /* Define this if you want to debug X11 events */ |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
53 /*#define DEBUG_XEVENTS*/ |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
54 |
0 | 55 /* The translation tables from an X11 keysym to a SDL keysym */ |
56 static SDLKey ODD_keymap[256]; | |
57 static SDLKey MISC_keymap[256]; | |
1327 | 58 SDLKey X11_TranslateKeycode(Display *display, KeyCode kc); |
59 | |
60 | |
61 #ifdef X_HAVE_UTF8_STRING | |
62 Uint32 Utf8ToUcs4(const Uint8 *utf8) | |
63 { | |
64 Uint32 c; | |
65 int i = 1; | |
66 int noOctets = 0; | |
67 int firstOctetMask = 0; | |
68 unsigned char firstOctet = utf8[0]; | |
69 if (firstOctet < 0x80) { | |
70 /* | |
71 Characters in the range: | |
72 00000000 to 01111111 (ASCII Range) | |
73 are stored in one octet: | |
74 0xxxxxxx (The same as its ASCII representation) | |
75 The least 6 significant bits of the first octet is the most 6 significant nonzero bits | |
76 of the UCS4 representation. | |
77 */ | |
78 noOctets = 1; | |
79 firstOctetMask = 0x7F; /* 0(1111111) - The most significant bit is ignored */ | |
80 } else if ((firstOctet & 0xE0) /* get the most 3 significant bits by AND'ing with 11100000 */ | |
81 == 0xC0 ) { /* see if those 3 bits are 110. If so, the char is in this range */ | |
82 /* | |
83 Characters in the range: | |
84 00000000 10000000 to 00000111 11111111 | |
85 are stored in two octets: | |
86 110xxxxx 10xxxxxx | |
87 The least 5 significant bits of the first octet is the most 5 significant nonzero bits | |
88 of the UCS4 representation. | |
89 */ | |
90 noOctets = 2; | |
91 firstOctetMask = 0x1F; /* 000(11111) - The most 3 significant bits are ignored */ | |
92 } else if ((firstOctet & 0xF0) /* get the most 4 significant bits by AND'ing with 11110000 */ | |
93 == 0xE0) { /* see if those 4 bits are 1110. If so, the char is in this range */ | |
94 /* | |
95 Characters in the range: | |
96 00001000 00000000 to 11111111 11111111 | |
97 are stored in three octets: | |
98 1110xxxx 10xxxxxx 10xxxxxx | |
99 The least 4 significant bits of the first octet is the most 4 significant nonzero bits | |
100 of the UCS4 representation. | |
101 */ | |
102 noOctets = 3; | |
103 firstOctetMask = 0x0F; /* 0000(1111) - The most 4 significant bits are ignored */ | |
104 } else if ((firstOctet & 0xF8) /* get the most 5 significant bits by AND'ing with 11111000 */ | |
105 == 0xF0) { /* see if those 5 bits are 11110. If so, the char is in this range */ | |
106 /* | |
107 Characters in the range: | |
108 00000001 00000000 00000000 to 00011111 11111111 11111111 | |
109 are stored in four octets: | |
110 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | |
111 The least 3 significant bits of the first octet is the most 3 significant nonzero bits | |
112 of the UCS4 representation. | |
113 */ | |
114 noOctets = 4; | |
115 firstOctetMask = 0x07; /* 11110(111) - The most 5 significant bits are ignored */ | |
116 } else if ((firstOctet & 0xFC) /* get the most 6 significant bits by AND'ing with 11111100 */ | |
117 == 0xF8) { /* see if those 6 bits are 111110. If so, the char is in this range */ | |
118 /* | |
119 Characters in the range: | |
120 00000000 00100000 00000000 00000000 to | |
121 00000011 11111111 11111111 11111111 | |
122 are stored in five octets: | |
123 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | |
124 The least 2 significant bits of the first octet is the most 2 significant nonzero bits | |
125 of the UCS4 representation. | |
126 */ | |
127 noOctets = 5; | |
128 firstOctetMask = 0x03; /* 111110(11) - The most 6 significant bits are ignored */ | |
129 } else if ((firstOctet & 0xFE) /* get the most 7 significant bits by AND'ing with 11111110 */ | |
130 == 0xFC) { /* see if those 7 bits are 1111110. If so, the char is in this range */ | |
131 /* | |
132 Characters in the range: | |
133 00000100 00000000 00000000 00000000 to | |
134 01111111 11111111 11111111 11111111 | |
135 are stored in six octets: | |
136 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx | |
137 The least significant bit of the first octet is the most significant nonzero bit | |
138 of the UCS4 representation. | |
139 */ | |
140 noOctets = 6; | |
141 firstOctetMask = 0x01; /* 1111110(1) - The most 7 significant bits are ignored */ | |
142 } else | |
143 return 0; /* The given chunk is not a valid UTF-8 encoded Unicode character */ | |
144 | |
145 /* | |
146 The least noOctets significant bits of the first octet is the most 2 significant nonzero bits | |
147 of the UCS4 representation. | |
148 The first 6 bits of the UCS4 representation is the least 8-noOctets-1 significant bits of | |
149 firstOctet if the character is not ASCII. If so, it's the least 7 significant bits of firstOctet. | |
150 This done by AND'ing firstOctet with its mask to trim the bits used for identifying the | |
151 number of continuing octets (if any) and leave only the free bits (the x's) | |
152 Sample: | |
153 1-octet: 0xxxxxxx & 01111111 = 0xxxxxxx | |
154 2-octets: 110xxxxx & 00011111 = 000xxxxx | |
155 */ | |
156 c = firstOctet & firstOctetMask; | |
157 | |
158 /* Now, start filling c.ucs4 with the bits from the continuing octets from utf8. */ | |
159 for (i = 1; i < noOctets; i++) { | |
160 /* A valid continuing octet is of the form 10xxxxxx */ | |
161 if ((utf8[i] & 0xC0) /* get the most 2 significant bits by AND'ing with 11000000 */ | |
162 != 0x80) /* see if those 2 bits are 10. If not, the is a malformed sequence. */ | |
163 /*The given chunk is a partial sequence at the end of a string that could | |
164 begin a valid character */ | |
165 return 0; | |
166 | |
167 /* Make room for the next 6-bits */ | |
168 c <<= 6; | |
169 | |
170 /* | |
171 Take only the least 6 significance bits of the current octet (utf8[i]) and fill the created room | |
172 of c.ucs4 with them. | |
173 This done by AND'ing utf8[i] with 00111111 and the OR'ing the result with c.ucs4. | |
174 */ | |
175 c |= utf8[i] & 0x3F; | |
176 } | |
177 return c; | |
178 } | |
179 #endif | |
0 | 180 |
181 /* Check to see if this is a repeated key. | |
182 (idea shamelessly lifted from GII -- thanks guys! :) | |
183 */ | |
184 static int X11_KeyRepeat(Display *display, XEvent *event) | |
185 { | |
186 XEvent peekevent; | |
187 int repeated; | |
188 | |
189 repeated = 0; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
190 if ( XPending(display) ) { |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
191 XPeekEvent(display, &peekevent); |
0 | 192 if ( (peekevent.type == KeyPress) && |
193 (peekevent.xkey.keycode == event->xkey.keycode) && | |
12
34d956b20f75
Fix key repeat detection on newer X servers
Sam Lantinga <slouken@lokigames.com>
parents:
8
diff
changeset
|
194 ((peekevent.xkey.time-event->xkey.time) < 2) ) { |
0 | 195 repeated = 1; |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
196 XNextEvent(display, &peekevent); |
0 | 197 } |
198 } | |
199 return(repeated); | |
200 } | |
201 | |
202 /* Note: The X server buffers and accumulates mouse motion events, so | |
203 the motion event generated by the warp may not appear exactly as we | |
204 expect it to. We work around this (and improve performance) by only | |
205 warping the pointer when it reaches the edge, and then wait for it. | |
206 */ | |
207 #define MOUSE_FUDGE_FACTOR 8 | |
208 | |
209 static __inline__ int X11_WarpedMotion(_THIS, XEvent *xevent) | |
210 { | |
211 int w, h, i; | |
212 int deltax, deltay; | |
213 int posted; | |
214 | |
215 w = SDL_VideoSurface->w; | |
216 h = SDL_VideoSurface->h; | |
217 deltax = xevent->xmotion.x - mouse_last.x; | |
218 deltay = xevent->xmotion.y - mouse_last.y; | |
219 #ifdef DEBUG_MOTION | |
220 printf("Warped mouse motion: %d,%d\n", deltax, deltay); | |
221 #endif | |
222 mouse_last.x = xevent->xmotion.x; | |
223 mouse_last.y = xevent->xmotion.y; | |
224 posted = SDL_PrivateMouseMotion(0, 1, deltax, deltay); | |
225 | |
226 if ( (xevent->xmotion.x < MOUSE_FUDGE_FACTOR) || | |
227 (xevent->xmotion.x > (w-MOUSE_FUDGE_FACTOR)) || | |
228 (xevent->xmotion.y < MOUSE_FUDGE_FACTOR) || | |
229 (xevent->xmotion.y > (h-MOUSE_FUDGE_FACTOR)) ) { | |
230 /* Get the events that have accumulated */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
231 while ( XCheckTypedEvent(SDL_Display, MotionNotify, xevent) ) { |
0 | 232 deltax = xevent->xmotion.x - mouse_last.x; |
233 deltay = xevent->xmotion.y - mouse_last.y; | |
234 #ifdef DEBUG_MOTION | |
235 printf("Extra mouse motion: %d,%d\n", deltax, deltay); | |
236 #endif | |
237 mouse_last.x = xevent->xmotion.x; | |
238 mouse_last.y = xevent->xmotion.y; | |
239 posted += SDL_PrivateMouseMotion(0, 1, deltax, deltay); | |
240 } | |
241 mouse_last.x = w/2; | |
242 mouse_last.y = h/2; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
243 XWarpPointer(SDL_Display, None, SDL_Window, 0, 0, 0, 0, |
0 | 244 mouse_last.x, mouse_last.y); |
245 for ( i=0; i<10; ++i ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
246 XMaskEvent(SDL_Display, PointerMotionMask, xevent); |
0 | 247 if ( (xevent->xmotion.x > |
248 (mouse_last.x-MOUSE_FUDGE_FACTOR)) && | |
249 (xevent->xmotion.x < | |
250 (mouse_last.x+MOUSE_FUDGE_FACTOR)) && | |
251 (xevent->xmotion.y > | |
252 (mouse_last.y-MOUSE_FUDGE_FACTOR)) && | |
253 (xevent->xmotion.y < | |
254 (mouse_last.y+MOUSE_FUDGE_FACTOR)) ) { | |
255 break; | |
256 } | |
257 #ifdef DEBUG_XEVENTS | |
258 printf("Lost mouse motion: %d,%d\n", xevent->xmotion.x, xevent->xmotion.y); | |
259 #endif | |
260 } | |
261 #ifdef DEBUG_XEVENTS | |
262 if ( i == 10 ) { | |
263 printf("Warning: didn't detect mouse warp motion\n"); | |
264 } | |
265 #endif | |
266 } | |
267 return(posted); | |
268 } | |
269 | |
270 static int X11_DispatchEvent(_THIS) | |
271 { | |
272 int posted; | |
273 XEvent xevent; | |
274 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1328
diff
changeset
|
275 SDL_memset(&xevent, '\0', sizeof (XEvent)); /* valgrind fix. --ryan. */ |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
276 XNextEvent(SDL_Display, &xevent); |
0 | 277 |
278 posted = 0; | |
279 switch (xevent.type) { | |
280 | |
281 /* Gaining mouse coverage? */ | |
282 case EnterNotify: { | |
283 #ifdef DEBUG_XEVENTS | |
82
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
284 printf("EnterNotify! (%d,%d)\n", xevent.xcrossing.x, xevent.xcrossing.y); |
0 | 285 if ( xevent.xcrossing.mode == NotifyGrab ) |
286 printf("Mode: NotifyGrab\n"); | |
287 if ( xevent.xcrossing.mode == NotifyUngrab ) | |
288 printf("Mode: NotifyUngrab\n"); | |
289 #endif | |
290 if ( (xevent.xcrossing.mode != NotifyGrab) && | |
291 (xevent.xcrossing.mode != NotifyUngrab) ) { | |
82
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
292 if ( this->input_grab == SDL_GRAB_OFF ) { |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
293 posted = SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
294 } |
1789 | 295 posted = SDL_PrivateMouseMotion(0, 0, |
296 xevent.xcrossing.x, | |
297 xevent.xcrossing.y); | |
0 | 298 } |
299 } | |
300 break; | |
301 | |
302 /* Losing mouse coverage? */ | |
303 case LeaveNotify: { | |
304 #ifdef DEBUG_XEVENTS | |
82
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
305 printf("LeaveNotify! (%d,%d)\n", xevent.xcrossing.x, xevent.xcrossing.y); |
0 | 306 if ( xevent.xcrossing.mode == NotifyGrab ) |
307 printf("Mode: NotifyGrab\n"); | |
308 if ( xevent.xcrossing.mode == NotifyUngrab ) | |
309 printf("Mode: NotifyUngrab\n"); | |
310 #endif | |
311 if ( (xevent.xcrossing.mode != NotifyGrab) && | |
496
864a66f028d8
Don't be fooled by unclutter - the mouse isn't really leaving our window
Sam Lantinga <slouken@libsdl.org>
parents:
412
diff
changeset
|
312 (xevent.xcrossing.mode != NotifyUngrab) && |
864a66f028d8
Don't be fooled by unclutter - the mouse isn't really leaving our window
Sam Lantinga <slouken@libsdl.org>
parents:
412
diff
changeset
|
313 (xevent.xcrossing.detail != NotifyInferior) ) { |
82
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
314 if ( this->input_grab == SDL_GRAB_OFF ) { |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
315 posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
316 } else { |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
317 posted = SDL_PrivateMouseMotion(0, 0, |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
318 xevent.xcrossing.x, |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
319 xevent.xcrossing.y); |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
320 } |
0 | 321 } |
322 } | |
323 break; | |
324 | |
325 /* Gaining input focus? */ | |
326 case FocusIn: { | |
327 #ifdef DEBUG_XEVENTS | |
328 printf("FocusIn!\n"); | |
329 #endif | |
330 posted = SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS); | |
331 | |
1328
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
332 #ifdef X_HAVE_UTF8_STRING |
1327 | 333 if ( SDL_IC != NULL ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
334 XSetICFocus(SDL_IC); |
1327 | 335 } |
1328
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
336 #endif |
0 | 337 /* Queue entry into fullscreen mode */ |
338 switch_waiting = 0x01 | SDL_FULLSCREEN; | |
339 switch_time = SDL_GetTicks() + 1500; | |
340 } | |
341 break; | |
342 | |
343 /* Losing input focus? */ | |
344 case FocusOut: { | |
345 #ifdef DEBUG_XEVENTS | |
346 printf("FocusOut!\n"); | |
347 #endif | |
348 posted = SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS); | |
349 | |
1328
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
350 #ifdef X_HAVE_UTF8_STRING |
1327 | 351 if ( SDL_IC != NULL ) { |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
352 XUnsetICFocus(SDL_IC); |
1327 | 353 } |
1328
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
354 #endif |
0 | 355 /* Queue leaving fullscreen mode */ |
356 switch_waiting = 0x01; | |
357 switch_time = SDL_GetTicks() + 200; | |
358 } | |
359 break; | |
360 | |
361 /* Generated upon EnterWindow and FocusIn */ | |
362 case KeymapNotify: { | |
14
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
363 #ifdef DEBUG_XEVENTS |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
364 printf("KeymapNotify!\n"); |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
365 #endif |
1327 | 366 X11_SetKeyboardState(SDL_Display, xevent.xkeymap.key_vector); |
0 | 367 } |
368 break; | |
369 | |
370 /* Mouse motion? */ | |
371 case MotionNotify: { | |
372 if ( SDL_VideoSurface ) { | |
373 if ( mouse_relative ) { | |
374 if ( using_dga & DGA_MOUSE ) { | |
375 #ifdef DEBUG_MOTION | |
376 printf("DGA motion: %d,%d\n", xevent.xmotion.x_root, xevent.xmotion.y_root); | |
377 #endif | |
378 posted = SDL_PrivateMouseMotion(0, 1, | |
379 xevent.xmotion.x_root, | |
380 xevent.xmotion.y_root); | |
381 } else { | |
382 posted = X11_WarpedMotion(this,&xevent); | |
383 } | |
384 } else { | |
82
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
385 #ifdef DEBUG_MOTION |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
386 printf("X11 motion: %d,%d\n", xevent.xmotion.x, xevent.xmotion.y); |
2bddc38a9f5d
When the mouse is grabbed, send the application the motion associated with
Sam Lantinga <slouken@lokigames.com>
parents:
75
diff
changeset
|
387 #endif |
0 | 388 posted = SDL_PrivateMouseMotion(0, 0, |
389 xevent.xmotion.x, | |
390 xevent.xmotion.y); | |
391 } | |
392 } | |
393 } | |
394 break; | |
395 | |
396 /* Mouse button press? */ | |
397 case ButtonPress: { | |
398 posted = SDL_PrivateMouseButton(SDL_PRESSED, | |
399 xevent.xbutton.button, 0, 0); | |
400 } | |
401 break; | |
402 | |
403 /* Mouse button release? */ | |
404 case ButtonRelease: { | |
405 posted = SDL_PrivateMouseButton(SDL_RELEASED, | |
406 xevent.xbutton.button, 0, 0); | |
407 } | |
408 break; | |
409 | |
410 /* Key press? */ | |
411 case KeyPress: { | |
1327 | 412 static SDL_keysym saved_keysym; |
0 | 413 SDL_keysym keysym; |
1327 | 414 KeyCode keycode = xevent.xkey.keycode; |
14
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
415 |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
416 #ifdef DEBUG_XEVENTS |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
417 printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode); |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
418 #endif |
1327 | 419 /* Get the translated SDL virtual keysym */ |
420 if ( keycode ) { | |
421 keysym.scancode = keycode; | |
422 keysym.sym = X11_TranslateKeycode(SDL_Display, keycode); | |
423 keysym.mod = KMOD_NONE; | |
424 keysym.unicode = 0; | |
425 } else { | |
426 keysym = saved_keysym; | |
427 } | |
428 | |
429 /* If we're not doing translation, we're done! */ | |
430 if ( !SDL_TranslateUNICODE ) { | |
431 posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym); | |
432 break; | |
433 } | |
434 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
435 if ( XFilterEvent(&xevent, None) ) { |
1327 | 436 if ( xevent.xkey.keycode ) { |
437 posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym); | |
438 } else { | |
439 /* Save event to be associated with IM text | |
440 In 1.3 we'll have a text event instead.. */ | |
441 saved_keysym = keysym; | |
442 } | |
443 break; | |
444 } | |
445 | |
446 /* Look up the translated value for the key event */ | |
447 #ifdef X_HAVE_UTF8_STRING | |
448 if ( SDL_IC != NULL ) { | |
449 static Status state; | |
450 /* A UTF-8 character can be at most 6 bytes */ | |
451 char keybuf[6]; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
452 if ( Xutf8LookupString(SDL_IC, &xevent.xkey, |
1327 | 453 keybuf, sizeof(keybuf), |
454 NULL, &state) ) { | |
455 keysym.unicode = Utf8ToUcs4((Uint8*)keybuf); | |
456 } | |
457 } | |
458 else | |
459 #endif | |
460 { | |
461 static XComposeStatus state; | |
462 char keybuf[32]; | |
463 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
464 if ( XLookupString(&xevent.xkey, |
1327 | 465 keybuf, sizeof(keybuf), |
466 NULL, &state) ) { | |
467 /* | |
468 * FIXME: XLookupString() may yield more than one | |
469 * character, so we need a mechanism to allow for | |
470 * this (perhaps null keypress events with a | |
471 * unicode value) | |
472 */ | |
473 keysym.unicode = (Uint8)keybuf[0]; | |
474 } | |
475 } | |
476 posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym); | |
0 | 477 } |
478 break; | |
479 | |
480 /* Key release? */ | |
481 case KeyRelease: { | |
482 SDL_keysym keysym; | |
1327 | 483 KeyCode keycode = xevent.xkey.keycode; |
0 | 484 |
14
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
485 #ifdef DEBUG_XEVENTS |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
486 printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode); |
c3e9d4a623c1
Fixed stuck keys when changing the video mode
Sam Lantinga <slouken@lokigames.com>
parents:
12
diff
changeset
|
487 #endif |
0 | 488 /* Check to see if this is a repeated key */ |
1327 | 489 if ( X11_KeyRepeat(SDL_Display, &xevent) ) { |
490 break; | |
0 | 491 } |
1327 | 492 |
493 /* Get the translated SDL virtual keysym */ | |
494 keysym.scancode = keycode; | |
495 keysym.sym = X11_TranslateKeycode(SDL_Display, keycode); | |
496 keysym.mod = KMOD_NONE; | |
497 keysym.unicode = 0; | |
498 | |
499 posted = SDL_PrivateKeyboard(SDL_RELEASED, &keysym); | |
0 | 500 } |
501 break; | |
502 | |
503 /* Have we been iconified? */ | |
504 case UnmapNotify: { | |
505 #ifdef DEBUG_XEVENTS | |
506 printf("UnmapNotify!\n"); | |
507 #endif | |
508 /* If we're active, make ourselves inactive */ | |
509 if ( SDL_GetAppState() & SDL_APPACTIVE ) { | |
510 /* Swap out the gamma before we go inactive */ | |
511 X11_SwapVidModeGamma(this); | |
512 | |
513 /* Send an internal deactivate event */ | |
514 posted = SDL_PrivateAppActive(0, | |
515 SDL_APPACTIVE|SDL_APPINPUTFOCUS); | |
516 } | |
517 } | |
518 break; | |
519 | |
520 /* Have we been restored? */ | |
521 case MapNotify: { | |
522 #ifdef DEBUG_XEVENTS | |
523 printf("MapNotify!\n"); | |
524 #endif | |
525 /* If we're not active, make ourselves active */ | |
526 if ( !(SDL_GetAppState() & SDL_APPACTIVE) ) { | |
527 /* Send an internal activate event */ | |
528 posted = SDL_PrivateAppActive(1, SDL_APPACTIVE); | |
529 | |
530 /* Now that we're active, swap the gamma back */ | |
531 X11_SwapVidModeGamma(this); | |
532 } | |
533 | |
534 if ( SDL_VideoSurface && | |
535 (SDL_VideoSurface->flags & SDL_FULLSCREEN) ) { | |
536 X11_EnterFullScreen(this); | |
537 } else { | |
538 X11_GrabInputNoLock(this, this->input_grab); | |
539 } | |
8
5574376c451d
Fixed relative motion checking after restore under X11
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
540 X11_CheckMouseModeNoLock(this); |
5574376c451d
Fixed relative motion checking after restore under X11
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
541 |
0 | 542 if ( SDL_VideoSurface ) { |
543 X11_RefreshDisplay(this); | |
544 } | |
545 } | |
546 break; | |
547 | |
548 /* Have we been resized or moved? */ | |
549 case ConfigureNotify: { | |
550 #ifdef DEBUG_XEVENTS | |
551 printf("ConfigureNotify! (resize: %dx%d)\n", xevent.xconfigure.width, xevent.xconfigure.height); | |
552 #endif | |
553 if ( SDL_VideoSurface ) { | |
554 if ((xevent.xconfigure.width != SDL_VideoSurface->w) || | |
555 (xevent.xconfigure.height != SDL_VideoSurface->h)) { | |
556 /* FIXME: Find a better fix for the bug with KDE 1.2 */ | |
557 if ( ! ((xevent.xconfigure.width == 32) && | |
558 (xevent.xconfigure.height == 32)) ) { | |
559 SDL_PrivateResize(xevent.xconfigure.width, | |
560 xevent.xconfigure.height); | |
561 } | |
562 } else { | |
563 /* OpenGL windows need to know about the change */ | |
564 if ( SDL_VideoSurface->flags & SDL_OPENGL ) { | |
565 SDL_PrivateExpose(); | |
566 } | |
567 } | |
568 } | |
569 } | |
570 break; | |
571 | |
572 /* Have we been requested to quit (or another client message?) */ | |
573 case ClientMessage: { | |
574 if ( (xevent.xclient.format == 32) && | |
575 (xevent.xclient.data.l[0] == WM_DELETE_WINDOW) ) | |
576 { | |
577 posted = SDL_PrivateQuit(); | |
578 } else | |
579 if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) { | |
580 SDL_SysWMmsg wmmsg; | |
581 | |
582 SDL_VERSION(&wmmsg.version); | |
583 wmmsg.subsystem = SDL_SYSWM_X11; | |
584 wmmsg.event.xevent = xevent; | |
585 posted = SDL_PrivateSysWMEvent(&wmmsg); | |
586 } | |
587 } | |
588 break; | |
589 | |
590 /* Do we need to refresh ourselves? */ | |
591 case Expose: { | |
592 #ifdef DEBUG_XEVENTS | |
593 printf("Expose (count = %d)\n", xevent.xexpose.count); | |
594 #endif | |
595 if ( SDL_VideoSurface && (xevent.xexpose.count == 0) ) { | |
161
eb6b76a95f2d
An expose event is now sent when using XVideo output.
Sam Lantinga <slouken@libsdl.org>
parents:
111
diff
changeset
|
596 X11_RefreshDisplay(this); |
0 | 597 } |
598 } | |
599 break; | |
600 | |
601 default: { | |
602 #ifdef DEBUG_XEVENTS | |
603 printf("Unhandled event %d\n", xevent.type); | |
604 #endif | |
605 /* Only post the event if we're watching for it */ | |
606 if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) { | |
607 SDL_SysWMmsg wmmsg; | |
608 | |
609 SDL_VERSION(&wmmsg.version); | |
610 wmmsg.subsystem = SDL_SYSWM_X11; | |
611 wmmsg.event.xevent = xevent; | |
612 posted = SDL_PrivateSysWMEvent(&wmmsg); | |
613 } | |
614 } | |
615 break; | |
616 } | |
617 return(posted); | |
618 } | |
619 | |
620 /* Ack! XPending() actually performs a blocking read if no events available */ | |
621 int X11_Pending(Display *display) | |
622 { | |
623 /* Flush the display connection and look to see if events are queued */ | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
624 XFlush(display); |
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
625 if ( XEventsQueued(display, QueuedAlready) ) { |
0 | 626 return(1); |
627 } | |
628 | |
629 /* More drastic measures are required -- see if X is ready to talk */ | |
630 { | |
631 static struct timeval zero_time; /* static == 0 */ | |
632 int x11_fd; | |
633 fd_set fdset; | |
634 | |
635 x11_fd = ConnectionNumber(display); | |
636 FD_ZERO(&fdset); | |
637 FD_SET(x11_fd, &fdset); | |
638 if ( select(x11_fd+1, &fdset, NULL, NULL, &zero_time) == 1 ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
639 return(XPending(display)); |
0 | 640 } |
641 } | |
642 | |
643 /* Oh well, nothing is ready .. */ | |
644 return(0); | |
645 } | |
646 | |
647 void X11_PumpEvents(_THIS) | |
648 { | |
649 int pending; | |
650 | |
651 /* Keep processing pending events */ | |
652 pending = 0; | |
653 while ( X11_Pending(SDL_Display) ) { | |
654 X11_DispatchEvent(this); | |
655 ++pending; | |
656 } | |
657 if ( switch_waiting ) { | |
658 Uint32 now; | |
659 | |
660 now = SDL_GetTicks(); | |
661 if ( pending || !SDL_VideoSurface ) { | |
662 /* Try again later... */ | |
663 if ( switch_waiting & SDL_FULLSCREEN ) { | |
664 switch_time = now + 1500; | |
665 } else { | |
666 switch_time = now + 200; | |
667 } | |
1740 | 668 } else if ( (int)(switch_time-now) <= 0 ) { |
0 | 669 Uint32 go_fullscreen; |
670 | |
671 go_fullscreen = switch_waiting & SDL_FULLSCREEN; | |
672 switch_waiting = 0; | |
673 if ( SDL_VideoSurface->flags & SDL_FULLSCREEN ) { | |
674 if ( go_fullscreen ) { | |
675 X11_EnterFullScreen(this); | |
676 } else { | |
677 X11_LeaveFullScreen(this); | |
678 } | |
679 } | |
680 /* Handle focus in/out when grabbed */ | |
681 if ( go_fullscreen ) { | |
682 X11_GrabInputNoLock(this, this->input_grab); | |
683 } else { | |
684 X11_GrabInputNoLock(this, SDL_GRAB_OFF); | |
685 } | |
686 X11_CheckMouseModeNoLock(this); | |
687 } | |
688 } | |
689 } | |
690 | |
691 void X11_InitKeymap(void) | |
692 { | |
693 int i; | |
694 | |
695 /* Odd keys used in international keyboards */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
696 for ( i=0; i<SDL_arraysize(ODD_keymap); ++i ) |
0 | 697 ODD_keymap[i] = SDLK_UNKNOWN; |
698 | |
1327 | 699 /* Some of these might be mappable to an existing SDLK_ code */ |
700 ODD_keymap[XK_dead_grave&0xFF] = SDLK_COMPOSE; | |
701 ODD_keymap[XK_dead_acute&0xFF] = SDLK_COMPOSE; | |
702 ODD_keymap[XK_dead_tilde&0xFF] = SDLK_COMPOSE; | |
703 ODD_keymap[XK_dead_macron&0xFF] = SDLK_COMPOSE; | |
704 ODD_keymap[XK_dead_breve&0xFF] = SDLK_COMPOSE; | |
705 ODD_keymap[XK_dead_abovedot&0xFF] = SDLK_COMPOSE; | |
706 ODD_keymap[XK_dead_diaeresis&0xFF] = SDLK_COMPOSE; | |
707 ODD_keymap[XK_dead_abovering&0xFF] = SDLK_COMPOSE; | |
708 ODD_keymap[XK_dead_doubleacute&0xFF] = SDLK_COMPOSE; | |
709 ODD_keymap[XK_dead_caron&0xFF] = SDLK_COMPOSE; | |
710 ODD_keymap[XK_dead_cedilla&0xFF] = SDLK_COMPOSE; | |
711 ODD_keymap[XK_dead_ogonek&0xFF] = SDLK_COMPOSE; | |
712 ODD_keymap[XK_dead_iota&0xFF] = SDLK_COMPOSE; | |
713 ODD_keymap[XK_dead_voiced_sound&0xFF] = SDLK_COMPOSE; | |
714 ODD_keymap[XK_dead_semivoiced_sound&0xFF] = SDLK_COMPOSE; | |
715 ODD_keymap[XK_dead_belowdot&0xFF] = SDLK_COMPOSE; | |
1328
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
716 #ifdef XK_dead_hook |
1327 | 717 ODD_keymap[XK_dead_hook&0xFF] = SDLK_COMPOSE; |
1328
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
718 #endif |
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
719 #ifdef XK_dead_horn |
1327 | 720 ODD_keymap[XK_dead_horn&0xFF] = SDLK_COMPOSE; |
1328
27ddb06a0bca
Date: Sat, 04 Feb 2006 19:47:23 +0900
Sam Lantinga <slouken@libsdl.org>
parents:
1327
diff
changeset
|
721 #endif |
1327 | 722 |
0 | 723 #ifdef XK_dead_circumflex |
724 /* These X keysyms have 0xFE as the high byte */ | |
725 ODD_keymap[XK_dead_circumflex&0xFF] = SDLK_CARET; | |
726 #endif | |
805
df1a3218b468
Date: Wed, 04 Feb 2004 13:51:56 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
727 #ifdef XK_ISO_Level3_Shift |
df1a3218b468
Date: Wed, 04 Feb 2004 13:51:56 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
728 ODD_keymap[XK_ISO_Level3_Shift&0xFF] = SDLK_MODE; /* "Alt Gr" key */ |
df1a3218b468
Date: Wed, 04 Feb 2004 13:51:56 +0100
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
729 #endif |
0 | 730 |
731 /* Map the miscellaneous keys */ | |
1379
c0a74f199ecf
Use only safe string functions
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
732 for ( i=0; i<SDL_arraysize(MISC_keymap); ++i ) |
0 | 733 MISC_keymap[i] = SDLK_UNKNOWN; |
734 | |
735 /* These X keysyms have 0xFF as the high byte */ | |
736 MISC_keymap[XK_BackSpace&0xFF] = SDLK_BACKSPACE; | |
737 MISC_keymap[XK_Tab&0xFF] = SDLK_TAB; | |
738 MISC_keymap[XK_Clear&0xFF] = SDLK_CLEAR; | |
739 MISC_keymap[XK_Return&0xFF] = SDLK_RETURN; | |
740 MISC_keymap[XK_Pause&0xFF] = SDLK_PAUSE; | |
741 MISC_keymap[XK_Escape&0xFF] = SDLK_ESCAPE; | |
742 MISC_keymap[XK_Delete&0xFF] = SDLK_DELETE; | |
743 | |
744 MISC_keymap[XK_KP_0&0xFF] = SDLK_KP0; /* Keypad 0-9 */ | |
745 MISC_keymap[XK_KP_1&0xFF] = SDLK_KP1; | |
746 MISC_keymap[XK_KP_2&0xFF] = SDLK_KP2; | |
747 MISC_keymap[XK_KP_3&0xFF] = SDLK_KP3; | |
748 MISC_keymap[XK_KP_4&0xFF] = SDLK_KP4; | |
749 MISC_keymap[XK_KP_5&0xFF] = SDLK_KP5; | |
750 MISC_keymap[XK_KP_6&0xFF] = SDLK_KP6; | |
751 MISC_keymap[XK_KP_7&0xFF] = SDLK_KP7; | |
752 MISC_keymap[XK_KP_8&0xFF] = SDLK_KP8; | |
753 MISC_keymap[XK_KP_9&0xFF] = SDLK_KP9; | |
754 MISC_keymap[XK_KP_Insert&0xFF] = SDLK_KP0; | |
755 MISC_keymap[XK_KP_End&0xFF] = SDLK_KP1; | |
756 MISC_keymap[XK_KP_Down&0xFF] = SDLK_KP2; | |
757 MISC_keymap[XK_KP_Page_Down&0xFF] = SDLK_KP3; | |
758 MISC_keymap[XK_KP_Left&0xFF] = SDLK_KP4; | |
759 MISC_keymap[XK_KP_Begin&0xFF] = SDLK_KP5; | |
760 MISC_keymap[XK_KP_Right&0xFF] = SDLK_KP6; | |
761 MISC_keymap[XK_KP_Home&0xFF] = SDLK_KP7; | |
762 MISC_keymap[XK_KP_Up&0xFF] = SDLK_KP8; | |
763 MISC_keymap[XK_KP_Page_Up&0xFF] = SDLK_KP9; | |
764 MISC_keymap[XK_KP_Delete&0xFF] = SDLK_KP_PERIOD; | |
765 MISC_keymap[XK_KP_Decimal&0xFF] = SDLK_KP_PERIOD; | |
766 MISC_keymap[XK_KP_Divide&0xFF] = SDLK_KP_DIVIDE; | |
767 MISC_keymap[XK_KP_Multiply&0xFF] = SDLK_KP_MULTIPLY; | |
768 MISC_keymap[XK_KP_Subtract&0xFF] = SDLK_KP_MINUS; | |
769 MISC_keymap[XK_KP_Add&0xFF] = SDLK_KP_PLUS; | |
770 MISC_keymap[XK_KP_Enter&0xFF] = SDLK_KP_ENTER; | |
771 MISC_keymap[XK_KP_Equal&0xFF] = SDLK_KP_EQUALS; | |
772 | |
773 MISC_keymap[XK_Up&0xFF] = SDLK_UP; | |
774 MISC_keymap[XK_Down&0xFF] = SDLK_DOWN; | |
775 MISC_keymap[XK_Right&0xFF] = SDLK_RIGHT; | |
776 MISC_keymap[XK_Left&0xFF] = SDLK_LEFT; | |
777 MISC_keymap[XK_Insert&0xFF] = SDLK_INSERT; | |
778 MISC_keymap[XK_Home&0xFF] = SDLK_HOME; | |
779 MISC_keymap[XK_End&0xFF] = SDLK_END; | |
780 MISC_keymap[XK_Page_Up&0xFF] = SDLK_PAGEUP; | |
781 MISC_keymap[XK_Page_Down&0xFF] = SDLK_PAGEDOWN; | |
782 | |
783 MISC_keymap[XK_F1&0xFF] = SDLK_F1; | |
784 MISC_keymap[XK_F2&0xFF] = SDLK_F2; | |
785 MISC_keymap[XK_F3&0xFF] = SDLK_F3; | |
786 MISC_keymap[XK_F4&0xFF] = SDLK_F4; | |
787 MISC_keymap[XK_F5&0xFF] = SDLK_F5; | |
788 MISC_keymap[XK_F6&0xFF] = SDLK_F6; | |
789 MISC_keymap[XK_F7&0xFF] = SDLK_F7; | |
790 MISC_keymap[XK_F8&0xFF] = SDLK_F8; | |
791 MISC_keymap[XK_F9&0xFF] = SDLK_F9; | |
792 MISC_keymap[XK_F10&0xFF] = SDLK_F10; | |
793 MISC_keymap[XK_F11&0xFF] = SDLK_F11; | |
794 MISC_keymap[XK_F12&0xFF] = SDLK_F12; | |
795 MISC_keymap[XK_F13&0xFF] = SDLK_F13; | |
796 MISC_keymap[XK_F14&0xFF] = SDLK_F14; | |
797 MISC_keymap[XK_F15&0xFF] = SDLK_F15; | |
798 | |
799 MISC_keymap[XK_Num_Lock&0xFF] = SDLK_NUMLOCK; | |
800 MISC_keymap[XK_Caps_Lock&0xFF] = SDLK_CAPSLOCK; | |
801 MISC_keymap[XK_Scroll_Lock&0xFF] = SDLK_SCROLLOCK; | |
802 MISC_keymap[XK_Shift_R&0xFF] = SDLK_RSHIFT; | |
803 MISC_keymap[XK_Shift_L&0xFF] = SDLK_LSHIFT; | |
804 MISC_keymap[XK_Control_R&0xFF] = SDLK_RCTRL; | |
805 MISC_keymap[XK_Control_L&0xFF] = SDLK_LCTRL; | |
806 MISC_keymap[XK_Alt_R&0xFF] = SDLK_RALT; | |
807 MISC_keymap[XK_Alt_L&0xFF] = SDLK_LALT; | |
808 MISC_keymap[XK_Meta_R&0xFF] = SDLK_RMETA; | |
809 MISC_keymap[XK_Meta_L&0xFF] = SDLK_LMETA; | |
810 MISC_keymap[XK_Super_L&0xFF] = SDLK_LSUPER; /* Left "Windows" */ | |
811 MISC_keymap[XK_Super_R&0xFF] = SDLK_RSUPER; /* Right "Windows */ | |
812 MISC_keymap[XK_Mode_switch&0xFF] = SDLK_MODE; /* "Alt Gr" key */ | |
813 MISC_keymap[XK_Multi_key&0xFF] = SDLK_COMPOSE; /* Multi-key compose */ | |
814 | |
815 MISC_keymap[XK_Help&0xFF] = SDLK_HELP; | |
816 MISC_keymap[XK_Print&0xFF] = SDLK_PRINT; | |
817 MISC_keymap[XK_Sys_Req&0xFF] = SDLK_SYSREQ; | |
818 MISC_keymap[XK_Break&0xFF] = SDLK_BREAK; | |
819 MISC_keymap[XK_Menu&0xFF] = SDLK_MENU; | |
820 MISC_keymap[XK_Hyper_R&0xFF] = SDLK_MENU; /* Windows "Menu" key */ | |
821 } | |
822 | |
1327 | 823 /* Get the translated SDL virtual keysym */ |
824 SDLKey X11_TranslateKeycode(Display *display, KeyCode kc) | |
0 | 825 { |
826 KeySym xsym; | |
1327 | 827 SDLKey key; |
0 | 828 |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
829 xsym = XKeycodeToKeysym(display, kc, 0); |
0 | 830 #ifdef DEBUG_KEYS |
1327 | 831 fprintf(stderr, "Translating key code %d -> 0x%.4x\n", kc, xsym); |
0 | 832 #endif |
1327 | 833 key = SDLK_UNKNOWN; |
0 | 834 if ( xsym ) { |
835 switch (xsym>>8) { | |
1327 | 836 case 0x1005FF: |
0 | 837 #ifdef SunXK_F36 |
1327 | 838 if ( xsym == SunXK_F36 ) |
839 key = SDLK_F11; | |
0 | 840 #endif |
841 #ifdef SunXK_F37 | |
1327 | 842 if ( xsym == SunXK_F37 ) |
843 key = SDLK_F12; | |
0 | 844 #endif |
1327 | 845 break; |
846 case 0x00: /* Latin 1 */ | |
847 key = (SDLKey)(xsym & 0xFF); | |
848 break; | |
849 case 0x01: /* Latin 2 */ | |
850 case 0x02: /* Latin 3 */ | |
851 case 0x03: /* Latin 4 */ | |
852 case 0x04: /* Katakana */ | |
853 case 0x05: /* Arabic */ | |
854 case 0x06: /* Cyrillic */ | |
855 case 0x07: /* Greek */ | |
856 case 0x08: /* Technical */ | |
857 case 0x0A: /* Publishing */ | |
858 case 0x0C: /* Hebrew */ | |
859 case 0x0D: /* Thai */ | |
860 /* These are wrong, but it's better than nothing */ | |
861 key = (SDLKey)(xsym & 0xFF); | |
862 break; | |
863 case 0xFE: | |
864 key = ODD_keymap[xsym&0xFF]; | |
865 break; | |
866 case 0xFF: | |
867 key = MISC_keymap[xsym&0xFF]; | |
868 break; | |
869 default: | |
870 /* | |
871 fprintf(stderr, "X11: Unhandled xsym, sym = 0x%04x\n", | |
0 | 872 (unsigned int)xsym); |
1327 | 873 */ |
874 break; | |
0 | 875 } |
876 } else { | |
877 /* X11 doesn't know how to translate the key! */ | |
878 switch (kc) { | |
1327 | 879 /* Caution: |
880 These keycodes are from the Microsoft Keyboard | |
881 */ | |
882 case 115: | |
883 key = SDLK_LSUPER; | |
884 break; | |
885 case 116: | |
886 key = SDLK_RSUPER; | |
887 break; | |
888 case 117: | |
889 key = SDLK_MENU; | |
890 break; | |
891 default: | |
892 /* | |
893 * no point in an error message; happens for | |
894 * several keys when we get a keymap notify | |
0 | 895 */ |
1327 | 896 break; |
0 | 897 } |
898 } | |
1327 | 899 return key; |
0 | 900 } |
901 | |
902 /* X11 modifier masks for various keys */ | |
903 static unsigned meta_l_mask, meta_r_mask, alt_l_mask, alt_r_mask; | |
904 static unsigned num_mask, mode_switch_mask; | |
905 | |
906 static void get_modifier_masks(Display *display) | |
907 { | |
908 static unsigned got_masks; | |
909 int i, j; | |
910 XModifierKeymap *xmods; | |
911 unsigned n; | |
912 | |
913 if(got_masks) | |
914 return; | |
915 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
916 xmods = XGetModifierMapping(display); |
0 | 917 n = xmods->max_keypermod; |
918 for(i = 3; i < 8; i++) { | |
919 for(j = 0; j < n; j++) { | |
920 KeyCode kc = xmods->modifiermap[i * n + j]; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
921 KeySym ks = XKeycodeToKeysym(display, kc, 0); |
0 | 922 unsigned mask = 1 << i; |
923 switch(ks) { | |
924 case XK_Num_Lock: | |
925 num_mask = mask; break; | |
926 case XK_Alt_L: | |
927 alt_l_mask = mask; break; | |
928 case XK_Alt_R: | |
929 alt_r_mask = mask; break; | |
930 case XK_Meta_L: | |
931 meta_l_mask = mask; break; | |
932 case XK_Meta_R: | |
933 meta_r_mask = mask; break; | |
934 case XK_Mode_switch: | |
935 mode_switch_mask = mask; break; | |
936 } | |
937 } | |
938 } | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
939 XFreeModifiermap(xmods); |
0 | 940 got_masks = 1; |
941 } | |
942 | |
943 | |
944 /* | |
945 * This function is semi-official; it is not officially exported and should | |
946 * not be considered part of the SDL API, but may be used by client code | |
947 * that *really* needs it (including legacy code). | |
948 * It is slow, though, and should be avoided if possible. | |
949 * | |
950 * Note that it isn't completely accurate either; in particular, multi-key | |
951 * sequences (dead accents, compose key sequences) will not work since the | |
952 * state has been irrevocably lost. | |
953 */ | |
954 Uint16 X11_KeyToUnicode(SDLKey keysym, SDLMod modifiers) | |
955 { | |
956 struct SDL_VideoDevice *this = current_video; | |
957 char keybuf[32]; | |
958 int i; | |
959 KeySym xsym = 0; | |
960 XKeyEvent xkey; | |
961 Uint16 unicode; | |
962 | |
963 if ( !this || !SDL_Display ) { | |
964 return 0; | |
965 } | |
966 | |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1328
diff
changeset
|
967 SDL_memset(&xkey, 0, sizeof(xkey)); |
0 | 968 xkey.display = SDL_Display; |
969 | |
970 xsym = keysym; /* last resort if not found */ | |
971 for (i = 0; i < 256; ++i) { | |
972 if ( MISC_keymap[i] == keysym ) { | |
973 xsym = 0xFF00 | i; | |
974 break; | |
975 } else if ( ODD_keymap[i] == keysym ) { | |
976 xsym = 0xFE00 | i; | |
977 break; | |
978 } | |
979 } | |
980 | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
981 xkey.keycode = XKeysymToKeycode(xkey.display, xsym); |
0 | 982 |
983 get_modifier_masks(SDL_Display); | |
984 if(modifiers & KMOD_SHIFT) | |
985 xkey.state |= ShiftMask; | |
986 if(modifiers & KMOD_CAPS) | |
987 xkey.state |= LockMask; | |
988 if(modifiers & KMOD_CTRL) | |
989 xkey.state |= ControlMask; | |
990 if(modifiers & KMOD_MODE) | |
991 xkey.state |= mode_switch_mask; | |
992 if(modifiers & KMOD_LALT) | |
993 xkey.state |= alt_l_mask; | |
994 if(modifiers & KMOD_RALT) | |
995 xkey.state |= alt_r_mask; | |
996 if(modifiers & KMOD_LMETA) | |
997 xkey.state |= meta_l_mask; | |
998 if(modifiers & KMOD_RMETA) | |
999 xkey.state |= meta_r_mask; | |
1000 if(modifiers & KMOD_NUM) | |
1001 xkey.state |= num_mask; | |
1002 | |
1003 unicode = 0; | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
1004 if ( XLookupString(&xkey, keybuf, sizeof(keybuf), NULL, NULL) ) |
0 | 1005 unicode = (unsigned char)keybuf[0]; |
1006 return(unicode); | |
1007 } | |
1008 | |
1178
9867f3d86e44
Real Unicode support for X11. Based on updated version of this patch:
Ryan C. Gordon <icculus@icculus.org>
parents:
1168
diff
changeset
|
1009 |
0 | 1010 /* |
1011 * Called when focus is regained, to read the keyboard state and generate | |
1012 * synthetic keypress/release events. | |
1013 * key_vec is a bit vector of keycodes (256 bits) | |
1014 */ | |
1327 | 1015 void X11_SetKeyboardState(Display *display, const char *key_vec) |
0 | 1016 { |
1017 char keys_return[32]; | |
412
ac59b067815b
Fix uninitialized variable warning
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
1018 int i; |
0 | 1019 Uint8 *kstate = SDL_GetKeyState(NULL); |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1020 SDLMod modstate; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1021 Window junk_window; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1022 int x, y; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1023 unsigned int mask; |
0 | 1024 |
1025 /* The first time the window is mapped, we initialize key state */ | |
1026 if ( ! key_vec ) { | |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
1027 XQueryKeymap(display, keys_return); |
0 | 1028 key_vec = keys_return; |
1029 } | |
1030 | |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1031 /* Get the keyboard modifier state */ |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1032 modstate = 0; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1033 get_modifier_masks(display); |
1575
3ba88cb7eb1b
Updated dynamic X11 code. See details in Bugzilla #170.
Ryan C. Gordon <icculus@icculus.org>
parents:
1402
diff
changeset
|
1034 if ( XQueryPointer(display, DefaultRootWindow(display), |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1035 &junk_window, &junk_window, &x, &y, &x, &y, &mask) ) { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1036 if ( mask & LockMask ) { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1037 modstate |= KMOD_CAPS; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1038 } |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1039 if ( mask & mode_switch_mask ) { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1040 modstate |= KMOD_MODE; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1041 } |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1042 if ( mask & num_mask ) { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1043 modstate |= KMOD_NUM; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1044 } |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1045 } |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1046 |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1047 /* Zero the new keyboard state and generate it */ |
1336
3692456e7b0f
Use SDL_ prefixed versions of C library functions.
Sam Lantinga <slouken@libsdl.org>
parents:
1328
diff
changeset
|
1048 SDL_memset(kstate, 0, SDLK_LAST); |
0 | 1049 /* |
1050 * An obvious optimisation is to check entire longwords at a time in | |
1051 * both loops, but we can't be sure the arrays are aligned so it's not | |
1052 * worth the extra complexity | |
1053 */ | |
1327 | 1054 for ( i = 0; i < 32; i++ ) { |
0 | 1055 int j; |
1327 | 1056 if ( !key_vec[i] ) |
0 | 1057 continue; |
1327 | 1058 for ( j = 0; j < 8; j++ ) { |
1059 if ( key_vec[i] & (1 << j) ) { | |
1060 SDLKey key; | |
1061 KeyCode kc = (i << 3 | j); | |
1062 key = X11_TranslateKeycode(display, kc); | |
1063 if ( key == SDLK_UNKNOWN ) { | |
1064 continue; | |
1065 } | |
1066 kstate[key] = SDL_PRESSED; | |
1067 switch (key) { | |
1068 case SDLK_LSHIFT: | |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1069 modstate |= KMOD_LSHIFT; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1070 break; |
1327 | 1071 case SDLK_RSHIFT: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1072 modstate |= KMOD_RSHIFT; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1073 break; |
1327 | 1074 case SDLK_LCTRL: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1075 modstate |= KMOD_LCTRL; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1076 break; |
1327 | 1077 case SDLK_RCTRL: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1078 modstate |= KMOD_RCTRL; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1079 break; |
1327 | 1080 case SDLK_LALT: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1081 modstate |= KMOD_LALT; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1082 break; |
1327 | 1083 case SDLK_RALT: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1084 modstate |= KMOD_RALT; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1085 break; |
1327 | 1086 case SDLK_LMETA: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1087 modstate |= KMOD_LMETA; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1088 break; |
1327 | 1089 case SDLK_RMETA: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1090 modstate |= KMOD_RMETA; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1091 break; |
1327 | 1092 default: |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1093 break; |
1327 | 1094 } |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1095 } |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1096 } |
0 | 1097 } |
111
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1098 |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1099 /* Hack - set toggle key state */ |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1100 if ( modstate & KMOD_CAPS ) { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1101 kstate[SDLK_CAPSLOCK] = SDL_PRESSED; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1102 } else { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1103 kstate[SDLK_CAPSLOCK] = SDL_RELEASED; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1104 } |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1105 if ( modstate & KMOD_NUM ) { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1106 kstate[SDLK_NUMLOCK] = SDL_PRESSED; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1107 } else { |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1108 kstate[SDLK_NUMLOCK] = SDL_RELEASED; |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1109 } |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1110 |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1111 /* Set the final modifier state */ |
53e3d8ba4321
Now gets correct keyboard state when starting up on X11
Sam Lantinga <slouken@lokigames.com>
parents:
88
diff
changeset
|
1112 SDL_SetModState(modstate); |
0 | 1113 } |
1114 | |
1115 void X11_InitOSKeymap(_THIS) | |
1116 { | |
1117 X11_InitKeymap(); | |
1118 } | |
1119 | |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1120 void X11_SaveScreenSaver(Display *display, int *saved_timeout, BOOL *dpms) |
1783 | 1121 { |
1122 int timeout, interval, prefer_blank, allow_exp; | |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1123 XGetScreenSaver(display, &timeout, &interval, &prefer_blank, &allow_exp); |
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1124 *saved_timeout = timeout; |
1783 | 1125 |
1126 #if SDL_VIDEO_DRIVER_X11_DPMS | |
1127 if ( SDL_X11_HAVE_DPMS ) { | |
1128 int dummy; | |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1129 if ( DPMSQueryExtension(display, &dummy, &dummy) ) { |
1783 | 1130 CARD16 state; |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1131 DPMSInfo(display, &state, dpms); |
1783 | 1132 } |
1133 } | |
1792
409974dedf2e
More compile fixes for systems without the DPMS extension
Sam Lantinga <slouken@libsdl.org>
parents:
1789
diff
changeset
|
1134 #else |
409974dedf2e
More compile fixes for systems without the DPMS extension
Sam Lantinga <slouken@libsdl.org>
parents:
1789
diff
changeset
|
1135 *dpms = 0; |
1783 | 1136 #endif /* SDL_VIDEO_DRIVER_X11_DPMS */ |
1137 } | |
1138 | |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1139 void X11_DisableScreenSaver(_THIS, Display *display) |
1783 | 1140 { |
1141 int timeout, interval, prefer_blank, allow_exp; | |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1142 |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1143 if (this->hidden->allow_screensaver) { |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1144 return; |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1145 } |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1146 |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1147 XGetScreenSaver(display, &timeout, &interval, &prefer_blank, &allow_exp); |
1783 | 1148 timeout = 0; |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1149 XSetScreenSaver(display, timeout, interval, prefer_blank, allow_exp); |
1783 | 1150 |
1151 #if SDL_VIDEO_DRIVER_X11_DPMS | |
1152 if ( SDL_X11_HAVE_DPMS ) { | |
1153 int dummy; | |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1154 if ( DPMSQueryExtension(display, &dummy, &dummy) ) { |
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1155 DPMSDisable(display); |
1783 | 1156 } |
1157 } | |
1158 #endif /* SDL_VIDEO_DRIVER_X11_DPMS */ | |
1159 } | |
1160 | |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1161 void X11_RestoreScreenSaver(_THIS, Display *display, int saved_timeout, BOOL dpms) |
1783 | 1162 { |
1163 int timeout, interval, prefer_blank, allow_exp; | |
3936
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1164 |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1165 if (this->hidden->allow_screensaver) { |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1166 return; |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1167 } |
c5c3c772f5aa
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
Ryan C. Gordon <icculus@icculus.org>
parents:
1792
diff
changeset
|
1168 |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1169 XGetScreenSaver(display, &timeout, &interval, &prefer_blank, &allow_exp); |
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1170 timeout = saved_timeout; |
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1171 XSetScreenSaver(display, timeout, interval, prefer_blank, allow_exp); |
1783 | 1172 |
1173 #if SDL_VIDEO_DRIVER_X11_DPMS | |
1174 if ( SDL_X11_HAVE_DPMS ) { | |
1175 int dummy; | |
1784
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1176 if ( DPMSQueryExtension(display, &dummy, &dummy) ) { |
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1177 if ( dpms ) { |
45669d4efd02
Disable the screensaver in DGA mode, which is even more important than X11...
Sam Lantinga <slouken@libsdl.org>
parents:
1783
diff
changeset
|
1178 DPMSEnable(display); |
1783 | 1179 } |
1180 } | |
1181 } | |
1182 #endif /* SDL_VIDEO_DRIVER_X11_DPMS */ | |
1183 } |