summaryrefslogtreecommitdiff
path: root/src/glut_compatibility.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/glut_compatibility.cxx')
-rw-r--r--src/glut_compatibility.cxx24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/glut_compatibility.cxx b/src/glut_compatibility.cxx
index 0a5a6b30e..011f9290b 100644
--- a/src/glut_compatibility.cxx
+++ b/src/glut_compatibility.cxx
@@ -30,6 +30,9 @@
# include "Fl_Screen_Driver.H"
# include <FL/glut.H>
# define MAXWINDOWS 32
+# ifndef GL_CURRENT_PROGRAM
+# define GL_CURRENT_PROGRAM 0x8B8D // from glew.h
+# endif
static Fl_Glut_Window *windows[MAXWINDOWS+1];
@@ -54,6 +57,27 @@ void Fl_Glut_Window::draw() {
indraw = 1;
if (!valid()) {reshape(pixel_w(),pixel_h()); valid(1);}
display();
+ if (children()) {
+ if ((mode() & FL_OPENGL3)) {
+#ifndef __APPLE__
+ typedef void (*glUseProgram_type)(GLint);
+ static glUseProgram_type glUseProgram_f = NULL;
+ if (!glUseProgram_f) {
+ Fl_Gl_Window_Driver *dr = Fl_Gl_Window_Driver::driver(this);
+ glUseProgram_f = (glUseProgram_type)dr->GetProcAddress("glUseProgram");
+ }
+ GLint current_prog = 0;
+ glGetIntegerv(GL_CURRENT_PROGRAM, &current_prog);
+ // Switch from GL3-style to GL1-style drawing;
+ // good under Windows, X11 and Wayland; impossible under macOS.
+ glUseProgram_f(0);
+ // Draw FLTK child widgets
+ Fl_Gl_Window::draw();
+ // Switch back to GL3-style drawing
+ glUseProgram_f((GLuint)current_prog);
+#endif // ! __APPLE__
+ } else Fl_Gl_Window::draw(); // Draw FLTK child widgets
+ }
indraw = 0;
}