• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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