summaryrefslogtreecommitdiff
path: root/src/drivers/Wayland/fl_wayland_platform_init.cxx
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-03-15 06:42:06 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-08-29 12:15:32 +0200
commitc720aae51515907ae82ee02df80bd084f291d4b1 (patch)
tree7fbf3569f35966891df68490b047b30c9ec20bcd /src/drivers/Wayland/fl_wayland_platform_init.cxx
parent28981f6fd3971aaf7ff6527ee1cdeb9d886c4a4a (diff)
Make hybrid Wayland/X11 platform.
Diffstat (limited to 'src/drivers/Wayland/fl_wayland_platform_init.cxx')
-rw-r--r--src/drivers/Wayland/fl_wayland_platform_init.cxx88
1 files changed, 75 insertions, 13 deletions
diff --git a/src/drivers/Wayland/fl_wayland_platform_init.cxx b/src/drivers/Wayland/fl_wayland_platform_init.cxx
index 4500a0f45..8c81ab331 100644
--- a/src/drivers/Wayland/fl_wayland_platform_init.cxx
+++ b/src/drivers/Wayland/fl_wayland_platform_init.cxx
@@ -22,10 +22,61 @@
#include "Fl_Wayland_Window_Driver.H"
#include "Fl_Wayland_Image_Surface_Driver.H"
+#include "../Xlib/Fl_Xlib_Copy_Surface_Driver.H"
+#include <cairo-xlib.h>
+#include "../Cairo/Fl_Display_Cairo_Graphics_Driver.H"
+#include "../X11/Fl_X11_Screen_Driver.H"
+#include "../X11/Fl_X11_System_Driver.H"
+#include "../X11/Fl_X11_Window_Driver.H"
+#include "../Xlib/Fl_Xlib_Image_Surface_Driver.H"
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+void fl_disable_wayland() {
+ if (Fl_Wayland_Screen_Driver::wl_display) {
+ wl_display_disconnect(Fl_Wayland_Screen_Driver::wl_display);
+ Fl_Wayland_Screen_Driver::wl_display = NULL;
+ delete Fl_Screen_Driver::system_driver;
+ Fl_Screen_Driver::system_driver = NULL;
+ }
+ Fl_Wayland_Screen_Driver::wld_disabled = true;
+ Fl::system_driver();
+}
+
-Fl_Copy_Surface_Driver *Fl_Copy_Surface_Driver::newCopySurfaceDriver(int w, int h)
+Fl_System_Driver *Fl_System_Driver::newSystemDriver()
{
- return new Fl_Wayland_Copy_Surface_Driver(w, h);
+ const char *backend = ::getenv("FLTK_BACKEND");
+ // fprintf(stderr, "FLTK_BACKEND='%s' XDG_RUNTIME_DIR='%s'\n",backend ? backend : "", xdg ? xdg : "");
+ if (backend && strcmp(backend, "wayland") == 0) {
+ Fl_Wayland_Screen_Driver::wl_display = wl_display_connect(NULL);
+ if (!Fl_Wayland_Screen_Driver::wl_display) {
+ fprintf(stderr, "Error: no Wayland connection available, FLTK_BACKEND = '%s'\n", backend);
+ exit(1);
+ }
+ return new Fl_Wayland_System_Driver();
+ }
+ else if (backend && strcmp(backend, "x11") == 0) {
+ return new Fl_X11_System_Driver();
+ }
+ else if (!backend) {
+ if (!Fl_Wayland_Screen_Driver::wld_disabled && ::getenv("XDG_RUNTIME_DIR")) {
+ // env var XDG_RUNTIME_DIR is necessary for wayland
+ // 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 new Fl_X11_System_Driver();
+ }
+ fprintf(stderr, "Error: unexpected value of FLTK_BACKEND: '%s'\n", backend);
+ exit(1);
+ return NULL;
}
@@ -52,32 +103,43 @@ static Fl_Fontdesc built_in_table[] = { // Pango font names
FL_EXPORT Fl_Fontdesc *fl_fonts = built_in_table;
-Fl_Graphics_Driver *Fl_Graphics_Driver::newMainGraphicsDriver()
-{
- fl_graphics_driver = new Fl_Wayland_Graphics_Driver();
+Fl_Graphics_Driver *Fl_Graphics_Driver::newMainGraphicsDriver() {
+ if (Fl_Wayland_Screen_Driver::wl_display) {
+ fl_graphics_driver = new Fl_Wayland_Graphics_Driver();
+puts("using Fl_Wayland_Graphics_Driver");
+ } else {
+ fl_graphics_driver = new Fl_Display_Cairo_Graphics_Driver();
+puts("using Fl_Display_Cairo_Graphics_Driver");
+ }
return fl_graphics_driver;
}
-Fl_Screen_Driver *Fl_Screen_Driver::newScreenDriver()
-{
- return new Fl_Wayland_Screen_Driver();
+Fl_Copy_Surface_Driver *Fl_Copy_Surface_Driver::newCopySurfaceDriver(int w, int h) {
+ 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);
}
-Fl_System_Driver *Fl_System_Driver::newSystemDriver()
-{
- return new Fl_Wayland_System_Driver();
+Fl_Screen_Driver *Fl_Screen_Driver::newScreenDriver() {
+ if (Fl_Wayland_Screen_Driver::wl_display) return new Fl_Wayland_Screen_Driver();
+
+ Fl_X11_Screen_Driver *d = new Fl_X11_Screen_Driver();
+ for (int i = 0; i < MAX_SCREENS; i++) d->screens[i].scale = 1;
+ d->current_xft_dpi = 0.; // means the value of the Xft.dpi resource is still unknown
+ return d;
}
Fl_Window_Driver *Fl_Window_Driver::newWindowDriver(Fl_Window *w)
{
- return new Fl_Wayland_Window_Driver(w);
+ if (Fl_Wayland_Screen_Driver::wl_display) return new Fl_Wayland_Window_Driver(w);
+ return new Fl_X11_Window_Driver(w);
}
Fl_Image_Surface_Driver *Fl_Image_Surface_Driver::newImageSurfaceDriver(int w, int h, int high_res, Fl_Offscreen off)
{
- return new Fl_Wayland_Image_Surface_Driver(w, h, high_res, off);
+ 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);
}