fixed text length calculation bug
[rocksndiamonds.git] / src / events.c
index f73e48847f172907b7eaadae7134d812405f613b..985dc2a2e2e84f775fbbf2e2e3a650a6c179fa6d 100644 (file)
@@ -620,6 +620,8 @@ void HandleWindowEvent(WindowEvent *event)
      subtype == SDL_WINDOWEVENT_FOCUS_GAINED ? "SDL_WINDOWEVENT_FOCUS_GAINED" :
      subtype == SDL_WINDOWEVENT_FOCUS_LOST ? "SDL_WINDOWEVENT_FOCUS_LOST" :
      subtype == SDL_WINDOWEVENT_CLOSE ? "SDL_WINDOWEVENT_CLOSE" :
+     subtype == SDL_WINDOWEVENT_TAKE_FOCUS ? "SDL_WINDOWEVENT_TAKE_FOCUS" :
+     subtype == SDL_WINDOWEVENT_HIT_TEST ? "SDL_WINDOWEVENT_HIT_TEST" :
      "(UNKNOWN)");
 
   Debug("event:window", "name: '%s', data1: %ld, data2: %ld",
@@ -1456,16 +1458,13 @@ void HandlePauseResumeEvent(PauseResumeEvent *event)
 void HandleKeyEvent(KeyEvent *event)
 {
   int key_status = (event->type == EVENT_KEYPRESS ? KEY_PRESSED : KEY_RELEASED);
-  boolean with_modifiers = (game_status == GAME_MODE_PLAYING ? FALSE : TRUE);
-  Key key = GetEventKey(event, with_modifiers);
-  Key keymod = (with_modifiers ? GetEventKey(event, FALSE) : key);
+  Key key = GetEventKey(event);
 
 #if DEBUG_EVENTS_KEY
-  Debug("event:key", "key was %s, keysym.scancode == %d, keysym.sym == %d, keymod = %d, GetKeyModState() = 0x%04x, resulting key == %d (%s)",
+  Debug("event:key", "key was %s, keysym.scancode == %d, keysym.sym == %d, GetKeyModState() = 0x%04x, resulting key == %d (%s)",
        event->type == EVENT_KEYPRESS ? "pressed" : "released",
        event->keysym.scancode,
        event->keysym.sym,
-       keymod,
        GetKeyModState(),
        key,
        getKeyNameFromKey(key));
@@ -1493,7 +1492,7 @@ void HandleKeyEvent(KeyEvent *event)
   }
 #endif
 
-  HandleKeyModState(keymod, key_status);
+  HandleKeyModState(key, key_status);
 
   // process all keys if not in text input mode or if non-printable keys
   if (!checkTextInputKey(key))
@@ -1698,6 +1697,7 @@ void HandleButton(int mx, int my, int button, int button_nr)
   static int old_mx = 0, old_my = 0;
   boolean button_hold = FALSE;
   boolean handle_gadgets = TRUE;
+  int game_status_last = game_status;
 
   if (button_nr < 0)
   {
@@ -1742,8 +1742,12 @@ void HandleButton(int mx, int my, int button, int button_nr)
 
   if (handle_gadgets && HandleGadgets(mx, my, button))
   {
-    // do not handle this button event anymore
+    // do not handle this button event anymore with position on screen
     mx = my = -32;     // force mouse event to be outside screen tiles
+
+    // do not handle this button event anymore if game status has changed
+    if (game_status != game_status_last)
+      return;
   }
 
   if (button_hold && game_status == GAME_MODE_PLAYING && tape.pausing)
@@ -2282,6 +2286,16 @@ void HandleKey(Key key, int key_status)
     return;
   }
 
+  if (game_status == GAME_MODE_MAIN &&
+      (setup.internal.info_screens_from_main ||
+       leveldir_current->info_screens_from_main) &&
+      (key >= KSYM_KP_1 && key <= KSYM_KP_9))
+  {
+    DrawInfoScreen_FromMainMenu(key - KSYM_KP_1 + 1);
+
+    return;
+  }
+
   if (game_status == GAME_MODE_MAIN || game_status == GAME_MODE_PLAYING)
   {
     if (key == setup.shortcut.save_game)