qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [Patch] selectable keyboard mapping function


From: Elrond
Subject: [Qemu-devel] [Patch] selectable keyboard mapping function
Date: Sun, 19 Dec 2004 17:24:45 +0100
User-agent: Mutt/1.5.6+20040907i

Hi,

After having some bug reports about scrambled keyboards in
Debian, we decided to make the keyboard mapping function
choosable.

It helps most people at least somewhat.

Here are two bugreports for example problems:
        <http://bugs.debian.org/282658>
        <http://bugs.debian.org/284510>


Patch attached.


    Elrond

p.s.: I'm not on the list, so please include me in replies.
#DPATCHLEVEL=1
diff -ur qemu-0.6.1/sdl.c qemu/sdl.c
--- qemu-0.6.1/sdl.c    2004-11-14 21:51:33.000000000 +0100
+++ qemu/sdl.c  2004-11-27 20:37:14.000000000 +0100
@@ -72,7 +72,6 @@
     ds->height = h;
 }
 
-#ifdef CONFIG_SDL_GENERIC_KBD
 
 /* XXX: use keymap tables defined in the VNC patch because the
    following code suppose you have a US keyboard. */
@@ -131,6 +130,7 @@
     [SDLK_COMMA]    = 0x33,
     [SDLK_PERIOD]   = 0x34,
     [SDLK_SLASH]    = 0x35,
+    [SDLK_RSHIFT]   = 0x36,
     [SDLK_KP_MULTIPLY]      = 0x37,
     [SDLK_LALT]     = 0x38,
     [SDLK_SPACE]    = 0x39,
@@ -178,20 +178,16 @@
     [SDLK_DELETE]   = 0xd3,
 };
 
-static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
+static uint8_t sdl_keyevent_to_keycode_generic(const SDL_KeyboardEvent *ev)
 {
     return scancodes[ev->keysym.sym];
 }
 
-#elif defined(_WIN32)
-
-static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
+static uint8_t sdl_keyevent_to_keycode_direct(const SDL_KeyboardEvent *ev)
 {
     return ev->keysym.scancode;
 }
 
-#else
-
 static const uint8_t x_keycode_to_pc_keycode[61] = {
    0xc7,      /*  97  Home   */
    0xc8,      /*  98  Up     */
@@ -256,7 +252,7 @@
    0x53,         /* 157 KP_Del */
 };
 
-static uint8_t sdl_keyevent_to_keycode(const SDL_KeyboardEvent *ev)
+static uint8_t sdl_keyevent_to_keycode_xf86(const SDL_KeyboardEvent *ev)
 {
     int keycode;
 
@@ -275,8 +271,30 @@
     return keycode;
 }
 
+#ifdef CONFIG_SDL_GENERIC_KBD
+#define DEFAULT_KEYEVENT_TO_KEYCODE sdl_keyevent_to_keycode_generic
+#elif defined(_WIN32)
+#define DEFAULT_KEYEVENT_TO_KEYCODE sdl_keyevent_to_keycode_direct
+#else
+#define DEFAULT_KEYEVENT_TO_KEYCODE sdl_keyevent_to_keycode_xf86
 #endif
 
+static uint8_t (* sdl_keyevent_to_keycode) (const SDL_KeyboardEvent *ev) = 
DEFAULT_KEYEVENT_TO_KEYCODE;
+
+void qemu_keyboard_set_sdl_method(const char *method)
+{
+       if (strcmp(method, "generic")==0)
+               sdl_keyevent_to_keycode = sdl_keyevent_to_keycode_generic;
+       else if (strcmp(method, "direct")==0)
+               sdl_keyevent_to_keycode = sdl_keyevent_to_keycode_direct;
+       else if (strcmp(method, "xf86")==0)
+               sdl_keyevent_to_keycode = sdl_keyevent_to_keycode_xf86;
+       else
+               fprintf(stderr, "Unknown keyboard method `%s', ignoring\n",
+                       method);
+}
+
+
 static void reset_keys(void)
 {
     int i;
diff -ur qemu-0.6.1/vl.c qemu/vl.c
--- qemu-0.6.1/vl.c     2004-11-14 21:51:33.000000000 +0100
+++ qemu/vl.c   2004-11-27 20:41:14.000000000 +0100
@@ -2502,6 +2502,8 @@
            "-m megs         set virtual RAM size to megs MB [default=%d]\n"
            "-nographic      disable graphical output and redirect serial I/Os 
to console\n"
            "-enable-audio   enable audio support\n"
+           "-keyboard {generic|direct|xf86}\n"
+           "                Select keyboard mapping method [default=xf86]\n"
            "-localtime      set the real time clock to local time 
[default=utc]\n"
            "-full-screen    start in full screen\n"
 #ifdef TARGET_PPC
@@ -2591,6 +2593,7 @@
     QEMU_OPTION_m,
     QEMU_OPTION_nographic,
     QEMU_OPTION_enable_audio,
+    QEMU_OPTION_keyboard,
 
     QEMU_OPTION_nics,
     QEMU_OPTION_macaddr,
@@ -2647,6 +2650,9 @@
     { "m", HAS_ARG, QEMU_OPTION_m },
     { "nographic", 0, QEMU_OPTION_nographic },
     { "enable-audio", 0, QEMU_OPTION_enable_audio },
+#ifdef CONFIG_SDL
+    { "keyboard", HAS_ARG, QEMU_OPTION_keyboard },
+#endif
 
     { "nics", HAS_ARG, QEMU_OPTION_nics},
     { "macaddr", HAS_ARG, QEMU_OPTION_macaddr},
@@ -2975,6 +2981,11 @@
             case QEMU_OPTION_enable_audio:
                 audio_enabled = 1;
                 break;
+#ifdef CONFIG_SDL
+            case QEMU_OPTION_keyboard:
+                qemu_keyboard_set_sdl_method(optarg);
+                break;
+#endif
             case QEMU_OPTION_h:
                 help();
                 break;
diff -ur qemu-0.6.1/vl.h qemu/vl.h
--- qemu-0.6.1/vl.h     2004-11-14 21:51:33.000000000 +0100
+++ qemu/vl.h   2004-11-27 15:55:53.000000000 +0100
@@ -545,6 +545,7 @@
 
 /* sdl.c */
 void sdl_display_init(DisplayState *ds, int full_screen);
+void qemu_keyboard_set_sdl_method(const char *method);
 
 /* ide.c */
 #define MAX_DISKS 4
--- qemu-0.6.1/qemu-doc.texi~   2004-12-18 21:19:02.000000000 +0100
+++ qemu-0.6.1/qemu-doc.texi    2004-12-18 21:19:02.000000000 +0100
@@ -194,6 +194,21 @@
 The SB16 emulation is disabled by default as it may give problems with
 Windows. You can enable it manually with this option.
 
address@hidden -keyboard {generic|direct|xf86}
+Choose a mapping function for the keyboard:
address@hidden @code
address@hidden xf86
+An i386 XFree86 based one
+(default on most Unix builds)
address@hidden generic
+an SDL based mapping function, fixes some "scrambled keyboards"
+problems, but has its own issues
+(default for alpha)
address@hidden direct
+Uses the scancodes as acquired from the underlying OS.
+(default on Win32)
address@hidden table
+
 @item -localtime
 Set the real time clock to local time (the default is to UTC
 time). This option is needed to have correct date in MS-DOS or

reply via email to

[Prev in Thread] Current Thread [Next in Thread]