- patch is no longer necessary

This commit is contained in:
Volker Ruppert 2002-01-16 16:40:37 +00:00
parent ed04aff2ca
commit 6058946c09
4 changed files with 0 additions and 1310 deletions

View File

@ -1,77 +0,0 @@
----------------------------------------------------------------------
Patch name: patch.floppy-mt0
Author: Bryce Denney
Date: Wed Dec 12 16:34:42 EST 2001
Detailed description:
WARNING: THIS IS STILL VERY BROKEN!
I'm working on sourceforge bug
[ #431508 ] FD io write:3f5: unsupported case 0x45
http://sourceforge.net/tracker/index.php?func=detail&aid=431508&group_id=12580&atid=112580
The code assumes MT=1, and fails when MT=0. I need an understanding
of what MT really does before I can go any further.
Patch was created with:
cvs diff -u
Apply patch to what version:
cvs checked out on DATE, release version VER
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
Index: iodev/floppy.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/iodev/floppy.cc,v
retrieving revision 1.26
diff -u -r1.26 floppy.cc
--- iodev/floppy.cc 2001/10/07 03:28:45 1.26
+++ iodev/floppy.cc 2001/12/12 21:31:40
@@ -466,6 +466,9 @@
case 0x4a: /* read ID */
BX_FD_THIS s.command_size = 2;
break;
+ case 0x45:
+ BX_ERROR(("treating FDC command 0x45 just like 0xc5"));
+ // fall through into next case.
case 0xc5: /* write normal data */
BX_FD_THIS s.command_size = 9;
break;
@@ -712,7 +715,9 @@
case 0xe6: // read normal data
//BX_INFO(("floppy_command read normal data"));
- case 0xc5: // write normal data
+ case 0x45: // write normal data, with MT=0.
+ BX_ERROR(("treat FDC command 0x45 like command 0xc5"));
+ case 0xc5: // write normal data, with MT=1.
//BX_INFO(("floppy_command write normal data"));
if ( (BX_FD_THIS s.DOR & 0x08) == 0 )
BX_PANIC(("read/write command with DMA and int disabled"));
@@ -860,7 +865,7 @@
BX_FD_THIS s.pending_command = BX_FD_THIS s.command[0];
return;
}
- else if (BX_FD_THIS s.command[0] == 0xc5) { // write
+ else if (BX_FD_THIS s.command[0] == 0xc5 || BX_FD_THIS s.command[0] == 0x45) { // write
BX_FD_THIS s.floppy_buffer_index = 0;
bx_pc_system.set_DRQ(FLOPPY_DMA_CHAN, 1);
@@ -871,7 +876,7 @@
return;
}
else
- BX_PANIC(("floppy_command(): unknown read/write command"));
+ BX_PANIC(("floppy_command(): unknown read/write command 0x%02x", (Bit8u)BX_FD_THIS s.command[0]));
return;
break;
@@ -980,6 +985,7 @@
case 0x4a: /* read ID */
+ case 0x45:
case 0xc5: // write normal data
case 0xe6: // read normal data
BX_FD_THIS s.pending_command = 0;

View File

@ -1,589 +0,0 @@
----------------------------------------------------------------------
Patch name: patch.kbd-dieter
Author: Dieter Mittelmaier <dieter.mittelmaier@freenet.de>
Date: Thu, 21 Jun 2001 23:07:37 +0200
Patch Updated: Mon Jun 25 09:32:07 EDT 2001
by Bryce to make it apply cleanly
Patch Updated: Mon Jun 25 09:50:46 EDT 2001
by Bryce to add left backslash code
Detailed description:
I mapped your BX_KEY-defines in gui.h to values from XFree
../keycodes/Xfree86. Keysyms in x.cc would now translated
to keycodes. Now I can use german or us keyboard-layout in
win95 and all works well.
Note: Changing keyboard layout in win95 to en works too
Also you must change keyboard setup in win95 to AT-Enhanced 101/102 keyboard
You can also add a
BX_KEY_LEFT_BACKSLASH 94
in gui/gui.h and
case BX_KEY_LEFT_BACKSLASH: scancode =0x56h; break;
in iodev/keyboard.cc (gen_scancode).
Then <>| keys work too
Apply patch to:
current CVS
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
Index: gui/gui.h
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/gui.h,v
retrieving revision 1.7
retrieving revision 1.9
diff -u -r1.7 -r1.9
--- gui/gui.h 2001/06/23 03:18:14 1.7
+++ gui/gui.h 2001/06/25 13:39:10 1.9
@@ -92,114 +92,115 @@
#define BX_KEY_PRESSED 0x00000000
#define BX_KEY_RELEASED 0x80000000
-#define BX_KEY_CTRL_L 0
-#define BX_KEY_SHIFT_L 1
+#define BX_KEY_CTRL_L 37
+#define BX_KEY_SHIFT_L 50
-#define BX_KEY_F1 2
-#define BX_KEY_F2 3
-#define BX_KEY_F3 4
-#define BX_KEY_F4 5
-#define BX_KEY_F5 6
-#define BX_KEY_F6 7
-#define BX_KEY_F7 8
-#define BX_KEY_F8 9
-#define BX_KEY_F9 10
-#define BX_KEY_F10 11
-#define BX_KEY_F11 12
-#define BX_KEY_F12 13
-
-#define BX_KEY_CTRL_R 14
-#define BX_KEY_SHIFT_R 15
-#define BX_KEY_CAPS_LOCK 16
-#define BX_KEY_NUM_LOCK 17
-#define BX_KEY_ALT_L 18
-#define BX_KEY_ALT_R 19
-
-#define BX_KEY_A 20
-#define BX_KEY_B 21
-#define BX_KEY_C 22
-#define BX_KEY_D 23
-#define BX_KEY_E 24
-#define BX_KEY_F 25
-#define BX_KEY_G 26
-#define BX_KEY_H 27
-#define BX_KEY_I 28
-#define BX_KEY_J 29
-#define BX_KEY_K 30
-#define BX_KEY_L 31
-#define BX_KEY_M 32
-#define BX_KEY_N 33
-#define BX_KEY_O 34
-#define BX_KEY_P 35
-#define BX_KEY_Q 36
-#define BX_KEY_R 37
-#define BX_KEY_S 38
-#define BX_KEY_T 39
-#define BX_KEY_U 40
-#define BX_KEY_V 41
-#define BX_KEY_W 42
-#define BX_KEY_X 43
-#define BX_KEY_Y 44
-#define BX_KEY_Z 45
-
-#define BX_KEY_0 46
-#define BX_KEY_1 47
-#define BX_KEY_2 48
-#define BX_KEY_3 49
-#define BX_KEY_4 50
-#define BX_KEY_5 51
-#define BX_KEY_6 52
-#define BX_KEY_7 53
-#define BX_KEY_8 54
-#define BX_KEY_9 55
+#define BX_KEY_F1 67
+#define BX_KEY_F2 68
+#define BX_KEY_F3 69
+#define BX_KEY_F4 70
+#define BX_KEY_F5 71
+#define BX_KEY_F6 72
+#define BX_KEY_F7 73
+#define BX_KEY_F8 74
+#define BX_KEY_F9 75
+#define BX_KEY_F10 76
+#define BX_KEY_F11 95
+#define BX_KEY_F12 96
+
+#define BX_KEY_CTRL_R 109
+#define BX_KEY_SHIFT_R 62
+#define BX_KEY_CAPS_LOCK 66
+#define BX_KEY_NUM_LOCK 77
+#define BX_KEY_ALT_L 64
+#define BX_KEY_ALT_R 113
+
+#define BX_KEY_A 38
+#define BX_KEY_B 56
+#define BX_KEY_C 54
+#define BX_KEY_D 40
+#define BX_KEY_E 26
+#define BX_KEY_F 41
+#define BX_KEY_G 42
+#define BX_KEY_H 43
+#define BX_KEY_I 31
+#define BX_KEY_J 44
+#define BX_KEY_K 45
+#define BX_KEY_L 46
+#define BX_KEY_M 58
+#define BX_KEY_N 57
+#define BX_KEY_O 32
+#define BX_KEY_P 33
+#define BX_KEY_Q 24
+#define BX_KEY_R 27
+#define BX_KEY_S 39
+#define BX_KEY_T 28
+#define BX_KEY_U 30
+#define BX_KEY_V 55
+#define BX_KEY_W 25
+#define BX_KEY_X 53
+#define BX_KEY_Y 29
+#define BX_KEY_Z 52
+
+#define BX_KEY_0 19
+#define BX_KEY_1 10
+#define BX_KEY_2 11
+#define BX_KEY_3 12
+#define BX_KEY_4 13
+#define BX_KEY_5 14
+#define BX_KEY_6 15
+#define BX_KEY_7 16
+#define BX_KEY_8 17
+#define BX_KEY_9 18
-#define BX_KEY_ESC 56
+#define BX_KEY_ESC 9
-#define BX_KEY_SPACE 57
-#define BX_KEY_SINGLE_QUOTE 58
+#define BX_KEY_SPACE 65
+#define BX_KEY_SINGLE_QUOTE 48
#define BX_KEY_COMMA 59
#define BX_KEY_PERIOD 60
#define BX_KEY_SLASH 61
-#define BX_KEY_SEMICOLON 62
-#define BX_KEY_EQUALS 63
+#define BX_KEY_SEMICOLON 47
+#define BX_KEY_EQUALS 21
-#define BX_KEY_LEFT_BRACKET 64
-#define BX_KEY_BACKSLASH 65
-#define BX_KEY_RIGHT_BRACKET 66
-#define BX_KEY_MINUS 67
-#define BX_KEY_GRAVE 68
-
-#define BX_KEY_BACKSPACE 69
-#define BX_KEY_ENTER 70
-#define BX_KEY_TAB 71
-
-#define BX_KEY_INSERT 76
-#define BX_KEY_DELETE 77
-#define BX_KEY_HOME 78
-#define BX_KEY_END 79
-#define BX_KEY_PAGE_UP 80
-#define BX_KEY_PAGE_DOWN 81
-
-#define BX_KEY_KP_ADD 82
-#define BX_KEY_KP_SUBTRACT 83
-#define BX_KEY_KP_END 84
-#define BX_KEY_KP_DOWN 85
-#define BX_KEY_KP_PAGE_DOWN 86
-#define BX_KEY_KP_LEFT 87
-#define BX_KEY_KP_RIGHT 88
-#define BX_KEY_KP_HOME 89
-#define BX_KEY_KP_UP 90
-#define BX_KEY_KP_PAGE_UP 91
-#define BX_KEY_KP_INSERT 92
-#define BX_KEY_KP_DELETE 93
-#define BX_KEY_KP_5 94
-
-#define BX_KEY_UP 95
-#define BX_KEY_DOWN 96
-#define BX_KEY_LEFT 97
-#define BX_KEY_RIGHT 98
-
-#define BX_KEY_KP_ENTER 99
-#define BX_KEY_KP_MULTIPLY 100
-#define BX_KEY_KP_DIVIDE 101
+#define BX_KEY_LEFT_BRACKET 34
+#define BX_KEY_BACKSLASH 51
+#define BX_KEY_LEFT_BACKSLASH 94
+#define BX_KEY_RIGHT_BRACKET 35
+#define BX_KEY_MINUS 20
+#define BX_KEY_GRAVE 49
+
+#define BX_KEY_BACKSPACE 22
+#define BX_KEY_ENTER 36
+#define BX_KEY_TAB 23
+
+#define BX_KEY_INSERT 106
+#define BX_KEY_DELETE 107
+#define BX_KEY_HOME 97
+#define BX_KEY_END 103
+#define BX_KEY_PAGE_UP 99
+#define BX_KEY_PAGE_DOWN 105
+
+#define BX_KEY_KP_ADD 86
+#define BX_KEY_KP_SUBTRACT 82
+#define BX_KEY_KP_END 87
+#define BX_KEY_KP_DOWN 88
+#define BX_KEY_KP_PAGE_DOWN 89
+#define BX_KEY_KP_LEFT 83
+#define BX_KEY_KP_RIGHT 85
+#define BX_KEY_KP_HOME 79
+#define BX_KEY_KP_UP 80
+#define BX_KEY_KP_PAGE_UP 81
+#define BX_KEY_KP_INSERT 90
+#define BX_KEY_KP_DELETE 91
+#define BX_KEY_KP_5 84
+
+#define BX_KEY_UP 98
+#define BX_KEY_DOWN 104
+#define BX_KEY_LEFT 100
+#define BX_KEY_RIGHT 102
+
+#define BX_KEY_KP_ENTER 108
+#define BX_KEY_KP_MULTIPLY 63
+#define BX_KEY_KP_DIVIDE 112
Index: gui/x.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/x.cc,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- gui/x.cc 2001/06/23 03:18:14 1.13
+++ gui/x.cc 2001/06/25 13:35:51 1.14
@@ -102,137 +102,11 @@
static void headerbar_click(int x, int y);
static void send_keyboard_mouse_status(void);
-
-
-
-Bit32u ascii_to_key_event[0x5f] = {
- // !"#$%&'
- BX_KEY_SPACE,
- BX_KEY_1,
- BX_KEY_SINGLE_QUOTE,
- BX_KEY_3,
- BX_KEY_4,
- BX_KEY_5,
- BX_KEY_7,
- BX_KEY_SINGLE_QUOTE,
-
- // ()*+,-./
- BX_KEY_9,
- BX_KEY_0,
- BX_KEY_8,
- BX_KEY_EQUALS,
- BX_KEY_COMMA,
- BX_KEY_MINUS,
- BX_KEY_PERIOD,
- BX_KEY_SLASH,
-
- // 01234567
- BX_KEY_0,
- BX_KEY_1,
- BX_KEY_2,
- BX_KEY_3,
- BX_KEY_4,
- BX_KEY_5,
- BX_KEY_6,
- BX_KEY_7,
-
- // 89:;<=>?
- BX_KEY_8,
- BX_KEY_9,
- BX_KEY_SEMICOLON,
- BX_KEY_SEMICOLON,
- BX_KEY_COMMA,
- BX_KEY_EQUALS,
- BX_KEY_PERIOD,
- BX_KEY_SLASH,
-
- // @ABCDEFG
- BX_KEY_2,
- BX_KEY_A,
- BX_KEY_B,
- BX_KEY_C,
- BX_KEY_D,
- BX_KEY_E,
- BX_KEY_F,
- BX_KEY_G,
-
-
- // HIJKLMNO
- BX_KEY_H,
- BX_KEY_I,
- BX_KEY_J,
- BX_KEY_K,
- BX_KEY_L,
- BX_KEY_M,
- BX_KEY_N,
- BX_KEY_O,
-
-
- // PQRSTUVW
- BX_KEY_P,
- BX_KEY_Q,
- BX_KEY_R,
- BX_KEY_S,
- BX_KEY_T,
- BX_KEY_U,
- BX_KEY_V,
- BX_KEY_W,
-
- // XYZ[\]^_
- BX_KEY_X,
- BX_KEY_Y,
- BX_KEY_Z,
- BX_KEY_LEFT_BRACKET,
- BX_KEY_BACKSLASH,
- BX_KEY_RIGHT_BRACKET,
- BX_KEY_6,
- BX_KEY_MINUS,
-
- // `abcdefg
- BX_KEY_GRAVE,
- BX_KEY_A,
- BX_KEY_B,
- BX_KEY_C,
- BX_KEY_D,
- BX_KEY_E,
- BX_KEY_F,
- BX_KEY_G,
-
- // hijklmno
- BX_KEY_H,
- BX_KEY_I,
- BX_KEY_J,
- BX_KEY_K,
- BX_KEY_L,
- BX_KEY_M,
- BX_KEY_N,
- BX_KEY_O,
-
- // pqrstuvw
- BX_KEY_P,
- BX_KEY_Q,
- BX_KEY_R,
- BX_KEY_S,
- BX_KEY_T,
- BX_KEY_U,
- BX_KEY_V,
- BX_KEY_W,
-
- // xyz{|}~
- BX_KEY_X,
- BX_KEY_Y,
- BX_KEY_Z,
- BX_KEY_LEFT_BRACKET,
- BX_KEY_BACKSLASH,
- BX_KEY_RIGHT_BRACKET,
- BX_KEY_GRAVE
- };
-
extern Bit8u graphics_snapshot[32 * 1024];
static void load_font(void);
-static void xkeypress(KeySym keysym, int press_release);
+static void xkeypress(KeyCode keycode, int press_release);
// extern "C" void select_visual(void);
#define ROUNDUP(nbytes, pad) ((((nbytes) + ((pad)-1)) / (pad)) * ((pad)>>3))
@@ -555,6 +429,7 @@
XEvent report;
XKeyEvent *key_event;
KeySym keysym;
+ KeyCode keycode;
XComposeStatus compose;
char buffer[MAX_MAPPED_STRING_LENGTH];
int bufsize = MAX_MAPPED_STRING_LENGTH;
@@ -690,13 +565,15 @@
case KeyPress:
key_event = (XKeyEvent *) &report;
charcount = XLookupString(key_event, buffer, bufsize, &keysym, &compose);
- xkeypress(keysym, 0);
+ keycode = XKeysymToKeycode(bx_x_display, keysym);
+ xkeypress(keycode, 0);
break;
case KeyRelease:
key_event = (XKeyEvent *) &report;
charcount = XLookupString(key_event, buffer, bufsize, &keysym, &compose);
- xkeypress(keysym, 1);
+ keycode = XKeysymToKeycode(bx_x_display, keysym);
+ xkeypress(keycode, 1);
break;
case MotionNotify:
@@ -790,137 +667,11 @@
void
-xkeypress(KeySym keysym, int press_release)
+xkeypress(KeyCode keycode, int press_release)
{
Bit32u key_event;
-
-
-
-
-
- // 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:
-#endif
- key_event = BX_KEY_KP_END; break;
-
- case XK_KP_2:
-#ifdef XK_KP_Down
- case XK_KP_Down:
-#endif
- key_event = BX_KEY_KP_DOWN; break;
-
- case XK_KP_3:
-#ifdef XK_KP_Page_Down
- case XK_KP_Page_Down:
-#endif
- key_event = BX_KEY_KP_PAGE_DOWN; break;
-
- case XK_KP_4:
-#ifdef XK_KP_Left
- case XK_KP_Left:
-#endif
- key_event = BX_KEY_KP_LEFT; break;
-
- case XK_KP_5:
- key_event = BX_KEY_KP_5; break;
-
- case XK_KP_6:
-#ifdef XK_KP_Right
- case XK_KP_Right:
-#endif
- key_event = BX_KEY_KP_RIGHT; break;
-
- case XK_KP_7:
-#ifdef XK_KP_Home
- case XK_KP_Home:
-#endif
- key_event = BX_KEY_KP_HOME; break;
-
- case XK_KP_8:
-#ifdef XK_KP_Up
- case XK_KP_Up:
-#endif
- key_event = BX_KEY_KP_UP; break;
-
- case XK_KP_9:
-#ifdef XK_KP_Page_Up
- case XK_KP_Page_Up:
-#endif
- key_event = BX_KEY_KP_PAGE_UP; break;
-
- case XK_KP_0:
-#ifdef XK_KP_Insert
- case XK_KP_Insert:
- key_event = BX_KEY_KP_INSERT; break;
-#endif
-
- case XK_KP_Decimal:
-#ifdef XK_KP_Delete
- case XK_KP_Delete:
- key_event = BX_KEY_KP_DELETE; break;
-#endif
-
-#ifdef XK_KP_Enter
- 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_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;
- }
+ key_event = (unsigned) keycode;
+ BX_DEBUG (("keycode: %d\n", (unsigned) keycode));
if (press_release)
key_event |= BX_KEY_RELEASED;
Index: iodev/keyboard.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/iodev/keyboard.cc,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- iodev/keyboard.cc 2001/06/20 14:01:39 1.22
+++ iodev/keyboard.cc 2001/06/25 13:39:10 1.23
@@ -646,6 +646,7 @@
case BX_KEY_LEFT_BRACKET: scancode = 0x1a; break;
case BX_KEY_BACKSLASH: scancode = 0x2b; break;
+ case BX_KEY_LEFT_BACKSLASH: scancode = 0x56; break;
case BX_KEY_RIGHT_BRACKET: scancode = 0x1b; break;
case BX_KEY_MINUS: scancode = 0x0c; break;
case BX_KEY_GRAVE: scancode = 0x29; break;

View File

@ -1,299 +0,0 @@
----------------------------------------------------------------------
Patch name: patch.kbd-dieter-2
Author: Dieter Mittelmaier <dieter.mittelmaier@freenet.de>
Date: Wed, 4 Jul 2001 22:12:28 +0200
RCS Id: $Id: patch.kbd-dieter-2,v 1.1 2001-11-19 18:36:35 bdenney Exp $
Detailed description:
New keyboard patch
Short description:
We now use a virtual keyboard with US-layout. X translate keycodes to
keysyms using this virtual keyboard. So we must not think about keycodes.
Read also comments in gui/x.cc.
This should work with all keyboards and languages X supports.
Hope this works on all X-servers.
Cause your current keyboard implementation is a US-keyboard to BIOS-scancodes
I must not change BX_KEY-defines.
Changes in iodev/keyboard.cc and gui/gui.h are additional and don't hurt your
current implementation.
Main changes in gui/x.cc I have included in #ifdef NEW_KEYBOARD which is
defined at top of x.cc. So you can use your current keyboard implementation
too. Or make a configure-option.
Patch was created with:
diff -u
Apply patch to what version:
current cvs
Instructions:
To patch, go to main bochs directory.
Type "patch -p1 < THIS_PATCH_FILE".
----------------------------------------------------------------------
diff -urN bochs/gui/gui.h bochs/gui/gui.h
--- bochs/gui/gui.h Tue May 15 16:49:56 2001
+++ bochs/gui/gui.h Mon Jul 2 15:01:56 2001
@@ -175,6 +175,13 @@
#define BX_KEY_ENTER 70
#define BX_KEY_TAB 71
+/* need this key for german keyboards "<>|" */
+#define BX_KEY_LSGT 72
+/* just for completeness */
+#define BX_KEY_PRSC 73
+#define BX_KEY_SCLK 74
+#define BX_KEY_PAUS 75
+
#define BX_KEY_INSERT 76
#define BX_KEY_DELETE 77
#define BX_KEY_HOME 78
diff -urN bochs/gui/x.cc bochs/gui/x.cc
--- bochs/gui/x.cc Thu May 24 16:08:54 2001
+++ bochs/gui/x.cc Wed Jul 4 21:24:17 2001
@@ -20,6 +20,8 @@
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+/* Change this to 0 if it does't work */
+#define NEW_KEYBOARD 1
extern "C" {
#include <X11/Xlib.h>
@@ -27,6 +29,10 @@
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
+#ifdef NEW_KEYBOARD
+#include <X11/XKBlib.h>
+#endif
+
}
#include "bochs.h"
@@ -37,6 +43,12 @@
#define MAX_MAPPED_STRING_LENGTH 10
+#ifdef NEW_KEYBOARD
+XkbDescPtr bx_xkb; /* Our virtual keyboard with US-layout */
+XkbDescPtr bx_xkb_orig;
+static void init_keyboard(void);
+#endif
+
/* These are used as arguments to nearly every Xlib routine, so it saves
* routine arguments to declare them global. If there were
* additional source files, they would be declared extern there. */
@@ -303,6 +315,10 @@
progname, XDisplayName(display_name)));
}
+#ifdef NEW_KEYBOARD
+ init_keyboard();
+#endif
+
/* get screen size from display structure macro */
bx_x_screen_num = DefaultScreen(bx_x_display);
@@ -515,6 +531,125 @@
XFlush(bx_x_display);
}
+#ifdef NEW_KEYBOARD
+ void
+init_keyboard(void)
+{
+ XkbComponentNamesRec kcomp;
+ char * bx_symbols= "+us";
+ char * orig_symbols = NULL;
+ char * orig_keycodes = NULL;
+ char * orig_types = NULL;
+ char * orig_compat = NULL;
+ char *tmp = NULL;
+
+ /*
+ Using XkbGetKeyboardByName(bx_x_display,XkbUseCoreKbd,
+ &kcomp,XkbGBN_AllComponentsMask,XkbGBN_AllComponentsMask,False);
+ should give us a keyboard description without loading it into the server,
+ but it crashs. Maybe this is a bug in XFree86, I don't know.
+ So we use this workaround.
+ We must store current keyboard description. Then we change symbols to
+ US-layout. The server load this layout. At this time we have it in all
+ clients. So we must restore previous keyboard-layout.
+
+ We should free our virtual keyboard description if bochs closed.
+ Can anybody tell me where.
+ */
+
+ /* Get a full copy from current keyboard */
+ bx_xkb_orig = NULL;
+ bx_xkb_orig = XkbGetKeyboard(bx_x_display,XkbAllComponentsMask,XkbUseCoreKbd);
+ if (bx_xkb_orig) {
+ if (XkbGetNames(bx_x_display,XkbAllNamesMask,bx_xkb_orig)!=Success) {
+ BX_PANIC(("Xkeyb:Could not load names\n"));
+ } else {
+ /* store description to restore it later */
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->symbols);
+ orig_symbols = (char *) malloc(strlen(tmp));
+ sprintf(orig_symbols, "%s", tmp);
+
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->keycodes);
+ orig_keycodes = (char *) malloc(strlen(tmp));
+ sprintf(orig_keycodes, "%s", tmp);
+
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->types);
+ orig_types = (char *) malloc(strlen(tmp));
+ sprintf(orig_types, "%s", tmp);
+
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->compat);
+ orig_compat = (char *) malloc(strlen(tmp));
+ sprintf(orig_compat, "%s", tmp);
+
+ BX_DEBUG(("Xkeyb:orig_symbols %s\n",orig_symbols));
+ BX_DEBUG(("Xkeyb:orig_keycodes %s\n",orig_keycodes));
+ BX_DEBUG(("Xkeyb:orig_types %s\n",orig_types));
+ BX_DEBUG(("Xkeyb:orig_compat %s\n",orig_compat));
+ }
+ XkbFreeKeyboard(bx_xkb_orig,XkbAllComponentsMask,True);
+ } else {
+ BX_PANIC(("Xkeyb:Could not load keyboard description\n"));
+ }
+
+ /* Now change symbols to US-layout */
+ kcomp.keymap = NULL;
+ kcomp.keycodes = NULL;
+ kcomp.types = NULL;
+ kcomp.compat = NULL;
+ kcomp.symbols = bx_symbols;
+ kcomp.geometry = NULL;
+ bx_xkb = NULL;
+ bx_xkb = XkbGetKeyboardByName(bx_x_display,XkbUseCoreKbd, &kcomp,XkbGBN_AllComponentsMask,XkbGBN_AllComponentsMask,True);
+ if (!bx_xkb)
+ BX_ERROR(("Xkeyb:Could not load us-symbols\n"));
+
+ /* Finally restore original keyboard layout */
+ kcomp.keymap = NULL;
+ kcomp.keycodes = orig_keycodes;
+ kcomp.types = orig_types;
+ kcomp.compat = orig_compat;
+ kcomp.symbols = orig_symbols;
+ kcomp.geometry = NULL;
+ bx_xkb_orig = NULL;
+ bx_xkb_orig = XkbGetKeyboardByName(bx_x_display,XkbUseCoreKbd, &kcomp,XkbGBN_AllComponentsMask,XkbGBN_AllComponentsMask,True);
+
+ if (bx_xkb_orig) {
+ /* Only needed to check if original keyboard is proper restored */
+ if (XkbGetNames(bx_x_display,XkbAllNamesMask,bx_xkb_orig)!=Success) {
+ BX_PANIC(("Xkeyb:Could not load names\n"));
+ } else {
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->symbols);
+ orig_symbols = (char *) malloc(strlen(tmp));
+ sprintf(orig_symbols, "%s", tmp);
+
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->keycodes);
+ orig_keycodes = (char *) malloc(strlen(tmp));
+ sprintf(orig_keycodes, "%s", tmp);
+
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->types);
+ orig_types = (char *) malloc(strlen(tmp));
+ sprintf(orig_types, "%s", tmp);
+
+ tmp = XGetAtomName(bx_x_display,bx_xkb_orig->names->compat);
+ orig_compat = (char *) malloc(strlen(tmp));
+ sprintf(orig_compat, "%s", tmp);
+
+ BX_DEBUG(("Xkeyb:restored_symbols %s\n",orig_symbols));
+ BX_DEBUG(("Xkeyb:restored_keycodes %s\n",orig_keycodes));
+ BX_DEBUG(("Xkeyb:restored_types %s\n",orig_types));
+ BX_DEBUG(("Xkeyb:restored_compat %s\n",orig_compat));
+ }
+ XkbFreeKeyboard(bx_xkb_orig,XkbAllComponentsMask,True);
+ } else {
+ BX_PANIC(("Xkeyb:Cannot restore previous keyboard\n"));
+ }
+
+ free(orig_symbols);
+ free(orig_keycodes);
+ free(orig_types);
+ free(orig_compat);
+}
+#endif
void
load_font(void)
@@ -533,10 +668,14 @@
XEvent report;
XKeyEvent *key_event;
KeySym keysym;
+#ifdef NEW_KEYBOARD
+ unsigned int mods_rtrn;
+#else
XComposeStatus compose;
char buffer[MAX_MAPPED_STRING_LENGTH];
int bufsize = MAX_MAPPED_STRING_LENGTH;
int charcount;
+#endif
Boolean mouse_update;
@@ -679,13 +818,23 @@
case KeyPress:
key_event = (XKeyEvent *) &report;
+#ifdef NEW_KEYBOARD
+ /* Now get keysym from virtual US-keyboard */
+ XkbTranslateKeyCode(bx_xkb, key_event->keycode, 0, &mods_rtrn, &keysym);
+#else
charcount = XLookupString(key_event, buffer, bufsize, &keysym, &compose);
+#endif
xkeypress(keysym, 0);
break;
case KeyRelease:
key_event = (XKeyEvent *) &report;
+#ifdef NEW_KEYBOARD
+ /* Now get keysym from virtual US-keyboard */
+ XkbTranslateKeyCode(bx_xkb, key_event->keycode, 0, &mods_rtrn, &keysym);
+#else
charcount = XLookupString(key_event, buffer, bufsize, &keysym, &compose);
+#endif
xkeypress(keysym, 1);
break;
@@ -792,9 +941,12 @@
// 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];
+ if ((keysym == XK_less) || (keysym == XK_greater)) {
+ key_event = BX_KEY_LSGT;
+ } else {
+ key_event = ascii_to_key_event[keysym - XK_space];
}
- else switch (keysym) {
+ } else switch (keysym) {
case XK_KP_1:
#ifdef XK_KP_End
case XK_KP_End:
@@ -899,6 +1051,7 @@
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_Mode_switch: key_event = BX_KEY_ALT_R; break;
case XK_Insert: key_event = BX_KEY_INSERT; break;
case XK_Home: key_event = BX_KEY_HOME; break;
diff -urN bochs/iodev/keyboard.cc bochs/iodev/keyboard.cc
--- bochs/iodev/keyboard.cc Tue Jun 12 19:30:11 2001
+++ bochs/iodev/keyboard.cc Mon Jul 2 14:51:44 2001
@@ -695,7 +695,8 @@
case BX_KEY_F10: scancode = 0x44; break;
case BX_KEY_F11: scancode = 0x57; break;
case BX_KEY_F12: scancode = 0x58; break;
-
+ case BX_KEY_LSGT: scancode = 0x56; break;
+
default:
BX_DEBUG(( "bx_keyb_c::gen_scancode : Unhandled %u\n",
(unsigned) key));

View File

@ -1,345 +0,0 @@
----------------------------------------------------------------------
Patch name: patch.memleaks-tominac
Author: Darko Tominac <darko.tominac@zg.tel.hr>
Date: Fri, 21 Dec 2001 19:22:48 +0100
Detailed description:
I am new to Bochs, but I have done some testing with
Numega's BoundsChecker and have found (and fixed) some bugs
and memory leaks.
Bryce took the modified files, edited them a bit, and made
it into this patch.
Volker Ruppert added 'virtual' to the destructors.
Patch was created with:
cvs diff -u
Apply patch to what version:
cvs checked out on DATE, release version VER
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
Index: logio.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/logio.cc,v
retrieving revision 1.14
diff -u -b -r1.14 logio.cc
--- logio.cc 2001/12/08 18:08:24 1.14
+++ logio.cc 2001/12/21 19:26:23
@@ -195,9 +195,10 @@
logfunctions::logfunctions(void)
{
+ prefix = NULL;
put(" ");
settype(GENLOG);
- if(io == NULL && Allocio == 0) {
+ if (io == NULL && Allocio == 0) {
Allocio = 1;
io = new iofunc_t(stderr);
}
@@ -210,6 +211,7 @@
logfunctions::logfunctions(iofunc_t *iofunc)
{
+ prefix = NULL;
put(" ");
settype(GENLOG);
setio(iofunc);
@@ -221,6 +223,16 @@
logfunctions::~logfunctions(void)
{
+ if (io != NULL)
+ {
+ delete io;
+ io = NULL;
+ }
+ if ( this->prefix )
+ {
+ free(this->prefix);
+ this->prefix = NULL;
+ }
}
void
@@ -238,6 +250,16 @@
char *tmpbuf;
tmpbuf=strdup("[ ]");// if we ever have more than 32 chars,
// we need to rethink this
+
+ if ( tmpbuf == NULL)
+ {
+ return ; /* allocation not successful */
+ }
+ if ( this->prefix != NULL )
+ {
+ free(this->prefix); /* free previously allocated memory */
+ this->prefix = NULL;
+ }
int len=strlen(p);
for(int i=1;i<len+1;i++) {
tmpbuf[i]=p[i-1];
Index: main.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/main.cc,v
retrieving revision 1.81
diff -u -b -r1.81 main.cc
--- main.cc 2001/12/14 17:55:51 1.81
+++ main.cc 2001/12/21 19:26:26
@@ -1195,13 +1195,15 @@
static void
parse_line_unformatted(char *context, char *line)
{
+#define MAX_PARAMS_LEN 40
char *ptr;
unsigned i, string_i;
char string[512];
- char *params[40];
+ char *params[MAX_PARAMS_LEN];
int num_params;
Boolean inquotes = 0;
+ memset(params, 0, sizeof(params));
if (line == NULL) return;
// if passed nothing but whitespace, just return
@@ -1247,10 +1249,30 @@
}
}
string[string_i] = '\0';
+ if ( params[num_params] != NULL )
+ {
+ free(params[num_params]);
+ params[num_params] = NULL;
+ }
+ if ( num_params < MAX_PARAMS_LEN )
+ {
params[num_params++] = strdup (string);
ptr = strtok(NULL, ",");
}
+ else
+ {
+ BX_PANIC (("too many parameters, max is %d\n", MAX_PARAMS_LEN));
+ }
+ }
parse_line_formatted(context, num_params, &params[0]);
+ for (i=0; i < MAX_PARAMS_LEN; i++)
+ {
+ if ( params[i] != NULL )
+ {
+ free(params[i]);
+ params[i] = NULL;
+ }
+ }
}
static void
Index: state_file.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/state_file.cc,v
retrieving revision 1.8
diff -u -b -r1.8 state_file.cc
--- state_file.cc 2001/10/03 13:10:37 1.8
+++ state_file.cc 2001/12/21 19:26:26
@@ -128,4 +128,9 @@
state_file::~state_file()
{
BX_DEBUG(("Exit."));
+ if ( log != NULL )
+ {
+ delete log;
+ log = NULL;
+ }
}
Index: gui/siminterface.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/siminterface.cc,v
retrieving revision 1.36
diff -u -b -r1.36 siminterface.cc
--- gui/siminterface.cc 2001/12/12 10:38:39 1.36
+++ gui/siminterface.cc 2001/12/21 19:26:27
@@ -32,6 +32,7 @@
int enabled;
public:
bx_real_sim_c ();
+ virtual ~bx_real_sim_c ();
virtual int get_init_done () { return init_done; }
virtual int set_init_done (int n) { init_done = n; return 0;}
virtual int register_param (bx_id id, bx_param_c *it);
@@ -127,6 +128,15 @@
param_registry = new bx_param_c* [registry_alloc_size];
}
+bx_real_sim_c::~bx_real_sim_c ()
+{
+ if ( param_registry != NULL )
+ {
+ delete [] param_registry;
+ param_registry = NULL;
+ }
+}
+
int
bx_real_sim_c::register_param (bx_id id, bx_param_c *it)
{
@@ -449,6 +459,26 @@
set (initial_val);
}
+bx_param_string_c::~bx_param_string_c ()
+{
+ if ( this->val != NULL )
+ {
+ delete [] this->val;
+ this->val = NULL;
+ }
+ if ( this->initial_val != NULL )
+ {
+ delete [] this->initial_val;
+ this->initial_val = NULL;
+ }
+
+ if ( this->options != NULL )
+ {
+ delete [] this->options;
+ this->options = NULL;
+ }
+}
+
void
bx_param_string_c::reset () {
strncpy (this->val, this->initial_val, maxsize);
@@ -514,6 +544,30 @@
for (int i=0; i<this->size; i++)
this->list[i] = init_list[i];
init ();
+}
+
+bx_list_c::~bx_list_c()
+{
+ if (this->list)
+ {
+ delete [] this->list;
+ this->list = NULL;
+ }
+ if ( this->title != NULL)
+ {
+ delete this->title;
+ this->title = NULL;
+ }
+ if (this->options != NULL)
+ {
+ delete this->options;
+ this->options = NULL;
+ }
+ if ( this->choice != NULL )
+ {
+ delete this->choice;
+ this->choice = NULL;
+ }
}
void
Index: gui/siminterface.h
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/siminterface.h,v
retrieving revision 1.29
diff -u -b -r1.29 siminterface.h
--- gui/siminterface.h 2001/12/14 17:54:58 1.29
+++ gui/siminterface.h 2001/12/21 19:26:27
@@ -229,6 +229,7 @@
char *description,
char *initial_val,
int maxsize=-1);
+ virtual ~bx_param_string_c ();
void reset ();
void set_handler (param_string_event_handler handler);
Bit32s get (char *buf, int len);
@@ -274,6 +275,7 @@
} bx_listopt_bits;
//bx_list_c (bx_id id, int maxsize);
bx_list_c (bx_id id, char *name, char *description, bx_param_c **init_list);
+ virtual ~bx_list_c();
void add (bx_param_c *param);
bx_param_c *get (int index);
bx_param_num_c *get_options () { return options; }
Index: gui/win32.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/gui/win32.cc,v
retrieving revision 1.21
diff -u -b -r1.21 win32.cc
--- gui/win32.cc 2001/12/13 18:36:29 1.21
+++ gui/win32.cc 2001/12/21 19:26:30
@@ -855,7 +855,8 @@
for (unsigned i=0; i<ydim * xdim/8; i++)
data[i] = reverse_bitorder(bmap[i]);
SetBitmapBits(bx_bitmaps[bx_bitmap_entries].bmap, ydim * xdim/8, data);
- free(data);
+ delete [] data;
+ data = NULL;
bx_bitmaps[bx_bitmap_entries].xdim = xdim;
bx_bitmaps[bx_bitmap_entries].ydim = ydim;
Index: iodev/harddrv.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/iodev/harddrv.cc,v
retrieving revision 1.41
diff -u -b -r1.41 harddrv.cc
--- iodev/harddrv.cc 2001/11/12 03:34:45 1.41
+++ iodev/harddrv.cc 2001/12/21 19:26:34
@@ -85,6 +85,8 @@
bx_hard_drive_c::bx_hard_drive_c(void)
{
+ s[0].hard_drive = NULL;
+ s[1].hard_drive = NULL;
put("HD");
settype(HDLOG);
#if EXTERNAL_DISK_SIMULATOR
@@ -106,12 +108,22 @@
bx_hard_drive_c::~bx_hard_drive_c(void)
{
- // nothing for now
BX_DEBUG(("Exit."));
+ if ( s[0].hard_drive != NULL ) /* DT 17.12.2001 21:55 */
+ {
+ delete s[0].hard_drive;
+ s[0].hard_drive = NULL;
+ }
+ if ( s[1].hard_drive != NULL )
+ {
+ delete s[1].hard_drive;
+ s[1].hard_drive = NULL; /* DT 17.12.2001 21:56 */
+ }
}
+
void
bx_hard_drive_c::init(bx_devices_c *d, bx_cmos_c *cmos)
{
Index: iodev/unmapped.cc
===================================================================
RCS file: /cvsroot/bochs/bochs/iodev/unmapped.cc,v
retrieving revision 1.13
diff -u -b -r1.13 unmapped.cc
--- iodev/unmapped.cc 2001/10/03 13:10:38 1.13
+++ iodev/unmapped.cc 2001/12/21 19:26:34
@@ -52,7 +52,11 @@
bx_unmapped_c::~bx_unmapped_c(void)
{
- // nothing for now
+ if ( bioslog != NULL ) /* DT 17.12.2001 21:32 */
+ {
+ delete bioslog;
+ bioslog = NULL;
+ }
}
void