diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-03-15 06:42:06 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-08-29 12:15:32 +0200 |
| commit | c720aae51515907ae82ee02df80bd084f291d4b1 (patch) | |
| tree | 7fbf3569f35966891df68490b047b30c9ec20bcd /src/drivers/Wayland/fl_wayland_platform_init.cxx | |
| parent | 28981f6fd3971aaf7ff6527ee1cdeb9d886c4a4a (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.cxx | 88 |
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); } |
