Add DataSelectedSignal for clipboard 64/298164/3
authorBowon Ryu <bowon.ryu@samsung.com>
Fri, 1 Sep 2023 10:15:56 +0000 (19:15 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Thu, 7 Sep 2023 06:29:44 +0000 (15:29 +0900)
Add DataSelectedSignalType to catch the copy event.

Change-Id: Ieb6a3582e32133436bc21939edd05a073c045fa4
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
dali/devel-api/adaptor-framework/clipboard.cpp
dali/devel-api/adaptor-framework/clipboard.h
dali/internal/clipboard/common/clipboard-impl.h
dali/internal/clipboard/generic/clipboard-impl-generic.cpp
dali/internal/clipboard/tizen-wayland/clipboard-impl-ecore-wl.cpp
dali/internal/clipboard/ubuntu-x11/clipboard-impl-x.cpp

index 27a64e3..e69c0a7 100644 (file)
@@ -56,6 +56,11 @@ Clipboard::DataReceivedSignalType& Clipboard::DataReceivedSignal()
   return GetImplementation(*this).DataReceivedSignal();
 }
 
+Clipboard::DataSelectedSignalType& Clipboard::DataSelectedSignal()
+{
+  return GetImplementation(*this).DataSelectedSignal();
+}
+
 bool Clipboard::SetData(const ClipData& clipData)
 {
   return GetImplementation(*this).SetData(clipData);
index c5a7bcd..3096b2d 100644 (file)
@@ -82,6 +82,9 @@ public:
   /// @brief Data receive completed signal.
   typedef Signal<void(uint32_t, const char*, const char*)> DataReceivedSignalType;
 
+  /// @brief To catch data selection event.
+  typedef Signal<void(const char*)> DataSelectedSignalType;
+
   /**
    * @brief Create an uninitialized Clipboard.
    * this can be initialized with one of the derived Clipboard's New() methods
@@ -131,6 +134,11 @@ public:
   DataReceivedSignalType& DataReceivedSignal();
 
   /**
+   * @brief This signal is emitted when the data seleted.
+   */
+  DataSelectedSignalType& DataSelectedSignal();
+
+  /**
    * @brief Send the given data to the clipboard.
    * @param[in] clipData data to send to the clipboard
    * @return bool true if the internal clipboard sending was successful.
index 261b655..d4e36c1 100644 (file)
@@ -70,6 +70,11 @@ public:
   Dali::Clipboard::DataReceivedSignalType& DataReceivedSignal();
 
   /**
+   * @copydoc Dali::Clipboard::DataSelectedSignal()
+   */
+  Dali::Clipboard::DataSelectedSignalType& DataSelectedSignal();
+
+  /**
    * @copydoc Dali::Clipboard::SetData()
    */
   bool SetData(const Dali::Clipboard::ClipData& clipData);
index bf5bd78..c4bef69 100644 (file)
@@ -31,6 +31,7 @@ struct Clipboard::Impl
 {
   Dali::Clipboard::DataSentSignalType     mDataSentSignal;
   Dali::Clipboard::DataReceivedSignalType mDataReceivedSignal;
+  Dali::Clipboard::DataSelectedSignalType mDataSelectedSignal;
 };
 
 Clipboard::Clipboard(Impl* impl)
@@ -91,6 +92,11 @@ Dali::Clipboard::DataReceivedSignalType& Clipboard::DataReceivedSignal()
   return mImpl->mDataReceivedSignal;
 }
 
+Dali::Clipboard::DataSelectedSignalType& Clipboard::DataSelectedSignal()
+{
+  return mImpl->mDataSelectedSignal;
+}
+
 bool Clipboard::SetData(const Dali::Clipboard::ClipData& clipData)
 {
   return true;
index 9e84a99..d2bfa43 100644 (file)
@@ -32,18 +32,21 @@ namespace Adaptor
 {
 static Eina_Bool EcoreEventDataSend(void* data, int type, void* event);
 static Eina_Bool EcoreEventOfferDataReady(void* data, int type, void* event);
+static Eina_Bool EcoreEventSelectionOffer(void* data, int type, void* event);
 
 struct Clipboard::Impl
 {
   Impl()
   {
-    mSendHandler    = ecore_event_handler_add(ECORE_WL2_EVENT_DATA_SOURCE_SEND, EcoreEventDataSend, this);
-    mReceiveHandler = ecore_event_handler_add(ECORE_WL2_EVENT_OFFER_DATA_READY, EcoreEventOfferDataReady, this);
+    mSendHandler      = ecore_event_handler_add(ECORE_WL2_EVENT_DATA_SOURCE_SEND, EcoreEventDataSend, this);
+    mReceiveHandler   = ecore_event_handler_add(ECORE_WL2_EVENT_OFFER_DATA_READY, EcoreEventOfferDataReady, this);
+    mSelectionHanlder = ecore_event_handler_add(ECORE_WL2_EVENT_SEAT_SELECTION, EcoreEventSelectionOffer, this);
   }
   ~Impl()
   {
     ecore_event_handler_del(mSendHandler);
     ecore_event_handler_del(mReceiveHandler);
+    ecore_event_handler_del(mSelectionHanlder);
   }
 
   bool SetData(const Dali::Clipboard::ClipData& clipData)
@@ -116,9 +119,9 @@ struct Clipboard::Impl
     mDataRequestIds.push_back(mDataId);
     mDataRequestItems[mDataId] = std::make_pair(mimeType, offer);
 
+    DALI_LOG_RELEASE_INFO("offer_receive, id:%u, request type:%s\n", mDataId, mimeType.c_str());
     ecore_wl2_offer_receive(offer, const_cast<char*>(type));
     ecore_wl2_display_flush(ecore_wl2_input_display_get(input));
-    DALI_LOG_RELEASE_INFO("offer_receive, id:%u, request type:%s\n", mDataId, mimeType.c_str());
     return mDataId;
   }
 
@@ -187,6 +190,18 @@ struct Clipboard::Impl
   {
     Ecore_Wl2_Event_Offer_Data_Ready* ev = reinterpret_cast<Ecore_Wl2_Event_Offer_Data_Ready*>(event);
 
+    if(ev == nullptr)
+    {
+      DALI_LOG_ERROR("ev is nullptr.\n");
+      return;
+    }
+
+    if(ev->data == nullptr || ev->len < 1)
+    {
+      DALI_LOG_ERROR("no selection data.\n");
+      return;
+    }
+
     size_t      dataLength = strlen(ev->data);
     size_t      bufferSize = static_cast<size_t>(ev->len);
     std::string content;
@@ -226,14 +241,65 @@ struct Clipboard::Impl
     }
   }
 
+  void SelectionOffer(void* event)
+  {
+    Ecore_Wl2_Event_Seat_Selection *ev = reinterpret_cast<Ecore_Wl2_Event_Seat_Selection*>(event);
+
+    if(ev == nullptr)
+    {
+      DALI_LOG_ERROR("ev is nullptr.\n");
+      return;
+    }
+
+    if(ev->num_types < 1)
+    {
+      DALI_LOG_ERROR("num type is 0.\n");
+      return;
+    }
+
+    if(ev->types == nullptr)
+    {
+      DALI_LOG_ERROR("types is nullptr.\n");
+      return;
+    }
+
+    const char* selectedType = nullptr;
+    std::string formatMarkup("application/x-elementary-markup");
+
+    for(int i = 0; i < ev->num_types; i++)
+    {
+      DALI_LOG_RELEASE_INFO("mime type(%s)", ev->types[i]);
+      if(!formatMarkup.compare(ev->types[i]))
+      {
+        continue;
+      }
+
+      if(!selectedType)
+      {
+        selectedType = ev->types[i];
+      }
+    }
+
+    if(!selectedType)
+    {
+      DALI_LOG_ERROR("mime type is invalid.\n");
+      return;
+    }
+
+    DALI_LOG_RELEASE_INFO("data selected signal emit, type:%s\n", selectedType);
+    mDataSelectedSignal.Emit(selectedType);
+  }
+
   uint32_t             mSerial{0u};
   std::string          mMimeType;
   std::string          mData;
   Ecore_Event_Handler* mSendHandler{nullptr};
   Ecore_Event_Handler* mReceiveHandler{nullptr};
+  Ecore_Event_Handler* mSelectionHanlder{nullptr};
 
   Dali::Clipboard::DataSentSignalType     mDataSentSignal;
   Dali::Clipboard::DataReceivedSignalType mDataReceivedSignal;
+  Dali::Clipboard::DataSelectedSignalType mDataSelectedSignal;
 
   uint32_t mDataId{0};
   std::vector<uint32_t> mDataRequestIds;
@@ -256,6 +322,14 @@ static Eina_Bool EcoreEventOfferDataReady(void* data, int type, void* event)
   return ECORE_CALLBACK_PASS_ON;
 }
 
+static Eina_Bool EcoreEventSelectionOffer(void* data, int type, void* event)
+{
+  Clipboard::Impl* impl = reinterpret_cast<Clipboard::Impl*>(data);
+  impl->SelectionOffer(event);
+
+  return ECORE_CALLBACK_PASS_ON;
+}
+
 Clipboard::Clipboard(Impl* impl)
 : mImpl(impl)
 {
@@ -315,6 +389,11 @@ Dali::Clipboard::DataReceivedSignalType& Clipboard::DataReceivedSignal()
   return mImpl->mDataReceivedSignal;
 }
 
+Dali::Clipboard::DataSelectedSignalType& Clipboard::DataSelectedSignal()
+{
+  return mImpl->mDataSelectedSignal;
+}
+
 bool Clipboard::SetData(const Dali::Clipboard::ClipData& clipData)
 {
   return mImpl->SetData(clipData);
index c49a66a..2681ea9 100644 (file)
@@ -54,6 +54,7 @@ struct Clipboard::Impl
     }
 
     mDataSentSignal.Emit(mMimeType.c_str(), mData.c_str());
+    mDataSelectedSignal.Emit(mMimeType.c_str());
 
     return true;
   }
@@ -89,6 +90,7 @@ struct Clipboard::Impl
 
   Dali::Clipboard::DataSentSignalType     mDataSentSignal;
   Dali::Clipboard::DataReceivedSignalType mDataReceivedSignal;
+  Dali::Clipboard::DataSelectedSignalType mDataSelectedSignal;
 
   Dali::Timer mDataReceiveTimer;
 };
@@ -166,6 +168,11 @@ Dali::Clipboard::DataReceivedSignalType& Clipboard::DataReceivedSignal()
   return mImpl->mDataReceivedSignal;
 }
 
+Dali::Clipboard::DataSelectedSignalType& Clipboard::DataSelectedSignal()
+{
+  return mImpl->mDataSelectedSignal;
+}
+
 bool Clipboard::SetData(const Dali::Clipboard::ClipData& clipData)
 {
   return mImpl->SetData(clipData);