From 71f8bab55f7b43da57c23adfeba0145e09426e6c Mon Sep 17 00:00:00 2001 From: Robert Mader <robert.mader@posteo.de> Date: Fri, 2 Oct 2020 09:13:06 +0000 Subject: [PATCH] Bug 1667674 - [Wayland] Support public primary-selection unstable protocol. r=stransky This is required to support pasting the primary selection into Firefox on compositors only supporting the public protocol, such as KWin. Getting the selection *from* Firefox is done via GTK and will be supported from GTK 3.24.23 on. The public protocol, while practically identical, will replace the gtk-private one eventually. However, support for the private one will still be needed for a while. Note: this also updates the auto-generated gtk-primary-selection files. Differential Revision: https://phabricator.services.mozilla.com/D91594 --- .clang-format-ignore | 2 + widget/gtk/nsClipboardWayland.cpp | 133 +++- widget/gtk/nsClipboardWayland.h | 8 +- widget/gtk/nsWaylandDisplay.cpp | 19 +- widget/gtk/nsWaylandDisplay.h | 22 +- .../gtk-primary-selection-client-protocol.h | 2 +- .../wayland/gtk-primary-selection-protocol.c | 53 +- widget/gtk/wayland/moz.build | 4 +- ...ry-selection-unstable-v1-client-protocol.h | 578 ++++++++++++++++++ .../primary-selection-unstable-v1-protocol.c | 116 ++++ 10 files changed, 880 insertions(+), 57 deletions(-) create mode 100644 widget/gtk/wayland/primary-selection-unstable-v1-client-protocol.h create mode 100644 widget/gtk/wayland/primary-selection-unstable-v1-protocol.c diff --git a/.clang-format-ignore b/.clang-format-ignore index be50d9ddb73f1..bcc0d531b9b42 100644 --- a/.clang-format-ignore +++ b/.clang-format-ignore @@ -42,6 +42,8 @@ media/mp4parse-rust/mp4parse.h security/manager/ssl/StaticHPKPins.h widget/gtk/wayland/gtk-primary-selection-client-protocol.h widget/gtk/wayland/gtk-primary-selection-protocol.c +widget/gtk/wayland/primary-selection-unstable-v1-client-protocol.h +widget/gtk/wayland/primary-selection-unstable-v1-protocol.c # Ignored because these files are used to generate a windows.h STL wrapper, # and reformatting them can break generating that wrapper. diff --git a/widget/gtk/nsClipboardWayland.cpp b/widget/gtk/nsClipboardWayland.cpp index 48a8c90257240..f8e1031e9eea8 100644 --- a/widget/gtk/nsClipboardWayland.cpp +++ b/widget/gtk/nsClipboardWayland.cpp @@ -314,15 +314,27 @@ WaylandDataOffer::~WaylandDataOffer(void) { } bool PrimaryDataOffer::RequestDataTransfer(const char* aMimeType, int fd) { - if (mPrimaryDataOffer) { - gtk_primary_selection_offer_receive(mPrimaryDataOffer, aMimeType, fd); + if (mPrimaryDataOfferGtk) { + gtk_primary_selection_offer_receive(mPrimaryDataOfferGtk, aMimeType, fd); + return true; + } + if (mPrimaryDataOfferZwpV1) { + zwp_primary_selection_offer_v1_receive(mPrimaryDataOfferZwpV1, aMimeType, + fd); return true; } return false; } static void primary_data_offer( - void* data, gtk_primary_selection_offer* gtk_primary_selection_offer, + void* data, gtk_primary_selection_offer* primary_selection_offer, + const char* mime_type) { + auto* offer = static_cast<DataOffer*>(data); + offer->AddMIMEType(mime_type); +} + +static void primary_data_offer( + void* data, zwp_primary_selection_offer_v1* primary_selection_offer, const char* mime_type) { auto* offer = static_cast<DataOffer*>(data); offer->AddMIMEType(mime_type); @@ -334,18 +346,31 @@ static void primary_data_offer( * gtk_primary_selection_offer. */ static const struct gtk_primary_selection_offer_listener - primary_selection_offer_listener = {primary_data_offer}; + primary_selection_offer_listener_gtk = {primary_data_offer}; + +static const struct zwp_primary_selection_offer_v1_listener + primary_selection_offer_listener_zwp_v1 = {primary_data_offer}; PrimaryDataOffer::PrimaryDataOffer( gtk_primary_selection_offer* aPrimaryDataOffer) - : mPrimaryDataOffer(aPrimaryDataOffer) { + : mPrimaryDataOfferGtk(aPrimaryDataOffer), mPrimaryDataOfferZwpV1(nullptr) { gtk_primary_selection_offer_add_listener( - aPrimaryDataOffer, &primary_selection_offer_listener, this); + aPrimaryDataOffer, &primary_selection_offer_listener_gtk, this); +} + +PrimaryDataOffer::PrimaryDataOffer( + zwp_primary_selection_offer_v1* aPrimaryDataOffer) + : mPrimaryDataOfferGtk(nullptr), mPrimaryDataOfferZwpV1(aPrimaryDataOffer) { + zwp_primary_selection_offer_v1_add_listener( + aPrimaryDataOffer, &primary_selection_offer_listener_zwp_v1, this); } PrimaryDataOffer::~PrimaryDataOffer(void) { - if (mPrimaryDataOffer) { - gtk_primary_selection_offer_destroy(mPrimaryDataOffer); + if (mPrimaryDataOfferGtk) { + gtk_primary_selection_offer_destroy(mPrimaryDataOfferGtk); + } + if (mPrimaryDataOfferZwpV1) { + zwp_primary_selection_offer_v1_destroy(mPrimaryDataOfferZwpV1); } } @@ -444,6 +469,20 @@ void nsRetrievalContextWayland::RegisterNewDataOffer( } } +void nsRetrievalContextWayland::RegisterNewDataOffer( + zwp_primary_selection_offer_v1* aPrimaryDataOffer) { + DataOffer* dataOffer = static_cast<DataOffer*>( + g_hash_table_lookup(mActiveOffers, aPrimaryDataOffer)); + MOZ_ASSERT( + dataOffer == nullptr, + "Registered PrimaryDataOffer already exists. Wayland protocol error?"); + + if (!dataOffer) { + dataOffer = new PrimaryDataOffer(aPrimaryDataOffer); + g_hash_table_insert(mActiveOffers, aPrimaryDataOffer, dataOffer); + } +} + void nsRetrievalContextWayland::SetClipboardDataOffer( wl_data_offer* aWaylandDataOffer) { // Delete existing clipboard data offer @@ -480,6 +519,24 @@ void nsRetrievalContextWayland::SetPrimaryDataOffer( } } +void nsRetrievalContextWayland::SetPrimaryDataOffer( + zwp_primary_selection_offer_v1* aPrimaryDataOffer) { + // Release any primary offer we have. + mPrimaryOffer = nullptr; + + // aPrimaryDataOffer can be null which means we lost + // the mouse selection. + if (aPrimaryDataOffer) { + DataOffer* dataOffer = static_cast<DataOffer*>( + g_hash_table_lookup(mActiveOffers, aPrimaryDataOffer)); + NS_ASSERTION(dataOffer, "We're missing primary data offer!"); + if (dataOffer) { + g_hash_table_remove(mActiveOffers, aPrimaryDataOffer); + mPrimaryOffer = WrapUnique(dataOffer); + } + } +} + void nsRetrievalContextWayland::AddDragAndDropDataOffer( wl_data_offer* aDropDataOffer) { // Remove any existing D&D contexts. @@ -615,25 +672,44 @@ static const struct wl_data_device_listener data_device_listener = { data_device_data_offer, data_device_enter, data_device_leave, data_device_motion, data_device_drop, data_device_selection}; +static void primary_selection_data_offer( + void* data, struct gtk_primary_selection_device* primary_selection_device, + struct gtk_primary_selection_offer* primary_offer) { + LOGCLIP(("primary_selection_data_offer() callback\n")); + // create and add listener + nsRetrievalContextWayland* context = + static_cast<nsRetrievalContextWayland*>(data); + context->RegisterNewDataOffer(primary_offer); +} + static void primary_selection_data_offer( void* data, - struct gtk_primary_selection_device* gtk_primary_selection_device, - struct gtk_primary_selection_offer* gtk_primary_offer) { + struct zwp_primary_selection_device_v1* primary_selection_device, + struct zwp_primary_selection_offer_v1* primary_offer) { LOGCLIP(("primary_selection_data_offer() callback\n")); // create and add listener nsRetrievalContextWayland* context = static_cast<nsRetrievalContextWayland*>(data); - context->RegisterNewDataOffer(gtk_primary_offer); + context->RegisterNewDataOffer(primary_offer); +} + +static void primary_selection_selection( + void* data, struct gtk_primary_selection_device* primary_selection_device, + struct gtk_primary_selection_offer* primary_offer) { + LOGCLIP(("primary_selection_selection() callback\n")); + nsRetrievalContextWayland* context = + static_cast<nsRetrievalContextWayland*>(data); + context->SetPrimaryDataOffer(primary_offer); } static void primary_selection_selection( void* data, - struct gtk_primary_selection_device* gtk_primary_selection_device, - struct gtk_primary_selection_offer* gtk_primary_offer) { + struct zwp_primary_selection_device_v1* primary_selection_device, + struct zwp_primary_selection_offer_v1* primary_offer) { LOGCLIP(("primary_selection_selection() callback\n")); nsRetrievalContextWayland* context = static_cast<nsRetrievalContextWayland*>(data); - context->SetPrimaryDataOffer(gtk_primary_offer); + context->SetPrimaryDataOffer(primary_offer); } /* gtk_primary_selection_device callback description: @@ -650,13 +726,20 @@ static void primary_selection_selection( * there's no primary selection. */ static const struct gtk_primary_selection_device_listener - primary_selection_device_listener = { + primary_selection_device_listener_gtk = { + primary_selection_data_offer, + primary_selection_selection, +}; + +static const struct zwp_primary_selection_device_v1_listener + primary_selection_device_listener_zwp_v1 = { primary_selection_data_offer, primary_selection_selection, }; bool nsRetrievalContextWayland::HasSelectionSupport(void) { - return mDisplay->GetPrimarySelectionDeviceManager() != nullptr; + return (mDisplay->GetPrimarySelectionDeviceManagerZwpV1() != nullptr || + mDisplay->GetPrimarySelectionDeviceManagerGtk() != nullptr); } nsRetrievalContextWayland::nsRetrievalContextWayland(void) @@ -673,14 +756,20 @@ nsRetrievalContextWayland::nsRetrievalContextWayland(void) mDisplay->GetDataDeviceManager(), mDisplay->GetSeat()); wl_data_device_add_listener(dataDevice, &data_device_listener, this); - gtk_primary_selection_device_manager* manager = - mDisplay->GetPrimarySelectionDeviceManager(); - if (manager) { + if (mDisplay->GetPrimarySelectionDeviceManagerZwpV1()) { + zwp_primary_selection_device_v1* primaryDataDevice = + zwp_primary_selection_device_manager_v1_get_device( + mDisplay->GetPrimarySelectionDeviceManagerZwpV1(), + mDisplay->GetSeat()); + zwp_primary_selection_device_v1_add_listener( + primaryDataDevice, &primary_selection_device_listener_zwp_v1, this); + } else if (mDisplay->GetPrimarySelectionDeviceManagerGtk()) { gtk_primary_selection_device* primaryDataDevice = - gtk_primary_selection_device_manager_get_device(manager, - mDisplay->GetSeat()); + gtk_primary_selection_device_manager_get_device( + mDisplay->GetPrimarySelectionDeviceManagerGtk(), + mDisplay->GetSeat()); gtk_primary_selection_device_add_listener( - primaryDataDevice, &primary_selection_device_listener, this); + primaryDataDevice, &primary_selection_device_listener_gtk, this); } mInitialized = true; diff --git a/widget/gtk/nsClipboardWayland.h b/widget/gtk/nsClipboardWayland.h index 6a1b6c715d73f..ddf5d40dc6dce 100644 --- a/widget/gtk/nsClipboardWayland.h +++ b/widget/gtk/nsClipboardWayland.h @@ -15,8 +15,6 @@ #include "mozilla/UniquePtr.h" #include "nsClipboard.h" #include "nsWaylandDisplay.h" -#include "mozwayland/mozwayland.h" -#include "wayland/gtk-primary-selection-client-protocol.h" struct FastTrackClipboard; @@ -69,6 +67,7 @@ class WaylandDataOffer : public DataOffer { class PrimaryDataOffer : public DataOffer { public: explicit PrimaryDataOffer(gtk_primary_selection_offer* aPrimaryDataOffer); + explicit PrimaryDataOffer(zwp_primary_selection_offer_v1* aPrimaryDataOffer); void SetAvailableDragActions(uint32_t aWaylandActions){}; virtual ~PrimaryDataOffer(); @@ -76,7 +75,8 @@ class PrimaryDataOffer : public DataOffer { private: bool RequestDataTransfer(const char* aMimeType, int fd) override; - gtk_primary_selection_offer* mPrimaryDataOffer; + gtk_primary_selection_offer* mPrimaryDataOfferGtk; + zwp_primary_selection_offer_v1* mPrimaryDataOfferZwpV1; }; class nsWaylandDragContext : public nsISupports { @@ -124,9 +124,11 @@ class nsRetrievalContextWayland : public nsRetrievalContext { void RegisterNewDataOffer(wl_data_offer* aWaylandDataOffer); void RegisterNewDataOffer(gtk_primary_selection_offer* aPrimaryDataOffer); + void RegisterNewDataOffer(zwp_primary_selection_offer_v1* aPrimaryDataOffer); void SetClipboardDataOffer(wl_data_offer* aWaylandDataOffer); void SetPrimaryDataOffer(gtk_primary_selection_offer* aPrimaryDataOffer); + void SetPrimaryDataOffer(zwp_primary_selection_offer_v1* aPrimaryDataOffer); void AddDragAndDropDataOffer(wl_data_offer* aWaylandDataOffer); nsWaylandDragContext* GetDragContext(); diff --git a/widget/gtk/nsWaylandDisplay.cpp b/widget/gtk/nsWaylandDisplay.cpp index 9a4cbb983fd49..69fb6b470e7ff 100644 --- a/widget/gtk/nsWaylandDisplay.cpp +++ b/widget/gtk/nsWaylandDisplay.cpp @@ -127,7 +127,12 @@ void nsWaylandDisplay::SetSeat(wl_seat* aSeat) { mSeat = aSeat; } void nsWaylandDisplay::SetPrimarySelectionDeviceManager( gtk_primary_selection_device_manager* aPrimarySelectionDeviceManager) { - mPrimarySelectionDeviceManager = aPrimarySelectionDeviceManager; + mPrimarySelectionDeviceManagerGtk = aPrimarySelectionDeviceManager; +} + +void nsWaylandDisplay::SetPrimarySelectionDeviceManager( + zwp_primary_selection_device_manager_v1* aPrimarySelectionDeviceManager) { + mPrimarySelectionDeviceManagerZwpV1 = aPrimarySelectionDeviceManager; } void nsWaylandDisplay::SetIdleInhibitManager( @@ -167,6 +172,15 @@ static void global_registry_handler(void* data, wl_registry* registry, wl_proxy_set_queue((struct wl_proxy*)primary_selection_device_manager, display->GetEventQueue()); display->SetPrimarySelectionDeviceManager(primary_selection_device_manager); + } else if (strcmp(interface, "zwp_primary_selection_device_manager_v1") == + 0) { + auto* primary_selection_device_manager = + WaylandRegistryBind<gtk_primary_selection_device_manager>( + registry, id, &zwp_primary_selection_device_manager_v1_interface, + 1); + wl_proxy_set_queue((struct wl_proxy*)primary_selection_device_manager, + display->GetEventQueue()); + display->SetPrimarySelectionDeviceManager(primary_selection_device_manager); } else if (strcmp(interface, "zwp_idle_inhibit_manager_v1") == 0) { auto* idle_inhibit_manager = WaylandRegistryBind<zwp_idle_inhibit_manager_v1>( @@ -284,7 +298,8 @@ nsWaylandDisplay::nsWaylandDisplay(wl_display* aDisplay, bool aLighWrapper) mSeat(nullptr), mShm(nullptr), mSyncCallback(nullptr), - mPrimarySelectionDeviceManager(nullptr), + mPrimarySelectionDeviceManagerGtk(nullptr), + mPrimarySelectionDeviceManagerZwpV1(nullptr), mIdleInhibitManager(nullptr), mRegistry(nullptr), mExplicitSync(false) { diff --git a/widget/gtk/nsWaylandDisplay.h b/widget/gtk/nsWaylandDisplay.h index ffec6737877b0..f3d1d1243bcf9 100644 --- a/widget/gtk/nsWaylandDisplay.h +++ b/widget/gtk/nsWaylandDisplay.h @@ -8,16 +8,16 @@ #ifndef __MOZ_WAYLAND_DISPLAY_H__ #define __MOZ_WAYLAND_DISPLAY_H__ -#include "mozilla/widget/mozwayland.h" -#include "mozilla/widget/gtk-primary-selection-client-protocol.h" -#include "mozilla/widget/idle-inhibit-unstable-v1-client-protocol.h" - #include "base/message_loop.h" // for MessageLoop #include "base/task.h" // for NewRunnableMethod, etc #include "mozilla/StaticMutex.h" +#include "mozilla/widget/mozwayland.h" #include "mozilla/widget/gbm.h" +#include "mozilla/widget/gtk-primary-selection-client-protocol.h" +#include "mozilla/widget/idle-inhibit-unstable-v1-client-protocol.h" #include "mozilla/widget/linux-dmabuf-unstable-v1-client-protocol.h" +#include "mozilla/widget/primary-selection-unstable-v1-client-protocol.h" namespace mozilla { namespace widget { @@ -51,8 +51,13 @@ class nsWaylandDisplay { }; wl_seat* GetSeat(void) { return mSeat; }; wl_shm* GetShm(void) { return mShm; }; - gtk_primary_selection_device_manager* GetPrimarySelectionDeviceManager(void) { - return mPrimarySelectionDeviceManager; + gtk_primary_selection_device_manager* GetPrimarySelectionDeviceManagerGtk( + void) { + return mPrimarySelectionDeviceManagerGtk; + }; + zwp_primary_selection_device_manager_v1* + GetPrimarySelectionDeviceManagerZwpV1(void) { + return mPrimarySelectionDeviceManagerZwpV1; }; zwp_idle_inhibit_manager_v1* GetIdleInhibitManager(void) { return mIdleInhibitManager; @@ -67,6 +72,8 @@ class nsWaylandDisplay { void SetSeat(wl_seat* aSeat); void SetPrimarySelectionDeviceManager( gtk_primary_selection_device_manager* aPrimarySelectionDeviceManager); + void SetPrimarySelectionDeviceManager( + zwp_primary_selection_device_manager_v1* aPrimarySelectionDeviceManager); void SetIdleInhibitManager(zwp_idle_inhibit_manager_v1* aIdleInhibitManager); MessageLoop* GetThreadLoop() { return mThreadLoop; } @@ -87,7 +94,8 @@ class nsWaylandDisplay { wl_seat* mSeat; wl_shm* mShm; wl_callback* mSyncCallback; - gtk_primary_selection_device_manager* mPrimarySelectionDeviceManager; + gtk_primary_selection_device_manager* mPrimarySelectionDeviceManagerGtk; + zwp_primary_selection_device_manager_v1* mPrimarySelectionDeviceManagerZwpV1; zwp_idle_inhibit_manager_v1* mIdleInhibitManager; wl_registry* mRegistry; bool mExplicitSync; diff --git a/widget/gtk/wayland/gtk-primary-selection-client-protocol.h b/widget/gtk/wayland/gtk-primary-selection-client-protocol.h index 8450512d2c032..770c35e03f058 100644 --- a/widget/gtk/wayland/gtk-primary-selection-client-protocol.h +++ b/widget/gtk/wayland/gtk-primary-selection-client-protocol.h @@ -1,4 +1,4 @@ -/* Generated by wayland-scanner 1.14.0 */ +/* Generated by wayland-scanner 1.18.0 */ #ifndef GTK_PRIMARY_SELECTION_CLIENT_PROTOCOL_H #define GTK_PRIMARY_SELECTION_CLIENT_PROTOCOL_H diff --git a/widget/gtk/wayland/gtk-primary-selection-protocol.c b/widget/gtk/wayland/gtk-primary-selection-protocol.c index 4f4ccca999144..b42176753ca00 100644 --- a/widget/gtk/wayland/gtk-primary-selection-protocol.c +++ b/widget/gtk/wayland/gtk-primary-selection-protocol.c @@ -1,4 +1,4 @@ -/* Generated by wayland-scanner 1.14.0 */ +/* Generated by wayland-scanner 1.18.0 */ /* * Copyright © 2015, 2016 Red Hat @@ -25,15 +25,25 @@ #include <stdlib.h> #include <stdint.h> -#include <gtk/gtk.h> #include <gdk/gdkwayland.h> #include "wayland-util.h" +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + extern const struct wl_interface gtk_primary_selection_device_interface; extern const struct wl_interface gtk_primary_selection_offer_interface; extern const struct wl_interface gtk_primary_selection_source_interface; +extern const struct wl_interface wl_seat_interface; -static const struct wl_interface *types[] = { +static const struct wl_interface *gtk_primary_selection_types[] = { NULL, NULL, >k_primary_selection_source_interface, @@ -46,60 +56,61 @@ static const struct wl_interface *types[] = { }; static const struct wl_message gtk_primary_selection_device_manager_requests[] = { - { "create_source", "n", types + 2 }, - { "get_device", "no", types + 3 }, - { "destroy", "", types + 0 }, + { "create_source", "n", gtk_primary_selection_types + 2 }, + { "get_device", "no", gtk_primary_selection_types + 3 }, + { "destroy", "", gtk_primary_selection_types + 0 }, }; -const struct wl_interface gtk_primary_selection_device_manager_interface = { +WL_PRIVATE const struct wl_interface gtk_primary_selection_device_manager_interface = { "gtk_primary_selection_device_manager", 1, 3, gtk_primary_selection_device_manager_requests, 0, NULL, }; static const struct wl_message gtk_primary_selection_device_requests[] = { - { "set_selection", "?ou", types + 5 }, - { "destroy", "", types + 0 }, + { "set_selection", "?ou", gtk_primary_selection_types + 5 }, + { "destroy", "", gtk_primary_selection_types + 0 }, }; static const struct wl_message gtk_primary_selection_device_events[] = { - { "data_offer", "n", types + 7 }, - { "selection", "?o", types + 8 }, + { "data_offer", "n", gtk_primary_selection_types + 7 }, + { "selection", "?o", gtk_primary_selection_types + 8 }, }; -const struct wl_interface gtk_primary_selection_device_interface = { +WL_PRIVATE const struct wl_interface gtk_primary_selection_device_interface = { "gtk_primary_selection_device", 1, 2, gtk_primary_selection_device_requests, 2, gtk_primary_selection_device_events, }; static const struct wl_message gtk_primary_selection_offer_requests[] = { - { "receive", "sh", types + 0 }, - { "destroy", "", types + 0 }, + { "receive", "sh", gtk_primary_selection_types + 0 }, + { "destroy", "", gtk_primary_selection_types + 0 }, }; static const struct wl_message gtk_primary_selection_offer_events[] = { - { "offer", "s", types + 0 }, + { "offer", "s", gtk_primary_selection_types + 0 }, }; -const struct wl_interface gtk_primary_selection_offer_interface = { +WL_PRIVATE const struct wl_interface gtk_primary_selection_offer_interface = { "gtk_primary_selection_offer", 1, 2, gtk_primary_selection_offer_requests, 1, gtk_primary_selection_offer_events, }; static const struct wl_message gtk_primary_selection_source_requests[] = { - { "offer", "s", types + 0 }, - { "destroy", "", types + 0 }, + { "offer", "s", gtk_primary_selection_types + 0 }, + { "destroy", "", gtk_primary_selection_types + 0 }, }; static const struct wl_message gtk_primary_selection_source_events[] = { - { "send", "sh", types + 0 }, - { "cancelled", "", types + 0 }, + { "send", "sh", gtk_primary_selection_types + 0 }, + { "cancelled", "", gtk_primary_selection_types + 0 }, }; -const struct wl_interface gtk_primary_selection_source_interface = { +WL_PRIVATE const struct wl_interface gtk_primary_selection_source_interface = { "gtk_primary_selection_source", 1, 2, gtk_primary_selection_source_requests, 2, gtk_primary_selection_source_events, }; + diff --git a/widget/gtk/wayland/moz.build b/widget/gtk/wayland/moz.build index 0de7427c15aad..63646de736126 100644 --- a/widget/gtk/wayland/moz.build +++ b/widget/gtk/wayland/moz.build @@ -10,7 +10,8 @@ with Files("**"): SOURCES += [ 'gtk-primary-selection-protocol.c', 'idle-inhibit-unstable-v1-protocol.c', - 'linux-dmabuf-unstable-v1-protocol.c' + 'linux-dmabuf-unstable-v1-protocol.c', + 'primary-selection-unstable-v1-protocol.c' ] EXPORTS.mozilla.widget += [ @@ -18,6 +19,7 @@ EXPORTS.mozilla.widget += [ 'gtk-primary-selection-client-protocol.h', 'idle-inhibit-unstable-v1-client-protocol.h', 'linux-dmabuf-unstable-v1-client-protocol.h', + 'primary-selection-unstable-v1-client-protocol.h', 'va_drmcommon.h' ] diff --git a/widget/gtk/wayland/primary-selection-unstable-v1-client-protocol.h b/widget/gtk/wayland/primary-selection-unstable-v1-client-protocol.h new file mode 100644 index 0000000000000..998266c3dbd9b --- /dev/null +++ b/widget/gtk/wayland/primary-selection-unstable-v1-client-protocol.h @@ -0,0 +1,578 @@ +/* Generated by wayland-scanner 1.18.0 */ + +#ifndef WP_PRIMARY_SELECTION_UNSTABLE_V1_CLIENT_PROTOCOL_H +#define WP_PRIMARY_SELECTION_UNSTABLE_V1_CLIENT_PROTOCOL_H + +#include <stdint.h> +#include <stddef.h> +#include "wayland-client.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @page page_wp_primary_selection_unstable_v1 The wp_primary_selection_unstable_v1 protocol + * Primary selection protocol + * + * @section page_desc_wp_primary_selection_unstable_v1 Description + * + * This protocol provides the ability to have a primary selection device to + * match that of the X server. This primary selection is a shortcut to the + * common clipboard selection, where text just needs to be selected in order + * to allow copying it elsewhere. The de facto way to perform this action + * is the middle mouse button, although it is not limited to this one. + * + * Clients wishing to honor primary selection should create a primary + * selection source and set it as the selection through + * wp_primary_selection_device.set_selection whenever the text selection + * changes. In order to minimize calls in pointer-driven text selection, + * it should happen only once after the operation finished. Similarly, + * a NULL source should be set when text is unselected. + * + * wp_primary_selection_offer objects are first announced through the + * wp_primary_selection_device.data_offer event. Immediately after this event, + * the primary data offer will emit wp_primary_selection_offer.offer events + * to let know of the mime types being offered. + * + * When the primary selection changes, the client with the keyboard focus + * will receive wp_primary_selection_device.selection events. Only the client + * with the keyboard focus will receive such events with a non-NULL + * wp_primary_selection_offer. Across keyboard focus changes, previously + * focused clients will receive wp_primary_selection_device.events with a + * NULL wp_primary_selection_offer. + * + * In order to request the primary selection data, the client must pass + * a recent serial pertaining to the press event that is triggering the + * operation, if the compositor deems the serial valid and recent, the + * wp_primary_selection_source.send event will happen in the other end + * to let the transfer begin. The client owning the primary selection + * should write the requested data, and close the file descriptor + * immediately. + * + * If the primary selection owner client disappeared during the transfer, + * the client reading the data will receive a + * wp_primary_selection_device.selection event with a NULL + * wp_primary_selection_offer, the client should take this as a hint + * to finish the reads related to the no longer existing offer. + * + * The primary selection owner should be checking for errors during + * writes, merely cancelling the ongoing transfer if any happened. + * + * @section page_ifaces_wp_primary_selection_unstable_v1 Interfaces + * - @subpage page_iface_zwp_primary_selection_device_manager_v1 - X primary selection emulation + * - @subpage page_iface_zwp_primary_selection_device_v1 - + * - @subpage page_iface_zwp_primary_selection_offer_v1 - offer to transfer primary selection contents + * - @subpage page_iface_zwp_primary_selection_source_v1 - offer to replace the contents of the primary selection + * @section page_copyright_wp_primary_selection_unstable_v1 Copyright + * <pre> + * + * Copyright © 2015, 2016 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * </pre> + */ +struct wl_seat; +struct zwp_primary_selection_device_manager_v1; +struct zwp_primary_selection_device_v1; +struct zwp_primary_selection_offer_v1; +struct zwp_primary_selection_source_v1; + +/** + * @page page_iface_zwp_primary_selection_device_manager_v1 zwp_primary_selection_device_manager_v1 + * @section page_iface_zwp_primary_selection_device_manager_v1_desc Description + * + * The primary selection device manager is a singleton global object that + * provides access to the primary selection. It allows to create + * wp_primary_selection_source objects, as well as retrieving the per-seat + * wp_primary_selection_device objects. + * @section page_iface_zwp_primary_selection_device_manager_v1_api API + * See @ref iface_zwp_primary_selection_device_manager_v1. + */ +/** + * @defgroup iface_zwp_primary_selection_device_manager_v1 The zwp_primary_selection_device_manager_v1 interface + * + * The primary selection device manager is a singleton global object that + * provides access to the primary selection. It allows to create + * wp_primary_selection_source objects, as well as retrieving the per-seat + * wp_primary_selection_device objects. + */ +extern const struct wl_interface zwp_primary_selection_device_manager_v1_interface; +/** + * @page page_iface_zwp_primary_selection_device_v1 zwp_primary_selection_device_v1 + * @section page_iface_zwp_primary_selection_device_v1_api API + * See @ref iface_zwp_primary_selection_device_v1. + */ +/** + * @defgroup iface_zwp_primary_selection_device_v1 The zwp_primary_selection_device_v1 interface + */ +extern const struct wl_interface zwp_primary_selection_device_v1_interface; +/** + * @page page_iface_zwp_primary_selection_offer_v1 zwp_primary_selection_offer_v1 + * @section page_iface_zwp_primary_selection_offer_v1_desc Description + * + * A wp_primary_selection_offer represents an offer to transfer the contents + * of the primary selection clipboard to the client. Similar to + * wl_data_offer, the offer also describes the mime types that the data can + * be converted to and provides the mechanisms for transferring the data + * directly to the client. + * @section page_iface_zwp_primary_selection_offer_v1_api API + * See @ref iface_zwp_primary_selection_offer_v1. + */ +/** + * @defgroup iface_zwp_primary_selection_offer_v1 The zwp_primary_selection_offer_v1 interface + * + * A wp_primary_selection_offer represents an offer to transfer the contents + * of the primary selection clipboard to the client. Similar to + * wl_data_offer, the offer also describes the mime types that the data can + * be converted to and provides the mechanisms for transferring the data + * directly to the client. + */ +extern const struct wl_interface zwp_primary_selection_offer_v1_interface; +/** + * @page page_iface_zwp_primary_selection_source_v1 zwp_primary_selection_source_v1 + * @section page_iface_zwp_primary_selection_source_v1_desc Description + * + * The source side of a wp_primary_selection_offer, it provides a way to + * describe the offered data and respond to requests to transfer the + * requested contents of the primary selection clipboard. + * @section page_iface_zwp_primary_selection_source_v1_api API + * See @ref iface_zwp_primary_selection_source_v1. + */ +/** + * @defgroup iface_zwp_primary_selection_source_v1 The zwp_primary_selection_source_v1 interface + * + * The source side of a wp_primary_selection_offer, it provides a way to + * describe the offered data and respond to requests to transfer the + * requested contents of the primary selection clipboard. + */ +extern const struct wl_interface zwp_primary_selection_source_v1_interface; + +#define ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_CREATE_SOURCE 0 +#define ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_GET_DEVICE 1 +#define ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_DESTROY 2 + + +/** + * @ingroup iface_zwp_primary_selection_device_manager_v1 + */ +#define ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_CREATE_SOURCE_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_primary_selection_device_manager_v1 + */ +#define ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_GET_DEVICE_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_primary_selection_device_manager_v1 + */ +#define ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_DESTROY_SINCE_VERSION 1 + +/** @ingroup iface_zwp_primary_selection_device_manager_v1 */ +static inline void +zwp_primary_selection_device_manager_v1_set_user_data(struct zwp_primary_selection_device_manager_v1 *zwp_primary_selection_device_manager_v1, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zwp_primary_selection_device_manager_v1, user_data); +} + +/** @ingroup iface_zwp_primary_selection_device_manager_v1 */ +static inline void * +zwp_primary_selection_device_manager_v1_get_user_data(struct zwp_primary_selection_device_manager_v1 *zwp_primary_selection_device_manager_v1) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zwp_primary_selection_device_manager_v1); +} + +static inline uint32_t +zwp_primary_selection_device_manager_v1_get_version(struct zwp_primary_selection_device_manager_v1 *zwp_primary_selection_device_manager_v1) +{ + return wl_proxy_get_version((struct wl_proxy *) zwp_primary_selection_device_manager_v1); +} + +/** + * @ingroup iface_zwp_primary_selection_device_manager_v1 + * + * Create a new primary selection source. + */ +static inline struct zwp_primary_selection_source_v1 * +zwp_primary_selection_device_manager_v1_create_source(struct zwp_primary_selection_device_manager_v1 *zwp_primary_selection_device_manager_v1) +{ + struct wl_proxy *id; + + id = wl_proxy_marshal_constructor((struct wl_proxy *) zwp_primary_selection_device_manager_v1, + ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_CREATE_SOURCE, &zwp_primary_selection_source_v1_interface, NULL); + + return (struct zwp_primary_selection_source_v1 *) id; +} + +/** + * @ingroup iface_zwp_primary_selection_device_manager_v1 + * + * Create a new data device for a given seat. + */ +static inline struct zwp_primary_selection_device_v1 * +zwp_primary_selection_device_manager_v1_get_device(struct zwp_primary_selection_device_manager_v1 *zwp_primary_selection_device_manager_v1, struct wl_seat *seat) +{ + struct wl_proxy *id; + + id = wl_proxy_marshal_constructor((struct wl_proxy *) zwp_primary_selection_device_manager_v1, + ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_GET_DEVICE, &zwp_primary_selection_device_v1_interface, NULL, seat); + + return (struct zwp_primary_selection_device_v1 *) id; +} + +/** + * @ingroup iface_zwp_primary_selection_device_manager_v1 + * + * Destroy the primary selection device manager. + */ +static inline void +zwp_primary_selection_device_manager_v1_destroy(struct zwp_primary_selection_device_manager_v1 *zwp_primary_selection_device_manager_v1) +{ + wl_proxy_marshal((struct wl_proxy *) zwp_primary_selection_device_manager_v1, + ZWP_PRIMARY_SELECTION_DEVICE_MANAGER_V1_DESTROY); + + wl_proxy_destroy((struct wl_proxy *) zwp_primary_selection_device_manager_v1); +} + +/** + * @ingroup iface_zwp_primary_selection_device_v1 + * @struct zwp_primary_selection_device_v1_listener + */ +struct zwp_primary_selection_device_v1_listener { + /** + * introduce a new wp_primary_selection_offer + * + * Introduces a new wp_primary_selection_offer object that may be + * used to receive the current primary selection. Immediately + * following this event, the new wp_primary_selection_offer object + * will send wp_primary_selection_offer.offer events to describe + * the offered mime types. + */ + void (*data_offer)(void *data, + struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1, + struct zwp_primary_selection_offer_v1 *offer); + /** + * advertise a new primary selection + * + * The wp_primary_selection_device.selection event is sent to + * notify the client of a new primary selection. This event is sent + * after the wp_primary_selection.data_offer event introducing this + * object, and after the offer has announced its mimetypes through + * wp_primary_selection_offer.offer. + * + * The data_offer is valid until a new offer or NULL is received or + * until the client loses keyboard focus. The client must destroy + * the previous selection data_offer, if any, upon receiving this + * event. + */ + void (*selection)(void *data, + struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1, + struct zwp_primary_selection_offer_v1 *id); +}; + +/** + * @ingroup iface_zwp_primary_selection_device_v1 + */ +static inline int +zwp_primary_selection_device_v1_add_listener(struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1, + const struct zwp_primary_selection_device_v1_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zwp_primary_selection_device_v1, + (void (**)(void)) listener, data); +} + +#define ZWP_PRIMARY_SELECTION_DEVICE_V1_SET_SELECTION 0 +#define ZWP_PRIMARY_SELECTION_DEVICE_V1_DESTROY 1 + +/** + * @ingroup iface_zwp_primary_selection_device_v1 + */ +#define ZWP_PRIMARY_SELECTION_DEVICE_V1_DATA_OFFER_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_primary_selection_device_v1 + */ +#define ZWP_PRIMARY_SELECTION_DEVICE_V1_SELECTION_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_primary_selection_device_v1 + */ +#define ZWP_PRIMARY_SELECTION_DEVICE_V1_SET_SELECTION_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_primary_selection_device_v1 + */ +#define ZWP_PRIMARY_SELECTION_DEVICE_V1_DESTROY_SINCE_VERSION 1 + +/** @ingroup iface_zwp_primary_selection_device_v1 */ +static inline void +zwp_primary_selection_device_v1_set_user_data(struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zwp_primary_selection_device_v1, user_data); +} + +/** @ingroup iface_zwp_primary_selection_device_v1 */ +static inline void * +zwp_primary_selection_device_v1_get_user_data(struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zwp_primary_selection_device_v1); +} + +static inline uint32_t +zwp_primary_selection_device_v1_get_version(struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1) +{ + return wl_proxy_get_version((struct wl_proxy *) zwp_primary_selection_device_v1); +} + +/** + * @ingroup iface_zwp_primary_selection_device_v1 + * + * Replaces the current selection. The previous owner of the primary + * selection will receive a wp_primary_selection_source.cancelled event. + * + * To unset the selection, set the source to NULL. + */ +static inline void +zwp_primary_selection_device_v1_set_selection(struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1, struct zwp_primary_selection_source_v1 *source, uint32_t serial) +{ + wl_proxy_marshal((struct wl_proxy *) zwp_primary_selection_device_v1, + ZWP_PRIMARY_SELECTION_DEVICE_V1_SET_SELECTION, source, serial); +} + +/** + * @ingroup iface_zwp_primary_selection_device_v1 + * + * Destroy the primary selection device. + */ +static inline void +zwp_primary_selection_device_v1_destroy(struct zwp_primary_selection_device_v1 *zwp_primary_selection_device_v1) +{ + wl_proxy_marshal((struct wl_proxy *) zwp_primary_selection_device_v1, + ZWP_PRIMARY_SELECTION_DEVICE_V1_DESTROY); + + wl_proxy_destroy((struct wl_proxy *) zwp_primary_selection_device_v1); +} + +/** + * @ingroup iface_zwp_primary_selection_offer_v1 + * @struct zwp_primary_selection_offer_v1_listener + */ +struct zwp_primary_selection_offer_v1_listener { + /** + * advertise offered mime type + * + * Sent immediately after creating announcing the + * wp_primary_selection_offer through + * wp_primary_selection_device.data_offer. One event is sent per + * offered mime type. + */ + void (*offer)(void *data, + struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1, + const char *mime_type); +}; + +/** + * @ingroup iface_zwp_primary_selection_offer_v1 + */ +static inline int +zwp_primary_selection_offer_v1_add_listener(struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1, + const struct zwp_primary_selection_offer_v1_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zwp_primary_selection_offer_v1, + (void (**)(void)) listener, data); +} + +#define ZWP_PRIMARY_SELECTION_OFFER_V1_RECEIVE 0 +#define ZWP_PRIMARY_SELECTION_OFFER_V1_DESTROY 1 + +/** + * @ingroup iface_zwp_primary_selection_offer_v1 + */ +#define ZWP_PRIMARY_SELECTION_OFFER_V1_OFFER_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_primary_selection_offer_v1 + */ +#define ZWP_PRIMARY_SELECTION_OFFER_V1_RECEIVE_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_primary_selection_offer_v1 + */ +#define ZWP_PRIMARY_SELECTION_OFFER_V1_DESTROY_SINCE_VERSION 1 + +/** @ingroup iface_zwp_primary_selection_offer_v1 */ +static inline void +zwp_primary_selection_offer_v1_set_user_data(struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zwp_primary_selection_offer_v1, user_data); +} + +/** @ingroup iface_zwp_primary_selection_offer_v1 */ +static inline void * +zwp_primary_selection_offer_v1_get_user_data(struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zwp_primary_selection_offer_v1); +} + +static inline uint32_t +zwp_primary_selection_offer_v1_get_version(struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1) +{ + return wl_proxy_get_version((struct wl_proxy *) zwp_primary_selection_offer_v1); +} + +/** + * @ingroup iface_zwp_primary_selection_offer_v1 + * + * To transfer the contents of the primary selection clipboard, the client + * issues this request and indicates the mime type that it wants to + * receive. The transfer happens through the passed file descriptor + * (typically created with the pipe system call). The source client writes + * the data in the mime type representation requested and then closes the + * file descriptor. + * + * The receiving client reads from the read end of the pipe until EOF and + * closes its end, at which point the transfer is complete. + */ +static inline void +zwp_primary_selection_offer_v1_receive(struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1, const char *mime_type, int32_t fd) +{ + wl_proxy_marshal((struct wl_proxy *) zwp_primary_selection_offer_v1, + ZWP_PRIMARY_SELECTION_OFFER_V1_RECEIVE, mime_type, fd); +} + +/** + * @ingroup iface_zwp_primary_selection_offer_v1 + * + * Destroy the primary selection offer. + */ +static inline void +zwp_primary_selection_offer_v1_destroy(struct zwp_primary_selection_offer_v1 *zwp_primary_selection_offer_v1) +{ + wl_proxy_marshal((struct wl_proxy *) zwp_primary_selection_offer_v1, + ZWP_PRIMARY_SELECTION_OFFER_V1_DESTROY); + + wl_proxy_destroy((struct wl_proxy *) zwp_primary_selection_offer_v1); +} + +/** + * @ingroup iface_zwp_primary_selection_source_v1 + * @struct zwp_primary_selection_source_v1_listener + */ +struct zwp_primary_selection_source_v1_listener { + /** + * send the primary selection contents + * + * Request for the current primary selection contents from the + * client. Send the specified mime type over the passed file + * descriptor, then close it. + */ + void (*send)(void *data, + struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1, + const char *mime_type, + int32_t fd); + /** + * request for primary selection contents was canceled + * + * This primary selection source is no longer valid. The client + * should clean up and destroy this primary selection source. + */ + void (*cancelled)(void *data, + struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1); +}; + +/** + * @ingroup iface_zwp_primary_selection_source_v1 + */ +static inline int +zwp_primary_selection_source_v1_add_listener(struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1, + const struct zwp_primary_selection_source_v1_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zwp_primary_selection_source_v1, + (void (**)(void)) listener, data); +} + +#define ZWP_PRIMARY_SELECTION_SOURCE_V1_OFFER 0 +#define ZWP_PRIMARY_SELECTION_SOURCE_V1_DESTROY 1 + +/** + * @ingroup iface_zwp_primary_selection_source_v1 + */ +#define ZWP_PRIMARY_SELECTION_SOURCE_V1_SEND_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_primary_selection_source_v1 + */ +#define ZWP_PRIMARY_SELECTION_SOURCE_V1_CANCELLED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_primary_selection_source_v1 + */ +#define ZWP_PRIMARY_SELECTION_SOURCE_V1_OFFER_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_primary_selection_source_v1 + */ +#define ZWP_PRIMARY_SELECTION_SOURCE_V1_DESTROY_SINCE_VERSION 1 + +/** @ingroup iface_zwp_primary_selection_source_v1 */ +static inline void +zwp_primary_selection_source_v1_set_user_data(struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zwp_primary_selection_source_v1, user_data); +} + +/** @ingroup iface_zwp_primary_selection_source_v1 */ +static inline void * +zwp_primary_selection_source_v1_get_user_data(struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zwp_primary_selection_source_v1); +} + +static inline uint32_t +zwp_primary_selection_source_v1_get_version(struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1) +{ + return wl_proxy_get_version((struct wl_proxy *) zwp_primary_selection_source_v1); +} + +/** + * @ingroup iface_zwp_primary_selection_source_v1 + * + * This request adds a mime type to the set of mime types advertised to + * targets. Can be called several times to offer multiple types. + */ +static inline void +zwp_primary_selection_source_v1_offer(struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1, const char *mime_type) +{ + wl_proxy_marshal((struct wl_proxy *) zwp_primary_selection_source_v1, + ZWP_PRIMARY_SELECTION_SOURCE_V1_OFFER, mime_type); +} + +/** + * @ingroup iface_zwp_primary_selection_source_v1 + * + * Destroy the primary selection source. + */ +static inline void +zwp_primary_selection_source_v1_destroy(struct zwp_primary_selection_source_v1 *zwp_primary_selection_source_v1) +{ + wl_proxy_marshal((struct wl_proxy *) zwp_primary_selection_source_v1, + ZWP_PRIMARY_SELECTION_SOURCE_V1_DESTROY); + + wl_proxy_destroy((struct wl_proxy *) zwp_primary_selection_source_v1); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/widget/gtk/wayland/primary-selection-unstable-v1-protocol.c b/widget/gtk/wayland/primary-selection-unstable-v1-protocol.c new file mode 100644 index 0000000000000..80b5264f39e21 --- /dev/null +++ b/widget/gtk/wayland/primary-selection-unstable-v1-protocol.c @@ -0,0 +1,116 @@ +/* Generated by wayland-scanner 1.18.0 */ + +/* + * Copyright © 2015, 2016 Red Hat + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include <stdlib.h> +#include <stdint.h> +#include <gdk/gdkwayland.h> +#include "wayland-util.h" + +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + +extern const struct wl_interface wl_seat_interface; +extern const struct wl_interface zwp_primary_selection_device_v1_interface; +extern const struct wl_interface zwp_primary_selection_offer_v1_interface; +extern const struct wl_interface zwp_primary_selection_source_v1_interface; + +static const struct wl_interface *wp_primary_selection_unstable_v1_types[] = { + NULL, + NULL, + &zwp_primary_selection_source_v1_interface, + &zwp_primary_selection_device_v1_interface, + &wl_seat_interface, + &zwp_primary_selection_source_v1_interface, + NULL, + &zwp_primary_selection_offer_v1_interface, + &zwp_primary_selection_offer_v1_interface, +}; + +static const struct wl_message zwp_primary_selection_device_manager_v1_requests[] = { + { "create_source", "n", wp_primary_selection_unstable_v1_types + 2 }, + { "get_device", "no", wp_primary_selection_unstable_v1_types + 3 }, + { "destroy", "", wp_primary_selection_unstable_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zwp_primary_selection_device_manager_v1_interface = { + "zwp_primary_selection_device_manager_v1", 1, + 3, zwp_primary_selection_device_manager_v1_requests, + 0, NULL, +}; + +static const struct wl_message zwp_primary_selection_device_v1_requests[] = { + { "set_selection", "?ou", wp_primary_selection_unstable_v1_types + 5 }, + { "destroy", "", wp_primary_selection_unstable_v1_types + 0 }, +}; + +static const struct wl_message zwp_primary_selection_device_v1_events[] = { + { "data_offer", "n", wp_primary_selection_unstable_v1_types + 7 }, + { "selection", "?o", wp_primary_selection_unstable_v1_types + 8 }, +}; + +WL_PRIVATE const struct wl_interface zwp_primary_selection_device_v1_interface = { + "zwp_primary_selection_device_v1", 1, + 2, zwp_primary_selection_device_v1_requests, + 2, zwp_primary_selection_device_v1_events, +}; + +static const struct wl_message zwp_primary_selection_offer_v1_requests[] = { + { "receive", "sh", wp_primary_selection_unstable_v1_types + 0 }, + { "destroy", "", wp_primary_selection_unstable_v1_types + 0 }, +}; + +static const struct wl_message zwp_primary_selection_offer_v1_events[] = { + { "offer", "s", wp_primary_selection_unstable_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zwp_primary_selection_offer_v1_interface = { + "zwp_primary_selection_offer_v1", 1, + 2, zwp_primary_selection_offer_v1_requests, + 1, zwp_primary_selection_offer_v1_events, +}; + +static const struct wl_message zwp_primary_selection_source_v1_requests[] = { + { "offer", "s", wp_primary_selection_unstable_v1_types + 0 }, + { "destroy", "", wp_primary_selection_unstable_v1_types + 0 }, +}; + +static const struct wl_message zwp_primary_selection_source_v1_events[] = { + { "send", "sh", wp_primary_selection_unstable_v1_types + 0 }, + { "cancelled", "", wp_primary_selection_unstable_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zwp_primary_selection_source_v1_interface = { + "zwp_primary_selection_source_v1", 1, + 2, zwp_primary_selection_source_v1_requests, + 2, zwp_primary_selection_source_v1_events, +}; + -- GitLab