aboutsummaryrefslogtreecommitdiff
path: root/include/wlr
diff options
context:
space:
mode:
Diffstat (limited to 'include/wlr')
-rw-r--r--include/wlr/types/wlr_data_device.h100
-rw-r--r--include/wlr/types/wlr_seat.h11
2 files changed, 99 insertions, 12 deletions
diff --git a/include/wlr/types/wlr_data_device.h b/include/wlr/types/wlr_data_device.h
index ff4a0f7e..6fb41c29 100644
--- a/include/wlr/types/wlr_data_device.h
+++ b/include/wlr/types/wlr_data_device.h
@@ -30,23 +30,29 @@ struct wlr_data_offer {
struct wl_listener source_destroy;
};
-struct wlr_data_source {
- // source metadata
- struct wl_array mime_types;
- int32_t actions;
-
- // source implementation
+/**
+ * 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 {
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);
void (*cancel)(struct wlr_data_source *source);
- // drag'n'drop implementation
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);
+};
+
+struct wlr_data_source {
+ const struct wlr_data_source_impl *impl;
+
+ // source metadata
+ struct wl_array mime_types;
+ int32_t actions;
// source status
bool accepted;
@@ -104,13 +110,31 @@ struct wlr_drag {
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;
+};
+
+struct wlr_drag_motion_event {
+ struct wlr_drag *drag;
+ uint32_t time;
+ double sx, sy;
+};
+
+struct wlr_drag_drop_event {
+ struct wlr_drag *drag;
+ uint32_t time;
};
/**
* Create a wl data device manager global for this display.
*/
struct wlr_data_device_manager *wlr_data_device_manager_create(
- struct wl_display *display);
+ struct wl_display *display);
/**
* Destroys a wlr_data_device_manager and removes its wl_data_device_manager global.
@@ -126,11 +150,67 @@ void wlr_data_device_manager_destroy(struct wlr_data_device_manager *manager);
*/
void wlr_seat_client_send_selection(struct wlr_seat_client *seat_client);
+/**
+ * Sets the current selection for the seat. This removes the previous one if
+ * there was any.
+ */
void wlr_seat_set_selection(struct wlr_seat *seat,
- struct wlr_data_source *source, uint32_t serial);
+ struct wlr_data_source *source, uint32_t serial);
-void wlr_data_source_init(struct wlr_data_source *source);
+/**
+ * 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);
+/**
+ * Finishes the data source.
+ */
void wlr_data_source_finish(struct wlr_data_source *source);
+/**
+ * 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
+ * potentially destroys immediately the data source.
+ */
+void wlr_data_source_cancel(struct wlr_data_source *source);
+
+/**
+ * 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);
+
#endif
diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h
index 124c1cb8..34105cf0 100644
--- a/include/wlr/types/wlr_seat.h
+++ b/include/wlr/types/wlr_seat.h
@@ -181,19 +181,25 @@ struct wlr_seat {
uint32_t capabilities;
struct timespec last_event;
- struct wlr_data_source *selection_data_source;
+ struct wlr_data_source *selection_source;
uint32_t selection_serial;
struct wlr_primary_selection_source *primary_selection_source;
uint32_t primary_selection_serial;
+ // `drag` goes away before `drag_source`, when the implicit grab ends
+ struct wlr_drag *drag;
+ struct wlr_data_source *drag_source;
+ uint32_t drag_serial;
+
struct wlr_seat_pointer_state pointer_state;
struct wlr_seat_keyboard_state keyboard_state;
struct wlr_seat_touch_state touch_state;
struct wl_listener display_destroy;
- struct wl_listener selection_data_source_destroy;
+ struct wl_listener selection_source_destroy;
struct wl_listener primary_selection_source_destroy;
+ struct wl_listener drag_source_destroy;
struct {
struct wl_signal pointer_grab_begin;
@@ -210,6 +216,7 @@ struct wlr_seat {
struct wl_signal selection;
struct wl_signal primary_selection;
+ struct wl_signal start_drag;
struct wl_signal new_drag_icon;
struct wl_signal destroy;