diff src/video/SDL_sysvideo.h @ 2268:4baee598306d

Date: Thu, 05 Jul 2007 14:02:33 -0700 From: Sam Lantinga Subject: SDL 1.3 keyboard plan After lots of discussion with Christian, this is what we came up with: > So, to sum up... > SDLK_* become the physical keys, starting at > (1<<21) > We create a macro SDLK_INDEX(X) > We have two functions SDL_GetLayoutKey(SDLKey) and SDL_GetKeyName() > SDL_GetLayoutKey maps to UCS4 for printable characters, and SDLK* for non-printable characters > and does so based on the OS's current keyboard layout > SDL_GetKeyName() handles both SDLK_* and UCS4, converting UCS4 to UTF-8 and converting SDLK_* into our names, which are UTF-8 for printable characters. > WASD folks use SDLK_*, and 'I' folks use SDL_GetLayoutKey(SDLK_*) Here is the patch he came up with, and his e-mail about it: Date: Fri, 17 Aug 2007 19:50:28 +0200 From: Christian Walther Subject: Re: SDL 1.3 keyboard plan > Sounds great, go ahead and send me a patch. Here goes! Thanks for having a look. Don't hesitate to comment if anything does not conform to your ideas. One caveat: Committing this now may break compilability of some video drivers - specifically, if they use any of the SDLK_* codes that were obsoleted and moved into SDL_compat.h. I only tried Cocoa (which did break, but is already fixed) and X11 (which didn't, but then its key handling is #iffed out). If that's a problem, it may need to go into a branch. -Christian
author Sam Lantinga <slouken@libsdl.org>
date Sun, 19 Aug 2007 14:52:52 +0000
parents 989fb86ad1ec
children d87417504c75
line wrap: on
line diff
--- a/src/video/SDL_sysvideo.h	Sat Aug 18 05:39:09 2007 +0000
+++ b/src/video/SDL_sysvideo.h	Sun Aug 19 14:52:52 2007 +0000
@@ -25,6 +25,7 @@
 #define _SDL_sysvideo_h
 
 #include "SDL_mouse.h"
+#include "SDL_keysym.h"
 
 /* The SDL video driver */
 
@@ -256,6 +257,45 @@
      */
     void (*PumpEvents) (_THIS);
 
+    /* Get the layout key code corresponding to the given physical key code
+     * according to the OS' current keyboard layout.
+     *
+     * - For character keys, this should return the Unicode code point of the
+     * character that is generated when the key is pressed without shift or
+     * any other modifiers.
+     * - For non-character keys, this should return one of the SDLK_* constants
+     * (usually the argument itself since these keys are typically layout-
+     * independent). Make sure that all of these values returned by this
+     * function have a suitable name defined, either the default from
+     * SDL_keynames.h, or one set using SDL_SetKeyName() in VideoInit(). In
+     * particular, if this function can return any of the codes whose default
+     * names start with "SDLK_" (usually, it shouldn't, since these are layout-
+     * dependent character keys), these names should be replaced by proper
+     * user-readable names.
+     * - If there are keys that cannot be adequately described by either a
+     * single Unicode character or an SDLK_* constant, this function may return
+     * a code with SDL_KEY_LAYOUT_SPECIAL_BIT set in the most significant byte
+     * and an arbitrary value in the less significant 3 bytes. The
+     * GetSpecialKeyName() function must then be implemented to take this code
+     * and return a human-readable key name for it.
+     * If the argument is not a physical key code or if translation of the key
+     * code by the OS' keyboard layout fails for any reason, the argument must
+     * be returned unchanged.
+     *
+     * On platforms that don't have the notion of a user-configurable keyboard
+     * layout, this may be left unimplemented. The default implementation of
+     * SDL_GetLayoutKey() then acts as the identity. The note about defining
+     * key names above particularly applies in this case.
+     */
+      SDLKey(*GetLayoutKey) (_THIS, SDLKey physicalKey);
+
+    /* Get a human-readable name for a special layout key code.
+     * This only needs to be implemented if this driver's implementation of
+     * GetLayoutKey() generates such codes (with SDL_KEY_LAYOUT_SPECIAL_BIT
+     * set) - see above.
+     */
+    const char *(*GetSpecialKeyName) (_THIS, SDLKey layoutKey);
+
     /* * * */
     /* Data common to all drivers */
     int num_displays;