From 46b74a38f11e9ff2808fc151a329a260d4ac8d90 Mon Sep 17 00:00:00 2001 From: Akemi Date: Thu, 15 Dec 2016 22:12:46 +0100 Subject: cocoa: add border cycling Fixes #2430 --- video/out/cocoa/window.h | 1 + video/out/cocoa/window.m | 28 ++++++++++++++++++++++++++++ video/out/cocoa_common.m | 16 ++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/video/out/cocoa/window.h b/video/out/cocoa/window.h index 485831a932..352eba61d6 100644 --- a/video/out/cocoa/window.h +++ b/video/out/cocoa/window.h @@ -27,4 +27,5 @@ - (BOOL)canBecomeKeyWindow; - (BOOL)canBecomeMainWindow; - (void)mulSize:(float)multiplier; +- (void)updateBorder:(int)border; @end diff --git a/video/out/cocoa/window.m b/video/out/cocoa/window.m index 68e5222a03..2bc7a5865a 100644 --- a/video/out/cocoa/window.m +++ b/video/out/cocoa/window.m @@ -212,6 +212,34 @@ [self.adapter putCommand:cmd]; } +- (void)updateBorder:(int)border +{ + int borderStyle = NSWindowStyleMaskTitled|NSWindowStyleMaskClosable| + NSWindowStyleMaskMiniaturizable; + if (border) { + int window_mask = [self styleMask] & ~NSWindowStyleMaskBorderless; + window_mask |= borderStyle; + [self setStyleMask:window_mask]; + } else { + int window_mask = [self styleMask] & ~borderStyle; + window_mask |= NSWindowStyleMaskBorderless; + [self setStyleMask:window_mask]; + } + + if (![self.adapter isInFullScreenMode]) { + // XXX: workaround to force redrawing of window decoration + if (border) { + NSRect frame = [self frame]; + frame.size.width += 1; + [self setFrame:frame display:YES]; + frame.size.width -= 1; + [self setFrame:frame display:YES]; + } + + [self setContentAspectRatio:_unfs_content_frame.size]; + } +} + - (NSRect)frameRect:(NSRect)f forCenteredContentSize:(NSSize)ns { NSRect cr = [self contentRectForFrameRect:f]; diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m index f4d2562acd..58b0df518f 100644 --- a/video/out/cocoa_common.m +++ b/video/out/cocoa_common.m @@ -552,6 +552,20 @@ static int cocoa_set_window_title(struct vo *vo) return VO_TRUE; } +static int vo_cocoa_window_border(struct vo *vo) +{ + struct vo_cocoa_state *s = vo->cocoa; + if (s->embedded) + return VO_NOTIMPL; + + struct mp_vo_opts *opts = vo->opts; + [s->window updateBorder:opts->border]; + if (opts->border) + cocoa_set_window_title(vo); + + return VO_TRUE; +} + static void cocoa_screen_reconfiguration_observer( CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void *ctx) { @@ -747,6 +761,8 @@ static int vo_cocoa_control_on_main_thread(struct vo *vo, int request, void *arg return VO_TRUE; case VOCTRL_ONTOP: return vo_cocoa_ontop(vo); + case VOCTRL_BORDER: + return vo_cocoa_window_border(vo); case VOCTRL_GET_UNFS_WINDOW_SIZE: { int *sz = arg; NSSize size = [s->view frame].size; -- cgit v1.2.3