From c824a023c4f640dd72d4c5dc1511eb53055d7535 Mon Sep 17 00:00:00 2001 From: Akemi Date: Tue, 21 Feb 2017 18:04:30 +0100 Subject: [PATCH] cocoa: fix dragging out of focus window fffab30 introduced a small regression where the cursor couldn't be unhidden after refocusing. the problem is that no mouseUp event was reported in our events_view. work around this with a separate event monitor. this also fixes another regression when the window is being dragged from the title bar. #4174 --- osdep/macosx_compat.h | 1 + video/out/cocoa/events_view.m | 1 - video/out/cocoa_common.m | 26 +++++++++++++++++++++----- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/osdep/macosx_compat.h b/osdep/macosx_compat.h index 9ef422be2f..c8099d7def 100644 --- a/osdep/macosx_compat.h +++ b/osdep/macosx_compat.h @@ -39,6 +39,7 @@ static const NSEventType NSEventTypeKeyUp = NSKeyUp; static const NSEventMask NSEventMaskKeyDown = NSKeyDownMask; static const NSEventMask NSEventMaskKeyUp = NSKeyUpMask; +static const NSEventMask NSEventMaskLeftMouseUp = NSLeftMouseUpMask; #if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_10) typedef NSUInteger NSEventModifierFlags; diff --git a/video/out/cocoa/events_view.m b/video/out/cocoa/events_view.m index e6d536b776..8be74d5e15 100644 --- a/video/out/cocoa/events_view.m +++ b/video/out/cocoa/events_view.m @@ -211,7 +211,6 @@ { if ([self.adapter mouseEnabled]) { [self mouseUpEvent:event]; - [self.adapter mouseUp]; } else { [super mouseUp:event]; } diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m index 0d6f310662..f59ffd9005 100644 --- a/video/out/cocoa_common.m +++ b/video/out/cocoa_common.m @@ -77,6 +77,7 @@ struct vo_cocoa_state { bool cursor_visibility; bool cursor_visibility_wanted; bool window_is_dragged; + id event_monitor_mouseup; bool embedded; // wether we are embedding in another GUI @@ -352,6 +353,23 @@ static void vo_cocoa_uninit_displaylink(struct vo_cocoa_state *s) CVDisplayLinkRelease(s->link); } +static void cocoa_add_event_monitor(struct vo *vo) +{ + struct vo_cocoa_state *s = vo->cocoa; + + s->event_monitor_mouseup = [NSEvent + addLocalMonitorForEventsMatchingMask: NSEventMaskLeftMouseUp + handler:^NSEvent*(NSEvent* event) { + s->window_is_dragged = false; + return event; + }]; +} + +static void cocoa_rm_event_monitor(struct vo *vo) +{ + [NSEvent removeMonitor:vo->cocoa->event_monitor_mouseup]; +} + void vo_cocoa_init(struct vo *vo) { struct vo_cocoa_state *s = talloc_zero(NULL, struct vo_cocoa_state); @@ -372,6 +390,8 @@ void vo_cocoa_init(struct vo *vo) vo_cocoa_init_displaylink(vo); cocoa_init_light_sensor(vo); cocoa_add_screen_reconfiguration_observer(vo); + cocoa_add_event_monitor(vo); + if (!s->embedded) { [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; set_application_icon(NSApp); @@ -426,6 +446,7 @@ void vo_cocoa_uninit(struct vo *vo) vo_cocoa_signal_swap(s); cocoa_uninit_light_sensor(s); cocoa_rm_screen_reconfiguration_observer(vo); + cocoa_rm_event_monitor(vo); [s->nsgl_ctx release]; CGLReleaseContext(s->cgl_ctx); @@ -1059,9 +1080,4 @@ int vo_cocoa_control(struct vo *vo, int *events, int request, void *arg) self.vout->cocoa->window_is_dragged = true; } -- (void)mouseUp -{ - self.vout->cocoa->window_is_dragged = false; -} - @end