---------------------------------------------------------------------- Patch name: patch.kbd-cbothamy Author: christophe Bothamy Date: 2 Dec 2001 Detailed description: . Architecture - A bx_keymap_c object is created. It offers the GUIs a way to remap the physical keyboard in a standard us keyboard. - The object is GUI implementation independant, and lets the GUI use key symbols, raw keycodes, or anything - It is optional, GUIs must use it explicitely, and keyboardmapping must be enabled in the configuration file. If disabled the old behavior is used. - The object could be used by two categories of GUIs - GUIs that provide their own translation function (like carbon). In that case the object can be used to get the right keymap table - GUIs that do the mapping to BX_KEY. In that case the object can map the physical key to the right BX_KEY . Implementation Methods of bx_keymap_c : - void addTable(const char *mapName, const void *table, Bit32u size); Adds the table named "mapName" to the keymap list Size should be the number of entries in the - void setDefault(const char *mapName); Sets the default keymap - void* getTable(char *mapName); Returns the table named "mapName" - void* getTable(void); Returns the table specified in the conf file - Bit32u getBXKey(char *mapName, Bit32u key); Returns the BX_KEY for the key and the table "mapName" - Bit32u getBXKey(Bit32u key); Returns the BX_KEY for the key and the table specified in the conf file. Format of the table - if the GUI provide its own translation function, the format of the keymap table is free and the number of elements should be set to 0. This GUI should also use the getTable functions. - if the GUI wants the keymap object do the translation to BX_KEYs then the format of the table is Bit32u table[N][2]. Each entry should contain the physical constant and the associated BX_KEY . Table writing Each GUI should provide at least one table, the standard 'us' keyboard one. Then they should provide additional table for each country specific keyboard, as a diff to the standard one. Please refer to x.cc for explainations on how to write a keymap table . Pros not gui specific (X, macintosh...) . Cons a table must be written for each keyboard and GUI . Changes - gui/keymap.cc and gui/keymap.h contains the implementation of the new object - bochs.h includes keymap.h - main.cc manages "keyboardmapping" options of the conf file - gui/siminterface.h - gui/x.cc implements us and fr tables based on keysym . Usage Add a line : keyboardmapping: enabled=1, map=LANG at the end of conf file to use the keyboard mapping. For now LANG must be us or fr. . Todo I only modified x.cc to provide us and fr tables. More table should be implemented. Check if other gui need mapping. Tables look-up should be optimised. For now up to 10 different map can be uploaded to the object The table size should be increased/dynamic. Patch was created with: diff -u Apply patch to what version: cvs checked out on 2 Dec 2001 Instructions: To patch, go to main bochs directory. Type "patch -p1 < THIS_PATCH_FILE". ---------------------------------------------------------------------- diff -urN bochs/gui/Makefile.in bochs-keymap/gui/Makefile.in --- bochs/gui/Makefile.in Sun Dec 2 23:25:28 2001 +++ bochs-keymap/gui/Makefile.in Sat Dec 1 13:03:41 2001 @@ -51,7 +51,7 @@ GUI_OBJS_TERM = term.o GUI_OBJS_RFB = rfb.o GUI_OBJS_AMIGAOS = amigaos.o -GUI_OBJS = gui.o control.o siminterface.o @GUI_OBJS@ +GUI_OBJS = keymap.o gui.o control.o siminterface.o @GUI_OBJS@ BX_INCDIRS = -I.. -I$(srcdir)/.. -I../iodev -I$(srcdir)/../iodev -I../@INSTRUMENT_DIR@ -I$(srcdir)/../@INSTRUMENT_DIR@ LOCAL_CXXFLAGS = @@ -90,7 +90,6 @@ beos.@CPP_SUFFIX@cc: gui.h - clean: @RMCOMMAND@ *.o @RMCOMMAND@ *.a @@ -146,6 +145,7 @@ ../gui/bitmaps/floppyb.h ../gui/bitmaps/mouse.h \ ../gui/bitmaps/reset.h ../gui/bitmaps/power.h \ ../gui/bitmaps/snapshot.h ../gui/bitmaps/configbutton.h +keymap.o: keymap.@CPP_SUFFIX@ ../bochs.h keymap.h macintosh.o: macintosh.@CPP_SUFFIX@ ../bochs.h ../config.h ../osdep.h \ ../debug/debug.h ../bxversion.h ../gui/siminterface.h ../state_file.h \ ../cpu/cpu.h ../cpu/lazy_flags.h ../memory/memory.h ../pc_system.h \ Binary files bochs/gui/control.o and bochs-keymap/gui/control.o differ diff -urN bochs/gui/gui.h bochs-keymap/gui/gui.h --- bochs/gui/gui.h Sun Dec 2 23:25:28 2001 +++ bochs-keymap/gui/gui.h Sat Dec 1 23:35:57 2001 @@ -102,6 +102,8 @@ #define BX_KEY_PRESSED 0x00000000 #define BX_KEY_RELEASED 0x80000000 +#define BX_KEY_UNHANDLED 0x10000000 + #define BX_KEY_CTRL_L 0 #define BX_KEY_SHIFT_L 1 @@ -176,7 +178,6 @@ #define BX_KEY_LEFT_BRACKET 64 #define BX_KEY_BACKSLASH 65 -#define BX_KEY_LEFT_BACKSLASH 72 #define BX_KEY_RIGHT_BRACKET 66 #define BX_KEY_MINUS 67 #define BX_KEY_GRAVE 68 @@ -185,6 +186,12 @@ #define BX_KEY_ENTER 70 #define BX_KEY_TAB 71 +#define BX_KEY_LEFT_BACKSLASH 72 + +#define BX_KEY_PRINT 73 +#define BX_KEY_SCRL_LOCK 74 +#define BX_KEY_PAUSE 75 + #define BX_KEY_INSERT 76 #define BX_KEY_DELETE 77 #define BX_KEY_HOME 78 @@ -214,7 +221,3 @@ #define BX_KEY_KP_ENTER 99 #define BX_KEY_KP_MULTIPLY 100 #define BX_KEY_KP_DIVIDE 101 - -#define BX_KEY_PRINT 73 -#define BX_KEY_SCRL_LOCK 74 -#define BX_KEY_PAUSE 75 Binary files bochs/gui/gui.o and bochs-keymap/gui/gui.o differ diff -urN bochs/gui/keymap.cc bochs-keymap/gui/keymap.cc --- bochs/gui/keymap.cc Thu Jan 1 01:00:00 1970 +++ bochs-keymap/gui/keymap.cc Sun Dec 2 22:52:36 2001 @@ -0,0 +1,145 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: $ +///////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2001 Christophe Bothamy +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + +#include "bochs.h" + +bx_keymap_c bx_keymap; + +#define LOG_THIS bx_keymap. + +bx_keymap_c::bx_keymap_c(void) +{ + put("KMAP"); + nbKeymaps=0; + defaultKeymap=BX_KEYMAP_MAX_TABLES; +} + +bx_keymap_c::~bx_keymap_c(void) +{ +} + + + void +bx_keymap_c::addTable(const char *mapName, const void *keymap, Bit32u size) +{ + if(nbKeymapsgetptr(); + return(getTable(localKeymap)); +} + + Bit32u +bx_keymap_c::getBXKey(char* mapName, Bit32u key) +{ + Bit32u i,mapIndex; + Bit32u *keymap,size; + + // First we browse through the specific keymap + mapIndex=BX_KEYMAP_MAX_TABLES; + for(i=0; igetptr(); + + return(getBXKey(localKeymap,key)); +} + diff -urN bochs/gui/keymap.h bochs-keymap/gui/keymap.h --- bochs/gui/keymap.h Thu Jan 1 01:00:00 1970 +++ bochs-keymap/gui/keymap.h Sun Dec 2 22:43:36 2001 @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: $ +///////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2001 Christophe Bothamy +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +#define BX_KEYMAP_MAX_TABLES 10 + +class bx_keymap_c : public logfunctions { +public: + bx_keymap_c(void); + ~bx_keymap_c(void); + + void addTable(const char *mapName, const void *table, Bit32u size); + void setDefault(const char *mapName); + void* getTable(char *mapName); + void* getTable(void); + Bit32u getBXKey(char *mapName, Bit32u key); + Bit32u getBXKey(Bit32u key); + +private: + const char* mapNames[BX_KEYMAP_MAX_TABLES]; + const void* keymaps[BX_KEYMAP_MAX_TABLES]; + Bit32u mapSizes[BX_KEYMAP_MAX_TABLES]; + Bit32u defaultKeymap; + Bit32u nbKeymaps; +}; + +extern bx_keymap_c bx_keymap; Binary files bochs/gui/keymap.o and bochs-keymap/gui/keymap.o differ Binary files bochs/gui/libgui.a and bochs-keymap/gui/libgui.a differ diff -urN bochs/gui/siminterface.h bochs-keymap/gui/siminterface.h --- bochs/gui/siminterface.h Sun Dec 2 23:25:28 2001 +++ bochs-keymap/gui/siminterface.h Sat Dec 1 23:38:57 2001 @@ -102,6 +102,9 @@ BXP_PARPORT1_OUTFILE, BXP_PARPORT2_ENABLE, BXP_PARPORT2_OUTFILE, + BXP_KEYBOARD_USEMAPPING, + BXP_KEYBOARD_MAP, + BXP_KEYBOARD, BXP_THIS_IS_THE_LAST // used to determine length of list } bx_id; Binary files bochs/gui/siminterface.o and bochs-keymap/gui/siminterface.o differ diff -urN bochs/gui/x.cc bochs-keymap/gui/x.cc --- bochs/gui/x.cc Sun Dec 2 23:25:28 2001 +++ bochs-keymap/gui/x.cc Sun Dec 2 22:43:47 2001 @@ -232,6 +232,283 @@ BX_KEY_GRAVE }; +/* US key mapping. Also the default */ +Bit32u keymap_us[][2] = { + { XK_space , BX_KEY_SPACE }, + { XK_exclam , BX_KEY_1 }, + { XK_quotedbl , BX_KEY_SINGLE_QUOTE }, + { XK_numbersign , BX_KEY_3 }, + { XK_dollar , BX_KEY_4 }, + { XK_percent , BX_KEY_5 }, + { XK_ampersand , BX_KEY_7 }, + { XK_apostrophe , BX_KEY_SINGLE_QUOTE }, + { XK_parenleft , BX_KEY_9 }, + { XK_parenright , BX_KEY_0 }, + { XK_asterisk , BX_KEY_8 }, + { XK_plus , BX_KEY_EQUALS }, + { XK_comma , BX_KEY_COMMA }, + { XK_minus , BX_KEY_MINUS }, + { XK_period , BX_KEY_PERIOD }, + { XK_slash , BX_KEY_SLASH }, + { XK_0 , BX_KEY_0 }, + { XK_1 , BX_KEY_1 }, + { XK_2 , BX_KEY_2 }, + { XK_3 , BX_KEY_3 }, + { XK_4 , BX_KEY_4 }, + { XK_5 , BX_KEY_5 }, + { XK_6 , BX_KEY_6 }, + { XK_7 , BX_KEY_7 }, + { XK_8 , BX_KEY_8 }, + { XK_9 , BX_KEY_9 }, + { XK_colon , BX_KEY_SEMICOLON }, + { XK_semicolon , BX_KEY_SEMICOLON }, + { XK_less , BX_KEY_COMMA }, + { XK_equal , BX_KEY_EQUALS }, + { XK_greater , BX_KEY_PERIOD }, + { XK_question , BX_KEY_SLASH }, + { XK_at , BX_KEY_2 }, + { XK_A , BX_KEY_A }, + { XK_B , BX_KEY_B }, + { XK_C , BX_KEY_C }, + { XK_D , BX_KEY_D }, + { XK_E , BX_KEY_E }, + { XK_F , BX_KEY_F }, + { XK_G , BX_KEY_G }, + { XK_H , BX_KEY_H }, + { XK_I , BX_KEY_I }, + { XK_J , BX_KEY_J }, + { XK_K , BX_KEY_K }, + { XK_L , BX_KEY_L }, + { XK_M , BX_KEY_M }, + { XK_N , BX_KEY_N }, + { XK_O , BX_KEY_O }, + { XK_P , BX_KEY_P }, + { XK_Q , BX_KEY_Q }, + { XK_R , BX_KEY_R }, + { XK_S , BX_KEY_S }, + { XK_T , BX_KEY_T }, + { XK_U , BX_KEY_U }, + { XK_V , BX_KEY_V }, + { XK_W , BX_KEY_W }, + { XK_X , BX_KEY_X }, + { XK_Y , BX_KEY_Y }, + { XK_Z , BX_KEY_Z }, + { XK_bracketleft , BX_KEY_LEFT_BRACKET }, + { XK_backslash , BX_KEY_BACKSLASH }, + { XK_bracketright , BX_KEY_RIGHT_BRACKET }, + { XK_asciicircum , BX_KEY_6 }, + { XK_underscore , BX_KEY_MINUS }, + { XK_grave , BX_KEY_GRAVE }, + { XK_a , BX_KEY_A }, + { XK_b , BX_KEY_B }, + { XK_c , BX_KEY_C }, + { XK_d , BX_KEY_D }, + { XK_e , BX_KEY_E }, + { XK_f , BX_KEY_F }, + { XK_g , BX_KEY_G }, + { XK_h , BX_KEY_H }, + { XK_i , BX_KEY_I }, + { XK_j , BX_KEY_J }, + { XK_k , BX_KEY_K }, + { XK_l , BX_KEY_L }, + { XK_m , BX_KEY_M }, + { XK_n , BX_KEY_N }, + { XK_o , BX_KEY_O }, + { XK_p , BX_KEY_P }, + { XK_q , BX_KEY_Q }, + { XK_r , BX_KEY_R }, + { XK_s , BX_KEY_S }, + { XK_t , BX_KEY_T }, + { XK_u , BX_KEY_U }, + { XK_v , BX_KEY_V }, + { XK_w , BX_KEY_W }, + { XK_x , BX_KEY_X }, + { XK_y , BX_KEY_Y }, + { XK_z , BX_KEY_Z }, + { XK_braceleft , BX_KEY_LEFT_BRACKET }, + { XK_bar , BX_KEY_BACKSLASH }, + { XK_braceright , BX_KEY_RIGHT_BRACKET }, + { XK_asciitilde , BX_KEY_GRAVE }, + { XK_KP_1 , BX_KEY_KP_END }, +#ifdef XK_KP_End + { XK_KP_End , BX_KEY_KP_END }, +#endif + { XK_KP_2 , BX_KEY_KP_DOWN }, +#ifdef XK_KP_Down + { XK_KP_Down , BX_KEY_KP_DOWN }, +#endif + { XK_KP_3 , BX_KEY_KP_PAGE_DOWN }, +#ifdef XK_KP_Page_Down + { XK_KP_Page_Down , BX_KEY_KP_PAGE_DOWN }, +#endif + { XK_KP_4 , BX_KEY_KP_LEFT }, +#ifdef XK_KP_Left + { XK_KP_Left , BX_KEY_KP_LEFT }, +#endif + { XK_KP_5 , BX_KEY_KP_5 }, + { XK_KP_6 , BX_KEY_KP_RIGHT }, +#ifdef XK_KP_Right + { XK_KP_Right , BX_KEY_KP_RIGHT }, +#endif + { XK_KP_7 , BX_KEY_KP_HOME }, +#ifdef XK_KP_Home + { XK_KP_Home , BX_KEY_KP_HOME }, +#endif + { XK_KP_8 , BX_KEY_KP_UP }, +#ifdef XK_KP_Up + { XK_KP_Up , BX_KEY_KP_UP }, +#endif + { XK_KP_9 , BX_KEY_KP_PAGE_UP }, +#ifdef XK_KP_Page_Up + { XK_KP_Page_Up , BX_KEY_KP_PAGE_UP }, +#endif + { XK_KP_0 , BX_KEY_KP_INSERT }, +#ifdef XK_KP_Insert + { XK_KP_Insert , BX_KEY_KP_INSERT }, +#endif + { XK_KP_Decimal , BX_KEY_KP_DELETE }, +#ifdef XK_KP_Delete + { XK_KP_Delete , BX_KEY_KP_DELETE }, +#endif +#ifdef XK_KP_Enter + { XK_KP_Enter , BX_KEY_KP_ENTER }, +#endif + { XK_KP_Subtract , BX_KEY_KP_SUBTRACT }, + { XK_KP_Add , BX_KEY_KP_ADD }, + { XK_KP_Multiply , BX_KEY_KP_MULTIPLY }, + { XK_KP_Divide , BX_KEY_KP_DIVIDE }, + { XK_Up , BX_KEY_UP }, + { XK_Down , BX_KEY_DOWN }, + { XK_Left , BX_KEY_LEFT }, + { XK_Right , BX_KEY_RIGHT }, + { XK_Delete , BX_KEY_DELETE }, + { XK_BackSpace , BX_KEY_BACKSPACE }, + { XK_Tab , BX_KEY_TAB }, + { XK_Return , BX_KEY_ENTER }, + { XK_Escape , BX_KEY_ESC }, + { XK_F1 , BX_KEY_F1 }, + { XK_F2 , BX_KEY_F2 }, + { XK_F3 , BX_KEY_F3 }, + { XK_F4 , BX_KEY_F4 }, + { XK_F5 , BX_KEY_F5 }, + { XK_F6 , BX_KEY_F6 }, + { XK_F7 , BX_KEY_F7 }, + { XK_F8 , BX_KEY_F8 }, + { XK_F9 , BX_KEY_F9 }, + { XK_F10 , BX_KEY_F10 }, + { XK_F11 , BX_KEY_F11 }, + { XK_F12 , BX_KEY_F12 }, + { XK_Control_L , BX_KEY_CTRL_L }, + { XK_Shift_L , BX_KEY_SHIFT_L }, + { XK_Shift_R , BX_KEY_SHIFT_R }, + { XK_Caps_Lock , BX_KEY_CAPS_LOCK }, + { XK_Num_Lock , BX_KEY_NUM_LOCK }, + { XK_Alt_L , BX_KEY_ALT_L }, + { XK_Insert , BX_KEY_INSERT }, + { XK_Home , BX_KEY_HOME }, + { XK_End , BX_KEY_END }, + { XK_Page_Up , BX_KEY_PAGE_UP }, + { XK_Page_Down , BX_KEY_PAGE_DOWN }, + }; + +/* + ===================================== + How to write your own mapping table : + ===================================== + + Just look at each key of the US Keyboard, and write down + what you see on your real keyboard + This gives you the XK_* symbol (your keyboard) + and the BX_KEY_* symbol (US keyboard) + + NB : you may have to add your country specific X11 keysyms + and don't forget to add a line for every symbol you can type + on each key +*/ + +/* +US Keyboard looks like this: + +Top Row from left to right +Esc F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 + +2nd row from left to right +` 1 2 3 4 5 6 7 8 9 0 - = \ Back + +3rd row from left to right +Tab Q W E R T Y U I O P [ ] Enter + +4rd row from left to right +Caps A S D F G H J K L ; ' + +5rd row from left to right +lShift l\ Z X C V B N M , . / rShift + +6rd row from left to right +lCtrl lAlt Space rAlt rCtrl +*/ + + +/* French key mapping. Applied as a diff to the default */ +Bit32u keymap_fr[][2] = { + { XK_twosuperior , BX_KEY_GRAVE }, + { XK_ampersand , BX_KEY_1 }, + { XK_eacute , BX_KEY_2 }, + { XK_asciitilde , BX_KEY_2 }, + { XK_quotedbl , BX_KEY_3 }, + { XK_numbersign , BX_KEY_3 }, + { XK_apostrophe , BX_KEY_4 }, + { XK_braceleft , BX_KEY_4 }, + { XK_parenleft , BX_KEY_5 }, + { XK_bracketleft , BX_KEY_5 }, + { XK_minus , BX_KEY_6 }, + { XK_bar , BX_KEY_6 }, + { XK_egrave , BX_KEY_7 }, + { XK_grave , BX_KEY_7 }, + { XK_underscore , BX_KEY_8 }, + { XK_backslash , BX_KEY_8 }, + { XK_ccedilla , BX_KEY_9 }, + { XK_asciicircum , BX_KEY_9 }, + { XK_agrave , BX_KEY_0 }, + { XK_at , BX_KEY_0 }, + { XK_parenright , BX_KEY_MINUS }, + { XK_degree , BX_KEY_MINUS }, + { XK_bracketright , BX_KEY_MINUS }, + { XK_equal , BX_KEY_EQUALS }, + { XK_plus , BX_KEY_EQUALS }, + { XK_braceright , BX_KEY_EQUALS }, + { XK_asterisk , BX_KEY_BACKSLASH }, + { XK_mu , BX_KEY_BACKSLASH }, + { XK_A , BX_KEY_Q }, + { XK_a , BX_KEY_Q }, + { XK_Z , BX_KEY_W }, + { XK_z , BX_KEY_W }, + { XK_dead_circumflex , BX_KEY_LEFT_BRACKET }, + { XK_dead_diaeresis , BX_KEY_LEFT_BRACKET }, + { XK_dollar , BX_KEY_RIGHT_BRACKET }, + { XK_sterling , BX_KEY_RIGHT_BRACKET }, + { XK_currency , BX_KEY_RIGHT_BRACKET }, + { XK_Q , BX_KEY_A }, + { XK_q , BX_KEY_A }, + { XK_M , BX_KEY_SEMICOLON }, + { XK_m , BX_KEY_SEMICOLON }, + { XK_ugrave , BX_KEY_SINGLE_QUOTE }, + { XK_percent , BX_KEY_SINGLE_QUOTE }, + { XK_less , BX_KEY_LEFT_BACKSLASH }, + { XK_greater , BX_KEY_LEFT_BACKSLASH }, + { XK_W , BX_KEY_Z }, + { XK_w , BX_KEY_Z }, + { XK_comma , BX_KEY_M }, + { XK_question , BX_KEY_M }, + { XK_semicolon , BX_KEY_COMMA }, + { XK_period , BX_KEY_COMMA }, + { XK_colon , BX_KEY_PERIOD }, + { XK_slash , BX_KEY_PERIOD }, + { XK_exclam , BX_KEY_SLASH }, + { XK_section , BX_KEY_SLASH }, + + }; + extern Bit8u graphics_snapshot[32 * 1024]; @@ -506,6 +783,9 @@ BX_PANIC(("vga_x: bits_per_pixel < depth ?")); } + bx_keymap.addTable("us",&keymap_us,sizeof(keymap_us)/(sizeof(Bit32u)*2)); + bx_keymap.addTable("fr",&keymap_fr,sizeof(keymap_fr)/(sizeof(Bit32u)*2)); + bx_keymap.setDefault("us"); } curr_background = 0; @@ -799,132 +1079,138 @@ Bit32u key_event; + /* Old (no mapping) behavior */ + if(!bx_options.keyboard.OuseMapping->get()){ - - - // this depends on the fact that the X11 keysyms which - // correspond to the ascii characters space .. tilde - // are in consequtive order. - if ((keysym >= XK_space) && (keysym <= XK_asciitilde)) { - key_event = ascii_to_key_event[keysym - XK_space]; - } - else switch (keysym) { - case XK_KP_1: + // this depends on the fact that the X11 keysyms which + // correspond to the ascii characters space .. tilde + // are in consequtive order. + if ((keysym >= XK_space) && (keysym <= XK_asciitilde)) { + key_event = ascii_to_key_event[keysym - XK_space]; + } + else switch (keysym) { + case XK_KP_1: #ifdef XK_KP_End - case XK_KP_End: + case XK_KP_End: #endif - key_event = BX_KEY_KP_END; break; + key_event = BX_KEY_KP_END; break; - case XK_KP_2: + case XK_KP_2: #ifdef XK_KP_Down - case XK_KP_Down: + case XK_KP_Down: #endif - key_event = BX_KEY_KP_DOWN; break; + key_event = BX_KEY_KP_DOWN; break; - case XK_KP_3: + case XK_KP_3: #ifdef XK_KP_Page_Down - case XK_KP_Page_Down: + case XK_KP_Page_Down: #endif - key_event = BX_KEY_KP_PAGE_DOWN; break; + key_event = BX_KEY_KP_PAGE_DOWN; break; - case XK_KP_4: + case XK_KP_4: #ifdef XK_KP_Left - case XK_KP_Left: + case XK_KP_Left: #endif - key_event = BX_KEY_KP_LEFT; break; + key_event = BX_KEY_KP_LEFT; break; - case XK_KP_5: - key_event = BX_KEY_KP_5; break; + case XK_KP_5: + key_event = BX_KEY_KP_5; break; - case XK_KP_6: + case XK_KP_6: #ifdef XK_KP_Right - case XK_KP_Right: + case XK_KP_Right: #endif - key_event = BX_KEY_KP_RIGHT; break; + key_event = BX_KEY_KP_RIGHT; break; - case XK_KP_7: + case XK_KP_7: #ifdef XK_KP_Home - case XK_KP_Home: + case XK_KP_Home: #endif - key_event = BX_KEY_KP_HOME; break; + key_event = BX_KEY_KP_HOME; break; - case XK_KP_8: + case XK_KP_8: #ifdef XK_KP_Up - case XK_KP_Up: + case XK_KP_Up: #endif - key_event = BX_KEY_KP_UP; break; + key_event = BX_KEY_KP_UP; break; - case XK_KP_9: + case XK_KP_9: #ifdef XK_KP_Page_Up - case XK_KP_Page_Up: + case XK_KP_Page_Up: #endif - key_event = BX_KEY_KP_PAGE_UP; break; + key_event = BX_KEY_KP_PAGE_UP; break; - case XK_KP_0: + case XK_KP_0: #ifdef XK_KP_Insert - case XK_KP_Insert: - key_event = BX_KEY_KP_INSERT; break; + case XK_KP_Insert: #endif + key_event = BX_KEY_KP_INSERT; break; - case XK_KP_Decimal: + case XK_KP_Decimal: #ifdef XK_KP_Delete - case XK_KP_Delete: - key_event = BX_KEY_KP_DELETE; break; + case XK_KP_Delete: #endif + key_event = BX_KEY_KP_DELETE; break; #ifdef XK_KP_Enter - case XK_KP_Enter: - key_event = BX_KEY_KP_ENTER; break; + case XK_KP_Enter: + key_event = BX_KEY_KP_ENTER; break; #endif - case XK_KP_Subtract: key_event = BX_KEY_KP_SUBTRACT; break; - case XK_KP_Add: key_event = BX_KEY_KP_ADD; break; + case XK_KP_Subtract: key_event = BX_KEY_KP_SUBTRACT; break; + case XK_KP_Add: key_event = BX_KEY_KP_ADD; break; - case XK_KP_Multiply: key_event = BX_KEY_KP_MULTIPLY; break; - case XK_KP_Divide: key_event = BX_KEY_KP_DIVIDE; break; - - - case XK_Up: key_event = BX_KEY_UP; break; - case XK_Down: key_event = BX_KEY_DOWN; break; - case XK_Left: key_event = BX_KEY_LEFT; break; - case XK_Right: key_event = BX_KEY_RIGHT; break; - - - case XK_Delete: key_event = BX_KEY_DELETE; break; - case XK_BackSpace: key_event = BX_KEY_BACKSPACE; break; - case XK_Tab: key_event = BX_KEY_TAB; break; - case XK_Return: key_event = BX_KEY_ENTER; break; - case XK_Escape: key_event = BX_KEY_ESC; break; - case XK_F1: key_event = BX_KEY_F1; break; - case XK_F2: key_event = BX_KEY_F2; break; - case XK_F3: key_event = BX_KEY_F3; break; - case XK_F4: key_event = BX_KEY_F4; break; - case XK_F5: key_event = BX_KEY_F5; break; - case XK_F6: key_event = BX_KEY_F6; break; - case XK_F7: key_event = BX_KEY_F7; break; - case XK_F8: key_event = BX_KEY_F8; break; - case XK_F9: key_event = BX_KEY_F9; break; - case XK_F10: key_event = BX_KEY_F10; break; - case XK_F11: key_event = BX_KEY_F11; break; - case XK_F12: key_event = BX_KEY_F12; break; - case XK_Control_L: key_event = BX_KEY_CTRL_L; break; - case XK_Shift_L: key_event = BX_KEY_SHIFT_L; break; - case XK_Shift_R: key_event = BX_KEY_SHIFT_R; break; - case XK_Caps_Lock: key_event = BX_KEY_CAPS_LOCK; break; - case XK_Num_Lock: key_event = BX_KEY_NUM_LOCK; break; - case XK_Alt_L: key_event = BX_KEY_ALT_L; break; - - case XK_Insert: key_event = BX_KEY_INSERT; break; - case XK_Home: key_event = BX_KEY_HOME; break; - case XK_End: key_event = BX_KEY_END; break; - case XK_Page_Up: key_event = BX_KEY_PAGE_UP; break; - case XK_Page_Down: key_event = BX_KEY_PAGE_DOWN; break; - - default: - BX_ERROR(( "xkeypress(): keysym %x unhandled!", (unsigned) keysym )); - return; + case XK_KP_Multiply: key_event = BX_KEY_KP_MULTIPLY; break; + case XK_KP_Divide: key_event = BX_KEY_KP_DIVIDE; break; + + + case XK_Up: key_event = BX_KEY_UP; break; + case XK_Down: key_event = BX_KEY_DOWN; break; + case XK_Left: key_event = BX_KEY_LEFT; break; + case XK_Right: key_event = BX_KEY_RIGHT; break; + + + case XK_Delete: key_event = BX_KEY_DELETE; break; + case XK_BackSpace: key_event = BX_KEY_BACKSPACE; break; + case XK_Tab: key_event = BX_KEY_TAB; break; + case XK_Return: key_event = BX_KEY_ENTER; break; + case XK_Escape: key_event = BX_KEY_ESC; break; + case XK_F1: key_event = BX_KEY_F1; break; + case XK_F2: key_event = BX_KEY_F2; break; + case XK_F3: key_event = BX_KEY_F3; break; + case XK_F4: key_event = BX_KEY_F4; break; + case XK_F5: key_event = BX_KEY_F5; break; + case XK_F6: key_event = BX_KEY_F6; break; + case XK_F7: key_event = BX_KEY_F7; break; + case XK_F8: key_event = BX_KEY_F8; break; + case XK_F9: key_event = BX_KEY_F9; break; + case XK_F10: key_event = BX_KEY_F10; break; + case XK_F11: key_event = BX_KEY_F11; break; + case XK_F12: key_event = BX_KEY_F12; break; + case XK_Control_L: key_event = BX_KEY_CTRL_L; break; + case XK_Shift_L: key_event = BX_KEY_SHIFT_L; break; + case XK_Shift_R: key_event = BX_KEY_SHIFT_R; break; + case XK_Caps_Lock: key_event = BX_KEY_CAPS_LOCK; break; + case XK_Num_Lock: key_event = BX_KEY_NUM_LOCK; break; + case XK_Alt_L: key_event = BX_KEY_ALT_L; break; + + case XK_Insert: key_event = BX_KEY_INSERT; break; + case XK_Home: key_event = BX_KEY_HOME; break; + case XK_End: key_event = BX_KEY_END; break; + case XK_Page_Up: key_event = BX_KEY_PAGE_UP; break; + case XK_Page_Down: key_event = BX_KEY_PAGE_DOWN; break; + + default: + BX_ERROR(( "xkeypress(): keysym %x unhandled!", (unsigned) keysym )); + return; break; + } } + else /* use mapping */ + if((key_event=bx_keymap.getBXKey(keysym))==BX_KEY_UNHANDLED){ + BX_ERROR(( "xkeypress(): keysym %x unhandled!", (unsigned) keysym )); + return; + } if (press_release) key_event |= BX_KEY_RELEASED; Binary files bochs/gui/x.o and bochs-keymap/gui/x.o differ --- bochs/bochs.h Sun Dec 2 23:25:28 2001 +++ bochs-keymap/bochs.h Sat Dec 1 13:08:19 2001 @@ -493,6 +493,7 @@ #include "gui/gui.h" #include "gui/control.h" +#include "gui/keymap.h" extern bx_gui_c bx_gui; #include "iodev/iodev.h" @@ -590,6 +591,11 @@ bx_param_num_c *Odmatimer; } bx_sb16_options; +typedef struct { + bx_param_bool_c *OuseMapping; + bx_param_string_c *Okeymap; + } bx_keyboard_options; + #define BX_BOOT_FLOPPYA 0 #define BX_BOOT_DISKC 1 @@ -622,6 +628,7 @@ bx_param_bool_c *OnewHardDriveSupport; bx_load32bitOSImage_t load32bitOSImage; bx_log_options log; + bx_keyboard_options keyboard; } bx_options_t; extern bx_options_t bx_options; --- bochs/main.cc Sun Dec 2 23:24:03 2001 +++ bochs-keymap/main.cc Sat Dec 1 13:08:46 2001 @@ -97,6 +97,7 @@ { 0, NULL, NULL, NULL }, // load32bitOSImage hack stuff // log options: ignore debug, report info and error, crash on panic. { NULL, { ACT_IGNORE, ACT_REPORT, ACT_REPORT, ACT_ASK } }, + { NULL, NULL }, // KeyboardMapping }; static void parse_line_unformatted(char *context, char *line); @@ -736,6 +737,14 @@ "Start time for Bochs CMOS clock, used if you really want two runs to be identical (cosimulation)", 0, BX_MAX_INT, 0); + bx_options.keyboard.OuseMapping = new bx_param_bool_c(BXP_KEYBOARD_USEMAPPING, + "Use keyboard mapping", + NULL, + 0); + bx_options.keyboard.Okeymap = new bx_param_string_c (BXP_KEYBOARD_MAP, + "Map name", + NULL, + "", 10); bx_param_c *other_init_list[] = { bx_options.Okeyboard_serial_delay, bx_options.Ofloppy_command_delay, @@ -744,6 +753,8 @@ bx_options.cmos.Opath, bx_options.cmos.Otime0, SIM->get_param (BXP_LOAD32BITOS), + bx_options.keyboard.OuseMapping, + bx_options.keyboard.Okeymap, NULL }; menu = new bx_list_c (BXP_MENU_MISC, "Configure Everything Else", "", other_init_list); @@ -1774,6 +1785,18 @@ } } + else if (!strcmp(params[0], "keyboardmapping")) { + for (i=1; iOuseMapping->get(), opt->Okeymap->getptr()); + return 0; +} + // return values: // 0: written ok // -1: failed @@ -1994,6 +2024,7 @@ fprintf (fp, "newharddrivesupport: enabled=%d\n", bx_options.OnewHardDriveSupport->get ()); bx_write_loader_options (fp, &bx_options.load32bitOSImage); bx_write_log_options (fp, &bx_options.log); + bx_write_keyboard_options (fp, &bx_options.keyboard); fclose (fp); return 0; }