@@ -314,15 +314,27 @@ WaylandDataOffer::~WaylandDataOffer(void) {
314314}
315315
316316bool PrimaryDataOffer::RequestDataTransfer (const char * aMimeType, int fd) {
317- if (mPrimaryDataOffer ) {
318- gtk_primary_selection_offer_receive (mPrimaryDataOffer , aMimeType, fd);
317+ if (mPrimaryDataOfferGtk ) {
318+ gtk_primary_selection_offer_receive (mPrimaryDataOfferGtk , aMimeType, fd);
319+ return true ;
320+ }
321+ if (mPrimaryDataOfferZwpV1 ) {
322+ zwp_primary_selection_offer_v1_receive (mPrimaryDataOfferZwpV1 , aMimeType,
323+ fd);
319324 return true ;
320325 }
321326 return false ;
322327}
323328
324329static void primary_data_offer (
325- void * data, gtk_primary_selection_offer* gtk_primary_selection_offer,
330+ void * data, gtk_primary_selection_offer* primary_selection_offer,
331+ const char * mime_type) {
332+ auto * offer = static_cast <DataOffer*>(data);
333+ offer->AddMIMEType (mime_type);
334+ }
335+
336+ static void primary_data_offer (
337+ void * data, zwp_primary_selection_offer_v1* primary_selection_offer,
326338 const char * mime_type) {
327339 auto * offer = static_cast <DataOffer*>(data);
328340 offer->AddMIMEType (mime_type);
@@ -334,18 +346,31 @@ static void primary_data_offer(
334346 * gtk_primary_selection_offer.
335347 */
336348static const struct gtk_primary_selection_offer_listener
337- primary_selection_offer_listener = {primary_data_offer};
349+ primary_selection_offer_listener_gtk = {primary_data_offer};
350+
351+ static const struct zwp_primary_selection_offer_v1_listener
352+ primary_selection_offer_listener_zwp_v1 = {primary_data_offer};
338353
339354PrimaryDataOffer::PrimaryDataOffer (
340355 gtk_primary_selection_offer* aPrimaryDataOffer)
341- : mPrimaryDataOffer (aPrimaryDataOffer) {
356+ : mPrimaryDataOfferGtk (aPrimaryDataOffer), mPrimaryDataOfferZwpV1( nullptr ) {
342357 gtk_primary_selection_offer_add_listener (
343- aPrimaryDataOffer, &primary_selection_offer_listener, this );
358+ aPrimaryDataOffer, &primary_selection_offer_listener_gtk, this );
359+ }
360+
361+ PrimaryDataOffer::PrimaryDataOffer (
362+ zwp_primary_selection_offer_v1* aPrimaryDataOffer)
363+ : mPrimaryDataOfferGtk(nullptr ), mPrimaryDataOfferZwpV1(aPrimaryDataOffer) {
364+ zwp_primary_selection_offer_v1_add_listener (
365+ aPrimaryDataOffer, &primary_selection_offer_listener_zwp_v1, this );
344366}
345367
346368PrimaryDataOffer::~PrimaryDataOffer (void ) {
347- if (mPrimaryDataOffer ) {
348- gtk_primary_selection_offer_destroy (mPrimaryDataOffer );
369+ if (mPrimaryDataOfferGtk ) {
370+ gtk_primary_selection_offer_destroy (mPrimaryDataOfferGtk );
371+ }
372+ if (mPrimaryDataOfferZwpV1 ) {
373+ zwp_primary_selection_offer_v1_destroy (mPrimaryDataOfferZwpV1 );
349374 }
350375}
351376
@@ -444,6 +469,20 @@ void nsRetrievalContextWayland::RegisterNewDataOffer(
444469 }
445470}
446471
472+ void nsRetrievalContextWayland::RegisterNewDataOffer (
473+ zwp_primary_selection_offer_v1* aPrimaryDataOffer) {
474+ DataOffer* dataOffer = static_cast <DataOffer*>(
475+ g_hash_table_lookup (mActiveOffers , aPrimaryDataOffer));
476+ MOZ_ASSERT (
477+ dataOffer == nullptr ,
478+ " Registered PrimaryDataOffer already exists. Wayland protocol error?" );
479+
480+ if (!dataOffer) {
481+ dataOffer = new PrimaryDataOffer (aPrimaryDataOffer);
482+ g_hash_table_insert (mActiveOffers , aPrimaryDataOffer, dataOffer);
483+ }
484+ }
485+
447486void nsRetrievalContextWayland::SetClipboardDataOffer (
448487 wl_data_offer* aWaylandDataOffer) {
449488 // Delete existing clipboard data offer
@@ -480,6 +519,24 @@ void nsRetrievalContextWayland::SetPrimaryDataOffer(
480519 }
481520}
482521
522+ void nsRetrievalContextWayland::SetPrimaryDataOffer (
523+ zwp_primary_selection_offer_v1* aPrimaryDataOffer) {
524+ // Release any primary offer we have.
525+ mPrimaryOffer = nullptr ;
526+
527+ // aPrimaryDataOffer can be null which means we lost
528+ // the mouse selection.
529+ if (aPrimaryDataOffer) {
530+ DataOffer* dataOffer = static_cast <DataOffer*>(
531+ g_hash_table_lookup (mActiveOffers , aPrimaryDataOffer));
532+ NS_ASSERTION (dataOffer, " We're missing primary data offer!" );
533+ if (dataOffer) {
534+ g_hash_table_remove (mActiveOffers , aPrimaryDataOffer);
535+ mPrimaryOffer = WrapUnique (dataOffer);
536+ }
537+ }
538+ }
539+
483540void nsRetrievalContextWayland::AddDragAndDropDataOffer (
484541 wl_data_offer* aDropDataOffer) {
485542 // Remove any existing D&D contexts.
@@ -615,25 +672,44 @@ static const struct wl_data_device_listener data_device_listener = {
615672 data_device_data_offer, data_device_enter, data_device_leave,
616673 data_device_motion, data_device_drop, data_device_selection};
617674
675+ static void primary_selection_data_offer (
676+ void * data, struct gtk_primary_selection_device * primary_selection_device,
677+ struct gtk_primary_selection_offer * primary_offer) {
678+ LOGCLIP ((" primary_selection_data_offer() callback\n " ));
679+ // create and add listener
680+ nsRetrievalContextWayland* context =
681+ static_cast <nsRetrievalContextWayland*>(data);
682+ context->RegisterNewDataOffer (primary_offer);
683+ }
684+
618685static void primary_selection_data_offer (
619686 void * data,
620- struct gtk_primary_selection_device * gtk_primary_selection_device ,
621- struct gtk_primary_selection_offer * gtk_primary_offer ) {
687+ struct zwp_primary_selection_device_v1 * primary_selection_device ,
688+ struct zwp_primary_selection_offer_v1 * primary_offer ) {
622689 LOGCLIP ((" primary_selection_data_offer() callback\n " ));
623690 // create and add listener
624691 nsRetrievalContextWayland* context =
625692 static_cast <nsRetrievalContextWayland*>(data);
626- context->RegisterNewDataOffer (gtk_primary_offer);
693+ context->RegisterNewDataOffer (primary_offer);
694+ }
695+
696+ static void primary_selection_selection (
697+ void * data, struct gtk_primary_selection_device * primary_selection_device,
698+ struct gtk_primary_selection_offer * primary_offer) {
699+ LOGCLIP ((" primary_selection_selection() callback\n " ));
700+ nsRetrievalContextWayland* context =
701+ static_cast <nsRetrievalContextWayland*>(data);
702+ context->SetPrimaryDataOffer (primary_offer);
627703}
628704
629705static void primary_selection_selection (
630706 void * data,
631- struct gtk_primary_selection_device * gtk_primary_selection_device ,
632- struct gtk_primary_selection_offer * gtk_primary_offer ) {
707+ struct zwp_primary_selection_device_v1 * primary_selection_device ,
708+ struct zwp_primary_selection_offer_v1 * primary_offer ) {
633709 LOGCLIP ((" primary_selection_selection() callback\n " ));
634710 nsRetrievalContextWayland* context =
635711 static_cast <nsRetrievalContextWayland*>(data);
636- context->SetPrimaryDataOffer (gtk_primary_offer );
712+ context->SetPrimaryDataOffer (primary_offer );
637713}
638714
639715/* gtk_primary_selection_device callback description:
@@ -650,13 +726,20 @@ static void primary_selection_selection(
650726 * there's no primary selection.
651727 */
652728static const struct gtk_primary_selection_device_listener
653- primary_selection_device_listener = {
729+ primary_selection_device_listener_gtk = {
730+ primary_selection_data_offer,
731+ primary_selection_selection,
732+ };
733+
734+ static const struct zwp_primary_selection_device_v1_listener
735+ primary_selection_device_listener_zwp_v1 = {
654736 primary_selection_data_offer,
655737 primary_selection_selection,
656738};
657739
658740bool nsRetrievalContextWayland::HasSelectionSupport (void ) {
659- return mDisplay ->GetPrimarySelectionDeviceManager () != nullptr ;
741+ return (mDisplay ->GetPrimarySelectionDeviceManagerZwpV1 () != nullptr ||
742+ mDisplay ->GetPrimarySelectionDeviceManagerGtk () != nullptr );
660743}
661744
662745nsRetrievalContextWayland::nsRetrievalContextWayland (void )
@@ -673,14 +756,20 @@ nsRetrievalContextWayland::nsRetrievalContextWayland(void)
673756 mDisplay ->GetDataDeviceManager (), mDisplay ->GetSeat ());
674757 wl_data_device_add_listener (dataDevice, &data_device_listener, this );
675758
676- gtk_primary_selection_device_manager* manager =
677- mDisplay ->GetPrimarySelectionDeviceManager ();
678- if (manager) {
759+ if (mDisplay ->GetPrimarySelectionDeviceManagerZwpV1 ()) {
760+ zwp_primary_selection_device_v1* primaryDataDevice =
761+ zwp_primary_selection_device_manager_v1_get_device (
762+ mDisplay ->GetPrimarySelectionDeviceManagerZwpV1 (),
763+ mDisplay ->GetSeat ());
764+ zwp_primary_selection_device_v1_add_listener (
765+ primaryDataDevice, &primary_selection_device_listener_zwp_v1, this );
766+ } else if (mDisplay ->GetPrimarySelectionDeviceManagerGtk ()) {
679767 gtk_primary_selection_device* primaryDataDevice =
680- gtk_primary_selection_device_manager_get_device (manager,
681- mDisplay ->GetSeat ());
768+ gtk_primary_selection_device_manager_get_device (
769+ mDisplay ->GetPrimarySelectionDeviceManagerGtk (),
770+ mDisplay ->GetSeat ());
682771 gtk_primary_selection_device_add_listener (
683- primaryDataDevice, &primary_selection_device_listener , this );
772+ primaryDataDevice, &primary_selection_device_listener_gtk , this );
684773 }
685774
686775 mInitialized = true ;
0 commit comments