[mutter/wip/carlosg/split-data-device: 47/48] wayland: Move the primary data device manager to its own file
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/split-data-device: 47/48] wayland: Move the primary data device manager to its own file
- Date: Thu, 16 Apr 2020 19:29:56 +0000 (UTC)
commit bddda3c6b004e2120df2e6e95fd013eb8ac8bacc
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu Apr 9 17:51:59 2020 +0200
wayland: Move the primary data device manager to its own file
Instead of having everything clumped at MetaWaylandDataManager,
split the primary selection to its own struct. This manager is
handled separately from wl_data_device_manager and other selection
managers, so they would be able to interoperate between them, even.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1193
src/meson.build | 2 +
src/wayland/meta-wayland-data-device-primary.c | 354 +++++++++++++++++++++++++
src/wayland/meta-wayland-data-device-primary.h | 54 ++++
src/wayland/meta-wayland-data-device.c | 223 +---------------
src/wayland/meta-wayland-data-device.h | 6 -
src/wayland/meta-wayland-seat.c | 3 +
src/wayland/meta-wayland-seat.h | 2 +
src/wayland/meta-wayland-types.h | 1 +
src/wayland/meta-wayland.c | 1 +
9 files changed, 418 insertions(+), 228 deletions(-)
---
diff --git a/src/meson.build b/src/meson.build
index c73d724b6..cee1e8565 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -496,6 +496,8 @@ if have_wayland
'wayland/meta-wayland-cursor-surface.h',
'wayland/meta-wayland-data-device.c',
'wayland/meta-wayland-data-device.h',
+ 'wayland/meta-wayland-data-device-primary.c',
+ 'wayland/meta-wayland-data-device-primary.h',
'wayland/meta-wayland-data-offer.c',
'wayland/meta-wayland-data-offer.h',
'wayland/meta-wayland-data-offer-primary.c',
diff --git a/src/wayland/meta-wayland-data-device-primary.c b/src/wayland/meta-wayland-data-device-primary.c
new file mode 100644
index 000000000..53de7f80f
--- /dev/null
+++ b/src/wayland/meta-wayland-data-device-primary.c
@@ -0,0 +1,354 @@
+/*
+ * Copyright © 2011 Kristian Høgsberg
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/* The file is based on src/data-device.c from Weston */
+
+#include "config.h"
+
+#include "wayland/meta-wayland-data-device-primary.h"
+
+#include "compositor/meta-dnd-actor-private.h"
+#include "meta/meta-selection-source-memory.h"
+#include "wayland/meta-selection-source-wayland-private.h"
+#include "wayland/meta-wayland-data-offer-primary.h"
+#include "wayland/meta-wayland-data-source-primary.h"
+#include "wayland/meta-wayland-dnd-surface.h"
+#include "wayland/meta-wayland-pointer.h"
+#include "wayland/meta-wayland-private.h"
+#include "wayland/meta-wayland-seat.h"
+
+#include "gtk-primary-selection-server-protocol.h"
+
+static struct wl_resource * create_and_send_primary_offer (MetaWaylandDataDevicePrimary *data_device,
+ struct wl_resource *target);
+
+static void
+unbind_resource (struct wl_resource *resource)
+{
+ wl_list_remove (wl_resource_get_link (resource));
+}
+
+static void
+default_destructor (struct wl_client *client,
+ struct wl_resource *resource)
+{
+ wl_resource_destroy (resource);
+}
+
+static void
+set_selection_source (MetaWaylandDataDevicePrimary *data_device,
+ MetaSelectionSource *selection_source)
+
+{
+ MetaDisplay *display = meta_get_display ();
+
+ meta_selection_set_owner (meta_display_get_selection (display),
+ META_SELECTION_PRIMARY,
+ selection_source);
+ g_set_object (&data_device->owner, selection_source);
+}
+
+static void
+unset_selection_source (MetaWaylandDataDevicePrimary *data_device)
+{
+ MetaDisplay *display = meta_get_display ();
+
+ if (!data_device->owner)
+ return;
+
+ meta_selection_unset_owner (meta_display_get_selection (display),
+ META_SELECTION_PRIMARY,
+ data_device->owner);
+ g_clear_object (&data_device->owner);
+}
+
+static void
+primary_source_destroyed (gpointer data,
+ GObject *object_was_here)
+{
+ MetaWaylandDataDevicePrimary *data_device = data;
+ MetaWaylandSeat *seat = wl_container_of (data_device, seat, primary_data_device);
+ struct wl_client *focus_client = NULL;
+
+ data_device->data_source = NULL;
+
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
+ if (focus_client)
+ {
+ struct wl_resource *data_device_resource;
+
+ data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client);
+ if (data_device_resource)
+ gtk_primary_selection_device_send_selection (data_device_resource, NULL);
+ }
+
+ unset_selection_source (data_device);
+}
+
+static void
+meta_wayland_data_device_primary_set_selection (MetaWaylandDataDevicePrimary *data_device,
+ MetaWaylandDataSource *source,
+ uint32_t serial)
+{
+ MetaWaylandSeat *seat = wl_container_of (data_device, seat, primary_data_device);
+ struct wl_resource *data_device_resource;
+ struct wl_client *focus_client;
+ MetaSelectionSource *selection_source;
+
+ g_assert (!source || META_IS_WAYLAND_DATA_SOURCE_PRIMARY (source));
+
+ if (data_device->data_source &&
+ data_device->serial - serial < UINT32_MAX / 2)
+ return;
+
+ if (data_device->data_source)
+ {
+ meta_wayland_data_source_cancel (data_device->data_source);
+ g_object_weak_unref (G_OBJECT (data_device->data_source),
+ primary_source_destroyed,
+ data_device);
+ }
+
+ data_device->data_source = source;
+ data_device->serial = serial;
+
+ if (source)
+ {
+ meta_wayland_data_source_set_seat (source, seat);
+ g_object_weak_ref (G_OBJECT (source),
+ primary_source_destroyed,
+ data_device);
+
+ selection_source = meta_selection_source_wayland_new (source);
+ }
+ else
+ {
+ selection_source = g_object_new (META_TYPE_SELECTION_SOURCE_MEMORY, NULL);
+ }
+
+ set_selection_source (data_device, selection_source);
+ g_object_unref (selection_source);
+
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
+ if (focus_client)
+ {
+ data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client);
+ if (data_device_resource)
+ {
+ struct wl_resource *offer;
+ offer = create_and_send_primary_offer (data_device, data_device_resource);
+ gtk_primary_selection_device_send_selection (data_device_resource, offer);
+ }
+ }
+}
+
+static void
+primary_device_set_selection (struct wl_client *client,
+ struct wl_resource *resource,
+ struct wl_resource *source_resource,
+ uint32_t serial)
+{
+ MetaWaylandDataDevicePrimary *data_device = wl_resource_get_user_data (resource);
+ MetaWaylandSeat *seat = wl_container_of (data_device, seat, primary_data_device);
+ MetaWaylandDataSource *source = NULL;
+
+ if (source_resource)
+ source = wl_resource_get_user_data (source_resource);
+
+ if (wl_resource_get_client (resource) !=
+ meta_wayland_keyboard_get_focus_client (seat->keyboard))
+ return;
+
+ meta_wayland_data_device_primary_set_selection (data_device, source, serial);
+}
+
+static const struct gtk_primary_selection_device_interface primary_device_interface = {
+ primary_device_set_selection,
+ default_destructor,
+};
+
+static void
+owner_changed_cb (MetaSelection *selection,
+ MetaSelectionType selection_type,
+ MetaSelectionSource *new_owner,
+ MetaWaylandDataDevicePrimary *data_device)
+{
+ MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
+ MetaWaylandSeat *seat = compositor->seat;
+ struct wl_resource *data_device_resource;
+ struct wl_client *focus_client;
+
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
+ if (!focus_client)
+ return;
+
+ if (selection_type == META_SELECTION_PRIMARY)
+ {
+ data_device_resource =
+ wl_resource_find_for_client (&data_device->resource_list,
+ focus_client);
+ if (data_device_resource)
+ {
+ struct wl_resource *offer = NULL;
+
+ if (new_owner)
+ {
+ offer = create_and_send_primary_offer (data_device,
+ data_device_resource);
+ }
+
+ gtk_primary_selection_device_send_selection (data_device_resource,
+ offer);
+ }
+ }
+}
+
+static void
+ensure_owners_changed_handler_connected (MetaWaylandDataDevicePrimary *data_device)
+{
+ if (data_device->selection_owner_signal_id != 0)
+ return;
+
+ data_device->selection_owner_signal_id =
+ g_signal_connect (meta_display_get_selection (meta_get_display ()),
+ "owner-changed",
+ G_CALLBACK (owner_changed_cb), data_device);
+}
+
+static void
+primary_device_manager_create_source (struct wl_client *client,
+ struct wl_resource *manager_resource,
+ guint32 id)
+{
+ struct wl_resource *source_resource;
+
+ source_resource =
+ wl_resource_create (client, >k_primary_selection_source_interface,
+ wl_resource_get_version (manager_resource),
+ id);
+ meta_wayland_data_source_primary_new (source_resource);
+}
+
+static void
+primary_device_manager_get_device (struct wl_client *client,
+ struct wl_resource *manager_resource,
+ guint32 id,
+ struct wl_resource *seat_resource)
+{
+ MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
+ struct wl_resource *cr;
+
+ cr = wl_resource_create (client, >k_primary_selection_device_interface,
+ wl_resource_get_version (manager_resource), id);
+ wl_resource_set_implementation (cr, &primary_device_interface,
+ &seat->primary_data_device, unbind_resource);
+ wl_list_insert (&seat->primary_data_device.resource_list, wl_resource_get_link (cr));
+
+ ensure_owners_changed_handler_connected (&seat->primary_data_device);
+}
+
+static const struct gtk_primary_selection_device_manager_interface primary_manager_interface = {
+ primary_device_manager_create_source,
+ primary_device_manager_get_device,
+ default_destructor,
+};
+
+static void
+bind_primary_manager (struct wl_client *client,
+ void *data,
+ uint32_t version,
+ uint32_t id)
+{
+ struct wl_resource *resource;
+
+ resource = wl_resource_create (client, >k_primary_selection_device_manager_interface,
+ version, id);
+ wl_resource_set_implementation (resource, &primary_manager_interface, NULL, NULL);
+}
+
+void
+meta_wayland_data_device_primary_manager_init (MetaWaylandCompositor *compositor)
+{
+ if (wl_global_create (compositor->wayland_display,
+ >k_primary_selection_device_manager_interface,
+ 1, NULL, bind_primary_manager) == NULL)
+ g_error ("Could not create data_device");
+}
+
+void
+meta_wayland_data_device_primary_init (MetaWaylandDataDevicePrimary *data_device)
+{
+ wl_list_init (&data_device->resource_list);
+}
+
+static struct wl_resource *
+create_and_send_primary_offer (MetaWaylandDataDevicePrimary *data_device,
+ struct wl_resource *target)
+{
+ MetaWaylandDataOffer *offer;
+ MetaDisplay *display = meta_get_display ();
+ struct wl_resource *resource;
+ GList *mimetypes, *l;
+
+ mimetypes = meta_selection_get_mimetypes (meta_display_get_selection (display),
+ META_SELECTION_PRIMARY);
+ if (!mimetypes)
+ return NULL;
+
+ offer = meta_wayland_data_offer_primary_new (target);
+ resource = meta_wayland_data_offer_get_resource (offer);
+
+ gtk_primary_selection_device_send_data_offer (target, resource);
+
+ for (l = mimetypes; l; l = l->next)
+ gtk_primary_selection_offer_send_offer (resource, l->data);
+
+ g_list_free_full (mimetypes, g_free);
+
+ return resource;
+}
+
+void
+meta_wayland_data_device_primary_set_keyboard_focus (MetaWaylandDataDevicePrimary *data_device)
+{
+ MetaWaylandSeat *seat = wl_container_of (data_device, seat, primary_data_device);
+ struct wl_client *focus_client;
+ struct wl_resource *data_device_resource;
+
+ focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
+
+ if (focus_client == data_device->focus_client)
+ return;
+
+ data_device->focus_client = focus_client;
+
+ if (!focus_client)
+ return;
+
+ data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client);
+ if (data_device_resource)
+ {
+ struct wl_resource *offer;
+ offer = create_and_send_primary_offer (data_device, data_device_resource);
+ gtk_primary_selection_device_send_selection (data_device_resource, offer);
+ }
+}
diff --git a/src/wayland/meta-wayland-data-device-primary.h b/src/wayland/meta-wayland-data-device-primary.h
new file mode 100644
index 000000000..401dae853
--- /dev/null
+++ b/src/wayland/meta-wayland-data-device-primary.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright © 2008 Kristian Høgsberg
+ * 2020 Red Hat Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. The copyright holders make no representations
+ * about the suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef META_WAYLAND_DATA_DEVICE_PRIMARY_H
+#define META_WAYLAND_DATA_DEVICE_PRIMARY_H
+
+#include <glib-object.h>
+#include <wayland-server.h>
+
+#include "clutter/clutter.h"
+#include "meta/meta-selection-source.h"
+#include "wayland/meta-wayland-data-offer.h"
+#include "wayland/meta-wayland-data-source.h"
+#include "wayland/meta-wayland-types.h"
+
+struct _MetaWaylandDataDevicePrimary
+{
+ uint32_t serial;
+ MetaWaylandDataSource *data_source;
+ struct wl_list resource_list;
+ struct wl_client *focus_client;
+
+ guint selection_owner_signal_id;
+
+ MetaSelectionSource *owner;
+};
+
+void meta_wayland_data_device_primary_manager_init (MetaWaylandCompositor *compositor);
+
+void meta_wayland_data_device_primary_init (MetaWaylandDataDevicePrimary *data_device);
+
+void meta_wayland_data_device_primary_set_keyboard_focus (MetaWaylandDataDevicePrimary *data_device);
+
+#endif /* META_WAYLAND_DATA_DEVICE_PRIMARY_H */
diff --git a/src/wayland/meta-wayland-data-device.c b/src/wayland/meta-wayland-data-device.c
index a31a5d93a..15dd1c074 100644
--- a/src/wayland/meta-wayland-data-device.c
+++ b/src/wayland/meta-wayland-data-device.c
@@ -25,7 +25,6 @@
#include "config.h"
#include "wayland/meta-wayland-data-device.h"
-#include "wayland/meta-wayland-data-source-primary.h"
#include <gio/gunixoutputstream.h>
#include <glib-unix.h>
@@ -38,14 +37,11 @@
#include "compositor/meta-dnd-actor-private.h"
#include "meta/meta-selection-source-memory.h"
#include "wayland/meta-selection-source-wayland-private.h"
-#include "wayland/meta-wayland-data-offer-primary.h"
#include "wayland/meta-wayland-dnd-surface.h"
#include "wayland/meta-wayland-pointer.h"
#include "wayland/meta-wayland-private.h"
#include "wayland/meta-wayland-seat.h"
-#include "gtk-primary-selection-server-protocol.h"
-
#define ROOTWINDOW_DROP_MIME "application/x-rootwindow-drop"
static void unset_selection_source (MetaWaylandDataDevice *data_device,
@@ -56,8 +52,6 @@ drag_grab_data_source_destroyed (gpointer data, GObject *where_the_object_was);
static struct wl_resource * create_and_send_clipboard_offer (MetaWaylandDataDevice *data_device,
struct wl_resource *target);
-static struct wl_resource * create_and_send_primary_offer (MetaWaylandDataDevice *data_device,
- struct wl_resource *target);
static void
unbind_resource (struct wl_resource *resource)
@@ -953,112 +947,6 @@ static const struct wl_data_device_interface data_device_interface = {
default_destructor,
};
-static void
-primary_source_destroyed (gpointer data,
- GObject *object_was_here)
-{
- MetaWaylandDataDevice *data_device = data;
- MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device);
- struct wl_client *focus_client = NULL;
-
- data_device->primary_data_source = NULL;
-
- focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
- if (focus_client)
- {
- struct wl_resource *data_device_resource;
-
- data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client);
- if (data_device_resource)
- gtk_primary_selection_device_send_selection (data_device_resource, NULL);
- }
-
- unset_selection_source (data_device, META_SELECTION_PRIMARY);
-}
-
-void
-meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device,
- MetaWaylandDataSource *source,
- guint32 serial)
-{
- MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device);
- struct wl_resource *data_device_resource;
- struct wl_client *focus_client;
- MetaSelectionSource *selection_source;
-
- g_assert (!source || META_IS_WAYLAND_DATA_SOURCE_PRIMARY (source));
-
- if (data_device->primary_data_source &&
- data_device->primary_serial - serial < UINT32_MAX / 2)
- return;
-
- if (data_device->primary_data_source)
- {
- meta_wayland_data_source_cancel (data_device->primary_data_source);
- g_object_weak_unref (G_OBJECT (data_device->primary_data_source),
- primary_source_destroyed,
- data_device);
- }
-
- data_device->primary_data_source = source;
- data_device->primary_serial = serial;
-
- if (source)
- {
- meta_wayland_data_source_set_seat (source, seat);
- g_object_weak_ref (G_OBJECT (source),
- primary_source_destroyed,
- data_device);
-
- selection_source = meta_selection_source_wayland_new (source);
- }
- else
- {
- selection_source = g_object_new (META_TYPE_SELECTION_SOURCE_MEMORY, NULL);
- }
-
- set_selection_source (data_device, META_SELECTION_PRIMARY,
- selection_source);
- g_object_unref (selection_source);
-
- focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
- if (focus_client)
- {
- data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client);
- if (data_device_resource)
- {
- struct wl_resource *offer;
- offer = create_and_send_primary_offer (data_device, data_device_resource);
- gtk_primary_selection_device_send_selection (data_device_resource, offer);
- }
- }
-}
-
-static void
-primary_device_set_selection (struct wl_client *client,
- struct wl_resource *resource,
- struct wl_resource *source_resource,
- uint32_t serial)
-{
- MetaWaylandDataDevice *data_device = wl_resource_get_user_data (resource);
- MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device);
- MetaWaylandDataSource *source = NULL;
-
- if (source_resource)
- source = wl_resource_get_user_data (source_resource);
-
- if (wl_resource_get_client (resource) !=
- meta_wayland_keyboard_get_focus_client (seat->keyboard))
- return;
-
- meta_wayland_data_device_set_primary (data_device, source, serial);
-}
-
-static const struct gtk_primary_selection_device_interface primary_device_interface = {
- primary_device_set_selection,
- default_destructor,
-};
-
static void
create_data_source (struct wl_client *client,
struct wl_resource *resource, guint32 id)
@@ -1085,26 +973,7 @@ owner_changed_cb (MetaSelection *selection,
if (!focus_client)
return;
- if (selection_type == META_SELECTION_PRIMARY)
- {
- data_device_resource =
- wl_resource_find_for_client (&data_device->primary_resource_list,
- focus_client);
- if (data_device_resource)
- {
- struct wl_resource *offer = NULL;
-
- if (new_owner)
- {
- offer = create_and_send_primary_offer (data_device,
- data_device_resource);
- }
-
- gtk_primary_selection_device_send_selection (data_device_resource,
- offer);
- }
- }
- else if (selection_type == META_SELECTION_CLIPBOARD)
+ if (selection_type == META_SELECTION_CLIPBOARD)
{
data_device_resource =
wl_resource_find_for_client (&data_device->resource_list, focus_client);
@@ -1156,44 +1025,6 @@ static const struct wl_data_device_manager_interface manager_interface = {
get_data_device
};
-static void
-primary_device_manager_create_source (struct wl_client *client,
- struct wl_resource *manager_resource,
- guint32 id)
-{
- struct wl_resource *source_resource;
-
- source_resource =
- wl_resource_create (client, >k_primary_selection_source_interface,
- wl_resource_get_version (manager_resource),
- id);
- meta_wayland_data_source_primary_new (source_resource);
-}
-
-static void
-primary_device_manager_get_device (struct wl_client *client,
- struct wl_resource *manager_resource,
- guint32 id,
- struct wl_resource *seat_resource)
-{
- MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
- struct wl_resource *cr;
-
- cr = wl_resource_create (client, >k_primary_selection_device_interface,
- wl_resource_get_version (manager_resource), id);
- wl_resource_set_implementation (cr, &primary_device_interface,
- &seat->data_device, unbind_resource);
- wl_list_insert (&seat->data_device.primary_resource_list, wl_resource_get_link (cr));
-
- ensure_owners_changed_handler_connected (&seat->data_device);
-}
-
-static const struct gtk_primary_selection_device_manager_interface primary_manager_interface = {
- primary_device_manager_create_source,
- primary_device_manager_get_device,
- default_destructor,
-};
-
static void
bind_manager (struct wl_client *client,
void *data, guint32 version, guint32 id)
@@ -1203,19 +1034,6 @@ bind_manager (struct wl_client *client,
wl_resource_set_implementation (resource, &manager_interface, NULL, NULL);
}
-static void
-bind_primary_manager (struct wl_client *client,
- void *data,
- uint32_t version,
- uint32_t id)
-{
- struct wl_resource *resource;
-
- resource = wl_resource_create (client, >k_primary_selection_device_manager_interface,
- version, id);
- wl_resource_set_implementation (resource, &primary_manager_interface, NULL, NULL);
-}
-
void
meta_wayland_data_device_manager_init (MetaWaylandCompositor *compositor)
{
@@ -1224,18 +1042,12 @@ meta_wayland_data_device_manager_init (MetaWaylandCompositor *compositor)
META_WL_DATA_DEVICE_MANAGER_VERSION,
NULL, bind_manager) == NULL)
g_error ("Could not create data_device");
-
- if (wl_global_create (compositor->wayland_display,
- >k_primary_selection_device_manager_interface,
- 1, NULL, bind_primary_manager) == NULL)
- g_error ("Could not create data_device");
}
void
meta_wayland_data_device_init (MetaWaylandDataDevice *data_device)
{
wl_list_init (&data_device->resource_list);
- wl_list_init (&data_device->primary_resource_list);
}
static struct wl_resource *
@@ -1265,31 +1077,6 @@ create_and_send_clipboard_offer (MetaWaylandDataDevice *data_device,
return resource;
}
-static struct wl_resource *
-create_and_send_primary_offer (MetaWaylandDataDevice *data_device,
- struct wl_resource *target)
-{
- MetaWaylandDataOffer *offer;
- MetaDisplay *display = meta_get_display ();
- GList *mimetypes, *l;
-
- mimetypes = meta_selection_get_mimetypes (meta_display_get_selection (display),
- META_SELECTION_PRIMARY);
- if (!mimetypes)
- return NULL;
-
- offer = meta_wayland_data_offer_primary_new (target);
-
- gtk_primary_selection_device_send_data_offer (target, offer->resource);
-
- for (l = mimetypes; l; l = l->next)
- gtk_primary_selection_offer_send_offer (offer->resource, l->data);
-
- g_list_free_full (mimetypes, g_free);
-
- return offer->resource;
-}
-
void
meta_wayland_data_device_set_keyboard_focus (MetaWaylandDataDevice *data_device)
{
@@ -1314,14 +1101,6 @@ meta_wayland_data_device_set_keyboard_focus (MetaWaylandDataDevice *data_device)
offer = create_and_send_clipboard_offer (data_device, data_device_resource);
wl_data_device_send_selection (data_device_resource, offer);
}
-
- data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client);
- if (data_device_resource)
- {
- struct wl_resource *offer;
- offer = create_and_send_primary_offer (data_device, data_device_resource);
- gtk_primary_selection_device_send_selection (data_device_resource, offer);
- }
}
gboolean
diff --git a/src/wayland/meta-wayland-data-device.h b/src/wayland/meta-wayland-data-device.h
index 292cf56c4..24591a672 100644
--- a/src/wayland/meta-wayland-data-device.h
+++ b/src/wayland/meta-wayland-data-device.h
@@ -38,13 +38,10 @@ typedef struct _MetaWaylandDataSourceFuncs MetaWaylandDataSourceFuncs;
struct _MetaWaylandDataDevice
{
uint32_t selection_serial;
- uint32_t primary_serial;
MetaWaylandDataSource *selection_data_source;
MetaWaylandDataSource *dnd_data_source;
- MetaWaylandDataSource *primary_data_source;
struct wl_listener selection_data_source_listener;
struct wl_list resource_list;
- struct wl_list primary_resource_list;
MetaWaylandDragGrab *current_grab;
struct wl_client *focus_client;
@@ -70,9 +67,6 @@ void meta_wayland_data_device_set_dnd_source (MetaWaylandDataDevice *data_de
void meta_wayland_data_device_set_selection (MetaWaylandDataDevice *data_device,
MetaWaylandDataSource *source,
guint32 serial);
-void meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device,
- MetaWaylandDataSource *source,
- guint32 serial);
void meta_wayland_data_device_unset_dnd_selection (MetaWaylandDataDevice *data_device);
const MetaWaylandDragDestFuncs *
diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c
index 8f5be63fa..ca243d56e 100644
--- a/src/wayland/meta-wayland-seat.c
+++ b/src/wayland/meta-wayland-seat.c
@@ -24,6 +24,7 @@
#include "wayland/meta-wayland-seat.h"
#include "wayland/meta-wayland-data-device.h"
+#include "wayland/meta-wayland-data-device-primary.h"
#include "wayland/meta-wayland-private.h"
#include "wayland/meta-wayland-tablet-seat.h"
#include "wayland/meta-wayland-versions.h"
@@ -231,6 +232,7 @@ meta_wayland_seat_new (MetaWaylandCompositor *compositor,
seat->gtk_text_input = meta_wayland_gtk_text_input_new (seat);
meta_wayland_data_device_init (&seat->data_device);
+ meta_wayland_data_device_primary_init (&seat->primary_data_device);
clutter_seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
meta_wayland_seat_update_capabilities (seat, clutter_seat);
@@ -431,6 +433,7 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat,
{
meta_wayland_keyboard_set_focus (seat->keyboard, surface);
meta_wayland_data_device_set_keyboard_focus (&seat->data_device);
+ meta_wayland_data_device_primary_set_keyboard_focus (&seat->primary_data_device);
}
tablet_seat = meta_wayland_tablet_manager_ensure_seat (compositor->tablet_manager, seat);
diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h
index 3a744d058..d9be100af 100644
--- a/src/wayland/meta-wayland-seat.h
+++ b/src/wayland/meta-wayland-seat.h
@@ -26,6 +26,7 @@
#include "clutter/clutter.h"
#include "wayland/meta-wayland-data-device.h"
+#include "wayland/meta-wayland-data-device-primary.h"
#include "wayland/meta-wayland-input-device.h"
#include "wayland/meta-wayland-keyboard.h"
#include "wayland/meta-wayland-pointer.h"
@@ -45,6 +46,7 @@ struct _MetaWaylandSeat
MetaWaylandTouch *touch;
MetaWaylandDataDevice data_device;
+ MetaWaylandDataDevicePrimary primary_data_device;
MetaWaylandGtkTextInput *gtk_text_input;
MetaWaylandTextInput *text_input;
diff --git a/src/wayland/meta-wayland-types.h b/src/wayland/meta-wayland-types.h
index fbdf81292..23d066d56 100644
--- a/src/wayland/meta-wayland-types.h
+++ b/src/wayland/meta-wayland-types.h
@@ -37,6 +37,7 @@ typedef struct _MetaWaylandTouch MetaWaylandTouch;
typedef struct _MetaWaylandDragDestFuncs MetaWaylandDragDestFuncs;
typedef struct _MetaWaylandDataOffer MetaWaylandDataOffer;
typedef struct _MetaWaylandDataDevice MetaWaylandDataDevice;
+typedef struct _MetaWaylandDataDevicePrimary MetaWaylandDataDevicePrimary;
typedef struct _MetaWaylandTabletManager MetaWaylandTabletManager;
typedef struct _MetaWaylandTabletSeat MetaWaylandTabletSeat;
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index b2eab006b..86ad781d1 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -395,6 +395,7 @@ meta_wayland_init (void)
meta_wayland_outputs_init (compositor);
meta_wayland_data_device_manager_init (compositor);
+ meta_wayland_data_device_primary_manager_init (compositor);
meta_wayland_subsurfaces_init (compositor);
meta_wayland_shell_init (compositor);
meta_wayland_pointer_gestures_init (compositor);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]