From 547b62f45e8c54dc892ba86b98f5ca7cb3f3beac Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Sun, 5 Oct 2014 22:31:33 +0200 Subject: [PATCH] cocoa: separate video view and events view --- video/out/cocoa/{view.h => events_view.h} | 6 +--- video/out/cocoa/{view.m => events_view.m} | 16 +++++++--- video/out/cocoa/video_view.h | 23 ++++++++++++++ video/out/cocoa/video_view.m | 38 +++++++++++++++++++++++ video/out/cocoa/window.m | 2 +- video/out/cocoa_common.m | 23 +++++++++----- wscript_build.py | 3 +- 7 files changed, 92 insertions(+), 19 deletions(-) rename video/out/cocoa/{view.h => events_view.h} (84%) rename video/out/cocoa/{view.m => events_view.m} (95%) create mode 100644 video/out/cocoa/video_view.h create mode 100644 video/out/cocoa/video_view.m diff --git a/video/out/cocoa/view.h b/video/out/cocoa/events_view.h similarity index 84% rename from video/out/cocoa/view.h rename to video/out/cocoa/events_view.h index 490af221b1..3dc0e0306e 100644 --- a/video/out/cocoa/view.h +++ b/video/out/cocoa/events_view.h @@ -18,13 +18,9 @@ #import #import "video/out/cocoa/mpvadapter.h" -@interface MpvVideoView : NSView { - BOOL hasMouseDown; -} +@interface MpvEventsView : NSView @property(nonatomic, retain) MpvCocoaAdapter *adapter; -@property(nonatomic, retain) NSTrackingArea *tracker; - (void)setFullScreen:(BOOL)willBeFullscreen; - (NSRect)frameInPixels; - (BOOL)canHideCursor; -- (void)signalMousePosition; @end diff --git a/video/out/cocoa/view.m b/video/out/cocoa/events_view.m similarity index 95% rename from video/out/cocoa/view.m rename to video/out/cocoa/events_view.m index 7be52b53c9..6e1b470d13 100644 --- a/video/out/cocoa/view.m +++ b/video/out/cocoa/events_view.m @@ -24,11 +24,18 @@ #include "video/out/cocoa_common.h" #import "video/out/cocoa/additions.h" -#include "view.h" +#include "events_view.h" -@implementation MpvVideoView +@interface MpvEventsView() +@property(nonatomic, assign) BOOL hasMouseDown; +@property(nonatomic, retain) NSTrackingArea *tracker; +- (void)signalMousePosition; +@end + +@implementation MpvEventsView @synthesize adapter = _adapter; @synthesize tracker = _tracker; +@synthesize hasMouseDown = _mouse_down; - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; @@ -130,7 +137,7 @@ - (BOOL)canHideCursor { - return !self->hasMouseDown && [self containsMouseLocation]; + return self.hasMouseDown && [self containsMouseLocation]; } - (void)mouseEntered:(NSEvent *)event @@ -147,7 +154,6 @@ { [super setFrameSize:size]; [self signalMousePosition]; - [self.adapter setNeedsResize]; } - (NSPoint)convertPointToPixels:(NSPoint)point @@ -223,7 +229,7 @@ - (void)putMouseEvent:(NSEvent *)event withState:(int)state { - self->hasMouseDown = (state == MP_KEY_STATE_DOWN); + self.hasMouseDown = (state == MP_KEY_STATE_DOWN); int mpkey = (MP_MOUSE_BTN0 + [event mpvButtonNumber]); [self.adapter putKey:(mpkey | state) withModifiers:[event modifierFlags]]; } diff --git a/video/out/cocoa/video_view.h b/video/out/cocoa/video_view.h new file mode 100644 index 0000000000..d31d1e014e --- /dev/null +++ b/video/out/cocoa/video_view.h @@ -0,0 +1,23 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with mpv. If not, see . + */ + +#import +#import "video/out/cocoa/mpvadapter.h" + +@interface MpvVideoView : NSView +@property(nonatomic, retain) MpvCocoaAdapter *adapter; +@end diff --git a/video/out/cocoa/video_view.m b/video/out/cocoa/video_view.m new file mode 100644 index 0000000000..851954c167 --- /dev/null +++ b/video/out/cocoa/video_view.m @@ -0,0 +1,38 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * mpv is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with mpv. If not, see . + */ + +#include "osdep/macosx_compat.h" +#include "video/out/cocoa_common.h" +#include "video_view.h" + +@implementation MpvVideoView +@synthesize adapter = _adapter; + +- (id)initWithFrame:(NSRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + } + return self; +} + +- (void)setFrameSize:(NSSize)size +{ + [super setFrameSize:size]; + [self.adapter setNeedsResize]; +} +@end diff --git a/video/out/cocoa/window.m b/video/out/cocoa/window.m index ece6246f34..1540a1b769 100644 --- a/video/out/cocoa/window.m +++ b/video/out/cocoa/window.m @@ -55,7 +55,7 @@ - (void)windowDidChangeBackingProperties:(NSNotification *)notification { // XXX: we maybe only need expose for this - [self.adapter setNeedsResize]; + // [self.adapter setNeedsResize]; } - (void)windowDidChangeScreenProfile:(NSNotification *)notification diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m index 30f9cb8e86..0a58cd85b8 100644 --- a/video/out/cocoa_common.m +++ b/video/out/cocoa_common.m @@ -22,9 +22,10 @@ #import #include -#include "cocoa_common.h" -#include "video/out/cocoa/window.h" -#include "video/out/cocoa/view.h" +#import "cocoa_common.h" +#import "video/out/cocoa/window.h" +#import "video/out/cocoa/events_view.h" +#import "video/out/cocoa/video_view.h" #import "video/out/cocoa/mpvadapter.h" #include "osdep/threads.h" @@ -57,7 +58,8 @@ static void cocoa_rm_fs_screen_profile_observer(struct vo *vo); struct vo_cocoa_state { NSWindow *window; - MpvVideoView *view; + MpvEventsView *view; + MpvVideoView *video; NSOpenGLContext *gl_ctx; NSScreen *current_screen; @@ -173,6 +175,8 @@ void vo_cocoa_uninit(struct vo *vo) enable_power_management(vo); cocoa_rm_fs_screen_profile_observer(vo); + [s->video release]; + // XXX: It looks like there are some circular retain cycles for the // video view / video window that cause them to not be deallocated, // This is a workaround to make the fullscreen window be released, @@ -304,7 +308,7 @@ static void create_ui(struct vo *vo, struct mp_rect *win, int geo_flags) s->window = create_window(contentRect, s->current_screen, opts->border, adapter); } - s->view = [[[MpvVideoView alloc] initWithFrame:contentRect] autorelease]; + s->view = [[[MpvEventsView alloc] initWithFrame:contentRect] autorelease]; [s->view setWantsBestResolutionOpenGLSurface:YES]; @@ -316,11 +320,15 @@ static void create_ui(struct vo *vo, struct mp_rect *win, int geo_flags) cocoa_register_menu_item_action(MPM_ZOOM, @selector(performZoom:)); #endif + s->video = [[MpvVideoView alloc] initWithFrame:[s->view bounds]]; + [s->view addSubview:s->video]; + [s->view setAutoresizesSubviews:YES]; [s->window setContentView:s->view]; - [s->gl_ctx setView:s->view]; + [s->gl_ctx setView:s->video]; adapter.vout = vo; s->view.adapter = adapter; + s->video.adapter = adapter; if (!s->embedded) { [s->window setRestorable:NO]; @@ -465,8 +473,9 @@ int vo_cocoa_check_events(struct vo *vo) int events = s->pending_events; s->pending_events = 0; - if (events & VO_EVENT_RESIZE) + if (events & VO_EVENT_RESIZE) { resize_window(vo); + } return events; } diff --git a/wscript_build.py b/wscript_build.py index e3021b8442..a3548a4f59 100644 --- a/wscript_build.py +++ b/wscript_build.py @@ -336,7 +336,8 @@ def build(ctx): ( "video/out/aspect.c" ), ( "video/out/bitmap_packer.c" ), ( "video/out/cocoa/additions.m", "cocoa" ), - ( "video/out/cocoa/view.m", "cocoa" ), + ( "video/out/cocoa/video_view.m", "cocoa" ), + ( "video/out/cocoa/events_view.m", "cocoa" ), ( "video/out/cocoa/window.m", "cocoa" ), ( "video/out/cocoa_common.m", "cocoa" ), ( "video/out/dither.c" ),