mirror of
https://github.com/mpv-player/mpv
synced 2025-02-28 19:30:44 +00:00
cocoa: allow to embed into an arbitrary NSView
Basically add if guards on all the problematic features. I'm still thinking about a better way to handle this, but for the time being, this will do.
This commit is contained in:
parent
06ecf54fdf
commit
69fa956f50
@ -82,7 +82,7 @@ static void wakeup(void *);
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if EMBED_VIEW
|
#if EMBED_VIEW
|
||||||
int64_t wid = (intptr_t) self->w;
|
int64_t wid = (intptr_t) [self->w contentView];
|
||||||
check_error(mpv_set_option(mpv, "wid", MPV_FORMAT_INT64, &wid));
|
check_error(mpv_set_option(mpv, "wid", MPV_FORMAT_INT64, &wid));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -21,6 +21,5 @@
|
|||||||
@interface MpvEventsView : NSView <NSDraggingDestination>
|
@interface MpvEventsView : NSView <NSDraggingDestination>
|
||||||
@property(nonatomic, retain) MpvCocoaAdapter *adapter;
|
@property(nonatomic, retain) MpvCocoaAdapter *adapter;
|
||||||
- (void)setFullScreen:(BOOL)willBeFullscreen;
|
- (void)setFullScreen:(BOOL)willBeFullscreen;
|
||||||
- (NSRect)frameInPixels;
|
|
||||||
- (BOOL)canHideCursor;
|
- (BOOL)canHideCursor;
|
||||||
@end
|
@end
|
||||||
|
@ -130,11 +130,6 @@
|
|||||||
- (BOOL)becomeFirstResponder { return YES; }
|
- (BOOL)becomeFirstResponder { return YES; }
|
||||||
- (BOOL)resignFirstResponder { return YES; }
|
- (BOOL)resignFirstResponder { return YES; }
|
||||||
|
|
||||||
- (NSRect)frameInPixels
|
|
||||||
{
|
|
||||||
return [self convertRectToBacking:[self frame]];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)canHideCursor
|
- (BOOL)canHideCursor
|
||||||
{
|
{
|
||||||
return !self.hasMouseDown && [self containsMouseLocation];
|
return !self.hasMouseDown && [self containsMouseLocation];
|
||||||
|
@ -20,4 +20,5 @@
|
|||||||
|
|
||||||
@interface MpvVideoView : NSView
|
@interface MpvVideoView : NSView
|
||||||
@property(nonatomic, retain) MpvCocoaAdapter *adapter;
|
@property(nonatomic, retain) MpvCocoaAdapter *adapter;
|
||||||
|
- (NSRect)frameInPixels;
|
||||||
@end
|
@end
|
||||||
|
@ -35,4 +35,9 @@
|
|||||||
[super setFrameSize:size];
|
[super setFrameSize:size];
|
||||||
[self.adapter setNeedsResize];
|
[self.adapter setNeedsResize];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSRect)frameInPixels
|
||||||
|
{
|
||||||
|
return [self convertRectToBacking:[self frame]];
|
||||||
|
}
|
||||||
@end
|
@end
|
||||||
|
@ -58,7 +58,7 @@ static void cocoa_rm_fs_screen_profile_observer(struct vo *vo);
|
|||||||
|
|
||||||
struct vo_cocoa_state {
|
struct vo_cocoa_state {
|
||||||
NSWindow *window;
|
NSWindow *window;
|
||||||
MpvEventsView *view;
|
NSView *view;
|
||||||
MpvVideoView *video;
|
MpvVideoView *video;
|
||||||
NSOpenGLContext *gl_ctx;
|
NSOpenGLContext *gl_ctx;
|
||||||
|
|
||||||
@ -155,17 +155,24 @@ int vo_cocoa_init(struct vo *vo)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vo_cocoa_set_cursor_visibility(struct vo *vo, bool *visible)
|
static int vo_cocoa_set_cursor_visibility(struct vo *vo, bool *visible)
|
||||||
{
|
{
|
||||||
struct vo_cocoa_state *s = vo->cocoa;
|
struct vo_cocoa_state *s = vo->cocoa;
|
||||||
|
|
||||||
|
if (s->embedded)
|
||||||
|
return VO_NOTIMPL;
|
||||||
|
|
||||||
|
MpvEventsView *v = (MpvEventsView *) s->view;
|
||||||
|
|
||||||
if (*visible) {
|
if (*visible) {
|
||||||
CGDisplayShowCursor(kCGDirectMainDisplay);
|
CGDisplayShowCursor(kCGDirectMainDisplay);
|
||||||
} else if ([s->view canHideCursor]) {
|
} else if ([v canHideCursor]) {
|
||||||
CGDisplayHideCursor(kCGDirectMainDisplay);
|
CGDisplayHideCursor(kCGDirectMainDisplay);
|
||||||
} else {
|
} else {
|
||||||
*visible = true;
|
*visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return VO_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vo_cocoa_uninit(struct vo *vo)
|
void vo_cocoa_uninit(struct vo *vo)
|
||||||
@ -225,6 +232,9 @@ static void vo_cocoa_update_screen_info(struct vo *vo, struct mp_rect *out_rc)
|
|||||||
{
|
{
|
||||||
struct vo_cocoa_state *s = vo->cocoa;
|
struct vo_cocoa_state *s = vo->cocoa;
|
||||||
|
|
||||||
|
if (s->embedded)
|
||||||
|
return;
|
||||||
|
|
||||||
vo_cocoa_update_screens_pointers(vo);
|
vo_cocoa_update_screens_pointers(vo);
|
||||||
|
|
||||||
if (out_rc) {
|
if (out_rc) {
|
||||||
@ -236,7 +246,7 @@ static void vo_cocoa_update_screen_info(struct vo *vo, struct mp_rect *out_rc)
|
|||||||
static void resize_window(struct vo *vo)
|
static void resize_window(struct vo *vo)
|
||||||
{
|
{
|
||||||
struct vo_cocoa_state *s = vo->cocoa;
|
struct vo_cocoa_state *s = vo->cocoa;
|
||||||
NSRect frame = [s->view frameInPixels];
|
NSRect frame = [s->video frameInPixels];
|
||||||
vo->dwidth = frame.size.width;
|
vo->dwidth = frame.size.width;
|
||||||
vo->dheight = frame.size.height;
|
vo->dheight = frame.size.height;
|
||||||
[s->gl_ctx update];
|
[s->gl_ctx update];
|
||||||
@ -301,14 +311,19 @@ static void create_ui(struct vo *vo, struct mp_rect *win, int geo_flags)
|
|||||||
MpvCocoaAdapter *adapter = [[[MpvCocoaAdapter alloc] init] autorelease];
|
MpvCocoaAdapter *adapter = [[[MpvCocoaAdapter alloc] init] autorelease];
|
||||||
const NSRect contentRect =
|
const NSRect contentRect =
|
||||||
NSMakeRect(win->x0, win->y0, win->x1 - win->x0, win->y1 - win->y0);
|
NSMakeRect(win->x0, win->y0, win->x1 - win->x0, win->y1 - win->y0);
|
||||||
|
adapter.vout = vo;
|
||||||
|
|
||||||
if (s->embedded) {
|
if (s->embedded) {
|
||||||
s->window = (NSWindow *) (intptr_t) opts->WinID;
|
s->view = (NSView *) (intptr_t) opts->WinID;
|
||||||
} else {
|
} else {
|
||||||
s->window = create_window(contentRect, s->current_screen,
|
s->window = create_window(contentRect, s->current_screen,
|
||||||
opts->border, adapter);
|
opts->border, adapter);
|
||||||
|
|
||||||
|
MpvEventsView *view = [[MpvEventsView alloc] initWithFrame:contentRect];
|
||||||
|
[view autorelease];
|
||||||
|
view.adapter = adapter;
|
||||||
|
s->view = view;
|
||||||
}
|
}
|
||||||
s->view = [[[MpvEventsView alloc] initWithFrame:contentRect] autorelease];
|
|
||||||
|
|
||||||
#if HAVE_COCOA_APPLICATION
|
#if HAVE_COCOA_APPLICATION
|
||||||
cocoa_register_menu_item_action(MPM_H_SIZE, @selector(halfSize));
|
cocoa_register_menu_item_action(MPM_H_SIZE, @selector(halfSize));
|
||||||
@ -326,8 +341,6 @@ static void create_ui(struct vo *vo, struct mp_rect *win, int geo_flags)
|
|||||||
[s->window setContentView:s->view];
|
[s->window setContentView:s->view];
|
||||||
[s->gl_ctx setView:s->video];
|
[s->gl_ctx setView:s->video];
|
||||||
|
|
||||||
adapter.vout = vo;
|
|
||||||
s->view.adapter = adapter;
|
|
||||||
s->video.adapter = adapter;
|
s->video.adapter = adapter;
|
||||||
|
|
||||||
if (!s->embedded) {
|
if (!s->embedded) {
|
||||||
@ -414,7 +427,7 @@ int vo_cocoa_config_window(struct vo *vo, uint32_t flags, void *gl_ctx)
|
|||||||
s->old_dwidth = width;
|
s->old_dwidth = width;
|
||||||
s->old_dheight = height;
|
s->old_dheight = height;
|
||||||
|
|
||||||
if (!(flags & VOFLAG_HIDDEN) && !s->window) {
|
if (!(flags & VOFLAG_HIDDEN) && !s->view) {
|
||||||
create_ui(vo, &geo.win, geo.flags);
|
create_ui(vo, &geo.win, geo.flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,10 +512,13 @@ static void vo_cocoa_fullscreen(struct vo *vo)
|
|||||||
struct vo_cocoa_state *s = vo->cocoa;
|
struct vo_cocoa_state *s = vo->cocoa;
|
||||||
struct mp_vo_opts *opts = vo->opts;
|
struct mp_vo_opts *opts = vo->opts;
|
||||||
|
|
||||||
|
if (s->embedded)
|
||||||
|
return;
|
||||||
|
|
||||||
vo_cocoa_update_screen_info(vo, NULL);
|
vo_cocoa_update_screen_info(vo, NULL);
|
||||||
|
|
||||||
draw_changes_after_next_frame(vo);
|
draw_changes_after_next_frame(vo);
|
||||||
[s->view setFullScreen:opts->fullscreen];
|
[(MpvEventsView *)s->view setFullScreen:opts->fullscreen];
|
||||||
|
|
||||||
if (s->icc_fs_profile_path != s->icc_wnd_profile_path)
|
if (s->icc_fs_profile_path != s->icc_wnd_profile_path)
|
||||||
s->pending_events = VO_EVENT_ICC_PROFILE_PATH_CHANGED;
|
s->pending_events = VO_EVENT_ICC_PROFILE_PATH_CHANGED;
|
||||||
@ -646,8 +662,7 @@ int vo_cocoa_control(struct vo *vo, int *events, int request, void *arg)
|
|||||||
return VO_TRUE;
|
return VO_TRUE;
|
||||||
}
|
}
|
||||||
case VOCTRL_SET_CURSOR_VISIBILITY:
|
case VOCTRL_SET_CURSOR_VISIBILITY:
|
||||||
vo_cocoa_set_cursor_visibility(vo, arg);
|
return vo_cocoa_set_cursor_visibility(vo, arg);
|
||||||
return VO_TRUE;
|
|
||||||
case VOCTRL_UPDATE_WINDOW_TITLE:
|
case VOCTRL_UPDATE_WINDOW_TITLE:
|
||||||
return cocoa_set_window_title(vo, (const char *) arg);
|
return cocoa_set_window_title(vo, (const char *) arg);
|
||||||
case VOCTRL_RESTORE_SCREENSAVER:
|
case VOCTRL_RESTORE_SCREENSAVER:
|
||||||
|
Loading…
Reference in New Issue
Block a user