2018-07-13 12:40:56 +00:00
|
|
|
/*
|
|
|
|
* This an unstable interface of wlroots. No guarantees are made regarding the
|
|
|
|
* future consistency of this API.
|
|
|
|
*/
|
|
|
|
#ifndef WLR_USE_UNSTABLE
|
|
|
|
#error "Add -DWLR_USE_UNSTABLE to enable unstable wlroots features"
|
|
|
|
#endif
|
|
|
|
|
2017-10-11 19:48:40 +00:00
|
|
|
#ifndef WLR_TYPES_WLR_DATA_DEVICE_H
|
|
|
|
#define WLR_TYPES_WLR_DATA_DEVICE_H
|
|
|
|
|
2019-07-27 08:53:54 +00:00
|
|
|
#include <wayland-server-core.h>
|
2017-10-14 19:53:30 +00:00
|
|
|
#include <wlr/types/wlr_seat.h>
|
2017-10-11 19:48:40 +00:00
|
|
|
|
2018-11-21 20:32:54 +00:00
|
|
|
extern const struct wlr_pointer_grab_interface
|
|
|
|
wlr_data_device_pointer_drag_interface;
|
2017-10-15 15:06:03 +00:00
|
|
|
|
2018-11-21 20:32:54 +00:00
|
|
|
extern const struct wlr_keyboard_grab_interface
|
|
|
|
wlr_data_device_keyboard_drag_interface;
|
2017-10-16 11:29:18 +00:00
|
|
|
|
2018-11-21 20:32:54 +00:00
|
|
|
extern const struct wlr_touch_grab_interface
|
|
|
|
wlr_data_device_touch_drag_interface;
|
2017-11-13 20:41:48 +00:00
|
|
|
|
2017-10-11 19:48:40 +00:00
|
|
|
struct wlr_data_device_manager {
|
|
|
|
struct wl_global *global;
|
2018-05-03 19:22:51 +00:00
|
|
|
struct wl_list data_sources;
|
2017-12-06 23:50:55 +00:00
|
|
|
|
|
|
|
struct wl_listener display_destroy;
|
2018-05-03 19:22:51 +00:00
|
|
|
|
|
|
|
struct {
|
|
|
|
struct wl_signal destroy;
|
|
|
|
} events;
|
|
|
|
|
|
|
|
void *data;
|
2017-10-11 19:48:40 +00:00
|
|
|
};
|
|
|
|
|
2018-12-09 16:27:37 +00:00
|
|
|
enum wlr_data_offer_type {
|
|
|
|
WLR_DATA_OFFER_SELECTION,
|
|
|
|
WLR_DATA_OFFER_DRAG,
|
|
|
|
};
|
|
|
|
|
2017-10-11 19:48:40 +00:00
|
|
|
struct wlr_data_offer {
|
|
|
|
struct wl_resource *resource;
|
2017-10-12 15:41:11 +00:00
|
|
|
struct wlr_data_source *source;
|
2018-12-09 16:27:37 +00:00
|
|
|
enum wlr_data_offer_type type;
|
2018-12-09 16:35:11 +00:00
|
|
|
struct wl_list link; // wlr_seat::{selection_offers,drag_offers}
|
2017-10-12 15:41:11 +00:00
|
|
|
|
2017-12-29 21:51:33 +00:00
|
|
|
uint32_t actions;
|
|
|
|
enum wl_data_device_manager_dnd_action preferred_action;
|
2017-10-13 11:58:46 +00:00
|
|
|
bool in_ask;
|
|
|
|
|
2017-10-12 15:41:11 +00:00
|
|
|
struct wl_listener source_destroy;
|
2017-10-11 19:48:40 +00:00
|
|
|
};
|
|
|
|
|
2018-03-29 21:53:13 +00:00
|
|
|
/**
|
|
|
|
* A data source implementation. Only the `send` function is mandatory. Refer to
|
|
|
|
* the matching wl_data_source_* functions documentation to know what they do.
|
|
|
|
*/
|
|
|
|
struct wlr_data_source_impl {
|
2017-12-29 21:51:33 +00:00
|
|
|
void (*send)(struct wlr_data_source *source, const char *mime_type,
|
|
|
|
int32_t fd);
|
|
|
|
void (*accept)(struct wlr_data_source *source, uint32_t serial,
|
|
|
|
const char *mime_type);
|
2018-12-09 10:50:28 +00:00
|
|
|
void (*destroy)(struct wlr_data_source *source);
|
2017-10-11 19:48:40 +00:00
|
|
|
|
2017-12-29 21:51:33 +00:00
|
|
|
void (*dnd_drop)(struct wlr_data_source *source);
|
|
|
|
void (*dnd_finish)(struct wlr_data_source *source);
|
|
|
|
void (*dnd_action)(struct wlr_data_source *source,
|
|
|
|
enum wl_data_device_manager_dnd_action action);
|
2018-03-29 21:53:13 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct wlr_data_source {
|
|
|
|
const struct wlr_data_source_impl *impl;
|
|
|
|
|
|
|
|
// source metadata
|
|
|
|
struct wl_array mime_types;
|
|
|
|
int32_t actions;
|
2017-12-29 21:51:33 +00:00
|
|
|
|
|
|
|
// source status
|
2017-10-12 15:41:11 +00:00
|
|
|
bool accepted;
|
|
|
|
|
2017-12-29 21:51:33 +00:00
|
|
|
// drag'n'drop status
|
2017-10-13 11:58:46 +00:00
|
|
|
enum wl_data_device_manager_dnd_action current_dnd_action;
|
|
|
|
uint32_t compositor_action;
|
2017-10-15 18:49:43 +00:00
|
|
|
|
2017-10-11 19:48:40 +00:00
|
|
|
struct {
|
|
|
|
struct wl_signal destroy;
|
|
|
|
} events;
|
|
|
|
};
|
|
|
|
|
2019-01-30 17:36:19 +00:00
|
|
|
struct wlr_drag;
|
|
|
|
|
2017-11-19 14:33:55 +00:00
|
|
|
struct wlr_drag_icon {
|
2019-01-30 17:36:19 +00:00
|
|
|
struct wlr_drag *drag;
|
2017-11-19 14:33:55 +00:00
|
|
|
struct wlr_surface *surface;
|
|
|
|
bool mapped;
|
|
|
|
|
|
|
|
struct {
|
2018-06-06 02:50:29 +00:00
|
|
|
struct wl_signal map;
|
2018-06-05 22:17:42 +00:00
|
|
|
struct wl_signal unmap;
|
2017-11-19 14:33:55 +00:00
|
|
|
struct wl_signal destroy;
|
|
|
|
} events;
|
|
|
|
|
|
|
|
struct wl_listener surface_destroy;
|
2018-06-04 00:11:59 +00:00
|
|
|
|
|
|
|
void *data;
|
2017-11-19 14:33:55 +00:00
|
|
|
};
|
|
|
|
|
2019-01-30 17:36:19 +00:00
|
|
|
enum wlr_drag_grab_type {
|
|
|
|
WLR_DRAG_GRAB_KEYBOARD,
|
|
|
|
WLR_DRAG_GRAB_KEYBOARD_POINTER,
|
|
|
|
WLR_DRAG_GRAB_KEYBOARD_TOUCH,
|
|
|
|
};
|
|
|
|
|
2017-10-14 19:53:30 +00:00
|
|
|
struct wlr_drag {
|
2019-01-30 17:36:19 +00:00
|
|
|
enum wlr_drag_grab_type grab_type;
|
2017-10-16 11:29:18 +00:00
|
|
|
struct wlr_seat_keyboard_grab keyboard_grab;
|
2019-01-30 17:36:19 +00:00
|
|
|
struct wlr_seat_pointer_grab pointer_grab;
|
2017-11-13 13:22:04 +00:00
|
|
|
struct wlr_seat_touch_grab touch_grab;
|
2017-10-16 11:29:18 +00:00
|
|
|
|
2017-11-13 20:41:48 +00:00
|
|
|
struct wlr_seat *seat;
|
2017-10-30 12:37:54 +00:00
|
|
|
struct wlr_seat_client *seat_client;
|
|
|
|
struct wlr_seat_client *focus_client;
|
2017-10-14 19:53:30 +00:00
|
|
|
|
2019-01-30 17:36:19 +00:00
|
|
|
struct wlr_drag_icon *icon; // can be NULL
|
|
|
|
struct wlr_surface *focus; // can be NULL
|
|
|
|
struct wlr_data_source *source; // can be NULL
|
2017-11-13 20:41:48 +00:00
|
|
|
|
2019-02-18 11:34:21 +00:00
|
|
|
bool started, dropped, cancelling;
|
2019-01-30 17:36:19 +00:00
|
|
|
int32_t grab_touch_id, touch_id; // if WLR_DRAG_GRAB_TOUCH
|
2017-10-14 19:53:30 +00:00
|
|
|
|
2019-01-30 17:36:19 +00:00
|
|
|
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;
|
2017-11-01 12:05:02 +00:00
|
|
|
|
2017-10-14 19:53:30 +00:00
|
|
|
struct wl_listener source_destroy;
|
2017-11-19 16:10:27 +00:00
|
|
|
struct wl_listener seat_client_destroy;
|
2017-11-19 14:33:55 +00:00
|
|
|
struct wl_listener icon_destroy;
|
2018-03-28 16:59:11 +00:00
|
|
|
|
2019-01-30 17:36:19 +00:00
|
|
|
void *data;
|
2017-10-14 19:53:30 +00:00
|
|
|
};
|
|
|
|
|
2018-03-28 18:16:14 +00:00
|
|
|
struct wlr_drag_motion_event {
|
|
|
|
struct wlr_drag *drag;
|
|
|
|
uint32_t time;
|
|
|
|
double sx, sy;
|
|
|
|
};
|
|
|
|
|
2018-03-28 19:33:23 +00:00
|
|
|
struct wlr_drag_drop_event {
|
|
|
|
struct wlr_drag *drag;
|
|
|
|
uint32_t time;
|
|
|
|
};
|
|
|
|
|
2017-10-11 19:48:40 +00:00
|
|
|
/**
|
|
|
|
* Create a wl data device manager global for this display.
|
|
|
|
*/
|
|
|
|
struct wlr_data_device_manager *wlr_data_device_manager_create(
|
2018-03-29 21:53:13 +00:00
|
|
|
struct wl_display *display);
|
2017-10-11 19:48:40 +00:00
|
|
|
|
2018-11-29 18:30:04 +00:00
|
|
|
/**
|
2019-06-27 19:43:58 +00:00
|
|
|
* Requests a selection to be set for the seat. If the request comes from
|
|
|
|
* a client, then set `client` to be the matching seat client so that this
|
|
|
|
* function can verify that the serial provided was once sent to the client
|
|
|
|
* on this seat.
|
2018-11-29 18:30:04 +00:00
|
|
|
*/
|
|
|
|
void wlr_seat_request_set_selection(struct wlr_seat *seat,
|
2019-06-27 19:43:58 +00:00
|
|
|
struct wlr_seat_client *client, struct wlr_data_source *source,
|
|
|
|
uint32_t serial);
|
2018-11-29 18:30:04 +00:00
|
|
|
|
2018-03-29 21:53:13 +00:00
|
|
|
/**
|
2019-01-21 18:23:40 +00:00
|
|
|
* Sets the current selection for the seat. NULL can be provided to clear it.
|
|
|
|
* This removes the previous one if there was any. In case the selection doesn't
|
|
|
|
* come from a client, wl_display_next_serial() can be used to generate a
|
|
|
|
* serial.
|
2018-03-29 21:53:13 +00:00
|
|
|
*/
|
2017-10-15 18:49:43 +00:00
|
|
|
void wlr_seat_set_selection(struct wlr_seat *seat,
|
2018-03-29 21:53:13 +00:00
|
|
|
struct wlr_data_source *source, uint32_t serial);
|
2017-10-15 18:49:43 +00:00
|
|
|
|
2019-01-30 17:36:19 +00:00
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
|
2018-03-29 21:53:13 +00:00
|
|
|
/**
|
|
|
|
* Initializes the data source with the provided implementation.
|
|
|
|
*/
|
|
|
|
void wlr_data_source_init(struct wlr_data_source *source,
|
|
|
|
const struct wlr_data_source_impl *impl);
|
2017-12-25 15:10:16 +00:00
|
|
|
|
2018-03-29 21:53:13 +00:00
|
|
|
/**
|
|
|
|
* Sends the data as the specified MIME type over the passed file descriptor,
|
|
|
|
* then close it.
|
|
|
|
*/
|
|
|
|
void wlr_data_source_send(struct wlr_data_source *source, const char *mime_type,
|
|
|
|
int32_t fd);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notifies the data source that a target accepts one of the offered MIME types.
|
|
|
|
* If a target doesn't accept any of the offered types, `mime_type` is NULL.
|
|
|
|
*/
|
|
|
|
void wlr_data_source_accept(struct wlr_data_source *source, uint32_t serial,
|
|
|
|
const char *mime_type);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notifies the data source it is no longer valid and should be destroyed. That
|
2018-12-09 10:50:28 +00:00
|
|
|
* destroys immediately the data source.
|
2018-03-29 21:53:13 +00:00
|
|
|
*/
|
2018-12-09 10:50:28 +00:00
|
|
|
void wlr_data_source_destroy(struct wlr_data_source *source);
|
2018-03-29 21:53:13 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Notifies the data source that the drop operation was performed. This does not
|
|
|
|
* indicate acceptance.
|
|
|
|
*
|
|
|
|
* The data source may still be used in the future and should not be destroyed
|
|
|
|
* here.
|
|
|
|
*/
|
|
|
|
void wlr_data_source_dnd_drop(struct wlr_data_source *source);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notifies the data source that the drag-and-drop operation concluded. That
|
|
|
|
* potentially destroys immediately the data source.
|
|
|
|
*/
|
|
|
|
void wlr_data_source_dnd_finish(struct wlr_data_source *source);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Notifies the data source that a target accepts the drag with the specified
|
|
|
|
* action.
|
|
|
|
*
|
|
|
|
* This shouldn't be called after `wlr_data_source_dnd_drop` unless the
|
|
|
|
* drag-and-drop operation ended in an "ask" action.
|
|
|
|
*/
|
|
|
|
void wlr_data_source_dnd_action(struct wlr_data_source *source,
|
|
|
|
enum wl_data_device_manager_dnd_action action);
|
|
|
|
|
2017-10-11 19:48:40 +00:00
|
|
|
#endif
|