labwc/include/labwc.h

461 lines
14 KiB
C
Raw Normal View History

2021-11-26 19:27:50 +00:00
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef LABWC_H
#define LABWC_H
2020-12-30 10:29:21 +00:00
#include "config.h"
2019-11-19 21:00:26 +00:00
#include <getopt.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
2019-11-19 21:00:26 +00:00
#include <time.h>
#include <unistd.h>
#include <wayland-server-core.h>
#include <wlr/backend.h>
#include <wlr/render/allocator.h>
2019-11-19 21:00:26 +00:00
#include <wlr/render/wlr_renderer.h>
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_buffer.h>
#include <wlr/types/wlr_cursor.h>
2019-11-19 21:00:26 +00:00
#include <wlr/types/wlr_data_device.h>
#include <wlr/types/wlr_foreign_toplevel_management_v1.h>
2019-11-19 21:00:26 +00:00
#include <wlr/types/wlr_input_device.h>
#include <wlr/types/wlr_keyboard.h>
#include <wlr/types/wlr_keyboard_group.h>
#include <wlr/types/wlr_layer_shell_v1.h>
2019-11-19 21:00:26 +00:00
#include <wlr/types/wlr_matrix.h>
#include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_management_v1.h>
2022-03-06 04:46:11 +00:00
#include <wlr/types/wlr_output_power_management_v1.h>
2019-11-19 21:00:26 +00:00
#include <wlr/types/wlr_output_layout.h>
#include <wlr/types/wlr_scene.h>
2021-10-17 16:54:35 -04:00
#include <wlr/types/wlr_relative_pointer_v1.h>
2019-11-19 21:00:26 +00:00
#include <wlr/types/wlr_pointer.h>
2021-10-17 16:54:35 -04:00
#include <wlr/types/wlr_pointer_constraints_v1.h>
#include <wlr/types/wlr_pointer_gestures_v1.h>
2019-11-19 21:00:26 +00:00
#include <wlr/types/wlr_seat.h>
#include <wlr/types/wlr_subcompositor.h>
#include <wlr/types/wlr_xcursor_manager.h>
Add xdg-activation protocol This PR allows applications to activate themselves *if they provide a valid xdg_activation token* (e.g. raise to the top and get keyboard focus). These tokens are given out by the xdg_activation protocol implemented by wlroots and can be configured by the client requesting the token in three ways: - an "empty" token (apparently used to tell the compositor about "urgency") - seat / input serial attached - surface attached Wlroots makes sure that - If the client attached the seat / input serial: those two are valid. - If the client attached a surface: that it has keyboard focus at the point where the request is finalized. There is a patch [1] pending for backport to wlroots 0.16 that also allows valid tokens when the supplied surface had cursor focus. - a token is only valid for 30 seconds after being given out The token can then be used by the client or given to other clients by unspecified means (e.g. via environment variable or dbus) which then may use the token on their own surface and request activation. We only handle the actual request activation part: - If the seat is set on the token we know wlroots validated seat and input serial - Thus, if no seat is set we deny the activation request so we don't have windows suddenly popping up and taking over the keyboard focus (focus stealing prevention) - We should also check for the surface being set but we can't do that with wlroots 0.16 as it will reset the surface to `NULL` when it is destroyed (which is something that usually happens for notifications). Once we move to wlroots 0.17.x we can add the missing surface check because it provides a `new_token` signal. We can use it to attach further details to the token which are then verified later when we decide if we allow the activate request or not. With this PR in place the following setup should activate windows: - launching an URL in foot should activate the target application if it is already running, foot requests a proper token and then sets it as `XDG_ACTIVATION_TOKEN` environment var before spawning `xdg-open` - clicking on a `mako` notification with a `default` action defined should request a proper token which is then given to the application starting the notification and can thus be used to activate itself This protocol is still very much in the process of being implemented / finalized all over the place (e.g. GTK / QT / Firefox / notification daemons, ..) but we should do our part and remove labwc from the puzzle of potential issues causing this not to work. [1] https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/f6008ffff41f67e3c20bd8b3be8f216da6a4bb30)
2023-02-04 10:07:46 +01:00
#include <wlr/types/wlr_xdg_activation_v1.h>
#include <wlr/types/wlr_xdg_shell.h>
#include <wlr/types/wlr_drm_lease_v1.h>
#include <wlr/types/wlr_virtual_pointer_v1.h>
#include <wlr/types/wlr_virtual_keyboard_v1.h>
2019-11-19 21:00:26 +00:00
#include <wlr/util/log.h>
#include <xkbcommon/xkbcommon.h>
#include "cursor.h"
2020-08-03 20:56:38 +01:00
#include "config/keybind.h"
#include "config/rcxml.h"
#include "regions.h"
2023-03-30 22:19:05 +01:00
#include "session-lock.h"
#if HAVE_NLS
#include <libintl.h>
#include <locale.h>
#define _ gettext
#else
#define _(s) (s)
#endif
2020-06-18 20:18:01 +01:00
2019-11-19 21:00:26 +00:00
#define XCURSOR_DEFAULT "left_ptr"
#define XCURSOR_SIZE 24
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
2020-10-21 20:30:06 +01:00
enum input_mode {
LAB_INPUT_STATE_PASSTHROUGH = 0,
LAB_INPUT_STATE_MOVE,
LAB_INPUT_STATE_RESIZE,
2020-10-19 22:14:17 +01:00
LAB_INPUT_STATE_MENU,
2019-11-19 21:00:26 +00:00
};
struct input {
struct wlr_input_device *wlr_input_device;
struct seat *seat;
struct wl_listener destroy;
2023-10-02 19:47:59 +01:00
struct wl_list link; /* seat.inputs */
};
/*
* Virtual keyboards should not belong to seat->keyboard_group. As a result we
* need to be able to ascertain which wlr_keyboard key/modifer events come from
* and we achieve that by using `struct keyboard` which inherits `struct input`
* and adds keybord specific listeners and a wlr_keyboard pointer.
*/
struct keyboard {
struct input base;
struct wlr_keyboard *wlr_keyboard;
bool is_virtual;
struct wl_listener modifier;
struct wl_listener key;
/* key repeat for compositor keybinds */
uint32_t keybind_repeat_keycode;
int32_t keybind_repeat_rate;
struct wl_event_source *keybind_repeat;
};
struct seat {
struct wlr_seat *seat;
struct server *server;
struct wlr_keyboard_group *keyboard_group;
struct wl_list touch_points; /* struct touch_point.link */
/*
* Enum of most recent server-side cursor image. Set by
* cursor_set(). Cleared when a client surface is entered
* (in that case the client is expected to set its own cursor image).
*/
enum lab_cursors server_cursor;
struct wlr_cursor *cursor;
struct wlr_xcursor_manager *xcursor_manager;
struct {
double x, y;
} smooth_scroll_offset;
2021-10-17 16:54:35 -04:00
struct wlr_pointer_constraint_v1 *current_constraint;
/* In support for ToggleKeybinds */
2023-03-05 10:35:56 +01:00
uint32_t nr_inhibited_keybind_views;
2022-06-15 01:07:45 +02:00
/* Used to hide the workspace OSD after switching workspaces */
struct wl_event_source *workspace_osd_timer;
bool workspace_osd_shown_by_modifier;
/* if set, views cannot receive focus */
struct wlr_layer_surface_v1 *focused_layer;
/**
* pressed view/surface/node will usually be NULL and is only set on
* button press while the mouse is over a view or surface, and reset
* to NULL on button release.
* It is used to send cursor motion events to a surface even though
* the cursor has left the surface in the meantime.
*
* This allows to keep dragging a scrollbar or selecting text even
* when moving outside of the window.
*
* Both (view && !surface) and (surface && !view) are possible.
*/
struct {
struct view *view;
struct wlr_scene_node *node;
struct wlr_surface *surface;
struct wlr_surface *toplevel;
uint32_t resize_edges;
} pressed;
struct {
bool active;
struct {
struct wl_listener request;
struct wl_listener start;
struct wl_listener destroy;
} events;
struct wlr_scene_tree *icons;
} drag;
/* Private use by regions.c */
struct region *region_active;
struct region_overlay region_overlay;
/* Used to prevent region snapping when starting a move with A-Left */
bool region_prevent_snap;
struct wl_client *active_client_while_inhibited;
struct wl_list inputs;
struct wl_listener new_input;
struct wl_listener focus_change;
struct wl_listener cursor_motion;
struct wl_listener cursor_motion_absolute;
struct wl_listener cursor_button;
struct wl_listener cursor_axis;
struct wl_listener cursor_frame;
struct wlr_pointer_gestures_v1 *pointer_gestures;
struct wl_listener pinch_begin;
struct wl_listener pinch_update;
struct wl_listener pinch_end;
struct wl_listener swipe_begin;
struct wl_listener swipe_update;
struct wl_listener swipe_end;
struct wl_listener request_cursor;
struct wl_listener request_set_selection;
2021-08-18 23:41:07 +01:00
struct wl_listener request_set_primary_selection;
struct wl_listener touch_down;
struct wl_listener touch_up;
struct wl_listener touch_motion;
struct wl_listener touch_frame;
2021-10-17 16:54:35 -04:00
struct wl_listener constraint_commit;
struct wl_listener pressed_surface_destroy;
struct wlr_virtual_pointer_manager_v1 *virtual_pointer;
struct wl_listener virtual_pointer_new;
struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard;
struct wl_listener virtual_keyboard_new;
};
struct lab_data_buffer;
2022-06-15 01:07:45 +02:00
struct workspace;
2019-12-27 20:48:58 +00:00
struct server {
2019-11-19 21:00:26 +00:00
struct wl_display *wl_display;
2022-06-15 01:07:45 +02:00
struct wl_event_loop *wl_event_loop; /* Can be used for timer events */
2019-11-19 21:00:26 +00:00
struct wlr_renderer *renderer;
struct wlr_allocator *allocator;
2020-09-29 19:53:46 +01:00
struct wlr_backend *backend;
2019-11-19 21:00:26 +00:00
struct wlr_xdg_shell *xdg_shell;
struct wlr_layer_shell_v1 *layer_shell;
2019-11-19 21:00:26 +00:00
struct wl_listener new_xdg_surface;
struct wl_listener new_layer_surface;
struct wl_listener kde_server_decoration;
2020-05-13 20:51:13 +01:00
struct wl_listener xdg_toplevel_decoration;
2020-12-30 10:29:21 +00:00
#if HAVE_XWAYLAND
2019-11-19 21:00:26 +00:00
struct wlr_xwayland *xwayland;
struct wl_listener xwayland_ready;
struct wl_listener xwayland_new_surface;
2020-12-30 10:29:21 +00:00
#endif
struct wlr_input_inhibit_manager *input_inhibit;
2021-09-22 20:24:02 +01:00
struct wl_listener input_inhibit_activate;
struct wl_listener input_inhibit_deactivate;
Add xdg-activation protocol This PR allows applications to activate themselves *if they provide a valid xdg_activation token* (e.g. raise to the top and get keyboard focus). These tokens are given out by the xdg_activation protocol implemented by wlroots and can be configured by the client requesting the token in three ways: - an "empty" token (apparently used to tell the compositor about "urgency") - seat / input serial attached - surface attached Wlroots makes sure that - If the client attached the seat / input serial: those two are valid. - If the client attached a surface: that it has keyboard focus at the point where the request is finalized. There is a patch [1] pending for backport to wlroots 0.16 that also allows valid tokens when the supplied surface had cursor focus. - a token is only valid for 30 seconds after being given out The token can then be used by the client or given to other clients by unspecified means (e.g. via environment variable or dbus) which then may use the token on their own surface and request activation. We only handle the actual request activation part: - If the seat is set on the token we know wlroots validated seat and input serial - Thus, if no seat is set we deny the activation request so we don't have windows suddenly popping up and taking over the keyboard focus (focus stealing prevention) - We should also check for the surface being set but we can't do that with wlroots 0.16 as it will reset the surface to `NULL` when it is destroyed (which is something that usually happens for notifications). Once we move to wlroots 0.17.x we can add the missing surface check because it provides a `new_token` signal. We can use it to attach further details to the token which are then verified later when we decide if we allow the activate request or not. With this PR in place the following setup should activate windows: - launching an URL in foot should activate the target application if it is already running, foot requests a proper token and then sets it as `XDG_ACTIVATION_TOKEN` environment var before spawning `xdg-open` - clicking on a `mako` notification with a `default` action defined should request a proper token which is then given to the application starting the notification and can thus be used to activate itself This protocol is still very much in the process of being implemented / finalized all over the place (e.g. GTK / QT / Firefox / notification daemons, ..) but we should do our part and remove labwc from the puzzle of potential issues causing this not to work. [1] https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/f6008ffff41f67e3c20bd8b3be8f216da6a4bb30)
2023-02-04 10:07:46 +01:00
struct wlr_xdg_activation_v1 *xdg_activation;
struct wl_listener xdg_activation_request;
2019-11-19 21:00:26 +00:00
struct wl_list views;
struct wl_list unmanaged_surfaces;
2019-11-19 21:00:26 +00:00
struct seat seat;
struct wlr_scene *scene;
/* cursor interactive */
2020-10-21 20:30:06 +01:00
enum input_mode input_mode;
2019-12-27 20:48:58 +00:00
struct view *grabbed_view;
2019-11-19 21:00:26 +00:00
double grab_x, grab_y;
struct wlr_box grab_box;
2019-11-19 21:00:26 +00:00
uint32_t resize_edges;
2022-02-21 03:18:38 +01:00
/* SSD state */
2023-09-26 01:35:36 -04:00
/*
* Currently focused view. Updated with each "focus change"
* event. This view is drawn with "active" SSD coloring.
2023-09-26 01:35:36 -04:00
*/
struct view *focused_view;
struct ssd_hover_state *ssd_hover_state;
2022-02-21 03:18:38 +01:00
/* Tree for all non-layer xdg/xwayland-shell surfaces */
struct wlr_scene_tree *view_tree;
2023-05-20 08:58:42 +01:00
/*
* Popups need to be rendered above always-on-top views, so we reparent
* them to this dedicated tree
*/
struct wlr_scene_tree *xdg_popup_tree;
/* Tree for all non-layer xdg/xwayland-shell surfaces with always-on-top/below */
2022-04-09 01:16:09 +02:00
struct wlr_scene_tree *view_tree_always_on_top;
2023-05-11 22:26:41 +01:00
struct wlr_scene_tree *view_tree_always_on_bottom;
#if HAVE_XWAYLAND
/* Tree for unmanaged xsurfaces without initialized view (usually popups) */
struct wlr_scene_tree *unmanaged_tree;
#endif
/* Tree for built in menu */
2022-02-19 02:05:38 +01:00
struct wlr_scene_tree *menu_tree;
2022-06-15 01:07:45 +02:00
/* Workspaces */
struct wl_list workspaces; /* struct workspace.link */
struct workspace *workspace_current;
struct workspace *workspace_last;
2022-06-15 01:07:45 +02:00
2019-11-19 21:00:26 +00:00
struct wl_list outputs;
struct wl_listener new_output;
struct wlr_output_layout *output_layout;
struct wl_listener output_layout_change;
struct wlr_output_manager_v1 *output_manager;
struct wl_listener output_manager_apply;
/*
* While an output layout change is in process, this counter is
* non-zero and causes change-events from the wlr_output_layout
* to be ignored (to prevent, for example, moving views in a
* transitory layout state). Once the counter reaches zero,
* do_output_layout_change() must be called explicitly.
*/
int pending_output_layout_change;
2023-03-30 22:19:05 +01:00
struct session_lock *session_lock;
struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
struct wlr_drm_lease_v1_manager *drm_lease_manager;
struct wl_listener drm_lease_request;
2022-03-06 04:46:11 +00:00
struct wlr_output_power_manager_v1 *output_power_manager_v1;
struct wl_listener output_power_manager_set_mode;
2021-10-17 16:54:35 -04:00
struct wlr_relative_pointer_manager_v1 *relative_pointer_manager;
struct wlr_pointer_constraints_v1 *constraints;
struct wl_listener new_constraint;
/* Set when in cycle (alt-tab) mode */
struct osd_state {
struct view *cycle_view;
bool preview_was_enabled;
struct wlr_scene_node *preview_node;
struct wlr_scene_node *preview_anchor;
struct multi_rect *preview_outline;
} osd_state;
2020-10-19 22:14:17 +01:00
2021-02-21 21:54:40 +00:00
struct theme *theme;
2022-02-19 02:05:38 +01:00
struct menu *menu_current;
2019-11-19 21:00:26 +00:00
};
#define LAB_NR_LAYERS (4)
2022-04-04 20:53:36 +01:00
2019-12-27 20:48:58 +00:00
struct output {
2023-10-02 19:47:59 +01:00
struct wl_list link; /* server.outputs */
2019-12-27 20:48:58 +00:00
struct server *server;
2019-11-19 21:00:26 +00:00
struct wlr_output *wlr_output;
struct wlr_scene_output *scene_output;
struct wlr_scene_tree *layer_tree[LAB_NR_LAYERS];
struct wlr_scene_tree *layer_popup_tree;
struct wlr_scene_tree *osd_tree;
2023-03-30 22:19:05 +01:00
struct wlr_scene_tree *session_lock_tree;
2022-06-15 01:07:45 +02:00
struct wlr_scene_buffer *workspace_osd;
struct wlr_box usable_area;
struct wl_list regions; /* struct region.link */
struct lab_data_buffer *osd_buffer;
2020-09-29 19:53:46 +01:00
struct wl_listener destroy;
struct wl_listener frame;
bool leased;
2019-11-19 21:00:26 +00:00
};
2022-04-04 20:53:36 +01:00
#undef LAB_NR_LAYERS
2019-11-19 21:00:26 +00:00
2021-10-17 16:54:35 -04:00
struct constraint {
struct seat *seat;
struct wlr_pointer_constraint_v1 *constraint;
struct wl_listener destroy;
};
void xdg_popup_create(struct view *view, struct wlr_xdg_popup *wlr_popup);
Add xdg-activation protocol This PR allows applications to activate themselves *if they provide a valid xdg_activation token* (e.g. raise to the top and get keyboard focus). These tokens are given out by the xdg_activation protocol implemented by wlroots and can be configured by the client requesting the token in three ways: - an "empty" token (apparently used to tell the compositor about "urgency") - seat / input serial attached - surface attached Wlroots makes sure that - If the client attached the seat / input serial: those two are valid. - If the client attached a surface: that it has keyboard focus at the point where the request is finalized. There is a patch [1] pending for backport to wlroots 0.16 that also allows valid tokens when the supplied surface had cursor focus. - a token is only valid for 30 seconds after being given out The token can then be used by the client or given to other clients by unspecified means (e.g. via environment variable or dbus) which then may use the token on their own surface and request activation. We only handle the actual request activation part: - If the seat is set on the token we know wlroots validated seat and input serial - Thus, if no seat is set we deny the activation request so we don't have windows suddenly popping up and taking over the keyboard focus (focus stealing prevention) - We should also check for the surface being set but we can't do that with wlroots 0.16 as it will reset the surface to `NULL` when it is destroyed (which is something that usually happens for notifications). Once we move to wlroots 0.17.x we can add the missing surface check because it provides a `new_token` signal. We can use it to attach further details to the token which are then verified later when we decide if we allow the activate request or not. With this PR in place the following setup should activate windows: - launching an URL in foot should activate the target application if it is already running, foot requests a proper token and then sets it as `XDG_ACTIVATION_TOKEN` environment var before spawning `xdg-open` - clicking on a `mako` notification with a `default` action defined should request a proper token which is then given to the application starting the notification and can thus be used to activate itself This protocol is still very much in the process of being implemented / finalized all over the place (e.g. GTK / QT / Firefox / notification daemons, ..) but we should do our part and remove labwc from the puzzle of potential issues causing this not to work. [1] https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/f6008ffff41f67e3c20bd8b3be8f216da6a4bb30)
2023-02-04 10:07:46 +01:00
void xdg_activation_handle_request(struct wl_listener *listener, void *data);
2019-12-26 21:37:31 +00:00
void xdg_surface_new(struct wl_listener *listener, void *data);
void foreign_toplevel_handle_create(struct view *view);
void foreign_toplevel_update_outputs(struct view *view);
/*
* desktop.c routines deal with a collection of views
*
* Definition of a few keywords used in desktop.c
* raise - Bring view to front.
* focus - Give keyboard focus to view.
* activate - Set view surface as active so that client window decorations
* are painted to show that the window is active,typically by
* using a different color. Although xdg-shell protocol says you
* cannot assume this means that the window actually has keyboard
* or pointer focus, in this compositor are they called together.
*/
void desktop_focus_view(struct view *view, bool raise);
void desktop_arrange_all_views(struct server *server);
void desktop_focus_output(struct output *output);
struct view *desktop_topmost_focusable_view(struct server *server);
2021-11-26 19:27:50 +00:00
enum lab_cycle_dir {
LAB_CYCLE_DIR_NONE,
LAB_CYCLE_DIR_FORWARD,
LAB_CYCLE_DIR_BACKWARD,
};
/**
2020-10-31 14:46:33 +00:00
* desktop_cycle_view - return view to 'cycle' to
* @start_view: reference point for finding next view to cycle to
* Note: If !start_view, the second focusable view is returned
*/
struct view *desktop_cycle_view(struct server *server, struct view *start_view,
2021-12-26 23:29:01 +00:00
enum lab_cycle_dir dir);
void desktop_focus_topmost_view(struct server *server);
void keyboard_cancel_keybind_repeat(struct keyboard *keyboard);
void keyboard_key_notify(struct wl_listener *listener, void *data);
void keyboard_modifiers_notify(struct wl_listener *listener, void *data);
void keyboard_init(struct seat *seat);
bool keyboard_any_modifiers_pressed(struct wlr_keyboard *keyboard);
void keyboard_finish(struct seat *seat);
2020-10-06 21:31:01 +01:00
void touch_init(struct seat *seat);
void touch_finish(struct seat *seat);
void seat_init(struct server *server);
void seat_finish(struct server *server);
2021-10-10 12:03:18 -04:00
void seat_reconfigure(struct server *server);
2020-10-08 20:22:52 +01:00
void seat_focus_surface(struct seat *seat, struct wlr_surface *surface);
void seat_set_focus_layer(struct seat *seat, struct wlr_layer_surface_v1 *layer);
void seat_set_pressed(struct seat *seat, struct view *view,
struct wlr_scene_node *node, struct wlr_surface *surface,
struct wlr_surface *toplevel, uint32_t resize_edges);
void seat_reset_pressed(struct seat *seat);
void interactive_begin(struct view *view, enum input_mode mode, uint32_t edges);
void interactive_finish(struct view *view);
void interactive_cancel(struct view *view);
2020-05-29 21:27:34 +01:00
void output_init(struct server *server);
void output_manager_init(struct server *server);
2021-09-22 20:24:02 +01:00
struct output *output_from_wlr_output(struct server *server,
struct wlr_output *wlr_output);
struct output *output_from_name(struct server *server, const char *name);
struct output *output_nearest_to(struct server *server, int lx, int ly);
struct output *output_nearest_to_cursor(struct server *server);
2023-02-16 12:24:27 -05:00
bool output_is_usable(struct output *output);
void output_update_usable_area(struct output *output);
void output_update_all_usable_areas(struct server *server, bool layout_changed);
struct wlr_box output_usable_area_in_layout_coords(struct output *output);
2022-03-06 04:46:11 +00:00
void handle_output_power_manager_set_mode(struct wl_listener *listener,
void *data);
void server_init(struct server *server);
void server_start(struct server *server);
void server_finish(struct server *server);
2019-12-26 21:37:31 +00:00
/* Updates onscreen display 'alt-tab' buffer */
void osd_update(struct server *server);
/* Closes the OSD */
void osd_finish(struct server *server);
/* Moves preview views back into their original stacking order and state */
void osd_preview_restore(struct server *server);
/* Notify OSD about a destroying view */
void osd_on_view_destroy(struct view *view);
2021-09-22 20:24:02 +01:00
/*
2021-08-25 19:59:49 +01:00
* wlroots "input inhibitor" extension (required for swaylock) blocks
* any client other than the requesting client from receiving events
*/
bool input_inhibit_blocks_surface(struct seat *seat,
2021-08-25 19:59:49 +01:00
struct wl_resource *resource);
2021-10-17 16:54:35 -04:00
void create_constraint(struct wl_listener *listener, void *data);
void constrain_cursor(struct server *server, struct wlr_pointer_constraint_v1
*constraint);
#endif /* LABWC_H */