diff options
author | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2015-01-01 14:38:08 +0100 |
---|---|---|
committer | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2015-01-01 14:38:08 +0100 |
commit | 64b6b2ea458f679ec0370878b1e54b2b1822c4b1 (patch) | |
tree | 0e694a2818886a6654f4ddf2b42af937d997214b /video | |
parent | 39548ad9e961794e023aef0e281089064dd41f36 (diff) | |
download | mpv-64b6b2ea458f679ec0370878b1e54b2b1822c4b1.tar.bz2 mpv-64b6b2ea458f679ec0370878b1e54b2b1822c4b1.tar.xz |
cocoa: fix uninitialization while in fullscreen
This is only needed for switching video track with `_`, since Cocoa
automatically handles cleaning up the application's presentation options when
quitting the process.
Fixes #1399
Diffstat (limited to 'video')
-rw-r--r-- | video/out/cocoa/events_view.h | 1 | ||||
-rw-r--r-- | video/out/cocoa/events_view.m | 12 | ||||
-rw-r--r-- | video/out/cocoa_common.m | 25 |
3 files changed, 36 insertions, 2 deletions
diff --git a/video/out/cocoa/events_view.h b/video/out/cocoa/events_view.h index ff2500a7bc..a16a2d7d5a 100644 --- a/video/out/cocoa/events_view.h +++ b/video/out/cocoa/events_view.h @@ -21,5 +21,6 @@ @interface MpvEventsView : NSView <NSDraggingDestination> @property(nonatomic, retain) MpvCocoaAdapter *adapter; - (void)setFullScreen:(BOOL)willBeFullscreen; +- (void)clear; - (BOOL)canHideCursor; @end diff --git a/video/out/cocoa/events_view.m b/video/out/cocoa/events_view.m index 8e96ac1244..2833bf2773 100644 --- a/video/out/cocoa/events_view.m +++ b/video/out/cocoa/events_view.m @@ -25,6 +25,7 @@ #include "events_view.h" @interface MpvEventsView() +@property(nonatomic, assign) BOOL clearing; @property(nonatomic, assign) BOOL hasMouseDown; @property(nonatomic, retain) NSTrackingArea *tracker; - (void)signalMousePosition; @@ -36,6 +37,7 @@ @end @implementation MpvEventsView +@synthesize clearing = _clearing; @synthesize adapter = _adapter; @synthesize tracker = _tracker; @synthesize hasMouseDown = _mouse_down; @@ -90,6 +92,12 @@ } } +- (void)clear +{ + self.clearing = YES; + [self exitFullScreenModeWithOptions:nil]; +} + // mpv uses flipped coordinates, because X11 uses those. So let's just use them // as well without having to do any coordinate conversion of mouse positions. - (BOOL)isFlipped { return YES; } @@ -177,6 +185,10 @@ - (void)setFrameSize:(NSSize)size { [super setFrameSize:size]; + + if (self.clearing) + return; + [self signalMousePosition]; } diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m index 01e28aceda..6dcdc16bae 100644 --- a/video/out/cocoa_common.m +++ b/video/out/cocoa_common.m @@ -189,12 +189,24 @@ void vo_cocoa_register_resize_callback(struct vo *vo, void vo_cocoa_uninit(struct vo *vo) { - with_cocoa_lock(vo, ^{ - struct vo_cocoa_state *s = vo->cocoa; + struct vo_cocoa_state *s = vo->cocoa; + NSView *ev = s->view; + + // keep the event view around for later in order to call -clear + if (!s->embedded) { + [ev retain]; + } + + with_cocoa_lock_on_main_thread(vo, ^{ enable_power_management(vo); cocoa_rm_fs_screen_profile_observer(vo); [s->gl_ctx release]; + + // needed to stop resize events triggered by the event's view -clear + // causing many uses after free + [s->video removeFromSuperview]; + [s->view removeFromSuperview]; [s->view release]; @@ -202,6 +214,15 @@ void vo_cocoa_uninit(struct vo *vo) if (s->window) [s->window release]; }); + + // don't use the mutex, because at that point it could have been destroyed + // and no one is accessing the events view anyway + if (!s->embedded) { + dispatch_async(dispatch_get_main_queue(), ^{ + [(MpvEventsView *)ev clear]; + [ev release]; + }); + } } static int get_screen_handle(struct vo *vo, int identifier, NSWindow *window, |