Reverted 91c1517 and reinserted the old mouse cursor code
authorIngo Ruhnke <grumbel@gmail.com>
Fri, 1 Aug 2014 17:32:30 +0000 (19:32 +0200)
committerIngo Ruhnke <grumbel@gmail.com>
Fri, 1 Aug 2014 17:32:30 +0000 (19:32 +0200)
With SDL_RenderSetLogicalSize() gone the old mouse code works again
and it doesn't glitch the mouse pointer on magnification changes as
the new code does.

src/gui/menu.cpp
src/gui/mousecursor.cpp
src/gui/mousecursor.hpp

index 583cbb0..e3fce4b 100644 (file)
@@ -768,78 +768,53 @@ Menu::event(const SDL_Event& event)
     return;
 
   switch(event.type) {
-    case SDL_MOUSEBUTTONUP:
+    case SDL_MOUSEBUTTONDOWN:
+    if(event.button.button == SDL_BUTTON_LEFT)
+    {
+      Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y);
+      int x = int(mouse_pos.x);
+      int y = int(mouse_pos.y);
+
+      if(x > pos.x - get_width()/2 &&
+         x < pos.x + get_width()/2 &&
+         y > pos.y - get_height()/2 &&
+         y < pos.y + get_height()/2)
       {
-        Vector mouse_pos = Renderer::instance()->to_logical(event.button.x, event.button.y);
-
-        if(MouseCursor::current())
-        {
-          MouseCursor::current()->set_pos(mouse_pos);
-        }
+        menuaction = MENU_ACTION_HIT;
       }
-      break;
+    }
+    break;
 
-    case SDL_MOUSEBUTTONDOWN:
+    case SDL_MOUSEMOTION:
+    {
+      Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y);
+      float x = mouse_pos.x;
+      float y = mouse_pos.y;
+
+      if(x > pos.x - get_width()/2 &&
+         x < pos.x + get_width()/2 &&
+         y > pos.y - get_height()/2 &&
+         y < pos.y + get_height()/2)
       {
-        Vector mouse_pos = Renderer::instance()->to_logical(event.button.x, event.button.y);
+        int new_active_item
+          = static_cast<int> ((y - (pos.y - get_height()/2)) / 24);
 
-        if(MouseCursor::current())
-        {
-          MouseCursor::current()->set_pos(mouse_pos);
-        }
+        /* only change the mouse focus to a selectable item */
+        if ((items[new_active_item]->kind != MN_HL)
+            && (items[new_active_item]->kind != MN_LABEL)
+            && (items[new_active_item]->kind != MN_INACTIVE))
+          active_item = new_active_item;
 
-        if(event.button.button == SDL_BUTTON_LEFT)
-        {
-          int x = int(mouse_pos.x);
-          int y = int(mouse_pos.y);
-
-          if(x > pos.x - get_width()/2 &&
-             x < pos.x + get_width()/2 &&
-             y > pos.y - get_height()/2 &&
-             y < pos.y + get_height()/2)
-          {
-            menuaction = MENU_ACTION_HIT;
-          }
-        }
+        if(MouseCursor::current())
+          MouseCursor::current()->set_state(MC_LINK);
       }
-      break;
-
-    case SDL_MOUSEMOTION:
+      else
       {
-        Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y);
-
         if(MouseCursor::current())
-        {
-          MouseCursor::current()->set_pos(mouse_pos);
-        }
-
-        float x = mouse_pos.x;
-        float y = mouse_pos.y;
-
-        if(x > pos.x - get_width()/2 &&
-           x < pos.x + get_width()/2 &&
-           y > pos.y - get_height()/2 &&
-           y < pos.y + get_height()/2)
-        {
-          int new_active_item
-            = static_cast<int> ((y - (pos.y - get_height()/2)) / 24);
-
-          /* only change the mouse focus to a selectable item */
-          if ((items[new_active_item]->kind != MN_HL)
-              && (items[new_active_item]->kind != MN_LABEL)
-              && (items[new_active_item]->kind != MN_INACTIVE))
-            active_item = new_active_item;
-
-          if(MouseCursor::current())
-            MouseCursor::current()->set_state(MC_LINK);
-        }
-        else
-        {
-          if(MouseCursor::current())
-            MouseCursor::current()->set_state(MC_NORMAL);
-        }
+          MouseCursor::current()->set_state(MC_NORMAL);
       }
-      break;
+    }
+    break;
 
     default:
       break;
index 3e86bfc..101cf1f 100644 (file)
@@ -26,7 +26,6 @@
 MouseCursor* MouseCursor::current_ = 0;
 
 MouseCursor::MouseCursor(std::string cursor_file) : 
-  mouse_pos(),
   mid_x(0), 
   mid_y(0),
   state_before_click(),
@@ -52,12 +51,6 @@ void MouseCursor::set_state(int nstate)
   cur_state = nstate;
 }
 
-void
-MouseCursor::set_pos(const Vector& pos)
-{
-  mouse_pos = pos;
-}
-
 void MouseCursor::set_mid(int x, int y)
 {
   mid_x = x;
@@ -69,17 +62,17 @@ void MouseCursor::draw(DrawingContext& context)
   if(cur_state == MC_HIDE)
     return;
 
-  // Not using coordinates from mouse, as they are in the wrong
-  // coordinate system, see:
-  // https://bugzilla.libsdl.org/show_bug.cgi?id=2442
-  Uint8 ispressed = SDL_GetMouseState(NULL, NULL);
+  int x,y,w,h;
+  Uint8 ispressed = SDL_GetMouseState(&x,&y);
+
+  Vector mouse_pos = Renderer::instance()->to_logical(x, y);
 
-  int x = int(mouse_pos.x);
-  int y = int(mouse_pos.y);
+  x = int(mouse_pos.x);
+  y = int(mouse_pos.y);
 
-  int w = (int) cursor->get_width();
-  int h = (int) (cursor->get_height() / MC_STATES_NB);
-  if(ispressed & SDL_BUTTON(1) || ispressed & SDL_BUTTON(2)) {
+  w = (int) cursor->get_width();
+  h = (int) (cursor->get_height() / MC_STATES_NB);
+  if(ispressed &SDL_BUTTON(1) || ispressed &SDL_BUTTON(2)) {
     if(cur_state != MC_CLICK) {
       state_before_click = cur_state;
       cur_state = MC_CLICK;
index 329f225..30afd56 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <string>
 
-#include "math/vector.hpp"
 #include "video/surface_ptr.hpp"
 
 #define MC_STATES_NB 3
@@ -32,7 +31,6 @@ enum {
 };
 
 class DrawingContext;
-class Vector;
 
 /// Mouse cursor.
 /** Used to create mouse cursors.
@@ -56,9 +54,6 @@ public:
   /** Useful for cross mouse cursor images in example. */
   void set_mid(int x, int y);
 
-  /** Set the position where the cursor should appear */
-  void set_pos(const Vector& pos);
-
   /// Draw MouseCursor on screen.
   void draw(DrawingContext& context);
 
@@ -72,7 +67,6 @@ public:
   friend class Resources;
 
 private:
-  Vector mouse_pos;
   int mid_x;
   int mid_y;
   int state_before_click;