diff options
Diffstat (limited to 'include/sway/input/seat.h')
-rw-r--r-- | include/sway/input/seat.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h new file mode 100644 index 00000000..ff76841e --- /dev/null +++ b/include/sway/input/seat.h @@ -0,0 +1,111 @@ +#ifndef _SWAY_INPUT_SEAT_H +#define _SWAY_INPUT_SEAT_H + +#include <wlr/types/wlr_layer_shell.h> +#include <wlr/types/wlr_seat.h> +#include "sway/input/input-manager.h" + +struct sway_seat_device { + struct sway_seat *sway_seat; + struct sway_input_device *input_device; + struct sway_keyboard *keyboard; + struct wl_list link; // sway_seat::devices +}; + +struct sway_seat_container { + struct sway_seat *seat; + struct sway_container *container; + + struct wl_list link; // sway_seat::focus_stack + + struct wl_listener destroy; +}; + +struct sway_seat { + struct wlr_seat *wlr_seat; + struct sway_cursor *cursor; + struct sway_input_manager *input; + + bool has_focus; + struct wl_list focus_stack; // list of containers in focus order + + // If the focused layer is set, views cannot receive keyboard focus + struct wlr_layer_surface *focused_layer; + + // If exclusive_client is set, no other clients will receive input events + struct wl_client *exclusive_client; + + struct wl_listener focus_destroy; + struct wl_listener new_container; + + struct wl_list devices; // sway_seat_device::link + + struct wl_list link; // input_manager::seats +}; + +struct sway_seat *seat_create(struct sway_input_manager *input, + const char *seat_name); + +void seat_destroy(struct sway_seat *seat); + +void seat_add_device(struct sway_seat *seat, + struct sway_input_device *device); + +void seat_configure_device(struct sway_seat *seat, + struct sway_input_device *device); + +void seat_remove_device(struct sway_seat *seat, + struct sway_input_device *device); + +void seat_configure_xcursor(struct sway_seat *seat); + +void seat_set_focus(struct sway_seat *seat, struct sway_container *container); + +void seat_set_focus_warp(struct sway_seat *seat, + struct sway_container *container, bool warp); + +void seat_set_focus_surface(struct sway_seat *seat, + struct wlr_surface *surface); + +void seat_set_focus_layer(struct sway_seat *seat, + struct wlr_layer_surface *layer); + +void seat_set_exclusive_client(struct sway_seat *seat, + struct wl_client *client); + +struct sway_container *seat_get_focus(struct sway_seat *seat); + +/** + * Return the last container to be focused for the seat (or the most recently + * opened if no container has received focused) that is a child of the given + * container. The focus-inactive container of the root window is the focused + * container for the seat (if the seat does have focus). This function can be + * used to determine what container gets focused next if the focused container + * is destroyed, or focus moves to a container with children and we need to + * descend into the next leaf in focus order. + */ +struct sway_container *seat_get_focus_inactive(struct sway_seat *seat, + struct sway_container *container); + +/** + * Descend into the focus stack to find the focus-inactive view. Useful for + * container placement when they change position in the tree. + */ +struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat, + struct sway_container *container); + +/** + * Iterate over the focus-inactive children of the container calling the + * function on each. + */ +void seat_focus_inactive_children_for_each(struct sway_seat *seat, + struct sway_container *container, + void (*f)(struct sway_container *container, void *data), void *data); + +void seat_apply_config(struct sway_seat *seat, struct seat_config *seat_config); + +struct seat_config *seat_get_config(struct sway_seat *seat); + +bool seat_is_input_allowed(struct sway_seat *seat, struct wlr_surface *surface); + +#endif |