mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-26 18:41:20 +00:00
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
This commit is contained in:
parent
01c26e5a18
commit
b9b3b02882
@ -181,12 +181,14 @@ AL_VAR(int, osx_mouse_warped);
|
|||||||
AL_VAR(int, osx_skip_mouse_move);
|
AL_VAR(int, osx_skip_mouse_move);
|
||||||
AL_VAR(int, osx_emulate_mouse_buttons);
|
AL_VAR(int, osx_emulate_mouse_buttons);
|
||||||
AL_VAR(NSTrackingRectTag, osx_mouse_tracking_rect);
|
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
|
#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
|
#endif
|
||||||
|
|
||||||
/* Local variables: */
|
/* Local variables: */
|
||||||
|
@ -255,7 +255,12 @@ static void osx_mouse_set_range(int x1, int y1, int x2, int y2)
|
|||||||
mouse_maxx = x2;
|
mouse_maxx = x2;
|
||||||
mouse_maxy = y2;
|
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];
|
requested_cursor = [NSCursor operationNotAllowedCursor];
|
||||||
break;
|
break;
|
||||||
case MOUSE_CURSOR_SIZE_N:
|
case MOUSE_CURSOR_SIZE_N:
|
||||||
requested_cursor = [NSCursor resizeUpCursor]; break;
|
requested_cursor = [NSCursor resizeUpCursor];
|
||||||
break;
|
break;
|
||||||
case MOUSE_CURSOR_SIZE_S:
|
case MOUSE_CURSOR_SIZE_S:
|
||||||
requested_cursor = [NSCursor resizeDownCursor]; break;
|
requested_cursor = [NSCursor resizeDownCursor];
|
||||||
break;
|
break;
|
||||||
case MOUSE_CURSOR_SIZE_NS:
|
case MOUSE_CURSOR_SIZE_NS:
|
||||||
requested_cursor = [NSCursor resizeUpDownCursor]; break;
|
requested_cursor = [NSCursor resizeUpDownCursor];
|
||||||
break;
|
break;
|
||||||
case MOUSE_CURSOR_SIZE_W:
|
case MOUSE_CURSOR_SIZE_W:
|
||||||
requested_cursor = [NSCursor resizeLeftCursor];
|
requested_cursor = [NSCursor resizeLeftCursor];
|
||||||
|
@ -69,6 +69,8 @@ AllegroWindow *osx_window = NULL;
|
|||||||
char osx_window_title[ALLEGRO_MESSAGE_SIZE];
|
char osx_window_title[ALLEGRO_MESSAGE_SIZE];
|
||||||
void (*osx_window_close_hook)(void) = NULL;
|
void (*osx_window_close_hook)(void) = NULL;
|
||||||
void (*osx_resize_callback)(RESIZE_DISPLAY_EVENT *ev) = 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_gfx_mode = OSX_GFX_NONE;
|
||||||
int osx_emulate_mouse_buttons = FALSE;
|
int osx_emulate_mouse_buttons = FALSE;
|
||||||
int osx_window_first_expose = FALSE;
|
int osx_window_first_expose = FALSE;
|
||||||
@ -295,6 +297,9 @@ void osx_event_handler()
|
|||||||
_mouse_on = TRUE;
|
_mouse_on = TRUE;
|
||||||
osx_hide_native_mouse();
|
osx_hide_native_mouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (osx_mouse_enter_callback)
|
||||||
|
osx_mouse_enter_callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[NSApp sendEvent: event];
|
[NSApp sendEvent: event];
|
||||||
@ -308,6 +313,9 @@ void osx_event_handler()
|
|||||||
_mouse_on = FALSE;
|
_mouse_on = FALSE;
|
||||||
osx_show_native_mouse();
|
osx_show_native_mouse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (osx_mouse_leave_callback)
|
||||||
|
osx_mouse_leave_callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[NSApp sendEvent: event];
|
[NSApp sendEvent: event];
|
||||||
|
@ -35,7 +35,9 @@
|
|||||||
#ifndef WM_MOUSEHWHEEL
|
#ifndef WM_MOUSEHWHEEL
|
||||||
#define WM_MOUSEHWHEEL 0x020E
|
#define WM_MOUSEHWHEEL 0x020E
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#elif defined(ALLEGRO_UNIX)
|
#elif defined(ALLEGRO_UNIX)
|
||||||
|
|
||||||
#include <xalleg.h>
|
#include <xalleg.h>
|
||||||
#ifdef None
|
#ifdef None
|
||||||
#undef None
|
#undef None
|
||||||
@ -50,6 +52,10 @@
|
|||||||
#include "she/clipboard_simple.h"
|
#include "she/clipboard_simple.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <allegro/platform/aintosx.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "loadpng.h"
|
#include "loadpng.h"
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
@ -407,7 +413,27 @@ void unsubclass_hwnd(HWND hwnd)
|
|||||||
base_wndproc = NULL;
|
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
|
} // anonymous namespace
|
||||||
|
|
||||||
class Alleg4Display : public Display {
|
class Alleg4Display : public Display {
|
||||||
@ -417,6 +443,11 @@ public:
|
|||||||
, m_scale(0) {
|
, m_scale(0) {
|
||||||
unique_display = this;
|
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_mouse() < 0) throw DisplayCreationException(allegro_error);
|
||||||
if (install_keyboard() < 0) throw DisplayCreationException(allegro_error);
|
if (install_keyboard() < 0) throw DisplayCreationException(allegro_error);
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
enum CursorType {
|
enum CursorType {
|
||||||
|
kOutsideDisplay = -1,
|
||||||
|
|
||||||
kFirstCursorType = 0,
|
kFirstCursorType = 0,
|
||||||
kNoCursor = 0,
|
kNoCursor = 0,
|
||||||
kArrowCursor,
|
kArrowCursor,
|
||||||
|
@ -102,6 +102,9 @@ static char old_readed_key[KEY_MAX]; /* keyboard status of previous
|
|||||||
|
|
||||||
static unsigned key_repeated[KEY_MAX];
|
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 */
|
/* keyboard focus movement stuff */
|
||||||
static bool move_focus(Manager* manager, Message* msg);
|
static bool move_focus(Manager* manager, Message* msg);
|
||||||
static int count_widgets_accept_focus(Widget* widget);
|
static int count_widgets_accept_focus(Widget* widget);
|
||||||
@ -288,6 +291,9 @@ bool Manager::generateMessages()
|
|||||||
|
|
||||||
void Manager::generateMouseMessages()
|
void Manager::generateMouseMessages()
|
||||||
{
|
{
|
||||||
|
if (mouse_left)
|
||||||
|
return;
|
||||||
|
|
||||||
// Update mouse status
|
// Update mouse status
|
||||||
bool mousemove = _internal_poll_mouse();
|
bool mousemove = _internal_poll_mouse();
|
||||||
|
|
||||||
@ -469,18 +475,14 @@ void Manager::generateMessagesFromSheEvents()
|
|||||||
}
|
}
|
||||||
|
|
||||||
case she::Event::MouseEnter: {
|
case she::Event::MouseEnter: {
|
||||||
if (!mouse_events_from_she)
|
mouse_left = false;
|
||||||
continue;
|
|
||||||
|
|
||||||
jmouse_set_cursor(kArrowCursor);
|
jmouse_set_cursor(kArrowCursor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case she::Event::MouseLeave: {
|
case she::Event::MouseLeave: {
|
||||||
if (!mouse_events_from_she)
|
mouse_left = true;
|
||||||
continue;
|
jmouse_set_cursor(kOutsideDisplay);
|
||||||
|
|
||||||
jmouse_set_cursor(kNoCursor);
|
|
||||||
setMouse(NULL);
|
setMouse(NULL);
|
||||||
|
|
||||||
_internal_no_mouse_position();
|
_internal_no_mouse_position();
|
||||||
|
@ -98,11 +98,14 @@ static void update_mouse_cursor()
|
|||||||
// Use native cursor when it's possible/available/configured to do so.
|
// Use native cursor when it's possible/available/configured to do so.
|
||||||
|
|
||||||
bool native_cursor_available = false;
|
bool native_cursor_available = false;
|
||||||
if (use_native_mouse_cursor) {
|
if (use_native_mouse_cursor || mouse_cursor_type == kOutsideDisplay) {
|
||||||
she::NativeCursor nativeCursor = she::kNoCursor;
|
she::NativeCursor nativeCursor = she::kNoCursor;
|
||||||
|
|
||||||
native_cursor_available = true;
|
native_cursor_available = true;
|
||||||
switch (mouse_cursor_type) {
|
switch (mouse_cursor_type) {
|
||||||
|
case ui::kOutsideDisplay:
|
||||||
|
nativeCursor = she::kArrowCursor;
|
||||||
|
break;
|
||||||
case ui::kNoCursor: break;
|
case ui::kNoCursor: break;
|
||||||
case ui::kArrowCursor:
|
case ui::kArrowCursor:
|
||||||
case ui::kArrowPlusCursor:
|
case ui::kArrowPlusCursor:
|
||||||
@ -151,11 +154,13 @@ static void update_mouse_cursor()
|
|||||||
// Use a software cursor with the overlay.
|
// Use a software cursor with the overlay.
|
||||||
|
|
||||||
if (!native_cursor_set) {
|
if (!native_cursor_set) {
|
||||||
if (mouse_cursor_type == ui::kNoCursor)
|
if (mouse_cursor_type == ui::kNoCursor) {
|
||||||
update_mouse_overlay(NULL);
|
update_mouse_overlay(NULL);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
update_mouse_overlay(CurrentTheme::get()->getCursor(mouse_cursor_type));
|
update_mouse_overlay(CurrentTheme::get()->getCursor(mouse_cursor_type));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
// Hide the overlay if we are using a native cursor.
|
// Hide the overlay if we are using a native cursor.
|
||||||
update_mouse_overlay(NULL);
|
update_mouse_overlay(NULL);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user