more retina support and multitasking support
authorkoda
Sat, 04 Dec 2010 08:52:57 +0100
changeset 4454 42bfc1a70968
parent 4453 15a483b2558a
child 4455 a0c8779713f2
more retina support and multitasking support
hedgewars/PascalExports.pas
hedgewars/SDLh.pas
hedgewars/hwengine.pas
hedgewars/uTypes.pas
project_files/HedgewarsMobile/Classes/OverlayViewController.h
project_files/HedgewarsMobile/Classes/OverlayViewController.m
project_files/HedgewarsMobile/Classes/PascalImports.h
project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.m
project_files/HedgewarsMobile/Info.plist
project_files/HedgewarsMobile/SDL.patch
--- a/hedgewars/PascalExports.pas	Thu Dec 02 20:40:30 2010 -0500
+++ b/hedgewars/PascalExports.pas	Sat Dec 04 08:52:57 2010 +0100
@@ -31,6 +31,7 @@
 implementation
 {$IFDEF HWLIBRARY}
 var cZoomVal: GLfloat;
+    previousGameState: TGameState;
 
 // retrieve protocol information
 procedure HW_versionInfo(netProto: PShortInt; versionStr: PPChar); cdecl; export;
@@ -167,9 +168,31 @@
 
 procedure HW_pause; cdecl; export;
 begin
+    if isPaused = false then
+        pauseAction:= true;
+end;
+
+procedure HW_pauseToggle; cdecl; export;
+begin
     pauseAction:= true;
 end;
 
+function HW_isPaused: boolean; cdecl; export;
+begin
+    exit( isPaused );
+end;
+
+procedure HW_suspend; cdecl; export;
+begin
+    previousGameState:= GameState;
+    GameState:= gsSuspend;
+end;
+
+procedure HW_resume; cdecl; export;
+begin
+    GameState:= previousGameState;
+end;
+
 procedure HW_terminate(closeFrontend: boolean); cdecl; export;
 begin
     isTerminated:= true;
@@ -199,11 +222,6 @@
            ((Ammoz[CurAmmoGear^.AmmoType].Ammo.Propz and ammoprop_AltAttack) = 0)) and hideAmmoMenu)) );
 end;
 
-function HW_isPaused: boolean; cdecl; export;
-begin
-    exit( isPaused );
-end;
-
 function HW_isWaiting: boolean; cdecl; export;
 begin
     exit( ReadyTimeLeft > 0 );
--- a/hedgewars/SDLh.pas	Thu Dec 02 20:40:30 2010 -0500
+++ b/hedgewars/SDLh.pas	Sat Dec 04 08:52:57 2010 +0100
@@ -511,6 +511,17 @@
 {$ENDIF}
         end;
 
+    TSDL_UserEvent = record
+{$IFDEF SDL13}
+        type_: LongInt;
+        windowID: LongInt;
+{$ELSE}
+        type_: Byte;
+{$ENDIF}
+        code: LongInt;
+        data1, data2: Pointer;
+        end;
+
     PSDL_Event = ^TSDL_Event;
     TSDL_Event = record
 {$IFDEF SDL13}
@@ -531,6 +542,7 @@
             SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent);
             SDL_JOYBUTTONDOWN,
             SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent);
+            SDL_USEREVENT: (user: TSDL_UserEvent);
 {$ELSE}
         case Byte of
             SDL_NOEVENT: (type_: byte);
--- a/hedgewars/hwengine.pas	Thu Dec 02 20:40:30 2010 -0500
+++ b/hedgewars/hwengine.pas	Sat Dec 04 08:52:57 2010 +0100
@@ -48,7 +48,8 @@
 procedure DoTimer(Lag: LongInt);
 var s: shortstring;
 begin
-    if not isPaused then inc(RealTicks, Lag);
+    if isPaused = false then
+        inc(RealTicks, Lag);
 
     case GameState of
         gsLandGen: begin
@@ -97,6 +98,7 @@
         gsExit: begin
                 isTerminated:= true;
                 end;
+        gsSuspend: exit;
         end;
 
 {$IFDEF SDL13}
@@ -104,7 +106,7 @@
 {$ELSE}
     SDL_GL_SwapBuffers();
 {$ENDIF}
-    // not going to make captures on the iPhone
+
     if flagMakeCapture then
     begin
         flagMakeCapture:= false;
@@ -146,19 +148,16 @@
         begin
             case event.type_ of
                 SDL_KEYDOWN: if GameState = gsChat then
-{$IFDEF IPHONEOS}
+{$IFDEF SDL13}
                     // sdl on iphone supports only ashii keyboards and the unicode field is deprecated in sdl 1.3
                     KeyPressChat(event.key.keysym.sym);
+                SDL_WINDOWEVENT:
+                    if event.wevent.event = SDL_WINDOWEVENT_SHOWN then
+                        cHasFocus:= true;
 {$ELSE}
                     KeyPressChat(event.key.keysym.unicode);
                 SDL_MOUSEBUTTONDOWN: if event.button.button = SDL_BUTTON_WHEELDOWN then uKeys.wheelDown:= true;
                 SDL_MOUSEBUTTONUP: if event.button.button = SDL_BUTTON_WHEELUP then uKeys.wheelUp:= true;
-{$ENDIF}
-{$IFDEF SDL13}
-                SDL_WINDOWEVENT:
-                    if event.wevent.event = SDL_WINDOWEVENT_SHOWN then
-                        cHasFocus:= true;
-{$ELSE}
                 SDL_ACTIVEEVENT:
                     if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then
                         cHasFocus:= event.active.gain = 1;
@@ -168,8 +167,8 @@
                 SDL_JOYBUTTONDOWN: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, true);
                 SDL_JOYBUTTONUP: ControllerButtonEvent(event.jbutton.which, event.jbutton.button, false);
                 SDL_QUITEV: isTerminated:= true
-            end; // end case event.type_
-        end; // end while SDL_PollEvent(@event) <> 0
+            end; //end case event.type_ of
+        end; //end while SDL_PollEvent(@event) <> 0 do
 
         if isTerminated = false then
         begin
--- a/hedgewars/uTypes.pas	Thu Dec 02 20:40:30 2010 -0500
+++ b/hedgewars/uTypes.pas	Sat Dec 04 08:52:57 2010 +0100
@@ -10,7 +10,7 @@
         r, g, b, a: byte
         end;
 
-    TGameState = (gsLandGen, gsStart, gsGame, gsChat, gsConfirm, gsExit);
+    TGameState = (gsLandGen, gsStart, gsGame, gsChat, gsConfirm, gsExit, gsSuspend);
 
     TGameType = (gmtLocal, gmtDemo, gmtNet, gmtSave, gmtLandPreview, gmtSyntax);
 
--- a/project_files/HedgewarsMobile/Classes/OverlayViewController.h	Thu Dec 02 20:40:30 2010 -0500
+++ b/project_files/HedgewarsMobile/Classes/OverlayViewController.h	Sat Dec 04 08:52:57 2010 +0100
@@ -53,6 +53,9 @@
     BOOL useClassicMenu;
     NSInteger initialOrientation;
     
+    // the containing window
+    UIWindow *containerWindow;
+    
     // dual head support
     NSInteger initialScreenCount;
     NSInteger a, b;
@@ -65,6 +68,7 @@
 @property (assign) BOOL isNetGame;
 @property (assign) BOOL useClassicMenu;
 @property (assign) NSInteger initialOrientation;
+@property (assign) UIWindow *containerWindow;
 
 -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
 -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
--- a/project_files/HedgewarsMobile/Classes/OverlayViewController.m	Thu Dec 02 20:40:30 2010 -0500
+++ b/project_files/HedgewarsMobile/Classes/OverlayViewController.m	Sat Dec 04 08:52:57 2010 +0100
@@ -38,7 +38,7 @@
 #define removeConfirmationInput()   [[self.view viewWithTag:CONFIRMATION_TAG] removeFromSuperview];
 
 @implementation OverlayViewController
-@synthesize popoverController, popupMenu, helpPage, amvc, isNetGame, useClassicMenu, initialOrientation;
+@synthesize popoverController, popupMenu, helpPage, amvc, isNetGame, useClassicMenu, initialOrientation, containerWindow;
 
 #pragma mark -
 #pragma mark rotation
@@ -54,9 +54,9 @@
     if (isGameRunning() == NO)
         return;
 
+    HW_pause();
     [self dismissPopover];
-    if (HW_isPaused() == NO)
-        HW_pause();
+
     if (self.amvc.isVisible && IS_DUALHEAD() == NO) {
         [self.amvc disappear];
         wasVisible = YES;
@@ -86,8 +86,7 @@
 
     if (wasVisible || IS_DUALHEAD())
         [self.amvc appearInView:self.view];
-    if (HW_isPaused() == YES)
-        HW_pause();
+    HW_pauseToggle();
 
     [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
 }
@@ -203,6 +202,8 @@
                                                      name:UIScreenDidDisconnectNotification
                                                    object:nil];
     }
+    
+    self.containerWindow = [[UIApplication sharedApplication] keyWindow];
 
     // present the overlay
     [UIView beginAnimations:@"showing overlay" context:NULL];
@@ -220,8 +221,7 @@
                                               otherButtonTitles:nil];
         [alert show];
         [alert release];
-        if (HW_isPaused() == NO)
-            HW_pause();
+        HW_pause();
     }
 }
 
@@ -493,7 +493,7 @@
     if (YES == isPopoverVisible) {
         isPopoverVisible = NO;
         if (HW_isPaused())
-            HW_pause();
+            HW_pauseToggle();
 
         if (IS_IPAD()) {
             [(InGameMenuViewController *)[[self popoverController] contentViewController] removeChat];
--- a/project_files/HedgewarsMobile/Classes/PascalImports.h	Thu Dec 02 20:40:30 2010 -0500
+++ b/project_files/HedgewarsMobile/Classes/PascalImports.h	Sat Dec 04 08:52:57 2010 +0100
@@ -63,16 +63,20 @@
     void HW_chat(void);
     void HW_chatEnd(void);
     void HW_tab(void);
+
     void HW_pause(void);
+    void HW_pauseToggle(void);
+    BOOL HW_isPaused(void);
 
     void HW_terminate(BOOL andCloseFrontend);
+    void HW_suspend(void);
+    void HW_resume(void);
 
     void HW_setCursor(int x, int y);
     void HW_getCursor(int *x, int *y);
 
     BOOL HW_isAmmoMenuOpen(void);
     BOOL HW_isAmmoMenuNotAllowed(void);
-    BOOL HW_isPaused(void);
     BOOL HW_isWeaponRequiringClick(void);
     BOOL HW_isWeaponTimerable(void);
     BOOL HW_isWeaponSwitch(void);
--- a/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.m	Thu Dec 02 20:40:30 2010 -0500
+++ b/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.m	Sat Dec 04 08:52:57 2010 +0100
@@ -29,6 +29,7 @@
 #import "SDL_video.h"
 #import "SDL_mixer.h"
 #import "PascalImports.h"
+#import "ObjcExports.h"
 #import "CommodityFunctions.h"
 #import "GameSetup.h"
 #import "MainMenuViewController.h"
@@ -222,40 +223,33 @@
 }
 
 -(void) applicationWillResignActive:(UIApplication *)application {
-    if (self.isInGame) {
-        HW_pause();
-
-        // Send every window on every screen a MINIMIZED event.
-        SDL_VideoDevice *_this = SDL_GetVideoDevice();
-        if (!_this)
-            return;
-
-        int i;
-        for (i = 0; i < _this->num_displays; i++) {
-            const SDL_VideoDisplay *display = &_this->displays[i];
-            SDL_Window *window;
-            for (window = display->windows; window != nil; window = window->next)
-                SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
+    UIDevice* device = [UIDevice currentDevice];
+    if ([device respondsToSelector:@selector(isMultitaskingSupported)] &&
+         device.multitaskingSupported &&
+         self.isInGame) {
+        // there is a bug on iphone that presents a sdl view with a black screen, so it returns to frontend
+        if (IS_IPAD())
+            HW_suspend();
+        else {
+            // while screen is loading you can't call HW_terminate() so we close the app
+            if (isGameRunning())
+                HW_terminate(NO);
+            else {
+                // force app closure
+                SDL_SendQuit();
+                HW_terminate(YES);
+                longjmp(*(jump_env()), 1);
+            }
         }
     }
 }
 
 -(void) applicationDidBecomeActive:(UIApplication *)application {
-    if (self.isInGame) {
-        HW_pause();
-
-        // Send every window on every screen a RESTORED event.
-        SDL_VideoDevice *_this = SDL_GetVideoDevice();
-        if (!_this)
-            return;
-
-        int i;
-        for (i = 0; i < _this->num_displays; i++) {
-            const SDL_VideoDisplay *display = &_this->displays[i];
-            SDL_Window *window;
-            for (window = display->windows; window != nil; window = window->next)
-                SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0);
-        }
+    UIDevice* device = [UIDevice currentDevice];
+    if ([device respondsToSelector:@selector(isMultitaskingSupported)] &&
+         device.multitaskingSupported &&
+         self.isInGame) {
+        HW_resume();
     }
 }
 
--- a/project_files/HedgewarsMobile/Info.plist	Thu Dec 02 20:40:30 2010 -0500
+++ b/project_files/HedgewarsMobile/Info.plist	Sat Dec 04 08:52:57 2010 +0100
@@ -31,8 +31,6 @@
 	<string>1.2</string>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
-	<key>UIApplicationExitsOnSuspend</key>
-	<true/>
 	<key>UILaunchImageFile~ipad</key>
 	<string>Default-ipad</string>
 	<key>UIStatusBarHidden</key>
--- a/project_files/HedgewarsMobile/SDL.patch	Thu Dec 02 20:40:30 2010 -0500
+++ b/project_files/HedgewarsMobile/SDL.patch	Sat Dec 04 08:52:57 2010 +0100
@@ -1,6 +1,6 @@
-diff -r 834ce48a19c2 Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj
---- a/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Sun May 09 12:58:58 2010 +0800
-+++ b/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj
+--- a/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Thu Dec 02 11:56:23 2010 -0800
++++ b/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Thu Dec 02 22:38:57 2010 +0100
 @@ -1262,7 +1262,14 @@
  			isa = PBXProject;
  			buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SDLiPhoneOS" */;
@@ -59,9 +59,9 @@
  				TARGETED_DEVICE_FAMILY = "1,2";
  			};
  			name = Release;
-diff -r 834ce48a19c2 Xcode-iPhoneOS/SDL/testsdl-Info.plist
---- a/Xcode-iPhoneOS/SDL/testsdl-Info.plist	Sun May 09 12:58:58 2010 +0800
-+++ b/Xcode-iPhoneOS/SDL/testsdl-Info.plist	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e Xcode-iPhoneOS/SDL/testsdl-Info.plist
+--- a/Xcode-iPhoneOS/SDL/testsdl-Info.plist	Thu Dec 02 11:56:23 2010 -0800
++++ b/Xcode-iPhoneOS/SDL/testsdl-Info.plist	Thu Dec 02 22:38:57 2010 +0100
 @@ -16,7 +16,5 @@
  	<string>????</string>
  	<key>CFBundleVersion</key>
@@ -70,9 +70,9 @@
 -	<string>MainWindow</string>
  </dict>
  </plist>
-diff -r 834ce48a19c2 include/SDL_config_iphoneos.h
---- a/include/SDL_config_iphoneos.h	Sun May 09 12:58:58 2010 +0800
-+++ b/include/SDL_config_iphoneos.h	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e include/SDL_config_iphoneos.h
+--- a/include/SDL_config_iphoneos.h	Thu Dec 02 11:56:23 2010 -0800
++++ b/include/SDL_config_iphoneos.h	Thu Dec 02 22:38:57 2010 +0100
 @@ -98,6 +98,8 @@
  #define HAVE_COS	1
  #define HAVE_COSF	1
@@ -108,9 +108,9 @@
 +#define SDL_VIEW_TAG 456987
 +
  #endif /* _SDL_config_iphoneos_h */
-diff -r 834ce48a19c2 src/SDL_fatal.c
---- a/src/SDL_fatal.c	Sun May 09 12:58:58 2010 +0800
-+++ b/src/SDL_fatal.c	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/SDL_fatal.c
+--- a/src/SDL_fatal.c	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/SDL_fatal.c	Thu Dec 02 22:38:57 2010 +0100
 @@ -38,9 +38,9 @@
  static void
  SDL_Parachute(int sig)
@@ -123,9 +123,9 @@
  }
  
  static const int SDL_fatal_signals[] = {
-diff -r 834ce48a19c2 src/video/SDL_renderer_gles.c
---- a/src/video/SDL_renderer_gles.c	Sun May 09 12:58:58 2010 +0800
-+++ b/src/video/SDL_renderer_gles.c	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/video/SDL_renderer_gles.c
+--- a/src/video/SDL_renderer_gles.c	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/SDL_renderer_gles.c	Thu Dec 02 22:38:57 2010 +0100
 @@ -324,6 +324,9 @@
      data->glDisable(GL_CULL_FACE);
      data->updateSize = SDL_TRUE;
@@ -207,9 +207,9 @@
      }
  
      data->glDisable(GL_TEXTURE_2D);
-diff -r 834ce48a19c2 src/video/SDL_video.c
---- a/src/video/SDL_video.c	Sun May 09 12:58:58 2010 +0800
-+++ b/src/video/SDL_video.c	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/video/SDL_video.c
+--- a/src/video/SDL_video.c	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/SDL_video.c	Thu Dec 02 22:38:57 2010 +0100
 @@ -1421,9 +1421,9 @@
          SDL_MinimizeWindow(window);
      }
@@ -222,9 +222,9 @@
      if ((window->flags & (SDL_WINDOW_INPUT_GRABBED | SDL_WINDOW_FULLSCREEN))
          && _this->SetWindowGrab) {
          _this->SetWindowGrab(_this, window);
-diff -r 834ce48a19c2 src/video/uikit/SDL_uikitopengles.m
---- a/src/video/uikit/SDL_uikitopengles.m	Sun May 09 12:58:58 2010 +0800
-+++ b/src/video/uikit/SDL_uikitopengles.m	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/video/uikit/SDL_uikitopengles.m
+--- a/src/video/uikit/SDL_uikitopengles.m	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/uikit/SDL_uikitopengles.m	Thu Dec 02 22:38:57 2010 +0100
 @@ -114,8 +114,8 @@
  									bBits: _this->gl_config.blue_size \
  									aBits: _this->gl_config.alpha_size \
@@ -236,9 +236,21 @@
  	
  	/* add the view to our window */
  	[uiwindow addSubview: view ];
-diff -r 834ce48a19c2 src/video/uikit/SDL_uikitview.h
---- a/src/video/uikit/SDL_uikitview.h	Sun May 09 12:58:58 2010 +0800
-+++ b/src/video/uikit/SDL_uikitview.h	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/video/uikit/SDL_uikitopenglview.m
+--- a/src/video/uikit/SDL_uikitopenglview.m	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/uikit/SDL_uikitopenglview.m	Thu Dec 02 22:38:57 2010 +0100
+@@ -117,6 +117,8 @@
+ 			return NO;
+ 		}
+ 		/* end create buffers */
++            if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
++                self.contentScaleFactor = [UIScreen mainScreen].scale;
+ 	}
+ 	return self;
+ }
+diff -r d716dff4b13e src/video/uikit/SDL_uikitview.h
+--- a/src/video/uikit/SDL_uikitview.h	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/uikit/SDL_uikitview.h	Thu Dec 02 22:38:57 2010 +0100
 @@ -23,11 +23,11 @@
  #include "SDL_stdinc.h"
  #include "SDL_events.h"
@@ -254,9 +266,9 @@
  #endif
  
  /* *INDENT-OFF* */
-diff -r 834ce48a19c2 src/video/uikit/SDL_uikitview.m
---- a/src/video/uikit/SDL_uikitview.m	Sun May 09 12:58:58 2010 +0800
-+++ b/src/video/uikit/SDL_uikitview.m	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/video/uikit/SDL_uikitview.m
+--- a/src/video/uikit/SDL_uikitview.m	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/uikit/SDL_uikitview.m	Thu Dec 02 22:38:57 2010 +0100
 @@ -35,9 +35,6 @@
  @implementation SDL_uikitview
  
@@ -368,9 +380,9 @@
  	
  	if (NULL == view) {
  		SDL_SetError("Window has no view");
-diff -r 834ce48a19c2 src/video/uikit/SDL_uikitwindow.m
---- a/src/video/uikit/SDL_uikitwindow.m	Sun May 09 12:58:58 2010 +0800
-+++ b/src/video/uikit/SDL_uikitwindow.m	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/video/uikit/SDL_uikitwindow.m
+--- a/src/video/uikit/SDL_uikitwindow.m	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/uikit/SDL_uikitwindow.m	Thu Dec 02 22:38:57 2010 +0100
 @@ -144,7 +144,10 @@
      if (SDL_UIKit_supports_multiple_displays) {
          [uiwindow setScreen:uiscreen];
@@ -383,9 +395,9 @@
      if (SetupWindowData(_this, window, uiwindow, SDL_TRUE) < 0) {
          [uiwindow release];
          return -1;
-diff -r 834ce48a19c2 src/video/uikit/keyinfotable.h
---- a/src/video/uikit/keyinfotable.h	Sun May 09 12:58:58 2010 +0800
-+++ b/src/video/uikit/keyinfotable.h	Sun Nov 28 18:14:58 2010 +0100
+diff -r d716dff4b13e src/video/uikit/keyinfotable.h
+--- a/src/video/uikit/keyinfotable.h	Thu Dec 02 11:56:23 2010 -0800
++++ b/src/video/uikit/keyinfotable.h	Thu Dec 02 22:38:57 2010 +0100
 @@ -54,7 +54,7 @@
  /*  10 */ {   SDL_SCANCODE_UNKNOWN, 0 },
  /*  11 */ {   SDL_SCANCODE_UNKNOWN, 0 },