summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-10-08 17:59:06 +0200
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-11-05 19:47:37 +0100
commit4b945a3086011b6a59b5aef434cdbe8cda96c2de (patch)
tree333de7fbb01ae280eb95728ad26ff1f366963054 /src/drivers
parentb426a3d7c07c9ffd53141ebd03dcd5e82ff4e52a (diff)
Wayland/X11 hybrid: use "bool fl_disable_wayland;" declaration.
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Screen_Driver.H3
-rw-r--r--src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx23
-rw-r--r--src/drivers/Wayland/Fl_Wayland_System_Driver.H2
-rw-r--r--src/drivers/Wayland/Fl_Wayland_System_Driver.cxx16
-rw-r--r--src/drivers/Wayland/fl_wayland_platform_init.cxx124
5 files changed, 62 insertions, 106 deletions
diff --git a/src/drivers/Wayland/Fl_Wayland_Screen_Driver.H b/src/drivers/Wayland/Fl_Wayland_Screen_Driver.H
index f08f9cd86..aebc651ff 100644
--- a/src/drivers/Wayland/Fl_Wayland_Screen_Driver.H
+++ b/src/drivers/Wayland/Fl_Wayland_Screen_Driver.H
@@ -176,9 +176,6 @@ public:
static compositor_name compositor; // identifies the used Wayland compositor
void set_spot(int font, int height, int x, int y, int w, int h, Fl_Window *win);
void reset_spot();
-#if FLTK_USE_X11
- static bool undo_wayland_backend_if_needed(const char *backend = NULL);
-#endif
};
diff --git a/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx
index 0f76454a8..0ea7bad37 100644
--- a/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_Screen_Driver.cxx
@@ -140,6 +140,7 @@ struct pointer_output {
Fl_Wayland_Screen_Driver::compositor_name Fl_Wayland_Screen_Driver::compositor = Fl_Wayland_Screen_Driver::unspecified;
+
extern "C" {
bool fl_libdecor_using_weston(void) {
return Fl_Wayland_Screen_Driver::compositor == Fl_Wayland_Screen_Driver::WESTON;
@@ -1093,33 +1094,12 @@ Fl_Wayland_Screen_Driver::Fl_Wayland_Screen_Driver() : Fl_Screen_Driver() {
}
-#if FLTK_USE_X11
-bool Fl_Wayland_Screen_Driver::undo_wayland_backend_if_needed(const char *backend) {
- if (!backend) backend = getenv("FLTK_BACKEND");
- if (wl_display && backend && strcmp(backend, "x11") == 0) {
- wl_display_disconnect(wl_display);
- wl_display = NULL;
- if (Fl_Screen_Driver::system_driver) delete Fl_Screen_Driver::system_driver;
- Fl_Screen_Driver::system_driver = new Fl_X11_System_Driver();
- return true;
- }
- return false;
-}
-#endif
-
-
void Fl_Wayland_Screen_Driver::open_display_platform() {
static bool beenHereDoneThat = false;
if (beenHereDoneThat)
return;
beenHereDoneThat = true;
-#if FLTK_USE_X11
- if (undo_wayland_backend_if_needed()) {
- Fl::screen_driver()->open_display();
- return;
- }
-#endif
if (!wl_display) {
wl_display = wl_display_connect(NULL);
@@ -1143,7 +1123,6 @@ puts("Using Wayland backend");
}*/
Fl::add_fd(wl_display_get_fd(wl_display), FL_READ, (Fl_FD_Handler)fd_callback, wl_display);
fl_create_print_window();
- Fl_Wayland_System_Driver::too_late_to_disable = true;
}
void Fl_Wayland_Screen_Driver::close_display() {
diff --git a/src/drivers/Wayland/Fl_Wayland_System_Driver.H b/src/drivers/Wayland/Fl_Wayland_System_Driver.H
index d363aa1d0..e5203581e 100644
--- a/src/drivers/Wayland/Fl_Wayland_System_Driver.H
+++ b/src/drivers/Wayland/Fl_Wayland_System_Driver.H
@@ -26,8 +26,6 @@ public:
int event_key(int k);
int get_key(int k);
virtual void *control_maximize_button(void *data);
- virtual void disable_wayland();
- static bool too_late_to_disable;
};
#endif /* FL_WAYLAND_SYSTEM_DRIVER_H */
diff --git a/src/drivers/Wayland/Fl_Wayland_System_Driver.cxx b/src/drivers/Wayland/Fl_Wayland_System_Driver.cxx
index 219d68926..d1d5e7dad 100644
--- a/src/drivers/Wayland/Fl_Wayland_System_Driver.cxx
+++ b/src/drivers/Wayland/Fl_Wayland_System_Driver.cxx
@@ -24,9 +24,6 @@
#include <stdlib.h>
-bool Fl_Wayland_System_Driver::too_late_to_disable = false;
-
-
int Fl_Wayland_System_Driver::event_key(int k) {
if (k > FL_Button && k <= FL_Button+8)
return Fl::event_state(8<<(k-FL_Button));
@@ -92,16 +89,3 @@ void *Fl_Wayland_System_Driver::control_maximize_button(void *data) {
return NULL;
}
}
-
-
-void Fl_Wayland_System_Driver::disable_wayland() {
-#if FLTK_USE_X11
- if (too_late_to_disable) {
- fprintf(stderr, "Error: fl_disable_wayland() cannot be called "
- "after the Wayland display was opened\n"
- "or a Wayland window was created or the Wayland screen was accessed\n");
- exit(1);
- }
- Fl_Wayland_Screen_Driver::undo_wayland_backend_if_needed("x11");
-#endif
-}
diff --git a/src/drivers/Wayland/fl_wayland_platform_init.cxx b/src/drivers/Wayland/fl_wayland_platform_init.cxx
index e962de92b..88b863b20 100644
--- a/src/drivers/Wayland/fl_wayland_platform_init.cxx
+++ b/src/drivers/Wayland/fl_wayland_platform_init.cxx
@@ -35,15 +35,49 @@
#include <stdio.h>
-Fl_System_Driver *Fl_System_Driver::newSystemDriver() {
+static Fl_Fontdesc built_in_table[] = { // Pango font names
+ {"Sans"},
+ {"Sans Bold"},
+ {"Sans Italic"},
+ {"Sans Bold Italic"},
+ {"Monospace"},
+ {"Monospace Bold"},
+ {"Monospace Italic"},
+ {"Monospace Bold Italic"},
+ {"Serif"},
+ {"Serif Bold"},
+ {"Serif Italic"},
+ {"Serif Bold Italic"},
+ {"Standard Symbols PS"}, // FL_SYMBOL
+ {"Monospace"}, // FL_SCREEN
+ {"Monospace Bold"}, // FL_SCREEN_BOLD
+ {"D050000L"}, // FL_ZAPF_DINGBATS
+};
+
+
+FL_EXPORT Fl_Fontdesc *fl_fonts = built_in_table;
+
+
#if FLTK_USE_X11
- const char *backend = ::getenv("FLTK_BACKEND");
- const char *xdgrt = ::getenv("XDG_RUNTIME_DIR");
- // fprintf(stderr, "FLTK_BACKEND='%s' XDG_RUNTIME_DIR='%s'\n",
- // backend ? backend : "", xdgrt ? xdgrt : "");
+static bool attempt_wayland() {
+ if (Fl_Wayland_Screen_Driver::wl_display) return true;
+ static bool first = true;
+ static bool disable_wl = false;
+ if (first) { // get the value if it exists and cache it
+ void *sym = Fl_Posix_System_Driver::dlopen_or_dlsym(NULL, "fl_disable_wayland");
+ if (sym) {
+ disable_wl = *(bool *)sym;
+ // printf("fl_disable_wayland = %s\n", disable_wl ? "true" : "false");
+ }
+ first = false;
+ }
+ if (disable_wl)
+ return false;
+ const char *backend = ::getenv("FLTK_BACKEND");
+ // fprintf(stderr, "FLTK_BACKEND='%s'\n", backend ? backend : "");
if (backend && strcmp(backend, "x11") == 0) {
- return new Fl_X11_System_Driver();
+ return false;
}
if (backend && strcmp(backend, "wayland") == 0) {
@@ -52,87 +86,61 @@ Fl_System_Driver *Fl_System_Driver::newSystemDriver() {
fprintf(stderr, "Error: no Wayland connection available, FLTK_BACKEND = '%s'\n", backend);
exit(1);
}
- return new Fl_Wayland_System_Driver();
+ return true;
}
if (!backend) {
// env var XDG_RUNTIME_DIR is required for Wayland
+ const char *xdgrt = ::getenv("XDG_RUNTIME_DIR");
if (xdgrt) {
// is a Wayland connection available ?
Fl_Wayland_Screen_Driver::wl_display = wl_display_connect(NULL);
if (Fl_Wayland_Screen_Driver::wl_display) { // Yes, use Wayland drivers
// puts("using wayland");
- return new Fl_Wayland_System_Driver();
+ return true;
}
}
// no Wayland connection or environment variable XDG_RUNTIME_DIR not set,
// falling back to X11
- return new Fl_X11_System_Driver();
+ return false;
}
fprintf(stderr, "Error: unexpected value of FLTK_BACKEND: '%s'\n", backend);
exit(1);
- return NULL;
-#else
- return new Fl_Wayland_System_Driver();
-#endif
+ return false;
}
-
-static Fl_Fontdesc built_in_table[] = { // Pango font names
- {"Sans"},
- {"Sans Bold"},
- {"Sans Italic"},
- {"Sans Bold Italic"},
- {"Monospace"},
- {"Monospace Bold"},
- {"Monospace Italic"},
- {"Monospace Bold Italic"},
- {"Serif"},
- {"Serif Bold"},
- {"Serif Italic"},
- {"Serif Bold Italic"},
- {"Standard Symbols PS"}, // FL_SYMBOL
- {"Monospace"}, // FL_SCREEN
- {"Monospace Bold"}, // FL_SCREEN_BOLD
- {"D050000L"}, // FL_ZAPF_DINGBATS
-};
+#endif // FLTK_USE_X11
-FL_EXPORT Fl_Fontdesc *fl_fonts = built_in_table;
+Fl_System_Driver *Fl_System_Driver::newSystemDriver() {
+#if FLTK_USE_X11
+ if (!attempt_wayland()) return new Fl_X11_System_Driver();
+#endif
+ return new Fl_Wayland_System_Driver();
+}
Fl_Graphics_Driver *Fl_Graphics_Driver::newMainGraphicsDriver() {
#if FLTK_USE_X11
- Fl_Wayland_Screen_Driver::undo_wayland_backend_if_needed();
- if (Fl_Wayland_Screen_Driver::wl_display) {
- fl_graphics_driver = new Fl_Wayland_Graphics_Driver();
- } else {
- fl_graphics_driver = new Fl_Display_Cairo_Graphics_Driver();
- }
- return fl_graphics_driver;
-#else
- return new Fl_Wayland_Graphics_Driver();
+ if (!attempt_wayland()) return new Fl_Display_Cairo_Graphics_Driver();
#endif
+ return new Fl_Wayland_Graphics_Driver();
}
Fl_Copy_Surface_Driver *Fl_Copy_Surface_Driver::newCopySurfaceDriver(int w, int h) {
#if FLTK_USE_X11
- if (Fl_Wayland_Screen_Driver::wl_display) return new Fl_Wayland_Copy_Surface_Driver(w, h);
- return new Fl_Xlib_Copy_Surface_Driver(w, h);
-#else
- return new Fl_Wayland_Copy_Surface_Driver(w, h);
+ if (!Fl_Wayland_Screen_Driver::wl_display) return new Fl_Xlib_Copy_Surface_Driver(w, h);
#endif
+ return new Fl_Wayland_Copy_Surface_Driver(w, h);
}
Fl_Screen_Driver *Fl_Screen_Driver::newScreenDriver() {
#if FLTK_USE_X11
if (!Fl_Screen_Driver::system_driver) Fl::system_driver();
- Fl_Wayland_Screen_Driver::undo_wayland_backend_if_needed();
if (Fl_Wayland_Screen_Driver::wl_display) {
- Fl_Wayland_System_Driver::too_late_to_disable = true;
return new Fl_Wayland_Screen_Driver();
}
@@ -149,27 +157,17 @@ Fl_Screen_Driver *Fl_Screen_Driver::newScreenDriver() {
Fl_Window_Driver *Fl_Window_Driver::newWindowDriver(Fl_Window *w)
{
#if FLTK_USE_X11
- if (!Fl_Screen_Driver::system_driver) Fl::system_driver();
- static bool been_here = false;
- if (!been_here) {
- been_here = true;
- Fl_Wayland_System_Driver::too_late_to_disable = true;
- Fl_Wayland_Screen_Driver::undo_wayland_backend_if_needed();
- }
- if (Fl_Wayland_Screen_Driver::wl_display) return new Fl_Wayland_Window_Driver(w);
- return new Fl_X11_Window_Driver(w);
-#else
- return new Fl_Wayland_Window_Driver(w);
+ if (!attempt_wayland()) return new Fl_X11_Window_Driver(w);
#endif
+ return new Fl_Wayland_Window_Driver(w);
}
Fl_Image_Surface_Driver *Fl_Image_Surface_Driver::newImageSurfaceDriver(int w, int h, int high_res, Fl_Offscreen off)
{
#if FLTK_USE_X11
- if (Fl_Wayland_Screen_Driver::wl_display) return new Fl_Wayland_Image_Surface_Driver(w, h, high_res, off);
- return new Fl_Xlib_Image_Surface_Driver(w, h, high_res, off);
-#else
- return new Fl_Wayland_Image_Surface_Driver(w, h, high_res, off);
+ if (!Fl_Wayland_Screen_Driver::wl_display)
+ return new Fl_Xlib_Image_Surface_Driver(w, h, high_res, off);
#endif
+ return new Fl_Wayland_Image_Surface_Driver(w, h, high_res, off);
}