aboutsummaryrefslogtreecommitdiff
path: root/include/sway/input/seat.h
blob: cd36ef5a797a6bc8d338da712b932af35e931c44 (plain)
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
#ifndef _SWAY_INPUT_SEAT_H
#define _SWAY_INPUT_SEAT_H

#include <wlr/types/wlr_layer_shell.h>
#include <wlr/types/wlr_seat.h>
#include <wlr/util/edges.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_drag_icon {
	struct sway_seat *seat;
	struct wlr_drag_icon *wlr_drag_icon;
	struct wl_list link; // sway_root::drag_icons

	double x, y; // in layout-local coordinates

	struct wl_listener surface_commit;
	struct wl_listener map;
	struct wl_listener unmap;
	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;

	// Last touch point
	int32_t touch_id;
	double touch_x, touch_y;

	// Operations (drag and resize)
	enum {
		OP_NONE,
		OP_MOVE,
		OP_RESIZE,
	} operation;

	struct sway_container *op_container;
	enum wlr_edges op_resize_edge;
	uint32_t op_button;
	bool op_resize_preserve_ratio;
	double op_ref_lx, op_ref_ly;         // cursor's x/y at start of op
	double op_ref_width, op_ref_height;  // container's size at start of op
	double op_ref_con_lx, op_ref_con_ly; // container's x/y at start of op

	struct wl_listener focus_destroy;
	struct wl_listener new_container;
	struct wl_listener new_drag_icon;

	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, bool unfocus);

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);

/**
 * Return the immediate child of container which was most recently focused.
 */
struct sway_container *seat_get_active_child(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);

void drag_icon_update_position(struct sway_drag_icon *icon);

void seat_begin_move(struct sway_seat *seat, struct sway_container *con);

void seat_begin_resize(struct sway_seat *seat, struct sway_container *con,
		uint32_t button, enum wlr_edges edge);

void seat_end_mouse_operation(struct sway_seat *seat);

#endif