Add static Fl_Wayland_Window_Driver::gl_plugin() member function.

This commit is contained in:
ManoloFLTK
2022-08-20 17:26:02 +02:00
parent 7deff86b5d
commit d5a1e7feb9
3 changed files with 17 additions and 19 deletions
@@ -1115,8 +1115,7 @@ void Fl_Wayland_Screen_Driver::open_display_platform() {
} }
void Fl_Wayland_Screen_Driver::close_display() { void Fl_Wayland_Screen_Driver::close_display() {
Fl_Plugin_Manager pm("wayland.fltk.org"); Fl_Wayland_Plugin *plugin = Fl_Wayland_Window_Driver::gl_plugin();
Fl_Wayland_Plugin *plugin = (Fl_Wayland_Plugin*)pm.plugin("gl.wayland.fltk.org");
if (plugin) plugin->terminate(); if (plugin) plugin->terminate();
Fl::remove_fd(wl_display_get_fd(Fl_Wayland_Screen_Driver::wl_display)); Fl::remove_fd(wl_display_get_fd(Fl_Wayland_Screen_Driver::wl_display));
@@ -41,12 +41,14 @@
*/ */
typedef struct _cairo_pattern cairo_pattern_t; typedef struct _cairo_pattern cairo_pattern_t;
class Fl_Wayland_Plugin;
class Fl_Wayland_Window_Driver : public Fl_Window_Driver class Fl_Wayland_Window_Driver : public Fl_Window_Driver
{ {
friend class Fl_X; friend class Fl_X;
friend class Fl_Wayland_Gl_Window_Driver; friend class Fl_Wayland_Gl_Window_Driver;
friend class Fl_Wayland_Screen_Driver;
private: private:
struct shape_data_type { struct shape_data_type {
int lw_; ///< width of shape image int lw_; ///< width of shape image
@@ -55,6 +57,7 @@ private:
cairo_pattern_t *mask_pattern_; cairo_pattern_t *mask_pattern_;
} *shape_data_; } *shape_data_;
static bool in_flush; // useful for progressive window drawing static bool in_flush; // useful for progressive window drawing
static Fl_Wayland_Plugin *gl_plugin();
struct wl_cursor *cursor_; struct wl_cursor *cursor_;
void delete_cursor_(); void delete_cursor_();
struct gl_start_support *gl_start_support_; // for support of gl_start/gl_finish struct gl_start_support *gl_start_support_; // for support of gl_start/gl_finish
@@ -98,14 +98,7 @@ Fl_Wayland_Window_Driver::~Fl_Wayland_Window_Driver()
} }
delete_cursor_(); delete_cursor_();
if (gl_start_support_) { // occurs only if gl_start/gl_finish was used if (gl_start_support_) { // occurs only if gl_start/gl_finish was used
static Fl_Wayland_Plugin *plugin = NULL; gl_plugin()->destroy(gl_start_support_);
if (!plugin) {
Fl_Plugin_Manager pm("wayland.fltk.org");
plugin = (Fl_Wayland_Plugin*)pm.plugin("gl.wayland.fltk.org");
}
if (plugin) {
plugin->destroy(gl_start_support_);
}
} }
} }
@@ -388,15 +381,8 @@ void Fl_Wayland_Window_Driver::flush() {
Fl_Wayland_Window_Driver::in_flush = true; Fl_Wayland_Window_Driver::in_flush = true;
Fl_Window_Driver::flush(); Fl_Window_Driver::flush();
Fl_Wayland_Window_Driver::in_flush = false; Fl_Wayland_Window_Driver::in_flush = false;
static Fl_Wayland_Plugin *plugin = NULL; gl_plugin()->do_swap(pWindow); // useful only for GL win with overlay
if (!plugin) { if (scale != fl_graphics_driver->scale() || W != pWindow->w() || H != pWindow->h()) gl_plugin()->invalidate(pWindow);
Fl_Plugin_Manager pm("wayland.fltk.org");
plugin = (Fl_Wayland_Plugin*)pm.plugin("gl.wayland.fltk.org");
}
if (plugin) {
plugin->do_swap(pWindow); // useful only for GL win with overlay
if (scale != fl_graphics_driver->scale() || W != pWindow->w() || H != pWindow->h()) plugin->invalidate(pWindow);
}
return; return;
} }
struct wld_window *window = fl_xid(pWindow); struct wld_window *window = fl_xid(pWindow);
@@ -1531,3 +1517,13 @@ cairo_t *fl_wl_cairo() {
struct wl_display *fl_wl_display() { struct wl_display *fl_wl_display() {
return Fl_Wayland_Screen_Driver::wl_display; return Fl_Wayland_Screen_Driver::wl_display;
} }
Fl_Wayland_Plugin *Fl_Wayland_Window_Driver::gl_plugin() {
static Fl_Wayland_Plugin *plugin = NULL;
if (!plugin) {
Fl_Plugin_Manager pm("wayland.fltk.org");
plugin = (Fl_Wayland_Plugin*)pm.plugin("gl.wayland.fltk.org");
}
return plugin;
}