From 20e2879ea8205934aeb3d31377bd3645439f4010 Mon Sep 17 00:00:00 2001 From: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> Date: Wed, 22 May 2024 10:37:18 +0200 Subject: [PATCH] macOS: let fullscreen windows have access to the system menubar --- CHANGES | 1 + src/Fl_cocoa.mm | 46 ++++++++++++++++++++++++++++++++++----------- test/fullscreen.cxx | 15 +++++++++++++++ 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 3d1f948ef..d9ec9995a 100644 --- a/CHANGES +++ b/CHANGES @@ -20,6 +20,7 @@ Details: ManoloFLTK: Fix "FLTK on NetBSD very slow on X11 with Unicode locale" (#935) + macOS: let fullscreen windows have access to the system menubar Matthias Melcher: Fix Fl_Shared_Image refcount (#877) diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 2b8a3dab1..23aa1f085 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -1272,6 +1272,8 @@ static FLTextView *fltextview_instance = nil; - (void)windowDidDeminiaturize:(NSNotification *)notif; - (void)fl_windowMiniaturize:(NSNotification *)notif; - (void)windowDidMiniaturize:(NSNotification *)notif; +- (void)windowWillEnterFullScreen:(NSNotification *)notif; +- (void)windowWillExitFullScreen:(NSNotification *)notif; - (BOOL)windowShouldClose:(id)fl; - (void)anyWindowWillClose:(NSNotification *)notif; - (void)doNothing:(id)unused; @@ -1496,7 +1498,7 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; FLWindow *nsw = (FLWindow*)[notif object]; Fl_Window *w = [nsw getFl_Window]; /* Restore previous fullscreen level */ - if (w->fullscreen_active()) { + if (w->fullscreen_active() && fl_mac_os_version < 100700) { [nsw setLevel:NSStatusWindowLevel]; fixup_window_levels(); } @@ -1554,6 +1556,18 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; Fl::handle(FL_HIDE, window); fl_unlock_function(); } +- (void)windowWillEnterFullScreen:(NSNotification *)notif; +{ + FLWindow *nsw = (FLWindow*)[notif object]; + Fl_Window *window = [nsw getFl_Window]; + window->_set_fullscreen(); +} +- (void)windowWillExitFullScreen:(NSNotification *)notif; +{ + FLWindow *nsw = (FLWindow*)[notif object]; + Fl_Window *window = [nsw getFl_Window]; + window->_clear_fullscreen(); +} - (BOOL)windowShouldClose:(id)fl { fl_lock_function(); @@ -3101,15 +3115,13 @@ NSOpenGLContext* Fl_X::GLcontext_getcurrent() void Fl_Window::fullscreen_x() { _set_fullscreen(); - if (fl_mac_os_version < 101000) { - // On OS X < 10.6, it is necessary to recreate the window. This is done with hide+show. - // The alternative procedure isn't stable until MacOS 10.10 - hide(); - show(); - } else { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - [i->xid setStyleMask:NSBorderlessWindowMask]; //10.6 -#endif + if (fl_mac_os_version >= 100700 && border()) { +# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + [i->xid toggleFullScreen:nil]; +# endif + } else if (fl_mac_os_version >= 100600) { + [i->xid setStyleMask:NSBorderlessWindowMask]; // 10.6 if ([i->xid isKeyWindow]) { if ([i->xid level] != NSStatusWindowLevel) { [i->xid setLevel:NSStatusWindowLevel]; @@ -3139,6 +3151,11 @@ void Fl_Window::fullscreen_x() { Fl::screen_xywh(sx, sy, sw, sh, right); W = sx + sw - X; resize(X, Y, W, H); + } else +#endif + { // On OS X < 10.6, it is necessary to recreate the window. This is done with hide+show. + hide(); + show(); } Fl::handle(FL_FULLSCREEN, this); } @@ -3146,7 +3163,11 @@ void Fl_Window::fullscreen_x() { void Fl_Window::fullscreen_off_x(int X, int Y, int W, int H) { _clear_fullscreen(); #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - if (fl_mac_os_version >= 100600) { + if (fl_mac_os_version >= 100700) { + # if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 + [i->xid toggleFullScreen:nil]; + # endif + } else if (fl_mac_os_version >= 100600) { NSInteger level = NSNormalWindowLevel; if (modal()) level = modal_window_level(); else if (non_modal()) level = non_modal_window_level(); @@ -3264,7 +3285,7 @@ void Fl_X::make(Fl_Window* w) x->in_windowDidResize(false); NSRect crect; - if (w->fullscreen_active()) { + if (w->fullscreen_active() && fl_mac_os_version < 100700) { int top, bottom, left, right; int sx, sy, sw, sh, X, Y, W, H; @@ -3382,6 +3403,9 @@ void Fl_X::make(Fl_Window* w) } else { // a top-level window if ([cw canBecomeKeyWindow]) [cw makeKeyAndOrderFront:nil]; else [cw orderFront:nil]; + if (w->fullscreen_active() && fl_mac_os_version >= 100700) { + [cw toggleFullScreen:nil]; + } } int old_event = Fl::e_number; diff --git a/test/fullscreen.cxx b/test/fullscreen.cxx index b3ede25bc..233ecbe7d 100644 --- a/test/fullscreen.cxx +++ b/test/fullscreen.cxx @@ -126,6 +126,7 @@ class fullscreen_window : public Fl_Single_Window { public: fullscreen_window(int W, int H, const char *t=0); int handle (int e); + void resize(int x, int y, int w, int h); Fl_Toggle_Light_Button *b3; Fl_Toggle_Light_Button *b4; }; @@ -134,6 +135,20 @@ fullscreen_window::fullscreen_window(int W, int H, const char *t) : Fl_Single_Wi } +void after_resize(void *data) { + Fl::remove_check(after_resize, data); + fullscreen_window *win = (fullscreen_window*)data; + if (win->fullscreen_active()) win->b3->set(); + else win->b3->clear(); + win->b3->redraw(); +} + +void fullscreen_window::resize(int x, int y, int w, int h) { + Fl_Single_Window::resize(x,y,w,h); + Fl::add_check(after_resize, this); +}; + + int fullscreen_window::handle(int e) { if (e == FL_FULLSCREEN) { printf("Received FL_FULLSCREEN event\n");