diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 8844f8aafde..32549577a5b 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -3338,7 +3338,8 @@ bool video_driver_init_internal(bool *video_is_threaded, bool verbosity_enabled) else #endif { -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) +#if (defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)) || \ + (defined(HAVE_COCOA_METAL) && !defined(HAVE_COCOATOUCH)) bool window_custom_size_enable = settings->bools.video_window_save_positions; #else bool window_custom_size_enable = settings->bools.video_window_custom_size_enable; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index eaad04f5e98..3ee8796df26 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -8591,7 +8591,9 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_MOUSE_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_POINTER_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_THREADED_DATA_RUNLOOP_ENABLE, PARSE_ONLY_BOOL, true}, +#if !defined(OSX) {MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION, PARSE_ONLY_BOOL, true}, +#endif #if defined(HAVE_QT) || defined(HAVE_COCOA) {MENU_ENUM_LABEL_UI_COMPANION_ENABLE, PARSE_ONLY_BOOL, true}, {MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT, PARSE_ONLY_BOOL, true}, @@ -8677,13 +8679,15 @@ unsigned menu_displaylist_build_list( break; case DISPLAYLIST_VIDEO_WINDOWED_MODE_SETTINGS_LIST: { -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) +#if (defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)) || \ + (defined(HAVE_COCOA_METAL) && !defined(HAVE_COCOATOUCH)) bool window_custom_size_enable = settings->bools.video_window_save_positions; #else bool window_custom_size_enable = settings->bools.video_window_custom_size_enable; #endif menu_displaylist_build_info_selective_t build_list[] = { -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) +#if (defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)) || \ + (defined(HAVE_COCOA_METAL) && !defined(HAVE_COCOATOUCH)) {MENU_ENUM_LABEL_VIDEO_WINDOW_SAVE_POSITION, PARSE_ONLY_BOOL, true }, #else {MENU_ENUM_LABEL_VIDEO_WINDOW_CUSTOM_SIZE_ENABLE, PARSE_ONLY_BOOL, true }, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 6aa2236defb..fb1833b721e 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -12535,7 +12535,10 @@ static bool setting_append_list( general_read_handler, SD_FLAG_NONE); MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REINIT); +#endif +#if (defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)) || \ + (defined(HAVE_COCOA_METAL) && !defined(HAVE_COCOATOUCH)) CONFIG_BOOL( list, list_info, &settings->bools.video_window_save_positions, diff --git a/ui/drivers/cocoa/apple_platform.h b/ui/drivers/cocoa/apple_platform.h index 6a5ad0324c8..07683ffd5d7 100644 --- a/ui/drivers/cocoa/apple_platform.h +++ b/ui/drivers/cocoa/apple_platform.h @@ -17,6 +17,7 @@ typedef enum apple_view_type #if defined(HAVE_COCOA_METAL) && !defined(HAVE_COCOATOUCH) @interface WindowListener : NSResponder +@property (nonatomic) NSWindow* window; @end #endif @@ -37,6 +38,9 @@ typedef enum apple_view_type * the displays should not sleep. */ - (bool)setDisableDisplaySleep:(bool)disable; +#if defined(HAVE_COCOA_METAL) && !defined(HAVE_COCOATOUCH) +- (void)updateWindowedMode; +#endif @end #endif diff --git a/ui/drivers/cocoa/cocoa_common.m b/ui/drivers/cocoa/cocoa_common.m index 95d1d206d56..0d1e72b317e 100644 --- a/ui/drivers/cocoa/cocoa_common.m +++ b/ui/drivers/cocoa/cocoa_common.m @@ -647,16 +647,3 @@ bool cocoa_get_metrics( return true; } #endif - -#if defined(HAVE_COCOA_METAL) && !defined(HAVE_COCOATOUCH) -@implementation WindowListener - -/* Similarly to SDL, we'll respond to key events - * by doing nothing so we don't beep. - */ -- (void)flagsChanged:(NSEvent *)event { } -- (void)keyDown:(NSEvent *)event { } -- (void)keyUp:(NSEvent *)event { } - -@end -#endif diff --git a/ui/drivers/ui_cocoa.m b/ui/drivers/ui_cocoa.m index 2f6f29e26c8..907b0d2d832 100644 --- a/ui/drivers/ui_cocoa.m +++ b/ui/drivers/ui_cocoa.m @@ -511,6 +511,59 @@ - (void)sendEvent:(NSEvent *)event { @end +#if defined(HAVE_COCOA_METAL) +@implementation WindowListener + +/* Similarly to SDL, we'll respond to key events + * by doing nothing so we don't beep. + */ +- (void)flagsChanged:(NSEvent *)event { } +- (void)keyDown:(NSEvent *)event { } +- (void)keyUp:(NSEvent *)event { } + +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + [apple_platform updateWindowedMode]; +} + +- (void)windowDidMove:(NSNotification *)notification +{ + settings_t *settings = config_get_ptr(); + bool window_save_positions = settings->bools.video_window_save_positions; + BOOL is_fullscreen = (self.window.styleMask + & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen; + + if (!window_save_positions || is_fullscreen) + return; + + NSRect frame = self.window.frame; + settings->uints.window_position_x = (unsigned)frame.origin.x; + settings->uints.window_position_y = (unsigned)frame.origin.y; + settings->uints.window_position_width = (unsigned)frame.size.width; + settings->uints.window_position_height = (unsigned)frame.size.height; +} + +- (void)windowDidResize:(NSNotification *)notification +{ + settings_t *settings = config_get_ptr(); + bool window_save_positions = settings->bools.video_window_save_positions; + BOOL is_fullscreen = (self.window.styleMask + & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen; + + if (!window_save_positions || is_fullscreen) + return; + + NSRect frame = self.window.frame; + settings->uints.window_position_x = (unsigned)frame.origin.x; + settings->uints.window_position_y = (unsigned)frame.origin.y; + settings->uints.window_position_width = (unsigned)frame.size.width; + settings->uints.window_position_height = (unsigned)frame.size.height; +} + +@end +#endif + + @implementation RetroArch_OSX @synthesize window = _window; @@ -537,6 +590,7 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification #ifdef HAVE_COCOA_METAL _listener = [WindowListener new]; + _listener.window = self.window; [self.window setNextResponder:_listener]; self.window.delegate = _listener; @@ -635,6 +689,7 @@ - (void)setVideoMode:(gfx_ctx_mode_t)mode if (!is_fullscreen) { [self.window toggleFullScreen:self]; + self.window.alphaValue = 1; return; } } @@ -642,12 +697,51 @@ - (void)setVideoMode:(gfx_ctx_mode_t)mode { if (is_fullscreen) [self.window toggleFullScreen:self]; + [self updateWindowedSize:mode]; + [self updateWindowedMode]; } - /* HACK(sgc): ensure MTKView posts a drawable resize event */ - if (mode.width > 0) - [self.window setContentSize:NSMakeSize(mode.width-1, mode.height)]; - [self.window setContentSize:NSMakeSize(mode.width, mode.height)]; + [self.window displayIfNeeded]; +} + +- (void)updateWindowedSize:(gfx_ctx_mode_t)mode +{ + settings_t *settings = config_get_ptr(); + bool windowed_full = settings->bools.video_windowed_fullscreen; + bool window_save_positions = settings->bools.video_window_save_positions; + + if (windowed_full) + return; + + if (window_save_positions) + { + NSRect frame; + frame.origin.x = settings->uints.window_position_x; + frame.origin.y = settings->uints.window_position_y; + frame.size.width = settings->uints.window_position_width; + frame.size.height = settings->uints.window_position_height; + [self.window setFrame:frame display:YES]; + } + else + [self.window setContentSize:NSMakeSize(mode.width, mode.height)]; +} + +- (void)updateWindowedMode +{ + settings_t *settings = config_get_ptr(); + bool windowed_full = settings->bools.video_windowed_fullscreen; + bool show_decorations = settings->bools.video_window_show_decorations; + CGFloat opacity = (CGFloat)settings->uints.video_window_opacity / (CGFloat)100.0; + + if (windowed_full || !self.window.keyWindow) + return; + + if (show_decorations) + self.window.styleMask |= NSWindowStyleMaskTitled; + else + self.window.styleMask &= ~NSWindowStyleMaskTitled; + + self.window.alphaValue = opacity; } - (void)setCursorVisible:(bool)v