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 (at) 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 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 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 146 void DGA_InitOSKeymap(_THIS) 147 { 148 X11_InitKeymap(); 149 } 150 151