aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-12-02 13:16:50 -0500
committerGitHub <noreply@github.com>2018-12-02 13:16:50 -0500
commit8887508fed89d59486a4abcff7a2071326ca8207 (patch)
tree169bfbf09bf0d533da13f4965b896cb1a97dc86b /include
parent3f5f4cec88868818105bdc297f89d51fa378d99d (diff)
parent9f0720c03abcc600b6156b52e367d7cafcf57644 (diff)
Merge pull request #1397 from emersion/refactor-primary-selection
gtk-primary-selection: refactor everything, untie from seat
Diffstat (limited to 'include')
-rw-r--r--include/wlr/types/meson.build1
-rw-r--r--include/wlr/types/wlr_gtk_primary_selection.h46
-rw-r--r--include/wlr/types/wlr_primary_selection.h54
-rw-r--r--include/wlr/types/wlr_seat.h15
-rw-r--r--include/wlr/xwayland.h4
-rw-r--r--include/xwayland/selection.h4
6 files changed, 87 insertions, 37 deletions
diff --git a/include/wlr/types/meson.build b/include/wlr/types/meson.build
index df611970..491d4a50 100644
--- a/include/wlr/types/meson.build
+++ b/include/wlr/types/meson.build
@@ -23,6 +23,7 @@ install_headers(
'wlr_output.h',
'wlr_pointer.h',
'wlr_presentation_time.h',
+ 'wlr_primary_selection.h',
'wlr_region.h',
'wlr_screencopy_v1.h',
'wlr_screenshooter.h',
diff --git a/include/wlr/types/wlr_gtk_primary_selection.h b/include/wlr/types/wlr_gtk_primary_selection.h
index f3410f69..7cf34201 100644
--- a/include/wlr/types/wlr_gtk_primary_selection.h
+++ b/include/wlr/types/wlr_gtk_primary_selection.h
@@ -14,7 +14,8 @@
struct wlr_gtk_primary_selection_device_manager {
struct wl_global *global;
- struct wl_list resources;
+ struct wl_list resources; // wl_resource_get_link
+ struct wl_list devices; // wlr_gtk_primary_selection_device::link
struct wl_listener display_destroy;
@@ -25,30 +26,20 @@ struct wlr_gtk_primary_selection_device_manager {
void *data;
};
-struct wlr_gtk_primary_selection_source {
- // source metadata
- struct wl_array mime_types;
-
- // source implementation
- void (*send)(struct wlr_gtk_primary_selection_source *source,
- const char *mime_type, int32_t fd);
- void (*cancel)(struct wlr_gtk_primary_selection_source *source);
-
- // source status
- struct wlr_seat_client *seat_client;
-
- struct {
- struct wl_signal destroy;
- } events;
-
- void *data;
-};
+/**
+ * A device is a per-seat object used to set and get the current selection.
+ */
+struct wlr_gtk_primary_selection_device {
+ struct wlr_gtk_primary_selection_device_manager *manager;
+ struct wlr_seat *seat;
+ struct wl_list link; // wlr_gtk_primary_selection_device_manager::devices
+ struct wl_list resources; // wl_resource_get_link
-struct wlr_gtk_primary_selection_offer {
- struct wl_resource *resource;
- struct wlr_gtk_primary_selection_source *source;
+ struct wl_list offers; // wl_resource_get_link
- struct wl_listener source_destroy;
+ struct wl_listener seat_destroy;
+ struct wl_listener seat_focus_change;
+ struct wl_listener seat_primary_selection;
void *data;
};
@@ -58,13 +49,4 @@ struct wlr_gtk_primary_selection_device_manager *
void wlr_gtk_primary_selection_device_manager_destroy(
struct wlr_gtk_primary_selection_device_manager *manager);
-void wlr_seat_client_send_gtk_primary_selection(struct wlr_seat_client *seat_client);
-void wlr_seat_set_gtk_primary_selection(struct wlr_seat *seat,
- struct wlr_gtk_primary_selection_source *source, uint32_t serial);
-
-void wlr_gtk_primary_selection_source_init(
- struct wlr_gtk_primary_selection_source *source);
-void wlr_gtk_primary_selection_source_finish(
- struct wlr_gtk_primary_selection_source *source);
-
#endif
diff --git a/include/wlr/types/wlr_primary_selection.h b/include/wlr/types/wlr_primary_selection.h
new file mode 100644
index 00000000..9be61acc
--- /dev/null
+++ b/include/wlr/types/wlr_primary_selection.h
@@ -0,0 +1,54 @@
+/*
+ * 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
+
+#ifndef WLR_TYPES_WLR_PRIMARY_SELECTION_H
+#define WLR_TYPES_WLR_PRIMARY_SELECTION_H
+
+#include <wayland-server.h>
+#include <wlr/types/wlr_seat.h>
+
+struct wlr_primary_selection_source;
+
+/**
+ * A data source implementation. Only the `send` function is mandatory.
+ */
+struct wlr_primary_selection_source_impl {
+ void (*send)(struct wlr_primary_selection_source *source,
+ const char *mime_type, int fd);
+ void (*destroy)(struct wlr_primary_selection_source *source);
+};
+
+/**
+ * A source is the sending side of a selection.
+ */
+struct wlr_primary_selection_source {
+ const struct wlr_primary_selection_source_impl *impl;
+
+ // source metadata
+ struct wl_array mime_types;
+
+ struct {
+ struct wl_signal destroy;
+ } events;
+
+ void *data;
+};
+
+void wlr_primary_selection_source_init(
+ struct wlr_primary_selection_source *source,
+ const struct wlr_primary_selection_source_impl *impl);
+void wlr_primary_selection_source_destroy(
+ struct wlr_primary_selection_source *source);
+void wlr_primary_selection_source_send(
+ struct wlr_primary_selection_source *source, const char *mime_type,
+ int fd);
+
+void wlr_seat_set_primary_selection(struct wlr_seat *seat,
+ struct wlr_primary_selection_source *source);
+
+#endif
diff --git a/include/wlr/types/wlr_seat.h b/include/wlr/types/wlr_seat.h
index 9670e6a5..942a3420 100644
--- a/include/wlr/types/wlr_seat.h
+++ b/include/wlr/types/wlr_seat.h
@@ -30,7 +30,6 @@ struct wlr_seat_client {
struct wl_list keyboards;
struct wl_list touches;
struct wl_list data_devices;
- struct wl_list primary_selection_devices;
struct {
struct wl_signal destroy;
@@ -168,6 +167,10 @@ struct wlr_seat_keyboard_state {
struct wlr_seat_keyboard_grab *grab;
struct wlr_seat_keyboard_grab *default_grab;
+
+ struct {
+ struct wl_signal focus_change; // wlr_seat_keyboard_focus_change_event
+ } events;
};
struct wlr_seat_touch_state {
@@ -181,6 +184,8 @@ struct wlr_seat_touch_state {
struct wlr_seat_touch_grab *default_grab;
};
+struct wlr_primary_selection_source;
+
struct wlr_seat {
struct wl_global *global;
struct wl_display *display;
@@ -194,8 +199,7 @@ struct wlr_seat {
struct wlr_data_source *selection_source;
uint32_t selection_serial;
- struct wlr_gtk_primary_selection_source *primary_selection_source;
- uint32_t primary_selection_serial;
+ struct wlr_primary_selection_source *primary_selection_source;
// `drag` goes away before `drag_source`, when the implicit grab ends
struct wlr_drag *drag;
@@ -248,6 +252,11 @@ struct wlr_seat_pointer_focus_change_event {
double sx, sy;
};
+struct wlr_seat_keyboard_focus_change_event {
+ struct wlr_seat *seat;
+ struct wlr_surface *old_surface, *new_surface;
+};
+
/**
* Allocates a new wlr_seat and adds a wl_seat global to the display.
*/
diff --git a/include/wlr/xwayland.h b/include/wlr/xwayland.h
index 8247aa15..40cc8848 100644
--- a/include/wlr/xwayland.h
+++ b/include/wlr/xwayland.h
@@ -18,6 +18,7 @@
struct wlr_xwm;
struct wlr_xwayland_cursor;
+struct wlr_gtk_primary_selection_device_manager;
struct wlr_xwayland {
pid_t pid;
@@ -42,13 +43,14 @@ struct wlr_xwayland {
struct wl_display *wl_display;
struct wlr_compositor *compositor;
struct wlr_seat *seat;
- struct wl_listener seat_destroy;
struct {
struct wl_signal ready;
struct wl_signal new_surface;
} events;
+ struct wl_listener seat_destroy;
+
/**
* Add a custom event handler to xwayland. Return 1 if the event was
* handled or 0 to use the default wlr-xwayland handler. wlr-xwayland will
diff --git a/include/xwayland/selection.h b/include/xwayland/selection.h
index 6529e9eb..85201461 100644
--- a/include/xwayland/selection.h
+++ b/include/xwayland/selection.h
@@ -7,6 +7,8 @@
#define XDND_VERSION 5
+struct wlr_primary_selection_source;
+
struct wlr_xwm_selection;
struct wlr_xwm_selection_transfer {
@@ -62,7 +64,7 @@ int xwm_handle_xfixes_selection_notify(struct wlr_xwm *xwm,
xcb_xfixes_selection_notify_event_t *event);
bool data_source_is_xwayland(struct wlr_data_source *wlr_source);
bool primary_selection_source_is_xwayland(
- struct wlr_gtk_primary_selection_source *wlr_source);
+ struct wlr_primary_selection_source *wlr_source);
void xwm_seat_handle_start_drag(struct wlr_xwm *xwm, struct wlr_drag *drag);