[aseprite] 25/134: Fix mouse issues on OS X (fix #458)

Tobias Hansen thansen at moszumanska.debian.org
Sat Mar 14 17:09:57 UTC 2015


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit b9b3b0288237c2337cff87f48de94eb1274ed004
Author: David Capello <davidcapello at gmail.com>
Date:   Sat Nov 1 11:36:51 2014 -0300

    Fix mouse issues on OS X (fix #458)
    
    Now we generate she::Event::MouseEnter/Leave events correctly when the
    mouse leaves or enters into the window to show the native cursor again
    when necessary.
    
    Close #466
---
 src/allegro/include/allegro/platform/aintosx.h |  8 ++++---
 src/allegro/src/macosx/qzmouse.m               | 13 ++++++----
 src/allegro/src/macosx/system.m                |  8 +++++++
 src/she/alleg4/she_alleg4.cpp                  | 33 +++++++++++++++++++++++++-
 src/ui/cursor_type.h                           |  2 ++
 src/ui/manager.cpp                             | 16 +++++++------
 src/ui/system.cpp                              | 11 ++++++---
 7 files changed, 73 insertions(+), 18 deletions(-)

diff --git a/src/allegro/include/allegro/platform/aintosx.h b/src/allegro/include/allegro/platform/aintosx.h
index 492cc28..8f41910 100644
--- a/src/allegro/include/allegro/platform/aintosx.h
+++ b/src/allegro/include/allegro/platform/aintosx.h
@@ -181,12 +181,14 @@ AL_VAR(int, osx_mouse_warped);
 AL_VAR(int, osx_skip_mouse_move);
 AL_VAR(int, osx_emulate_mouse_buttons);
 AL_VAR(NSTrackingRectTag, osx_mouse_tracking_rect);
-extern AL_METHOD(void, osx_window_close_hook, (void));
-extern AL_METHOD(void, osx_resize_callback, (RESIZE_DISPLAY_EVENT *ev));
-
 
 #endif
 
+extern AL_METHOD(void, osx_window_close_hook, (void));
+extern AL_METHOD(void, osx_resize_callback, (RESIZE_DISPLAY_EVENT *ev));
+extern AL_METHOD(void, osx_mouse_enter_callback, (void));
+extern AL_METHOD(void, osx_mouse_leave_callback, (void));
+
 #endif
 
 /* Local variables:       */
diff --git a/src/allegro/src/macosx/qzmouse.m b/src/allegro/src/macosx/qzmouse.m
index 2db4208..cb6fd14 100644
--- a/src/allegro/src/macosx/qzmouse.m
+++ b/src/allegro/src/macosx/qzmouse.m
@@ -255,7 +255,12 @@ static void osx_mouse_set_range(int x1, int y1, int x2, int y2)
    mouse_maxx = x2;
    mouse_maxy = y2;
 
-   osx_mouse_position(CLAMP(mouse_minx, _mouse_x, mouse_maxx), CLAMP(mouse_miny, _mouse_y, mouse_maxy));
+   // Do not change the position of the mouse inside the
+   // range to avoid changing the position to 0,0 when
+   // the program starts.
+   //osx_mouse_position(
+   //  CLAMP(mouse_minx, _mouse_x, mouse_maxx),
+   //  CLAMP(mouse_miny, _mouse_y, mouse_maxy));
 }
 
 
@@ -418,13 +423,13 @@ static int osx_select_system_cursor(AL_CONST int cursor)
          requested_cursor = [NSCursor operationNotAllowedCursor];
          break;
       case MOUSE_CURSOR_SIZE_N:
-         requested_cursor = [NSCursor resizeUpCursor]; break;
+         requested_cursor = [NSCursor resizeUpCursor];
          break;
       case MOUSE_CURSOR_SIZE_S:
-         requested_cursor = [NSCursor resizeDownCursor]; break;
+         requested_cursor = [NSCursor resizeDownCursor];
          break;
       case MOUSE_CURSOR_SIZE_NS:
-         requested_cursor = [NSCursor resizeUpDownCursor]; break;
+         requested_cursor = [NSCursor resizeUpDownCursor];
          break;
       case MOUSE_CURSOR_SIZE_W:
          requested_cursor = [NSCursor resizeLeftCursor];
diff --git a/src/allegro/src/macosx/system.m b/src/allegro/src/macosx/system.m
index 7e890f8..113cf5c 100644
--- a/src/allegro/src/macosx/system.m
+++ b/src/allegro/src/macosx/system.m
@@ -69,6 +69,8 @@ AllegroWindow *osx_window = NULL;
 char osx_window_title[ALLEGRO_MESSAGE_SIZE];
 void (*osx_window_close_hook)(void) = NULL;
 void (*osx_resize_callback)(RESIZE_DISPLAY_EVENT *ev) = NULL;
+void (*osx_mouse_enter_callback)() = NULL;
+void (*osx_mouse_leave_callback)() = NULL;
 int osx_gfx_mode = OSX_GFX_NONE;
 int osx_emulate_mouse_buttons = FALSE;
 int osx_window_first_expose = FALSE;
@@ -295,6 +297,9 @@ void osx_event_handler()
                     _mouse_on = TRUE;
                     osx_hide_native_mouse();
                   }
+
+                  if (osx_mouse_enter_callback)
+                    osx_mouse_enter_callback();
                }
             }
             [NSApp sendEvent: event];
@@ -308,6 +313,9 @@ void osx_event_handler()
                     _mouse_on = FALSE;
                     osx_show_native_mouse();
                   }
+
+                  if (osx_mouse_leave_callback)
+                    osx_mouse_leave_callback();
                }
             }
             [NSApp sendEvent: event];
diff --git a/src/she/alleg4/she_alleg4.cpp b/src/she/alleg4/she_alleg4.cpp
index 7f11b6d..1610f92 100644
--- a/src/she/alleg4/she_alleg4.cpp
+++ b/src/she/alleg4/she_alleg4.cpp
@@ -35,7 +35,9 @@
   #ifndef WM_MOUSEHWHEEL
     #define WM_MOUSEHWHEEL 0x020E
   #endif
+
 #elif defined(ALLEGRO_UNIX)
+
   #include <xalleg.h>
   #ifdef None
   #undef None
@@ -50,6 +52,10 @@
   #include "she/clipboard_simple.h"
 #endif
 
+#ifdef __APPLE__
+  #include <allegro/platform/aintosx.h>
+#endif
+
 #include "loadpng.h"
 
 #include <cassert>
@@ -407,7 +413,27 @@ void unsubclass_hwnd(HWND hwnd)
   base_wndproc = NULL;
 }
   
-#endif
+#endif // WIN32
+
+#if __APPLE__
+
+void osx_mouser_enter_she_callback()
+{
+  Event ev;
+  ev.setPosition(gfx::Point(0, 0));
+  ev.setType(Event::MouseEnter);
+  queue_event(ev);
+}
+
+void osx_mouser_leave_she_callback()
+{
+  Event ev;
+  ev.setType(Event::MouseLeave);
+  queue_event(ev);
+}
+
+#endif // __APPLE__
+
 } // anonymous namespace
 
 class Alleg4Display : public Display {
@@ -417,6 +443,11 @@ public:
     , m_scale(0) {
     unique_display = this;
 
+#ifdef __APPLE__
+    osx_mouse_enter_callback = osx_mouser_enter_she_callback;
+    osx_mouse_leave_callback = osx_mouser_leave_she_callback;
+#endif
+
     if (install_mouse() < 0) throw DisplayCreationException(allegro_error);
     if (install_keyboard() < 0) throw DisplayCreationException(allegro_error);
 
diff --git a/src/ui/cursor_type.h b/src/ui/cursor_type.h
index ed8b746..e1625ad 100644
--- a/src/ui/cursor_type.h
+++ b/src/ui/cursor_type.h
@@ -11,6 +11,8 @@
 namespace ui {
 
   enum CursorType {
+    kOutsideDisplay = -1,
+
     kFirstCursorType = 0,
     kNoCursor = 0,
     kArrowCursor,
diff --git a/src/ui/manager.cpp b/src/ui/manager.cpp
index 49d5b9e..ad13712 100644
--- a/src/ui/manager.cpp
+++ b/src/ui/manager.cpp
@@ -102,6 +102,9 @@ static char old_readed_key[KEY_MAX]; /* keyboard status of previous
 
 static unsigned key_repeated[KEY_MAX];
 
+// Flag to block all the generation of mouse messages from polling.
+static bool mouse_left = false;
+
 /* keyboard focus movement stuff */
 static bool move_focus(Manager* manager, Message* msg);
 static int count_widgets_accept_focus(Widget* widget);
@@ -288,6 +291,9 @@ bool Manager::generateMessages()
 
 void Manager::generateMouseMessages()
 {
+  if (mouse_left)
+    return;
+
   // Update mouse status
   bool mousemove = _internal_poll_mouse();
 
@@ -469,18 +475,14 @@ void Manager::generateMessagesFromSheEvents()
       }
 
       case she::Event::MouseEnter: {
-        if (!mouse_events_from_she)
-          continue;
-
+        mouse_left = false;
         jmouse_set_cursor(kArrowCursor);
         break;
       }
 
       case she::Event::MouseLeave: {
-        if (!mouse_events_from_she)
-          continue;
-
-        jmouse_set_cursor(kNoCursor);
+        mouse_left = true;
+        jmouse_set_cursor(kOutsideDisplay);
         setMouse(NULL);
 
         _internal_no_mouse_position();
diff --git a/src/ui/system.cpp b/src/ui/system.cpp
index cfea56e..6b5648a 100644
--- a/src/ui/system.cpp
+++ b/src/ui/system.cpp
@@ -98,11 +98,14 @@ static void update_mouse_cursor()
   // Use native cursor when it's possible/available/configured to do so.
 
   bool native_cursor_available = false;
-  if (use_native_mouse_cursor) {
+  if (use_native_mouse_cursor || mouse_cursor_type == kOutsideDisplay) {
     she::NativeCursor nativeCursor = she::kNoCursor;
 
     native_cursor_available = true;
     switch (mouse_cursor_type) {
+      case ui::kOutsideDisplay:
+        nativeCursor = she::kArrowCursor;
+        break;
       case ui::kNoCursor: break;
       case ui::kArrowCursor:
       case ui::kArrowPlusCursor:
@@ -151,10 +154,12 @@ static void update_mouse_cursor()
   // Use a software cursor with the overlay.
 
   if (!native_cursor_set) {
-    if (mouse_cursor_type == ui::kNoCursor)
+    if (mouse_cursor_type == ui::kNoCursor) {
       update_mouse_overlay(NULL);
-    else
+    }
+    else {
       update_mouse_overlay(CurrentTheme::get()->getCursor(mouse_cursor_type));
+    }
   }
   else {
     // Hide the overlay if we are using a native cursor.

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list