// // Definition of X11 Screen interface // for the Fast Light Tool Kit (FLTK). // // Copyright 2010-2022 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this // file is missing or damaged, see the license at: // // https://www.fltk.org/COPYING.php // // Please see the following page on how to report bugs and issues: // // https://www.fltk.org/bugs.php // /** \file Fl_Wayland_Screen_Driver.H \brief Definition of Wayland Screen interface */ #ifndef FL_WAYLAND_SCREEN_DRIVER_H #define FL_WAYLAND_SCREEN_DRIVER_H #include "../../Fl_Screen_Driver.H" #include class Fl_Window; struct seat { struct wl_seat *wl_seat; struct wl_pointer *wl_pointer; struct wl_keyboard *wl_keyboard; uint32_t keyboard_enter_serial; struct wl_surface *keyboard_surface; struct wl_list link; struct wl_list pointer_outputs; struct wl_cursor_theme *cursor_theme; struct wl_cursor *default_cursor; struct wl_surface *cursor_surface; struct wl_surface *pointer_focus; int pointer_scale; uint32_t serial; struct wl_data_device_manager *data_device_manager; struct wl_data_device *data_device; struct wl_data_source *data_source; struct xkb_state *xkb_state; struct xkb_context *xkb_context; struct xkb_keymap *xkb_keymap; struct xkb_compose_state *xkb_compose_state; char *name; struct zwp_text_input_v3 *text_input; }; class FL_EXPORT Fl_Wayland_Screen_Driver : public Fl_Screen_Driver { friend class Fl_Screen_Driver; friend class Fl_Wayland_Graphics_Driver; static int insertion_point_x; static int insertion_point_y; static int insertion_point_width; static int insertion_point_height; static bool insertion_point_location_is_valid; public: static struct wl_display *wl_display; static void insertion_point_location(int x, int y, int height); static bool insertion_point_location(int *px, int *py, int *pwidth, int *pheight); int get_mouse_unscaled(int &xx, int &yy); void screen_count(int count) {num_screens = count;} void reset_cursor(); struct wl_cursor *xc_arrow; struct wl_cursor *xc_ns; struct wl_cursor *xc_wait; struct wl_cursor *xc_insert; struct wl_cursor *xc_hand; struct wl_cursor *xc_help; struct wl_cursor *xc_cross; struct wl_cursor *xc_move; struct wl_cursor *xc_north; struct wl_cursor *xc_south; struct wl_cursor *xc_west; struct wl_cursor *xc_east; struct wl_cursor *xc_we; struct wl_cursor *xc_nesw; struct wl_cursor *xc_nwse; struct wl_cursor *xc_sw; struct wl_cursor *xc_se; struct wl_cursor *xc_ne; struct wl_cursor *xc_nw; static const struct wl_data_device_listener *p_data_device_listener; public: struct wl_compositor *wl_compositor; struct wl_subcompositor *wl_subcompositor; struct wl_shm *wl_shm; struct wl_list seats; struct seat *seat; struct wl_list outputs; // linked list of all screens in system struct output { // one record for each screen uint32_t id; short x_org; short y_org; short width; // in pixels short height; // in pixels float dpi; struct wl_output *wl_output; int wld_scale; // Wayland scale factor float gui_scale; // FLTK scale factor struct wl_list link; }; struct libdecor *libdecor_context; struct xdg_wm_base *xdg_wm_base; struct zwp_text_input_manager_v3 *text_input_base; Fl_Wayland_Screen_Driver(); virtual APP_SCALING_CAPABILITY rescalable() { return PER_SCREEN_APP_SCALING; } virtual float scale(int n); virtual void scale(int n, float f); int screen_num_unscaled(int x, int y); void copy_image(const unsigned char* data, int W, int H); // --- screen configuration void init_workarea(); virtual void init(); virtual int x(); virtual int y(); virtual int w(); virtual int h(); virtual void screen_xywh(int &X, int &Y, int &W, int &H, int n); virtual void screen_dpi(float &h, float &v, int n=0); virtual void screen_work_area(int &X, int &Y, int &W, int &H, int n); // --- audible output virtual void beep(int type); // --- global events virtual void flush(); virtual void grab(Fl_Window* win); // --- global colors virtual void get_system_colors(); virtual const char *get_system_scheme(); virtual int dnd(int unused); virtual int compose(int &del); virtual void compose_reset(); virtual Fl_RGB_Image *read_win_rectangle(int X, int Y, int w, int h, Fl_Window *win, bool may_capture_subwins, bool *did_capture_subwins); virtual int get_mouse(int &x, int &y); virtual void open_display_platform(); virtual void close_display(); // --- compute dimensions of an Fl_Offscreen virtual void offscreen_size(Fl_Offscreen o, int &width, int &height); virtual int has_marked_text() const; static int next_marked_length; // next length of marked text after current marked text will have been replaced // --- clipboard operations // this one is in fl_wayland_clipboard_dnd.cxx virtual void copy(const char *stuff, int len, int clipboard, const char *type); // this one is in fl_wayland_clipboard_dnd.cxx virtual void paste(Fl_Widget &receiver, int clipboard, const char *type); // this one is in fl_wayland_clipboard_dnd.cxx virtual int clipboard_contains(const char *type); // --- Wayland-special void set_cursor(); struct wl_cursor *default_cursor(); void default_cursor(struct wl_cursor *cursor); struct wl_cursor *cache_cursor(const char *cursor_name); static Fl_Window *surface_to_window(struct wl_surface *); uint32_t get_serial(); struct wl_seat *get_wl_seat(); char *get_seat_name(); struct xkb_keymap *get_xkb_keymap(); static bool own_output(struct wl_output *output); typedef enum {unspecified, MUTTER, WESTON, KDE} compositor_name; static compositor_name compositor; // identifies the used Wayland compositor }; #endif // FL_WAYLAND_SCREEN_DRIVER_H