summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx
index 4d47c3015..b14ac6a17 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx
+++ b/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx
@@ -304,6 +304,47 @@ FL_EXPORT NSOpenGLContext *fl_mac_glcontext(GLContext rc) {
}
+/* macOS offers only core contexts when using GL3. This forbids to add
+ FLTK widgets to a GL3-using Fl_Gl_Window because these widgets are drawn
+ with the GL1-based Fl_OpenGL_Graphics_Driver. The solution implemented here
+ is to create, with public function fl_mac_prepare_add_widgets_to_GL3_win(),
+ an additional Fl_Gl_Window placed above and sized as the GL3-based window,
+ to give it a non opaque, GL1-based context, and to put the FLTK widgets
+ in that additional window.
+ */
+
+class transparentGlWindow : public Fl_Gl_Window { // utility class
+ bool need_remove_opacity;
+public:
+ transparentGlWindow(int x, int y, int w, int h) : Fl_Gl_Window(x, y, w, h) {
+ mode(FL_RGB8 | FL_ALPHA | FL_SINGLE);
+ need_remove_opacity = true;
+ }
+ void show() {
+ Fl_Gl_Window::show();
+ if (need_remove_opacity) {
+ need_remove_opacity = false;
+ Fl_Cocoa_Window_Driver *d = Fl_Cocoa_Window_Driver::driver(this);
+ d->remove_gl_context_opacity((NSOpenGLContext*)context());
+ }
+ }
+};
+
+
+Fl_Gl_Window *fl_mac_prepare_add_widgets_to_GL3_win(Fl_Gl_Window *gl3win) {
+ gl3win->begin();
+ transparentGlWindow *transp = new transparentGlWindow(0, 0,
+ gl3win->w(), gl3win->h());
+ gl3win->end();
+ if (!gl3win->resizable()) gl3win->resizable(gl3win);
+ if (gl3win->shown()) {
+ transp->show();
+ gl3win->make_current();
+ }
+ return transp;
+}
+
+
class Fl_Gl_Cocoa_Plugin : public Fl_Cocoa_Plugin {
public:
Fl_Gl_Cocoa_Plugin() : Fl_Cocoa_Plugin(name()) { }