diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2021-12-07 10:54:29 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2021-12-07 10:54:41 +0100 |
| commit | 939d536b66c633b42eeddfe3dfa775e7fab0055a (patch) | |
| tree | dc93d306c029e972fbf7bd0f7fd553044e035a85 | |
| parent | 16c9641797c631caee5499f7fdd300fab714b8f8 (diff) | |
Fix for fltk.coredev "reentrant calls with Fl_Window::resize" - cont'd
| -rw-r--r-- | src/Fl_cocoa.mm | 16 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx | 11 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H | 9 |
3 files changed, 33 insertions, 3 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index b415e8d4b..3b8cf6370 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -1253,9 +1253,19 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; float s = Fl::screen_driver()->scale(window->screen_num()); NSRect r = [view frame]; Fl_Cocoa_Window_Driver::driver(window)->view_resized(1); - if (Fl_Cocoa_Window_Driver::driver(window)->through_resize()) - Fl_Cocoa_Window_Driver::driver(window)->resize(X, Y, lround(r.size.width/s), lround(r.size.height/s)); - else + if (Fl_Cocoa_Window_Driver::driver(window)->through_resize()) { + if (window->as_gl_window()) { + static Fl_Cocoa_Plugin *plugin = NULL; + if (!plugin) { + Fl_Plugin_Manager pm("fltk:cocoa"); + plugin = (Fl_Cocoa_Plugin*)pm.plugin("gl.cocoa.fltk.org"); + } + // calls Fl_Gl_Window::resize() without including Fl_Gl_Window.H + plugin->resize(window->as_gl_window(), X, Y, lround(r.size.width/s), lround(r.size.height/s)); + } else { + Fl_Cocoa_Window_Driver::driver(window)->resize(X, Y, lround(r.size.width/s), lround(r.size.height/s)); + } + } else window->resize(X, Y, lround(r.size.width/s), lround(r.size.height/s)); Fl_Cocoa_Window_Driver::driver(window)->view_resized(0); update_e_xy_and_e_xy_root(nsw); diff --git a/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx index 372ee38ec..af36b1fd1 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Gl_Window_Driver.cxx @@ -297,4 +297,15 @@ Fl_RGB_Image* Fl_Cocoa_Gl_Window_Driver::capture_gl_rectangle(int x, int y, int return img; } +class Fl_Gl_Cocoa_Plugin : public Fl_Cocoa_Plugin { +public: + Fl_Gl_Cocoa_Plugin() : Fl_Cocoa_Plugin(name()) { } + virtual const char *name() { return "gl.cocoa.fltk.org"; } + virtual void resize(Fl_Gl_Window *glw, int x, int y, int w, int h) { + glw->Fl_Gl_Window::resize(x, y, w, h); + } +}; + +static Fl_Gl_Cocoa_Plugin Gl_Cocoa_Plugin; + #endif // HAVE_GL diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H index 4bc7d3783..3003e3904 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H @@ -24,6 +24,7 @@ #define FL_COCOA_WINDOW_DRIVER_H #include "../../Fl_Window_Driver.H" +#include <FL/Fl_Plugin.H> #include <ApplicationServices/ApplicationServices.h> class Fl_Image; @@ -163,4 +164,12 @@ public: NSImage *icon_image; }; +class Fl_Cocoa_Plugin : public Fl_Plugin { +public: + Fl_Cocoa_Plugin(const char *pluginName) : Fl_Plugin(klass(), pluginName) { } + virtual const char *klass() { return "fltk:cocoa"; } + virtual const char *name() = 0; + virtual void resize(Fl_Gl_Window *glw, int x, int y, int w, int h) = 0; +}; + #endif // FL_COCOA_WINDOW_DRIVER_H |
