From b0e0e0912cc9e6dab548fe914461cee96772dce1 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Wed, 12 Sep 2018 12:46:09 +0000 Subject: =?UTF-8?q?MacOS=20=E2=89=A5=2010.10:=20Fl=5FWindow::fullscreen()?= =?UTF-8?q?=20and=20fullscreen=5Foff()=20no=20longer=20call=20Fl=5FWindow:?= =?UTF-8?q?:hide()=20+=20Fl=5FWindow::show()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new procedure essentially resizes the window, as done on the X11+EWMH and Windows platforms. This improves in particular the possibility to turn an Fl_Gl_Window fullscreen on and off. MacOS ≥ 10.10 is required because the procedure isn't stable (random crashes during fast switches) with 10.9. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@13045 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- CHANGES | 3 ++ examples/OpenGL3-glut-test.cxx | 2 +- src/Fl_cocoa.mm | 42 ++++++++++++++++++++++++++++ src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx | 19 ------------- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/CHANGES b/CHANGES index 22e926b4b..fbba9b260 100644 --- a/CHANGES +++ b/CHANGES @@ -102,6 +102,9 @@ Changes in FLTK 1.4.0 Released: ??? ?? 2018 Other Improvements - (add new items here) + - MacOS ≥ 10.10: Fl_Window::fullscreen() and fullscreen_off() no longer + proceed by Fl_Window::hide() + Fl_Window::show() but essentially + resize the window, as done on the X11+EWMH and Windows platforms. - Fl_Cairo_Window constructors are now compatible with Fl_Double_Window constructors - fixed missing constructors (STR #3160). - The include file for platform specific functions and definitions diff --git a/examples/OpenGL3-glut-test.cxx b/examples/OpenGL3-glut-test.cxx index 405d7f105..84c9322a4 100644 --- a/examples/OpenGL3-glut-test.cxx +++ b/examples/OpenGL3-glut-test.cxx @@ -198,7 +198,6 @@ int main (int argc, char* argv[]) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | FL_OPENGL3); glutInitWindowSize(400, 400); glutCreateWindow("Triangle Test"); - if (fullscreen) Fl::first_window()->fullscreen(); #ifndef __APPLE__ GLenum err = glewInit(); // defines pters to functions of OpenGL V 1.2 and above if (err) Fl::error("glewInit() failed returning %u", err); @@ -215,6 +214,7 @@ int main (int argc, char* argv[]) initShaders(); init(); glutDisplayFunc(display); + if (fullscreen) Fl::first_window()->fullscreen(); glutMainLoop(); return 0; } diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index d6ca855f2..fc8269975 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -3000,6 +3000,48 @@ Fl_X* Fl_Cocoa_Window_Driver::makeWindow() return x; } +void Fl_Cocoa_Window_Driver::fullscreen_on() { + pWindow->_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 + pWindow->hide(); + pWindow->show(); + } else { + FLWindow *nswin = fl_xid(pWindow); +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + [nswin setStyleMask:NSBorderlessWindowMask]; //10.6 +#endif + [nswin setLevel:NSStatusWindowLevel]; + int X,Y,W,H; + Fl::screen_xywh(X, Y, W, H, x(), y(), w(), h()); + pWindow->resize(X, Y, W, H); + } + Fl::handle(FL_FULLSCREEN, pWindow); +} + +void Fl_Cocoa_Window_Driver::fullscreen_off(int X, int Y, int W, int H) { + pWindow->_clear_fullscreen(); + if (fl_mac_os_version < 101000) { + pWindow->hide(); + pWindow->resize(X, Y, W, H); + pWindow->show(); + } else { + FLWindow *nswin = fl_xid(pWindow); + NSUInteger winstyle = (pWindow->border() ? + (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask) : NSBorderlessWindowMask); + if (!pWindow->modal()) winstyle |= NSMiniaturizableWindowMask; + NSInteger level = NSNormalWindowLevel; + if (pWindow->modal()) level = modal_window_level(); + else if (pWindow->non_modal()) level = non_modal_window_level(); + [nswin setLevel:level]; + pWindow->resize(X, Y, W, H); +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + [nswin setStyleMask:winstyle]; //10.6 +#endif + } + Fl::handle(FL_FULLSCREEN, pWindow); +} /* * Tell the OS what window sizes we want to allow diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx index 254d22545..1f189300c 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx @@ -252,25 +252,6 @@ void Fl_Cocoa_Window_Driver::hide() { } -void Fl_Cocoa_Window_Driver::fullscreen_on() { - pWindow->_set_fullscreen(); - /* On OS X < 10.6, it is necessary to recreate the window. This is done - with hide+show. */ - pWindow->hide(); - pWindow->show(); - Fl::handle(FL_FULLSCREEN, pWindow); -} - - -void Fl_Cocoa_Window_Driver::fullscreen_off(int X, int Y, int W, int H) { - pWindow->_clear_fullscreen(); - pWindow->hide(); - pWindow->resize(X, Y, W, H); - pWindow->show(); - Fl::handle(FL_FULLSCREEN, pWindow); -} - - void Fl_Cocoa_Window_Driver::decoration_sizes(int *top, int *left, int *right, int *bottom) { *top = 24; *left = 2; -- cgit v1.2.3