mirror of
https://github.com/mpv-player/mpv
synced 2025-02-23 00:06:56 +00:00
cocoa: separate video view and events view
This commit is contained in:
parent
cb0f342ab2
commit
547b62f45e
@ -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
|
@ -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]];
|
||||
}
|
23
video/out/cocoa/video_view.h
Normal file
23
video/out/cocoa/video_view.h
Normal 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
|
38
video/out/cocoa/video_view.m
Normal file
38
video/out/cocoa/video_view.m
Normal 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
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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" ),
|
||||
|
Loading…
Reference in New Issue
Block a user