--- ./before-diff/sdl.c 2004-05-18 10:33:05.000000000 +0700 +++ ./sdl.c 2004-05-18 10:40:55.000000000 +0700 @@ -130,6 +130,7 @@ static void sdl_process_key(SDL_KeyboardEvent *ev) { int keycode, v; + static int modif; /* XXX: not portable, but avoids complicated mappings */ keycode = ev->keysym.scancode; @@ -150,6 +151,78 @@ } else { keycode = 0; } + /* Adjust shift-key states when leaving window */ + + if (ev->keysym.scancode == 0) { + if ((modif ^ ev->keysym.mod) & KMOD_LSHIFT) + kbd_put_keycode(0x2a | (modif & KMOD_LSHIFT ? 0x80 : 0)); + if ((modif ^ ev->keysym.mod) & KMOD_RSHIFT) + kbd_put_keycode(0x36 | (modif & KMOD_RSHIFT ? 0x80 : 0)); + if ((modif ^ ev->keysym.mod) & KMOD_LCTRL) + kbd_put_keycode(0x1d | (modif & KMOD_LCTRL ? 0x80 : 0)); + if ((modif ^ ev->keysym.mod) & KMOD_RCTRL) { + kbd_put_keycode(0xe0 ); + kbd_put_keycode(0x1d | (modif & KMOD_RCTRL ? 0x80 : 0)); + } + if ((modif ^ ev->keysym.mod) & KMOD_LALT) + kbd_put_keycode(0x38 | (modif & KMOD_LALT ? 0x80 : 0)); + if ((modif ^ ev->keysym.mod) & KMOD_RALT) { + kbd_put_keycode(0xe0 ); + kbd_put_keycode(0x38 | (modif & KMOD_RALT ? 0x80 : 0)); + } + modif = ev->keysym.mod; + } + + /* remember shift-key state */ + + switch (keycode) { + case 0x2a: /* Left Shift */ + if (ev->type == SDL_KEYUP) + modif &= ~KMOD_LSHIFT; + else + modif |= KMOD_LSHIFT; + break; + case 0x36: /* Right Shift */ + if (ev->type == SDL_KEYUP) + modif &= ~KMOD_RSHIFT; + else + modif |= KMOD_RSHIFT; + break; + case 0x1d: /* Left CTRL */ + if (ev->type == SDL_KEYUP) + modif &= ~KMOD_LCTRL; + else + modif |= KMOD_LCTRL; + break; + case 0x1de0: /* Right CTRL */ + if (ev->type == SDL_KEYUP) + modif &= ~KMOD_RCTRL; + else + modif |= KMOD_RCTRL; + break; + case 0x38: /* Left ALT */ + if (ev->type == SDL_KEYUP) + modif &= ~KMOD_LALT; + else + modif |= KMOD_LALT; + break; + case 0x38e0: /* Right ALT */ + if (ev->type == SDL_KEYUP) + modif &= ~KMOD_RALT; + else + modif |= KMOD_RALT; + break; + case 0x45: /* Num Lock */ + kbd_put_keycode(0x45); + kbd_put_keycode(0xc5); + return; + case 0x3a: /* Caps Lock */ + kbd_put_keycode(0x3a); + kbd_put_keycode(0xba); + return; + + } + /* now send the key code */ while (keycode != 0) {