diff options
| author | Manolo Gouy <Manolo> | 2018-09-12 12:46:09 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2018-09-12 12:46:09 +0000 |
| commit | b0e0e0912cc9e6dab548fe914461cee96772dce1 (patch) | |
| tree | d97fc0539900ea0aaff20a767f5f2fffdc0e2313 /src/Fl_cocoa.mm | |
| parent | b6f65b1c8706098fbbbe8b717f5c94309728aa16 (diff) | |
MacOS ≥ 10.10: Fl_Window::fullscreen() and fullscreen_off() no longer call Fl_Window::hide() + Fl_Window::show()
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
Diffstat (limited to 'src/Fl_cocoa.mm')
| -rw-r--r-- | src/Fl_cocoa.mm | 42 |
1 files changed, 42 insertions, 0 deletions
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 |
