cocoa: separate video view and events view

This commit is contained in:
Stefano Pigozzi 2014-10-05 22:31:33 +02:00
parent cb0f342ab2
commit 547b62f45e
7 changed files with 92 additions and 19 deletions

View File

@ -18,13 +18,9 @@
#import <Cocoa/Cocoa.h>
#import "video/out/cocoa/mpvadapter.h"
@interface MpvVideoView : NSView <NSDraggingDestination> {
BOOL hasMouseDown;
}
@interface MpvEventsView : NSView <NSDraggingDestination>
@property(nonatomic, retain) MpvCocoaAdapter *adapter;
@property(nonatomic, retain) NSTrackingArea *tracker;
- (void)setFullScreen:(BOOL)willBeFullscreen;
- (NSRect)frameInPixels;
- (BOOL)canHideCursor;
- (void)signalMousePosition;
@end

View File

@ -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]];
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
#import "video/out/cocoa/mpvadapter.h"
@interface MpvVideoView : NSView
@property(nonatomic, retain) MpvCocoaAdapter *adapter;
@end

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#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

View File

@ -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

View File

@ -22,9 +22,10 @@
#import <IOKit/pwr_mgt/IOPMLib.h>
#include <dlfcn.h>
#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;
}

View File

@ -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" ),