diff src/video/dga/SDL_dgaevents.c @ 1327:d12a63a8d95a

Resolved bug #130 Use XFilterEvent() to handle dead-key composition under X11 Cleaned up the code in preparation for 1.3 API changes
author Sam Lantinga <slouken@libsdl.org>
date Sat, 04 Feb 2006 08:35:11 +0000
parents c9b51268668f
children 19418e4422cb
line wrap: on
line diff
--- a/src/video/dga/SDL_dgaevents.c	Fri Feb 03 07:43:42 2006 +0000
+++ b/src/video/dga/SDL_dgaevents.c	Sat Feb 04 08:35:11 2006 +0000
@@ -37,8 +37,7 @@
 /* Heheh we're using X11 event code */
 extern int X11_Pending(Display *display);
 extern void X11_InitKeymap(void);
-extern SDL_keysym *X11_TranslateKey(Display *display, XIC ic, XKeyEvent *xkey,
-				    KeyCode kc, SDL_keysym *keysym);
+extern SDLKey X11_TranslateKeycode(Display *display, KeyCode kc);
 
 static int DGA_DispatchEvent(_THIS)
 {
@@ -74,20 +73,64 @@
 	    }
 	    break;
 
-	    /* Key press or release? */
-	    case KeyPress:
-	    case KeyRelease: {
+	    /* Key press? */
+	    case KeyPress: {
 		SDL_keysym keysym;
+		KeyCode keycode;
 		XKeyEvent xkey;
 
 		SDL_NAME(XDGAKeyEventToXKeyEvent)(&xevent.xkey, &xkey);
-		posted = SDL_PrivateKeyboard((xevent.type == KeyPress), 
-					X11_TranslateKey(DGA_Display, NULL/*no XIC*/,
-							 &xkey, xkey.keycode,
-							 &keysym));
+		keycode = xkey.keycode;
+#ifdef DEBUG_XEVENTS
+printf("KeyPress (X11 keycode = 0x%X)\n", xkey.keycode);
+#endif
+		/* Get the translated SDL virtual keysym */
+		keysym.scancode = keycode;
+		keysym.sym = X11_TranslateKeycode(DGA_Display, keycode);
+		keysym.mod = KMOD_NONE;
+		keysym.unicode = 0;
+
+		/* Look up the translated value for the key event */
+		if ( SDL_TranslateUNICODE ) {
+			static XComposeStatus state;
+			char keybuf[32];
+
+			if ( pXLookupString(&xkey, keybuf, sizeof(keybuf), NULL, &state) ) {
+				/*
+				* FIXME: XLookupString() may yield more than one
+				* character, so we need a mechanism to allow for
+				* this (perhaps null keypress events with a
+				* unicode value)
+				*/
+				keysym.unicode = (Uint8)keybuf[0];
+			}
+		}
+		posted = SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
 	    }
 	    break;
 
+	    /* Key release? */
+	    case KeyRelease: {
+		SDL_keysym keysym;
+		KeyCode keycode;
+		XKeyEvent xkey;
+
+		SDL_NAME(XDGAKeyEventToXKeyEvent)(&xevent.xkey, &xkey);
+		keycode = xkey.keycode;
+#ifdef DEBUG_XEVENTS
+printf("KeyRelease (X11 keycode = 0x%X)\n", xkey.keycode);
+#endif
+		/* Get the translated SDL virtual keysym */
+		keysym.scancode = keycode;
+		keysym.sym = X11_TranslateKeycode(DGA_Display, keycode);
+		keysym.mod = KMOD_NONE;
+		keysym.unicode = 0;
+		posted = SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
+	    }
+	    break;
+
+	    break;
+
 	}
 	return(posted);
 }