Browse Source

simplify keyboard handling

Wei Mingzhi 6 years ago
parent
commit
3d4b6c0fb4
2 changed files with 80 additions and 86 deletions
  1. 79 86
      input.c
  2. 1 0
      input.h

+ 79 - 86
input.c

@@ -53,6 +53,70 @@ static void (*input_init_filter)() = _default_init_filter;
 static int (*input_event_filter)(const SDL_Event *, volatile PALINPUTSTATE *) = _default_input_event_filter;
 static void (*input_shutdown_filter)() = _default_input_shutdown_filter;
 
+static const int g_KeyMap[][2] = {
+   { SDLK_UP,        kKeyUp },
+   { SDLK_KP_8,      kKeyUp },
+   { SDLK_DOWN,      kKeyDown },
+   { SDLK_KP_2,      kKeyDown },
+   { SDLK_LEFT,      kKeyLeft },
+   { SDLK_KP_4,      kKeyLeft },
+   { SDLK_RIGHT,     kKeyRight },
+   { SDLK_KP_6,      kKeyRight },
+   { SDLK_ESCAPE,    kKeyMenu },
+   { SDLK_INSERT,    kKeyMenu },
+   { SDLK_LALT,      kKeyMenu },
+   { SDLK_RALT,      kKeyMenu },
+   { SDLK_KP_0,      kKeyMenu },
+   { SDLK_RETURN,    kKeySearch },
+   { SDLK_SPACE,     kKeySearch },
+   { SDLK_KP_ENTER,  kKeySearch },
+   { SDLK_LCTRL,     kKeySearch },
+   { SDLK_PAGEUP,    kKeyPgUp },
+   { SDLK_KP_9,      kKeyPgUp },
+   { SDLK_PAGEDOWN,  kKeyPgDn },
+   { SDLK_KP_3,      kKeyPgDn },
+   { SDLK_HOME,      kKeyHome },
+   { SDLK_END,       kKeyEnd },
+   { SDLK_r,         kKeyRepeat },
+   { SDLK_a,         kKeyAuto },
+   { SDLK_d,         kKeyDefend },
+   { SDLK_e,         kKeyUseItem },
+   { SDLK_w,         kKeyThrowItem },
+   { SDLK_q,         kKeyFlee },
+   { SDLK_f,         kKeyForce }
+};
+
+static INT
+PAL_ConvertKey(
+   INT      keySym
+)
+/*++
+  Purpose:
+
+    Convert SDL key code to our internal key code.
+
+  Parameters:
+
+    [IN]  keySym - SDL key code.
+
+  Return value:
+
+    Internal key code.
+
+--*/
+{
+   int i;
+
+   for (i = 0; i < sizeof(g_KeyMap) / sizeof(g_KeyMap[0]); i++)
+   {
+      if (g_KeyMap[i][0] == keySym)
+      {
+         return g_KeyMap[i][1];
+      }
+   }
+
+   return kKeyNone;
+}
 
 static VOID
 PAL_KeyboardEventFilter(
@@ -73,6 +137,8 @@ PAL_KeyboardEventFilter(
 
 --*/
 {
+   int   key;
+
    switch (lpEvent->type)
    {
    case SDL_KEYDOWN:
@@ -98,10 +164,10 @@ PAL_KeyboardEventFilter(
          }
       }
 
-      switch (lpEvent->key.keysym.sym)
+      key = PAL_ConvertKey(lpEvent->key.keysym.sym);
+      switch (key)
       {
-      case SDLK_UP:
-      case SDLK_KP_8:
+      case kKeyUp:
          if (gpGlobals->fInBattle || g_InputState.dir != kDirNorth)
          {
             g_InputState.prevdir = (gpGlobals->fInBattle ? kDirUnknown : g_InputState.dir);
@@ -110,8 +176,7 @@ PAL_KeyboardEventFilter(
          }
          break;
 
-      case SDLK_DOWN:
-      case SDLK_KP_2:
+      case kKeyDown:
          if (gpGlobals->fInBattle || g_InputState.dir != kDirSouth)
          {
             g_InputState.prevdir = (gpGlobals->fInBattle ? kDirUnknown : g_InputState.dir);
@@ -120,8 +185,7 @@ PAL_KeyboardEventFilter(
          }
          break;
 
-      case SDLK_LEFT:
-      case SDLK_KP_4:
+      case kKeyLeft:
          if (gpGlobals->fInBattle || g_InputState.dir != kDirWest)
          {
             g_InputState.prevdir = (gpGlobals->fInBattle ? kDirUnknown : g_InputState.dir);
@@ -130,8 +194,7 @@ PAL_KeyboardEventFilter(
          }
          break;
 
-     case SDLK_RIGHT:
-     case SDLK_KP_6:
+     case kKeyRight:
          if (gpGlobals->fInBattle || g_InputState.dir != kDirEast)
          {
             g_InputState.prevdir = (gpGlobals->fInBattle ? kDirUnknown : g_InputState.dir);
@@ -140,80 +203,13 @@ PAL_KeyboardEventFilter(
          }
          break;
 
-      case SDLK_ESCAPE:
-      case SDLK_INSERT:
-      case SDLK_LALT:
-      case SDLK_RALT:
-      case SDLK_KP_0:
-         g_InputState.dwKeyPress |= kKeyMenu;
-         break;
-
-      case SDLK_RETURN:
-      case SDLK_SPACE:
-      case SDLK_KP_ENTER:
-      case SDLK_LCTRL:
-         g_InputState.dwKeyPress |= kKeySearch;
-         break;
-
-      case SDLK_PAGEUP:
-      case SDLK_KP_9:
-         g_InputState.dwKeyPress |= kKeyPgUp;
-         break;
-
-      case SDLK_PAGEDOWN:
-      case SDLK_KP_3:
-         g_InputState.dwKeyPress |= kKeyPgDn;
-         break;
-
-      case SDLK_HOME:
-         g_InputState.dwKeyPress |= kKeyHome;
-         break;
-
-      case SDLK_END:
-         g_InputState.dwKeyPress |= kKeyEnd;
-         break;
-
-      case SDLK_7: //7 for mobile device
-      case SDLK_r:
-         g_InputState.dwKeyPress |= kKeyRepeat;
-         break;
-
-      case SDLK_2: //2 for mobile device
-      case SDLK_a:
-         g_InputState.dwKeyPress |= kKeyAuto;
-         break;
-
-      case SDLK_d:
-         g_InputState.dwKeyPress |= kKeyDefend;
-         break;
-
-      case SDLK_e:
-         g_InputState.dwKeyPress |= kKeyUseItem;
-         break;
-
-      case SDLK_w:
-         g_InputState.dwKeyPress |= kKeyThrowItem;
-         break;
-
-      case SDLK_q:
-         g_InputState.dwKeyPress |= kKeyFlee;
-         break;
-
-      case SDLK_s:
-         g_InputState.dwKeyPress |= kKeyStatus;
-         break;
-
-      case SDLK_f:
-      case SDLK_5: // 5 for mobile device
-         g_InputState.dwKeyPress |= kKeyForce;
-         break;
-
       case SDLK_HASH: //# for mobile device
       case SDLK_p:
          VIDEO_SaveScreenshot();
          break;
 
       default:
+         g_InputState.dwKeyPress |= key;
          break;
       }
       break;
@@ -222,10 +218,10 @@ PAL_KeyboardEventFilter(
       //
       // Released a key
       //
-      switch (lpEvent->key.keysym.sym)
+      key = PAL_ConvertKey(lpEvent->key.keysym.sym);
+      switch (key)
       {
-      case SDLK_UP:
-      case SDLK_KP_8:
+      case kKeyUp:
          if (g_InputState.dir == kDirNorth)
          {
             g_InputState.dir = g_InputState.prevdir;
@@ -233,8 +229,7 @@ PAL_KeyboardEventFilter(
          g_InputState.prevdir = kDirUnknown;
          break;
 
-      case SDLK_DOWN:
-      case SDLK_KP_2:
+      case kKeyDown:
          if (g_InputState.dir == kDirSouth)
          {
             g_InputState.dir = g_InputState.prevdir;
@@ -242,8 +237,7 @@ PAL_KeyboardEventFilter(
          g_InputState.prevdir = kDirUnknown;
          break;
 
-      case SDLK_LEFT:
-      case SDLK_KP_4:
+      case kKeyLeft:
          if (g_InputState.dir == kDirWest)
          {
             g_InputState.dir = g_InputState.prevdir;
@@ -251,8 +245,7 @@ PAL_KeyboardEventFilter(
          g_InputState.prevdir = kDirUnknown;
          break;
 
-      case SDLK_RIGHT:
-      case SDLK_KP_6:
+      case kKeyRight:
          if (g_InputState.dir == kDirEast)
          {
             g_InputState.dir = g_InputState.prevdir;

+ 1 - 0
input.h

@@ -34,6 +34,7 @@ typedef struct tagPALINPUTSTATE
 
 enum PALKEY
 {
+   kKeyNone        = 0,
    kKeyMenu        = (1 << 0),
    kKeySearch      = (1 << 1),
    kKeyDown        = (1 << 2),