diff options
author | emersion <contact@emersion.fr> | 2019-01-30 18:36:19 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2019-02-20 18:42:29 +0100 |
commit | 6291e8453247053d2a706da7e1a5d7271e1774d2 (patch) | |
tree | a7151bfb81f6ce4f7d4faf839528cae37c6c5f17 /include/wlr | |
parent | 18600f457be7a538e39914c37b72fee1a933ebe1 (diff) |
data-device: refactor wlr_drag
Diffstat (limited to 'include/wlr')
-rw-r--r-- | include/wlr/types/wlr_data_device.h | 76 | ||||
-rw-r--r-- | include/wlr/types/wlr_seat.h | 31 |
2 files changed, 86 insertions, 21 deletions
diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h index 59aa718f..9da7cc0d 100644 --- a/include/wlr/types/wlr_data_device.h +++ b/include/wlr/types/wlr_data_device.h @@ -89,15 +89,13 @@ struct wlr_data_source { } events; }; +struct wlr_drag; + struct wlr_drag_icon { + struct wlr_drag *drag; struct wlr_surface *surface; - struct wlr_seat_client *client; - struct wl_list link; // wlr_seat::drag_icons bool mapped; - bool is_pointer; - int32_t touch_id; - struct { struct wl_signal map; struct wl_signal unmap; @@ -105,40 +103,46 @@ struct wlr_drag_icon { } events; struct wl_listener surface_destroy; - struct wl_listener seat_client_destroy; void *data; }; +enum wlr_drag_grab_type { + WLR_DRAG_GRAB_KEYBOARD, + WLR_DRAG_GRAB_KEYBOARD_POINTER, + WLR_DRAG_GRAB_KEYBOARD_TOUCH, +}; + struct wlr_drag { - struct wlr_seat_pointer_grab pointer_grab; + enum wlr_drag_grab_type grab_type; struct wlr_seat_keyboard_grab keyboard_grab; + struct wlr_seat_pointer_grab pointer_grab; struct wlr_seat_touch_grab touch_grab; struct wlr_seat *seat; struct wlr_seat_client *seat_client; struct wlr_seat_client *focus_client; - bool is_pointer_grab; + struct wlr_drag_icon *icon; // can be NULL + struct wlr_surface *focus; // can be NULL + struct wlr_data_source *source; // can be NULL - struct wlr_drag_icon *icon; - struct wlr_surface *focus; - struct wlr_data_source *source; + bool started, cancelling; + int32_t grab_touch_id, touch_id; // if WLR_DRAG_GRAB_TOUCH - bool cancelling; - int32_t grab_touch_id; + struct { + struct wl_signal focus; + struct wl_signal motion; // wlr_drag_motion_event + struct wl_signal drop; // wlr_drag_drop_event + struct wl_signal destroy; + } events; struct wl_listener point_destroy; struct wl_listener source_destroy; struct wl_listener seat_client_destroy; struct wl_listener icon_destroy; - struct { - struct wl_signal focus; - struct wl_signal motion; - struct wl_signal drop; - struct wl_signal destroy; - } events; + void *data; }; struct wlr_drag_motion_event { @@ -179,6 +183,40 @@ void wlr_seat_set_selection(struct wlr_seat *seat, struct wlr_data_source *source, uint32_t serial); /** + * Creates a new drag. To request to start the drag, call + * `wlr_seat_request_start_drag`. + */ +struct wlr_drag *wlr_drag_create(struct wlr_seat_client *seat_client, + struct wlr_data_source *source, struct wlr_surface *icon_surface); + +/** + * Requests a drag to be started on the seat. + */ +void wlr_seat_request_start_drag(struct wlr_seat *seat, struct wlr_drag *drag, + struct wlr_surface *origin, uint32_t serial); + +/** + * Starts a drag on the seat. This starts an implicit keyboard grab, but doesn't + * start a pointer or a touch grab. + */ +void wlr_seat_start_drag(struct wlr_seat *seat, struct wlr_drag *drag, + uint32_t serial); + +/** + * Starts a pointer drag on the seat. This starts implicit keyboard and pointer + * grabs. + */ +void wlr_seat_start_pointer_drag(struct wlr_seat *seat, struct wlr_drag *drag, + uint32_t serial); + +/** + * Starts a touch drag on the seat. This starts implicit keyboard and touch + * grabs. + */ +void wlr_seat_start_touch_drag(struct wlr_seat *seat, struct wlr_drag *drag, + uint32_t serial, struct wlr_touch_point *point); + +/** * Initializes the data source with the provided implementation. */ void wlr_data_source_init(struct wlr_data_source *source, diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h index c81c2cec..c020dbdb 100644 --- a/include/wlr/types/wlr_seat.h +++ b/include/wlr/types/wlr_seat.h @@ -191,7 +191,6 @@ struct wlr_seat { struct wl_global *global; struct wl_display *display; struct wl_list clients; - struct wl_list drag_icons; // wlr_drag_icon::link char *name; uint32_t capabilities; @@ -239,8 +238,9 @@ struct wlr_seat { struct wl_signal request_set_primary_selection; struct wl_signal set_primary_selection; + // wlr_seat_request_start_drag_event + struct wl_signal request_start_drag; struct wl_signal start_drag; // wlr_drag - struct wl_signal new_drag_icon; // wlr_drag_icon struct wl_signal destroy; } events; @@ -265,6 +265,12 @@ struct wlr_seat_request_set_primary_selection_event { uint32_t serial; }; +struct wlr_seat_request_start_drag_event { + struct wlr_drag *drag; + struct wlr_surface *origin; + uint32_t serial; +}; + struct wlr_seat_pointer_focus_change_event { struct wlr_seat *seat; struct wlr_surface *old_surface, *new_surface; @@ -597,9 +603,30 @@ bool wlr_seat_touch_has_grab(struct wlr_seat *seat); */ bool wlr_seat_validate_grab_serial(struct wlr_seat *seat, uint32_t serial); +/** + * Check whether this serial is valid to start a pointer grab action. + */ +bool wlr_seat_validate_pointer_grab_serial(struct wlr_seat *seat, + struct wlr_surface *origin, uint32_t serial); + +/** + * Check whether this serial is valid to start a touch grab action. If it's the + * case and point_ptr is non-NULL, *point_ptr is set to the touch point matching + * the serial. + */ +bool wlr_seat_validate_touch_grab_serial(struct wlr_seat *seat, + struct wlr_surface *origin, uint32_t serial, + struct wlr_touch_point **point_ptr); + +/** + * Get a seat client from a seat resource. Returns NULL if inert. + */ struct wlr_seat_client *wlr_seat_client_from_resource( struct wl_resource *resource); +/** + * Get a seat client from a pointer resource. Returns NULL if inert. + */ struct wlr_seat_client *wlr_seat_client_from_pointer_resource( struct wl_resource *resource); |