Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
wrapper.h (17.9K)
1 #ifndef WRAPPER_H
2 #define WRAPPER_H
3
4 // Wayland Server headers
5 #include <wayland-server.h>
6
7 // Wlroots base headers
8 #include <wlr/backend.h>
9 #include <wlr/backend/wayland.h>
10 #include <wlr/backend/x11.h>
11 #include <wlr/backend/session.h>
12 #include <wlr/types/wlr_keyboard.h>
13 #include <wlr/interfaces/wlr_keyboard.h>
14 #include <wlr/render/allocator.h>
15 #include <wlr/render/wlr_renderer.h>
16 #include <wlr/render/pixman.h>
17
18 // Wlroots types
19 // #include <wlr/types/wlr_fixes.h>
20 #include <wlr/types/wlr_compositor.h>
21 #include <wlr/types/wlr_subcompositor.h>
22 #include <wlr/types/wlr_data_device.h>
23 #include <wlr/types/wlr_primary_selection.h>
24 #include <wlr/types/wlr_primary_selection_v1.h>
25 #include <wlr/types/wlr_screencopy_v1.h>
26 #include <wlr/types/wlr_export_dmabuf_v1.h>
27 #include <wlr/types/wlr_xdg_shell.h>
28 #include <wlr/types/wlr_xdg_decoration_v1.h>
29 #include <wlr/types/wlr_xdg_activation_v1.h>
30 #include <wlr/types/wlr_xdg_foreign_registry.h>
31 #include <wlr/types/wlr_xdg_foreign_v2.h>
32 #include <wlr/types/wlr_layer_shell_v1.h>
33 #include <wlr/types/wlr_presentation_time.h>
34 #include <wlr/types/wlr_relative_pointer_v1.h>
35 #include <wlr/types/wlr_pointer_constraints_v1.h>
36 #include <wlr/types/wlr_tablet_tool.h>
37 #include <wlr/types/wlr_tablet_v2.h>
38 #include <wlr/types/wlr_pointer_gestures_v1.h>
39 #include <wlr/types/wlr_idle_inhibit_v1.h>
40 #include <wlr/types/wlr_idle_notify_v1.h>
41 #include <wlr/types/wlr_virtual_pointer_v1.h>
42 #include <wlr/types/wlr_virtual_keyboard_v1.h>
43 #include <wlr/types/wlr_input_method_v2.h>
44 #include <wlr/types/wlr_text_input_v3.h>
45 #include <wlr/types/wlr_ext_foreign_toplevel_list_v1.h>
46 #include <wlr/types/wlr_foreign_toplevel_management_v1.h>
47 #include <wlr/types/wlr_ext_data_control_v1.h>
48 #include <wlr/types/wlr_data_control_v1.h>
49 #include <wlr/types/wlr_output_power_management_v1.h>
50 #include <wlr/types/wlr_gamma_control_v1.h>
51 #include <wlr/types/wlr_output.h>
52 #include <wlr/types/wlr_output_layout.h>
53 #include <wlr/types/wlr_cursor.h>
54 #include <wlr/types/wlr_touch.h>
55 #include <wlr/types/wlr_seat.h>
56 #include <wlr/types/wlr_xcursor_manager.h>
57 #include <wlr/types/wlr_xdg_output_v1.h>
58 #include <wlr/types/wlr_output_management_v1.h>
59 #include <wlr/types/wlr_output_swapchain_manager.h>
60 #include <wlr/types/wlr_fractional_scale_v1.h>
61 #include <wlr/types/wlr_cursor_shape_v1.h>
62 #include <wlr/types/wlr_tearing_control_v1.h>
63 #include <wlr/types/wlr_viewporter.h>
64 #include <wlr/types/wlr_ext_image_copy_capture_v1.h>
65 #include <wlr/types/wlr_ext_image_capture_source_v1.h>
66 #include <wlr/types/wlr_session_lock_v1.h>
67 #include <wlr/types/wlr_security_context_v1.h>
68 #include <wlr/types/wlr_shm.h>
69 #include <wlr/types/wlr_single_pixel_buffer_v1.h>
70 #include <wlr/types/wlr_alpha_modifier_v1.h>
71 #include <wlr/types/wlr_color_management_v1.h>
72 // #include <wlr/types/wlr_color_representation_v1.h>
73 #include <wlr/types/wlr_linux_dmabuf_v1.h>
74 #include <wlr/types/wlr_linux_drm_syncobj_v1.h>
75 #include <scenefx/types/wlr_scene.h>
76 #include <scenefx/render/fx_renderer/fx_renderer.h>
77
78 #include <wlr/util/addon.h>
79 #include <wlr/xwayland.h>
80
81 // Wlroots utils
82 #include <wlr/util/log.h>
83 #include <wlr/util/edges.h>
84 #include <wlr/util/box.h>
85 #include <wlr/util/region.h>
86
87 // System helper libraries
88 #include <xkbcommon/xkbcommon.h>
89 #include <libinput.h>
90 #include <libevdev/libevdev.h>
91 #include <pixman.h>
92
93 // Custom and upstream protocols generated via wayland-scanner
94 #include "river-xkb-bindings-v1-protocol.h"
95 #include "river-layer-shell-v1-protocol.h"
96 #include "river-input-management-v1-protocol.h"
97 #include "river-libinput-config-v1-protocol.h"
98 #include "river-xkb-config-v1-protocol.h"
99 #include "cce-inspector-v1-protocol.h"
100 #include "cce-window-management-v1-protocol.h"
101 #include "virtual-keyboard-unstable-v1-protocol.h"
102 #include <wlr/backend/libinput.h>
103
104 // Custom FFI helpers defined in wlroots_log_wrapper.c
105 struct wlr_surface *river_scene_node_get_surface(struct wlr_scene_node *node);
106 enum wlr_scene_node_type river_scene_node_get_type(struct wlr_scene_node *node);
107 struct wlr_scene_tree *river_scene_node_get_parent(struct wlr_scene_node *node);
108 int river_scene_node_get_x(struct wlr_scene_node *node);
109 int river_scene_node_get_y(struct wlr_scene_node *node);
110 void *river_scene_node_get_data(struct wlr_scene_node *node);
111 void river_scene_node_set_data(struct wlr_scene_node *node, void *data);
112 struct wl_signal *river_scene_node_get_destroy_signal(struct wlr_scene_node *node);
113 void river_scene_tree_save_buffers(struct wlr_scene_tree *tree, struct wlr_scene_tree *saved_tree);
114 void river_scene_tree_clear_children(struct wlr_scene_tree *tree);
115 struct wlr_scene_node *river_scene_node_from_children_link(struct wl_list *link);
116
117 struct wl_signal *river_wlr_output_get_destroy_signal(struct wlr_output *output);
118 struct wl_signal *river_wlr_output_get_request_state_signal(struct wlr_output *output);
119 struct wl_signal *river_wlr_output_get_frame_signal(struct wlr_output *output);
120 struct wl_signal *river_wlr_output_get_present_signal(struct wlr_output *output);
121 void *river_wlr_output_get_data(struct wlr_output *output);
122 void river_wlr_output_set_data(struct wlr_output *output, void *data);
123 const char *river_wlr_output_get_name(struct wlr_output *output);
124 struct wl_signal *river_wlr_session_get_active_signal(struct wlr_session *session);
125 bool river_wlr_session_get_active(struct wlr_session *session);
126 enum wlr_output_adaptive_sync_status river_wlr_output_get_adaptive_sync_status(struct wlr_output *output);
127
128 bool river_wlr_output_get_enabled(struct wlr_output *output);
129 struct wlr_output_mode *river_wlr_output_get_current_mode(struct wlr_output *output);
130 int32_t river_wlr_output_get_width(struct wlr_output *output);
131 int32_t river_wlr_output_get_height(struct wlr_output *output);
132 int32_t river_wlr_output_get_refresh(struct wlr_output *output);
133 // Physical size in mm as the backend read it from EDID (0 when unknown),
134 // and a setter so a configured `size_mm` override reaches every client's
135 // wl_output geometry in place of a lying EDID.
136 void river_wlr_output_get_phys_size(struct wlr_output *output, int32_t *width_mm, int32_t *height_mm);
137 void river_wlr_output_set_phys_size(struct wlr_output *output, int32_t width_mm, int32_t height_mm);
138 struct wl_global *river_wlr_output_get_global(struct wlr_output *output);
139
140 void *river_wlr_surface_get_data(struct wlr_surface *surface);
141 void river_wlr_surface_set_data(struct wlr_surface *surface, void *data);
142 struct wl_signal *river_wlr_surface_get_commit_signal(struct wlr_surface *surface);
143 struct wl_signal *river_wlr_surface_get_destroy_signal(struct wlr_surface *surface);
144 void river_wlr_surface_scale_logical_size(struct wlr_surface *surface, float scale);
145 struct wl_signal *river_wlr_surface_get_map_signal(struct wlr_surface *surface);
146 struct wl_signal *river_wlr_surface_get_unmap_signal(struct wlr_surface *surface);
147 struct wl_resource *river_wlr_surface_get_resource(struct wlr_surface *surface);
148 bool river_wlr_surface_is_mapped(struct wlr_surface *surface);
149
150 enum wlr_input_device_type river_wlr_input_device_get_type(struct wlr_input_device *dev);
151 const char *river_wlr_input_device_get_name(struct wlr_input_device *dev);
152 struct wl_signal *river_wlr_input_device_get_destroy_signal(struct wlr_input_device *dev);
153 void *river_wlr_input_device_get_data(struct wlr_input_device *dev);
154 void river_wlr_input_device_set_data(struct wlr_input_device *dev, void *data);
155
156 struct wl_signal *river_wlr_keyboard_get_key_signal(struct wlr_keyboard *kbd);
157 struct wl_signal *river_wlr_keyboard_get_modifiers_signal(struct wlr_keyboard *kbd);
158 struct wl_signal *river_wlr_keyboard_get_keymap_signal(struct wlr_keyboard *kbd);
159 struct xkb_keymap *river_wlr_keyboard_get_keymap(struct wlr_keyboard *kbd);
160 struct wlr_keyboard_modifiers *river_wlr_keyboard_get_modifiers(struct wlr_keyboard *kbd);
161 void *river_wlr_keyboard_get_data(struct wlr_keyboard *kbd);
162 void river_wlr_keyboard_set_data(struct wlr_keyboard *kbd, void *data);
163
164 double river_wlr_cursor_get_x(struct wlr_cursor *cursor);
165 double river_wlr_cursor_get_y(struct wlr_cursor *cursor);
166 struct wl_signal *river_wlr_cursor_get_motion_signal(struct wlr_cursor *cursor);
167 struct wl_signal *river_wlr_cursor_get_motion_absolute_signal(struct wlr_cursor *cursor);
168 struct wl_signal *river_wlr_cursor_get_button_signal(struct wlr_cursor *cursor);
169 struct wl_signal *river_wlr_cursor_get_axis_signal(struct wlr_cursor *cursor);
170 struct wl_signal *river_wlr_cursor_get_frame_signal(struct wlr_cursor *cursor);
171 struct wl_signal *river_wlr_cursor_get_swipe_begin_signal(struct wlr_cursor *cursor);
172 struct wl_signal *river_wlr_cursor_get_swipe_update_signal(struct wlr_cursor *cursor);
173 struct wl_signal *river_wlr_cursor_get_swipe_end_signal(struct wlr_cursor *cursor);
174 struct wl_signal *river_wlr_cursor_get_pinch_begin_signal(struct wlr_cursor *cursor);
175 struct wl_signal *river_wlr_cursor_get_pinch_update_signal(struct wlr_cursor *cursor);
176 struct wl_signal *river_wlr_cursor_get_pinch_end_signal(struct wlr_cursor *cursor);
177 struct wl_signal *river_wlr_cursor_get_hold_begin_signal(struct wlr_cursor *cursor);
178 struct wl_signal *river_wlr_cursor_get_hold_end_signal(struct wlr_cursor *cursor);
179 struct wl_signal *river_wlr_cursor_get_touch_down_signal(struct wlr_cursor *cursor);
180 struct wl_signal *river_wlr_cursor_get_touch_motion_signal(struct wlr_cursor *cursor);
181 struct wl_signal *river_wlr_cursor_get_touch_up_signal(struct wlr_cursor *cursor);
182 struct wl_signal *river_wlr_cursor_get_touch_cancel_signal(struct wlr_cursor *cursor);
183 struct wl_signal *river_wlr_cursor_get_touch_frame_signal(struct wlr_cursor *cursor);
184 struct wl_signal *river_wlr_cursor_get_tablet_tool_axis_signal(struct wlr_cursor *cursor);
185 struct wl_signal *river_wlr_cursor_get_tablet_tool_proximity_signal(struct wlr_cursor *cursor);
186 struct wl_signal *river_wlr_cursor_get_tablet_tool_tip_signal(struct wlr_cursor *cursor);
187 struct wl_signal *river_wlr_cursor_get_tablet_tool_button_signal(struct wlr_cursor *cursor);
188
189 const char *river_wlr_seat_get_name(struct wlr_seat *seat);
190 void *river_wlr_seat_get_data(struct wlr_seat *seat);
191 void river_wlr_seat_set_data(struct wlr_seat *seat, void *data);
192 struct wl_signal *river_wlr_seat_get_request_set_cursor_signal(struct wlr_seat *seat);
193 struct wl_signal *river_wlr_seat_get_request_set_selection_signal(struct wlr_seat *seat);
194 struct wl_signal *river_wlr_seat_get_request_start_drag_signal(struct wlr_seat *seat);
195 struct wl_signal *river_wlr_seat_get_start_drag_signal(struct wlr_seat *seat);
196 struct wl_signal *river_wlr_seat_get_request_set_primary_selection_signal(struct wlr_seat *seat);
197 struct wlr_seat_client *river_wlr_seat_get_pointer_focused_client(struct wlr_seat *seat);
198 struct wlr_surface *river_wlr_seat_get_pointer_focused_surface(struct wlr_seat *seat);
199 void river_scene_output_damage_whole(struct wlr_scene_output *scene_output);
200 struct wl_client *river_wlr_seat_client_get_client(struct wlr_seat_client *client);
201 struct wlr_keyboard *river_wlr_seat_get_keyboard(struct wlr_seat *seat);
202 struct wl_global *river_wlr_seat_get_global(struct wlr_seat *seat);
203 struct wl_signal *river_wlr_backend_get_new_input_signal(struct wlr_backend *backend);
204
205 const struct wlr_surface_role *river_wlr_surface_get_role(struct wlr_surface *surface);
206 struct wl_resource *river_wlr_surface_get_role_resource(struct wlr_surface *surface);
207 void river_wlr_surface_set_role_object(struct wlr_surface *surface, struct wl_resource *role_resource);
208
209 struct wlr_surface *river_wlr_xdg_surface_get_surface(struct wlr_xdg_surface *xdg_surface);
210 struct wl_signal *river_wlr_xdg_surface_get_ack_configure_signal(struct wlr_xdg_surface *xdg_surface);
211 struct wl_signal *river_wlr_xdg_surface_get_new_popup_signal(struct wlr_xdg_surface *xdg_surface);
212 void river_wlr_xdg_surface_get_geometry(struct wlr_xdg_surface *xdg_surface, struct wlr_box *box);
213 bool river_wlr_xdg_surface_get_initial_commit(struct wlr_xdg_surface *xdg_surface);
214 bool river_wlr_xdg_surface_get_initialized(struct wlr_xdg_surface *xdg_surface);
215
216 struct wlr_xdg_surface *river_wlr_xdg_toplevel_get_base(struct wlr_xdg_toplevel *toplevel);
217 struct wl_signal *river_wlr_xdg_toplevel_get_destroy_signal(struct wlr_xdg_toplevel *toplevel);
218 struct wl_signal *river_wlr_xdg_toplevel_get_request_show_window_menu_signal(struct wlr_xdg_toplevel *toplevel);
219 struct wl_signal *river_wlr_xdg_toplevel_get_request_fullscreen_signal(struct wlr_xdg_toplevel *toplevel);
220 struct wl_signal *river_wlr_xdg_toplevel_get_request_maximize_signal(struct wlr_xdg_toplevel *toplevel);
221 struct wl_signal *river_wlr_xdg_toplevel_get_request_minimize_signal(struct wlr_xdg_toplevel *toplevel);
222 struct wl_signal *river_wlr_xdg_toplevel_get_request_move_signal(struct wlr_xdg_toplevel *toplevel);
223 struct wl_signal *river_wlr_xdg_toplevel_get_request_resize_signal(struct wlr_xdg_toplevel *toplevel);
224 struct wl_signal *river_wlr_xdg_toplevel_get_set_parent_signal(struct wlr_xdg_toplevel *toplevel);
225 struct wl_signal *river_wlr_xdg_toplevel_get_set_title_signal(struct wlr_xdg_toplevel *toplevel);
226 struct wl_signal *river_wlr_xdg_toplevel_get_set_app_id_signal(struct wlr_xdg_toplevel *toplevel);
227
228 const char *river_wlr_xdg_toplevel_get_title(struct wlr_xdg_toplevel *toplevel);
229 const char *river_wlr_xdg_toplevel_get_app_id(struct wlr_xdg_toplevel *toplevel);
230 struct wlr_xdg_toplevel *river_wlr_xdg_toplevel_get_parent(struct wlr_xdg_toplevel *toplevel);
231 bool river_wlr_xdg_toplevel_get_requested_fullscreen(struct wlr_xdg_toplevel *toplevel);
232 struct wlr_output *river_wlr_xdg_toplevel_get_requested_fullscreen_output(struct wlr_xdg_toplevel *toplevel);
233 bool river_wlr_xdg_toplevel_get_requested_maximized(struct wlr_xdg_toplevel *toplevel);
234 void river_wlr_xdg_toplevel_get_requested_min_max_size(struct wlr_xdg_toplevel *toplevel, int *min_w, int *min_h, int *max_w, int *max_h);
235
236 struct wlr_xdg_surface *river_wlr_xdg_popup_get_base(struct wlr_xdg_popup *popup);
237 struct wl_signal *river_wlr_xdg_popup_get_destroy_signal(struct wlr_xdg_popup *popup);
238 struct wl_signal *river_wlr_xdg_popup_get_reposition_signal(struct wlr_xdg_popup *popup);
239 void river_wlr_xdg_popup_get_anchor_rect(struct wlr_xdg_popup *popup, struct wlr_box *box);
240 void *river_wlr_xdg_surface_get_data(struct wlr_xdg_surface *xdg_surface);
241 void river_wlr_xdg_surface_set_data(struct wlr_xdg_surface *xdg_surface, void *data);
242 struct wl_list *river_wlr_xdg_surface_get_popups(struct wlr_xdg_surface *xdg_surface);
243 struct wlr_scene_tree *river_wlr_scene_tree_get_parent(struct wlr_scene_tree *tree);
244 struct wl_list *river_scene_tree_get_children(struct wlr_scene_tree *tree);
245
246 struct wl_signal *river_wlr_tablet_v2_tablet_tool_get_set_cursor_signal(struct wlr_tablet_v2_tablet_tool *tool);
247 struct wlr_surface *river_wlr_tablet_v2_tablet_tool_get_focused_surface(struct wlr_tablet_v2_tablet_tool *tool);
248 uint32_t river_wlr_tablet_v2_tablet_tool_get_proximity_serial(struct wlr_tablet_v2_tablet_tool *tool);
249 bool river_wlr_tablet_v2_tablet_tool_get_is_down(struct wlr_tablet_v2_tablet_tool *tool);
250 size_t river_wlr_tablet_v2_tablet_tool_get_num_buttons(struct wlr_tablet_v2_tablet_tool *tool);
251 struct wlr_tablet_tool *river_wlr_tablet_v2_tablet_tool_get_wlr_tool(struct wlr_tablet_v2_tablet_tool *tool);
252
253 void river_wlr_seat_touch_cancel_all(struct wlr_seat *wlr_seat);
254 struct wlr_surface *river_wlr_seat_get_keyboard_focused_surface(struct wlr_seat *seat);
255
256 int river_wlr_surface_get_width(struct wlr_surface *surface);
257 int river_wlr_surface_get_height(struct wlr_surface *surface);
258 void river_wlr_surface_get_buffer_size(struct wlr_surface *surface, int *width, int *height);
259 uint32_t river_wlr_surface_current_seq(struct wlr_surface *surface);
260 struct wlr_keyboard *river_wlr_input_method_keyboard_grab_v2_get_keyboard(struct wlr_input_method_keyboard_grab_v2 *grab);
261 struct wl_signal *river_wlr_input_method_keyboard_grab_v2_get_destroy_signal(struct wlr_input_method_keyboard_grab_v2 *grab);
262
263 struct wlr_drag_icon *river_wlr_drag_get_icon(struct wlr_drag *drag);
264 struct wlr_seat *river_wlr_drag_get_seat(struct wlr_drag *drag);
265 enum wlr_drag_grab_type river_wlr_drag_get_grab_type(struct wlr_drag *drag);
266 int32_t river_wlr_drag_get_touch_id(struct wlr_drag *drag);
267 struct wlr_data_source *river_wlr_drag_get_source(struct wlr_drag *drag);
268 struct wl_signal *river_wlr_drag_get_destroy_signal(struct wlr_drag *drag);
269 struct wlr_seat_client *river_wlr_drag_get_seat_client(struct wlr_drag *drag);
270
271 void river_wlr_keyboard_init(struct wlr_keyboard *keyboard, void (*led_update)(struct wlr_keyboard *keyboard, uint32_t leds), const char *name);
272
273 void river_scene_node_enable_blur(struct wlr_scene_node *node, bool enabled, bool optimized, bool ignore_transparent, int x, int y, int width, int height, int corner_radius);
274
275 void river_scene_mark_optimized_blur_dirty(struct wlr_scene *scene);
276 void river_scene_set_blur_frozen(struct wlr_scene *scene, bool frozen);
277 void river_scene_tree_set_desk_offset(struct wlr_scene_tree *tree, bool on);
278 void river_scene_set_desk_subpixel(struct wlr_scene *scene, double sub_x, double sub_y);
279
280 void river_scene_node_set_opacity(struct wlr_scene_node *node, float opacity);
281
282 void river_scene_node_set_corner_radius(struct wlr_scene_node *node, int radius);
283
284 void river_scene_buffer_set_dest_size_if_changed(struct wlr_scene_buffer *scene_buffer, int width, int height);
285 int river_scene_buffer_get_width(struct wlr_scene_buffer *scene_buffer);
286 int river_scene_buffer_get_height(struct wlr_scene_buffer *scene_buffer);
287 void river_scene_buffer_set_scaled_opaque_region(struct wlr_scene_buffer *scene_buffer, struct wlr_surface *surface, double scale);
288 bool river_scene_buffer_get_surface_clip(struct wlr_scene_buffer *scene_buffer, struct wlr_box *out);
289 int river_scene_buffer_get_dest_width(struct wlr_scene_buffer *scene_buffer);
290 int river_scene_buffer_get_dest_height(struct wlr_scene_buffer *scene_buffer);
291 bool river_scene_node_get_enabled(struct wlr_scene_node *node);
292
293 void river_scene_node_set_position_if_changed(struct wlr_scene_node *node, int x, int y);
294
295 void river_scene_rect_set_size_if_changed(struct wlr_scene_rect *rect, int width, int height);
296
297 void river_scene_rect_set_corner_radius(struct wlr_scene_rect *rect, int radius);
298
299 #endif // WRAPPER_H
300 void river_scene_ovdbg_dump(struct wlr_scene_node *node, const char *tag);
301 void river_scene_shadow_dbg(struct wlr_scene_shadow *shadow, const char *tag);
302 struct wlr_buffer *river_data_buffer_create(int width, int height, size_t stride, const void *data);