From: Bowon Ryu Date: Fri, 1 Sep 2023 10:15:56 +0000 (+0900) Subject: Add DataSelectedSignal for clipboard X-Git-Tag: dali_2.2.44~8^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b6a7a636af0a7bfa7faf99e95f81a05dd9c20bc0;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git Add DataSelectedSignal for clipboard Add DataSelectedSignalType to catch the copy event. Change-Id: Ieb6a3582e32133436bc21939edd05a073c045fa4 Signed-off-by: Bowon Ryu --- diff --git a/dali/devel-api/adaptor-framework/clipboard.cpp b/dali/devel-api/adaptor-framework/clipboard.cpp index 27a64e3..e69c0a7 100644 --- a/dali/devel-api/adaptor-framework/clipboard.cpp +++ b/dali/devel-api/adaptor-framework/clipboard.cpp @@ -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); diff --git a/dali/devel-api/adaptor-framework/clipboard.h b/dali/devel-api/adaptor-framework/clipboard.h index c5a7bcd..3096b2d 100644 --- a/dali/devel-api/adaptor-framework/clipboard.h +++ b/dali/devel-api/adaptor-framework/clipboard.h @@ -82,6 +82,9 @@ public: /// @brief Data receive completed signal. typedef Signal DataReceivedSignalType; + /// @brief To catch data selection event. + typedef Signal 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. diff --git a/dali/internal/clipboard/common/clipboard-impl.h b/dali/internal/clipboard/common/clipboard-impl.h index 261b655..d4e36c1 100644 --- a/dali/internal/clipboard/common/clipboard-impl.h +++ b/dali/internal/clipboard/common/clipboard-impl.h @@ -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); diff --git a/dali/internal/clipboard/generic/clipboard-impl-generic.cpp b/dali/internal/clipboard/generic/clipboard-impl-generic.cpp index bf5bd78..c4bef69 100644 --- a/dali/internal/clipboard/generic/clipboard-impl-generic.cpp +++ b/dali/internal/clipboard/generic/clipboard-impl-generic.cpp @@ -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; diff --git a/dali/internal/clipboard/tizen-wayland/clipboard-impl-ecore-wl.cpp b/dali/internal/clipboard/tizen-wayland/clipboard-impl-ecore-wl.cpp index 9e84a99..d2bfa43 100644 --- a/dali/internal/clipboard/tizen-wayland/clipboard-impl-ecore-wl.cpp +++ b/dali/internal/clipboard/tizen-wayland/clipboard-impl-ecore-wl.cpp @@ -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(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(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(ev->len); std::string content; @@ -226,14 +241,65 @@ struct Clipboard::Impl } } + void SelectionOffer(void* event) + { + Ecore_Wl2_Event_Seat_Selection *ev = reinterpret_cast(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 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(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); diff --git a/dali/internal/clipboard/ubuntu-x11/clipboard-impl-x.cpp b/dali/internal/clipboard/ubuntu-x11/clipboard-impl-x.cpp index c49a66a..2681ea9 100644 --- a/dali/internal/clipboard/ubuntu-x11/clipboard-impl-x.cpp +++ b/dali/internal/clipboard/ubuntu-x11/clipboard-impl-x.cpp @@ -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);