mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-11-02 09:01:38 -05:00
Merge pull request #1517 from emersion/refactor-dnd
Refactor drag-and-drop
This commit is contained in:
commit
e77e53dae5
11 changed files with 360 additions and 189 deletions
|
|
@ -40,7 +40,8 @@ struct roots_seat {
|
|||
|
||||
struct wl_listener request_set_selection;
|
||||
struct wl_listener request_set_primary_selection;
|
||||
struct wl_listener new_drag_icon;
|
||||
struct wl_listener request_start_drag;
|
||||
struct wl_listener start_drag;
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -30,9 +30,6 @@ void data_source_notify_finish(struct wlr_data_source *source);
|
|||
|
||||
struct wlr_seat_client *seat_client_from_data_device_resource(
|
||||
struct wl_resource *resource);
|
||||
bool seat_client_start_drag(struct wlr_seat_client *client,
|
||||
struct wlr_data_source *source, struct wlr_surface *icon_surface,
|
||||
struct wlr_surface *origin, uint32_t serial);
|
||||
/**
|
||||
* Creates a new wl_data_offer if there is a wl_data_source currently set as
|
||||
* the seat selection and sends it to the seat client, followed by the
|
||||
|
|
|
|||
|
|
@ -89,14 +89,12 @@ struct wlr_data_source {
|
|||
} events;
|
||||
};
|
||||
|
||||
struct wlr_drag_icon {
|
||||
struct wlr_surface *surface;
|
||||
struct wlr_seat_client *client;
|
||||
struct wl_list link; // wlr_seat::drag_icons
|
||||
bool mapped;
|
||||
struct wlr_drag;
|
||||
|
||||
bool is_pointer;
|
||||
int32_t touch_id;
|
||||
struct wlr_drag_icon {
|
||||
struct wlr_drag *drag;
|
||||
struct wlr_surface *surface;
|
||||
bool mapped;
|
||||
|
||||
struct {
|
||||
struct wl_signal map;
|
||||
|
|
@ -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, dropped, 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 {
|
||||
|
|
@ -178,6 +182,40 @@ void wlr_seat_request_set_selection(struct wlr_seat *seat,
|
|||
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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue