1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
//
// 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 <wayland-client.h>
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_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_set(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
void set_spot(int font, int height, int x, int y, int w, int h, Fl_Window *win);
void reset_spot();
};
#endif // FL_WAYLAND_SCREEN_DRIVER_H
|