added function to update the mouse position when changing window size
authorHolger Schemel <info@artsoft.org>
Thu, 4 Apr 2019 22:00:53 +0000 (00:00 +0200)
committerHolger Schemel <info@artsoft.org>
Thu, 4 Apr 2019 22:00:53 +0000 (00:00 +0200)
src/events.c
src/libgame/sdl.c
src/libgame/sdl.h
src/libgame/system.c
src/libgame/system.h

index bd82a609734afb1c06ebf95f52862a82594ab54c..f6442956645825d6ac8e1e1cdcd970e01fe64397 100644 (file)
@@ -54,20 +54,13 @@ static void HandleEventActions(void);
 
 int FilterMouseMotionEvents(void *userdata, Event *event)
 {
-  if (event->type != EVENT_MOTIONNOTIFY)
-    return 1;
-
-  int mouse_x = ((MotionEvent *)event)->x;
-  int mouse_y = ((MotionEvent *)event)->y;
-
-  // mouse events do not contain logical screen size corrections at this stage
-  SDLCorrectMouseEventXY(&mouse_x, &mouse_y);
-
-  mouse_x -= video.screen_xoffset;
-  mouse_y -= video.screen_yoffset;
+  if (event->type == EVENT_MOTIONNOTIFY)
+  {
+    int mouse_x = ((MotionEvent *)event)->x;
+    int mouse_y = ((MotionEvent *)event)->y;
 
-  gfx.mouse_x = mouse_x;
-  gfx.mouse_y = mouse_y;
+    UpdateRawMousePosition(mouse_x, mouse_y);
+  }
 
   return 1;
 }
@@ -593,6 +586,8 @@ void HandleWindowEvent(WindowEvent *event)
        if (game_status == GAME_MODE_SETUP)
          RedrawSetupScreenAfterFullscreenToggle();
 
+       UpdateMousePosition();
+
        SetWindowTitle();
       }
     }
@@ -2142,6 +2137,8 @@ void HandleKey(Key key, int key_status)
     if (game_status == GAME_MODE_SETUP)
       RedrawSetupScreenAfterFullscreenToggle();
 
+    UpdateMousePosition();
+
     // set flag to ignore repeated "key pressed" events
     ignore_repeated_key = TRUE;
 
@@ -2173,6 +2170,8 @@ void HandleKey(Key key, int key_status)
     if (game_status == GAME_MODE_SETUP)
       RedrawSetupScreenAfterFullscreenToggle();
 
+    UpdateMousePosition();
+
     return;
   }
 
index 45f7f2ce69a823b9b4f635bb6a8c334765f87736..fca1e8b9f3e357c06f8ac4818344ed4f30efbaf0 100644 (file)
@@ -2362,7 +2362,7 @@ void SDLWaitEvent(Event *event)
   SDL_WaitEvent(event);
 }
 
-void SDLCorrectMouseEventXY(int *x, int *y)
+void SDLCorrectRawMousePosition(int *x, int *y)
 {
   if (sdl_renderer == NULL)
     return;
index 35d6a2411c3c7af8edd90677d04cf1630c550f15..ad7dca8c1a95ee9cdf4535838be523469ead2c0f 100644 (file)
@@ -423,7 +423,7 @@ void SDLOpenAudio(void);
 void SDLCloseAudio(void);
 
 void SDLWaitEvent(Event *);
-void SDLCorrectMouseEventXY(int *, int *);
+void SDLCorrectRawMousePosition(int *, int *);
 
 void HandleJoystickEvent(Event *);
 void SDLInitJoysticks(void);
index 7fcb784d66c9f7608f00dad238a52b76cc0ce464..8c8b7d5ac8515121bc647aec0ecb59b71c14924e 100644 (file)
@@ -1576,6 +1576,28 @@ void SetMouseCursor(int mode)
   gfx.cursor_mode_final = mode_final;
 }
 
+void UpdateRawMousePosition(int mouse_x, int mouse_y)
+{
+  // mouse events do not contain logical screen size corrections yet
+  SDLCorrectRawMousePosition(&mouse_x, &mouse_y);
+
+  mouse_x -= video.screen_xoffset;
+  mouse_y -= video.screen_yoffset;
+
+  gfx.mouse_x = mouse_x;
+  gfx.mouse_y = mouse_y;
+}
+
+void UpdateMousePosition(void)
+{
+  int mouse_x, mouse_y;
+
+  SDL_PumpEvents();
+  SDL_GetMouseState(&mouse_x, &mouse_y);
+
+  UpdateRawMousePosition(mouse_x, mouse_y);
+}
+
 
 // ============================================================================
 // audio functions
index 290f0cb7827af8e501be7cf2c38e2114f96a1c7c..30b37544c32519abbc73f06692c4bb5511bdf0c2 100644 (file)
@@ -1852,6 +1852,8 @@ void FreeBitmapTextures(Bitmap **);
 void ScaleBitmap(Bitmap **, int);
 
 void SetMouseCursor(int);
+void UpdateRawMousePosition(int, int);
+void UpdateMousePosition(void);
 
 void OpenAudio(void);
 void CloseAudio(void);