added video frame counter (currently not used)
[rocksndiamonds.git] / src / libgame / system.c
index 488e838e8c4b82650edbcd48caee246420f1c6d8..dc7dba8b2db2c763e19ee8cc274c38d73cc50b06 100644 (file)
@@ -317,6 +317,11 @@ void InitGfxCustomArtworkInfo(void)
 void InitGfxOtherSettings(void)
 {
   gfx.cursor_mode = CURSOR_DEFAULT;
+  gfx.cursor_mode_override = CURSOR_UNDEFINED;
+  gfx.cursor_mode_final = gfx.cursor_mode;
+
+  gfx.mouse_x = 0;
+  gfx.mouse_y = 0;
 }
 
 void InitTileCursorInfo(void)
@@ -565,6 +570,7 @@ void InitVideoBuffer(int width, int height, int depth, boolean fullscreen)
 
   video.window_scaling_available = WINDOW_SCALING_STATUS;
 
+  video.frame_counter = 0;
   video.frame_delay = 0;
   video.frame_delay_value = GAME_FRAME_DELAY;
 
@@ -1550,6 +1556,7 @@ void SetMouseCursor(int mode)
   static struct MouseCursorInfo *cursor_none = NULL;
   static struct MouseCursorInfo *cursor_playfield = NULL;
   struct MouseCursorInfo *cursor_new;
+  int mode_final = mode;
 
   if (cursor_none == NULL)
     cursor_none = get_cursor_from_image(cursor_image_none);
@@ -1557,13 +1564,39 @@ void SetMouseCursor(int mode)
   if (cursor_playfield == NULL)
     cursor_playfield = get_cursor_from_image(cursor_image_playfield);
 
-  cursor_new = (mode == CURSOR_DEFAULT   ? NULL :
-               mode == CURSOR_NONE      ? cursor_none :
-               mode == CURSOR_PLAYFIELD ? cursor_playfield : NULL);
+  if (gfx.cursor_mode_override != CURSOR_UNDEFINED)
+    mode_final = gfx.cursor_mode_override;
+
+  cursor_new = (mode_final == CURSOR_DEFAULT   ? NULL :
+               mode_final == CURSOR_NONE      ? cursor_none :
+               mode_final == CURSOR_PLAYFIELD ? cursor_playfield : NULL);
 
   SDLSetMouseCursor(cursor_new);
 
   gfx.cursor_mode = 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);
 }
 
 
@@ -1613,6 +1646,11 @@ void SetAudioMode(boolean enabled)
 // event functions
 // ============================================================================
 
+void InitEventFilter(EventFilter filter_function)
+{
+  SDL_SetEventFilter(filter_function, NULL);
+}
+
 boolean PendingEvent(void)
 {
   return (SDL_PollEvent(NULL) ? TRUE : FALSE);
@@ -1628,6 +1666,11 @@ void PeekEvent(Event *event)
   SDL_PeepEvents(event, 1, SDL_PEEKEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT);
 }
 
+void PumpEvents(void)
+{
+  SDL_PumpEvents();
+}
+
 void CheckQuitEvent(void)
 {
   if (SDL_QuitRequested())
@@ -1731,12 +1774,18 @@ void StopTextInput(void)
 #endif
 }
 
-boolean CheckCloseWindowEvent(ClientMessageEvent *event)
+void PushUserEvent(int code, int value1, int value2)
 {
-  if (event->type != EVENT_CLIENTMESSAGE)
-    return FALSE;
+  UserEvent event;
+
+  SDL_memset(&event, 0, sizeof(event));
+
+  event.type = EVENT_USER;
+  event.code = code;
+  event.value1 = value1;
+  event.value2 = value2;
 
-  return TRUE;         // the only possible message here is SDL_QUIT
+  SDL_PushEvent((SDL_Event *)&event);
 }