1 /*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2006 Sam Lantinga
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
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
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Sam Lantinga
20 slouken@libsdl.org
21 */
22 #include "SDL_config.h"
23
24 /* Handle the event stream, converting DGA events into SDL events */
25
26 #include <stdio.h>
27 #include <X11/Xlib.h>
28 #include "../Xext/extensions/xf86dga.h"
29
30 #include "../SDL_sysvideo.h"
31 #include "../../events/SDL_events_c.h"
32 #include "SDL_dgavideo.h"
33 #include "SDL_dgaevents_c.h"
34
35 /* get function pointers... */
36 #include "../x11/SDL_x11dyn.h"
37
38 /* Heheh we're using X11 event code */
39 extern int X11_Pending(Display *display);
40 extern void X11_InitKeymap(void);
41 extern SDLKey X11_TranslateKeycode(Display *display, KeyCode kc);
42
DGA_DispatchEvent(_THIS)43 static int DGA_DispatchEvent(_THIS)
44 {
45 int posted;
46 SDL_NAME(XDGAEvent) xevent;
47
48 XNextEvent(DGA_Display, (XEvent *)&xevent);
49
50 posted = 0;
51 xevent.type -= DGA_event_base;
52 switch (xevent.type) {
53
54 /* Mouse motion? */
55 case MotionNotify: {
56 if ( SDL_VideoSurface ) {
57 posted = SDL_PrivateMouseMotion(0, 1,
58 xevent.xmotion.dx, xevent.xmotion.dy);
59 }
60 }
61 break;
62
63 /* Mouse button press? */
64 case ButtonPress: {
65 posted = SDL_PrivateMouseButton(SDL_PRESSED,
66 xevent.xbutton.button, 0, 0);
67 }
68 break;
69
70 /* Mouse button release? */
71 case ButtonRelease: {
72 posted = SDL_PrivateMouseButton(SDL_RELEASED,
73 xevent.xbutton.button, 0, 0);
74 }
75 break;
76
77 /* Key press? */
78 case KeyPress: {
79 SDL_keysym keysym;
80 KeyCode keycode;
81 XKeyEvent xkey;
82
83 SDL_NAME(XDGAKeyEventToXKeyEvent)(&xevent.xkey, &xkey);
84 keycode = xkey.keycode;
85 #ifdef DEBUG_XEVENTS
86 printf("KeyPress (X11 keycode = 0x%X)\n", xkey.keycode);
87 #endif
88 /* Get the translated SDL virtual keysym */
89 keysym.scancode = keycode;
90 keysym.sym = X11_TranslateKeycode(DGA_Display, keycode);
91 keysym.mod = KMOD_NONE;
92 keysym.unicode = 0;
93
94 /* Look up the translated value for the key event */
95 if ( SDL_TranslateUNICODE ) {
96 static XComposeStatus state;
97 char keybuf[32];
98
99 if ( XLookupString(&xkey, keybuf, sizeof(keybuf), NULL, &state) ) {
100 /*
101 * FIXME: XLookupString() may yield more than one
102 * character, so we need a mechanism to allow for
103 * this (perhaps null keypress events with a
104 * unicode value)
105 */
106 keysym.unicode = (Uint8)keybuf[0];
107 }
108 }
109 posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
110 }
111 break;
112
113 /* Key release? */
114 case KeyRelease: {
115 SDL_keysym keysym;
116 KeyCode keycode;
117 XKeyEvent xkey;
118
119 SDL_NAME(XDGAKeyEventToXKeyEvent)(&xevent.xkey, &xkey);
120 keycode = xkey.keycode;
121 #ifdef DEBUG_XEVENTS
122 printf("KeyRelease (X11 keycode = 0x%X)\n", xkey.keycode);
123 #endif
124 /* Get the translated SDL virtual keysym */
125 keysym.scancode = keycode;
126 keysym.sym = X11_TranslateKeycode(DGA_Display, keycode);
127 keysym.mod = KMOD_NONE;
128 keysym.unicode = 0;
129 posted = SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
130 }
131 break;
132 }
133 return(posted);
134 }
135
DGA_PumpEvents(_THIS)136 void DGA_PumpEvents(_THIS)
137 {
138 /* Keep processing pending events */
139 LOCK_DISPLAY();
140 while ( X11_Pending(DGA_Display) ) {
141 DGA_DispatchEvent(this);
142 }
143 UNLOCK_DISPLAY();
144 }
145
DGA_InitOSKeymap(_THIS)146 void DGA_InitOSKeymap(_THIS)
147 {
148 X11_InitKeymap();
149 }
150
151