Only in SDL-1.2.11: sdl.pc
diff -ur SDL-1.2.11.orig/src/events/SDL_keyboard.c SDL-1.2.11/src/events/SDL_keyboard.c
--- SDL-1.2.11.orig/src/events/SDL_keyboard.c	Thu May  4 14:06:02 2006
+++ SDL-1.2.11/src/events/SDL_keyboard.c	Tue Oct 17 10:46:55 2006
@@ -369,6 +369,14 @@
 	return (char *)(keyname);
 }
 
+SDL_Event saved_event;
+Uint8 saved_state;
+SDL_keysym saved_keysym;
+#define NOT_SAVED       0
+#define CTRL_SAVED      1
+#define CTRL_ALT_SAVED  2
+int saved_ctrl = NOT_SAVED;
+
 /* These are global for SDL_eventloop.c */
 int SDL_PrivateKeyboard(Uint8 state, SDL_keysym *keysym)
 {
@@ -523,10 +531,69 @@
 			SDL_KeyRepeat.firsttime = 1;
 			SDL_KeyRepeat.timestamp=SDL_GetTicks();
 		}
+
+#if 1
+                /* remove left ctrl before right alt */
+                if (saved_ctrl == NOT_SAVED) {
+                    if ((keysym->sym == SDLK_LCTRL) && (state == SDL_PRESSED)) {
+                        //                    printf("kazu: left ctrl is pressed.\n");
+                        saved_state = state;
+                        saved_event = event;
+                        memcpy(&saved_keysym, keysym, sizeof(SDL_keysym));
+                        saved_event.key.keysym = saved_keysym;
+                        saved_ctrl = CTRL_SAVED;
+                    } else {
+                        if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
+                            posted = 1;
+                            SDL_PushEvent(&event);
+                        }
+                    }
+                } else if (saved_ctrl == CTRL_SAVED) {
+                    if ((keysym->sym == SDLK_LCTRL) && (state == SDL_RELEASED)) {
+                        if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
+                            posted = 1;
+                            SDL_PushEvent(&saved_event);
+                            SDL_PushEvent(&event);
+                            saved_ctrl = NOT_SAVED;
+                        }
+                    } else if ((keysym->sym == SDLK_RALT) && (state == SDL_PRESSED)) {
+                        if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
+                            posted = 1;
+                            SDL_PushEvent(&event);
+                            saved_ctrl = CTRL_ALT_SAVED;
+                        }
+                    } else {
+                        if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
+                            posted = 1;
+                            SDL_PushEvent(&saved_event);
+                            SDL_PushEvent(&event);
+                            saved_ctrl = NOT_SAVED;
+                        }
+                    }
+                } else {
+                    /* ctrl alt saved */
+                    if ((keysym->sym == SDLK_LCTRL) && (state == SDL_RELEASED)) {
+                            /* nothing to do */
+                    } else if ((keysym->sym == SDLK_RALT) && (state == SDL_RELEASED)) {
+                        if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
+                            posted = 1;
+                            SDL_PushEvent(&event);
+                            saved_ctrl = NOT_SAVED;
+                        }
+                    } else {
+                        if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
+                            posted = 1;
+                            SDL_PushEvent(&event);
+                        }                            
+                    }                        
+                }   
+#endif
+#if 0
 		if ( (SDL_EventOK == NULL) || SDL_EventOK(&event) ) {
 			posted = 1;
 			SDL_PushEvent(&event);
 		}
+#endif
 	}
 	return(posted);
 }
diff -ur SDL-1.2.11.orig/src/video/windib/SDL_dibevents.c SDL-1.2.11/src/video/windib/SDL_dibevents.c
--- SDL-1.2.11.orig/src/video/windib/SDL_dibevents.c	Thu May 18 21:44:22 2006
+++ SDL-1.2.11/src/video/windib/SDL_dibevents.c	Tue Oct 17 09:22:10 2006
@@ -107,6 +107,19 @@
 				return(0);
 			}
 			switch (wParam) {
+#ifdef JP106_KLUDGE
+				case 0xf3: /* VK_DBE_SBCSCHAR */
+				case 0xf4: /* VK_DBE_DBCSCHAR */ {
+					int keytype, subtype;
+					keytype = GetKeyboardType(0);
+					subtype = GetKeyboardType(1);
+					if (!(keytype == 7 && subtype == 2)) break;
+					/* kludge for OADG Japanese 106/109(A01) keyboard */
+					posted = SDL_PrivateKeyboard(SDL_RELEASED,
+						TranslateKey(0xf3,HIWORD(lParam),&keysym,0));
+					return(0);
+				}
+#endif
 				case VK_CONTROL:
 					if ( lParam&EXTENDED_KEYMASK )
 						wParam = VK_RCONTROL;
@@ -178,6 +191,19 @@
 #endif
 
 			switch (wParam) {
+#ifdef JP106_KLUDGE
+				case 0xf3: /* VK_DBE_SBCSCHAR */
+				case 0xf4: /* VK_DBE_DBCSCHAR */ {
+					int keytype, subtype;
+					keytype = GetKeyboardType(0);
+					subtype = GetKeyboardType(1);
+					if (!(keytype == 7 && subtype == 2)) break;
+					/* kludge for OADG Japanese 106/109(A01) keyboard */
+					posted = SDL_PrivateKeyboard(SDL_PRESSED,
+						TranslateKey(0xf3,HIWORD(lParam),&keysym,1));
+					return(0);
+				}
+#endif
 				case VK_CONTROL:
 					if ( lParam&EXTENDED_KEYMASK )
 						wParam = VK_RCONTROL;
@@ -475,6 +501,10 @@
 #endif /* NO_GETKEYBOARDSTATE */
 	}
 
+#if 1
+	if ((scancode & 0x0100) && ((scancode & 0x01ff) != 0x0145)) keysym->scancode |= 0x80;
+#endif
+
 	if ((vkey == VK_RETURN) && (scancode & 0x100)) {
 		/* No VK_ code for the keypad enter key */
 		keysym->sym = SDLK_KP_ENTER;
@@ -536,6 +566,17 @@
 			SDL_SetError("Couldn't create window");
 			return(-1);
 		}
+#ifdef DO_NOT_HANDLE_IM
+		{
+			HMODULE hm;
+			hm = GetModuleHandle("USER32");
+			if (hm) {
+				BOOL (WINAPI *enableime)(HWND, BOOL);
+				enableime = (BOOL (WINAPI *)(HWND, BOOL))GetProcAddress(hm, "WINNLSEnableIME");
+				if (enableime) enableime(SDL_Window, FALSE);
+			}
+		}
+#endif
 		ShowWindow(SDL_Window, SW_HIDE);
 	}
 
diff -ur SDL-1.2.11.orig/src/video/windib/SDL_dibvideo.c SDL-1.2.11/src/video/windib/SDL_dibvideo.c
--- SDL-1.2.11.orig/src/video/windib/SDL_dibvideo.c	Tue Jun 27 13:48:30 2006
+++ SDL-1.2.11/src/video/windib/SDL_dibvideo.c	Tue Oct 17 09:22:10 2006
@@ -446,6 +446,12 @@
     switch( dib_hdr->biBitCount )
     {
     case 8:     depth = 8; break;
+#ifdef FORCE_32BPP
+    case 16:
+    case 24:
+    case 32:
+        return 32;
+#else
     case 24:    depth = 24; break;
     case 32:    depth = 32; break;
     case 16:
@@ -456,6 +462,7 @@
                 case 0x7c00: depth = 15; break;   /* 555 */
             }
         }
+#endif
     }
     SDL_free(dib_hdr);
     return depth;
diff -ur SDL-1.2.11.orig/src/video/windx5/SDL_dx5events.c SDL-1.2.11/src/video/windx5/SDL_dx5events.c
--- SDL-1.2.11.orig/src/video/windx5/SDL_dx5events.c	Thu May 18 21:44:22 2006
+++ SDL-1.2.11/src/video/windx5/SDL_dx5events.c	Tue Oct 17 09:22:10 2006
@@ -268,6 +268,13 @@
 /* Flag to tell SDL whether or not we queued an event */
 static int posted = 0;
 
+#ifdef JP106_KLUDGE
+static BOOL is_togglekey(int ofs)
+{
+	return ((BYTE)GetVersion() >= 0x05) && (GetKeyboardType(0) == 7) && (ofs == DIK_KANJI || ofs == DIK_KANA || ofs == DIK_CAPSLOCK);
+}
+#endif
+
 /* Input event handler functions */
 static void handle_keyboard(const int numevents, DIDEVICEOBJECTDATA *keybuf)
 {
@@ -279,7 +286,17 @@
 		if ( keybuf[i].dwData & 0x80 ) {
 			posted = SDL_PrivateKeyboard(SDL_PRESSED,
 				    TranslateKey(keybuf[i].dwOfs, &keysym, 1));
+#ifdef JP106_KLUDGE
+			if (is_togglekey(keybuf[i].dwOfs))
+				posted = SDL_PrivateKeyboard(SDL_RELEASED,
+				    TranslateKey(keybuf[i].dwOfs, &keysym, 1));
+#endif
 		} else {
+#ifdef JP106_KLUDGE
+			if (is_togglekey(keybuf[i].dwOfs))
+				posted = SDL_PrivateKeyboard(SDL_PRESSED,
+				    TranslateKey(keybuf[i].dwOfs, &keysym, 1));
+#endif
 			posted = SDL_PrivateKeyboard(SDL_RELEASED,
 				    TranslateKey(keybuf[i].dwOfs, &keysym, 0));
 		}
@@ -822,6 +839,31 @@
 
 static SDL_keysym *TranslateKey(UINT scancode, SDL_keysym *keysym, int pressed)
 {
+#ifdef JP106_KLUDGE
+	if (GetKeyboardType(0) == 7 && GetKeyboardType(1) == 2)
+	{
+		struct xlatscan { UINT match; UINT remap; };
+		struct xlatscan xlatmap[] = {
+			 { 0x94, 0x29 } /* ibm 1 */
+			,{ 0x90, 0x0d } /* ibm 13 */
+			,{ 0x91, 0x1a } /* ibm 27 */
+			,{ 0x1a, 0x1b } /* ibm 28 */
+			,{ 0x92, 0x28 } /* ibm 41 */
+			,{ 0x1b, 0x2b } /* ibm 42 */
+			,{ 0x2b, 0x73 } /* ibm 56 */
+			,{ 0,0 }
+		};
+		int i = 0;
+		
+		while(xlatmap[i].match) {
+			if (xlatmap[i].match == scancode) {
+				scancode = xlatmap[i].remap;
+				break;
+			}
+			i++;
+		}
+	}
+#endif
 	/* Set the keysym information */
 	keysym->scancode = (unsigned char)scancode;
 	keysym->sym = DIK_keymap[scancode];
@@ -886,6 +928,27 @@
 		}
 		ShowWindow(SDL_Window, SW_HIDE);
 	}
+#ifdef DO_NOT_HANDLE_IM
+	{
+		BOOL rc = FALSE;
+		HMODULE hm;
+		hm = GetModuleHandle("IMM32");
+		if (hm) {
+			BOOL (WINAPI *disableime)(DWORD);
+			disableime = (BOOL (WINAPI *)(DWORD))GetProcAddress(hm, "ImmDisableIME");
+			if (disableime)
+				rc = disableime(0);
+		}
+		if (!rc) {
+			hm = GetModuleHandle("USER32");
+			if (hm) {
+				BOOL (WINAPI *enableime)(HWND, BOOL);
+				enableime = (BOOL (WINAPI *)(HWND, BOOL))GetProcAddress(hm, "WINNLSEnableIME");
+				if (enableime) enableime(SDL_Window, FALSE);
+			}
+		}
+	}
+#endif
 
 	/* Initialize DirectInput */
 	if ( DX5_DInputInit(this) < 0 ) {
