2 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/clipboard/common/clipboard-impl.h>
20 #include <dali/devel-api/adaptor-framework/clipboard-event-notifier.h>
23 #include <dali/internal/system/linux/dali-ecore.h>
26 #include <dali/internal/adaptor/tizen-wayland/dali-ecore-wl2.h>
28 #include <dali/internal/adaptor/tizen-wayland/dali-ecore-wayland.h>
31 #include <dali/public-api/object/any.h>
32 #include <dali/public-api/object/type-registry.h>
33 #include <dali/integration-api/debug.h>
36 #ifdef DALI_ELDBUS_AVAILABLE
38 #endif // DALI_ELDBUS_AVAILABLE
41 #include <dali/internal/system/common/singleton-service-impl.h>
43 #define CBHM_DBUS_OBJPATH "/org/tizen/cbhm/dbus"
44 #ifndef CBHM_DBUS_INTERFACE
45 #define CBHM_DBUS_INTERFACE "org.tizen.cbhm.dbus"
46 #endif /* CBHM_DBUS_INTERFACE */
47 #define CBHM_COUNT_ALL 0 // ATOM_INDEX_CBHM_COUNT_ALL
49 ///////////////////////////////////////////////////////////////////////////////////////////////////
51 ///////////////////////////////////////////////////////////////////////////////////////////////////
62 struct Clipboard::Impl
66 Eldbus_Object *eldbus_obj;
67 cbhm_conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
68 eldbus_obj = eldbus_object_get(cbhm_conn, CBHM_DBUS_INTERFACE, CBHM_DBUS_OBJPATH);
69 eldbus_proxy = eldbus_proxy_get(eldbus_obj, CBHM_DBUS_INTERFACE);
70 eldbus_name_owner_changed_callback_add(cbhm_conn, CBHM_DBUS_INTERFACE, NULL, cbhm_conn, EINA_TRUE);
71 eldbus_proxy_signal_handler_add(eldbus_proxy, "ItemClicked", _on_item_clicked, this);
73 mIsFirstTimeHidden = true;
79 eldbus_connection_unref(cbhm_conn);
82 Eldbus_Proxy* cbhm_proxy_get()
87 Eldbus_Connection* cbhm_connection_get()
92 void SetItem( const std::string &itemData )
94 const char *types[10] = {0, };
97 if (itemData.length() == 0)
101 mSendBuffer = itemData;
103 // ELM_SEL_TYPE_CLIPBOARD - To distinguish clipboard selection in cbhm
104 types[++i] = "CLIPBOARD_BEGIN";
106 types[++i] = "text/plain;charset=utf-8";
108 // ELM_SEL_TYPE_CLIPBOARD - To distinguish clipboard selection in cbhm
109 types[++i] = "CLIPBOARD_END";
111 #ifdef ECORE_WAYLAND2
112 Ecore_Wl2_Input* input = ecore_wl2_input_default_input_get( ecore_wl2_connected_display_get( NULL ) );
113 ecore_wl2_dnd_selection_set( input, types );
115 ecore_wl_dnd_selection_set( ecore_wl_input_get(), types );
121 #ifdef ECORE_WAYLAND2
122 Ecore_Wl2_Input* input = ecore_wl2_input_default_input_get( ecore_wl2_connected_display_get( NULL ) );
123 ecore_wl2_dnd_selection_get( input );
125 const char *types[10] = {0, };
128 types[++i] = "text/plain;charset=utf-8";
129 ecore_wl_dnd_selection_get(ecore_wl_input_get(), *types);
132 Dali::ClipboardEventNotifier clipboardEventNotifier(Dali::ClipboardEventNotifier::Get());
133 if ( clipboardEventNotifier )
135 clipboardEventNotifier.SetContent( mSendBuffer );
136 clipboardEventNotifier.EmitContentSelectedSignal();
140 char *ExcuteSend( void *event )
142 #ifdef ECORE_WAYLAND2
143 Ecore_Wl2_Event_Data_Source_Send *ev = reinterpret_cast<Ecore_Wl2_Event_Data_Source_Send *>( event );
145 Ecore_Wl_Event_Data_Source_Send *ev = reinterpret_cast<Ecore_Wl_Event_Data_Source_Send *>( event );
148 int len_buf = mSendBuffer.length();
149 int len_remained = len_buf;
150 int len_written = 0, ret;
151 const char *buf = mSendBuffer.c_str();
153 while (len_written < len_buf)
155 ret = write(ev->fd, buf, len_remained);
156 if (ret == -1) break;
165 char *ExcuteReceive( void *event )
167 #ifdef ECORE_WAYLAND2
168 Ecore_Wl2_Event_Selection_Data_Ready *ev = reinterpret_cast<Ecore_Wl2_Event_Selection_Data_Ready *>( event );
170 Ecore_Wl_Event_Selection_Data_Ready *ev = reinterpret_cast<Ecore_Wl_Event_Selection_Data_Ready *>( event );
173 return reinterpret_cast<char *>( ev->data );
178 Eldbus_Message *reply, *req;
179 const char *errname = NULL, *errmsg = NULL;
182 if (!(req = eldbus_proxy_method_call_new(eldbus_proxy, "CbhmGetCount")))
184 DALI_LOG_ERROR("Failed to create method call on org.freedesktop.DBus.Properties.Get");
188 eldbus_message_ref(req);
189 eldbus_message_arguments_append(req, "i", CBHM_COUNT_ALL) ;
190 reply = eldbus_proxy_send_and_block(eldbus_proxy, req, 100);
191 if (!reply || eldbus_message_error_get(reply, &errname, &errmsg))
193 DALI_LOG_ERROR("Unable to call method org.freedesktop.DBus.Properties.Get: %s %s",
195 eldbus_message_unref(req);
198 eldbus_message_unref(reply);
203 if (!eldbus_message_arguments_get(reply, "i", &count))
205 DALI_LOG_ERROR("Cannot get arguments from eldbus");
206 eldbus_message_unref(req);
207 eldbus_message_unref(reply);
211 eldbus_message_unref(req);
212 eldbus_message_unref(reply);
213 DALI_LOG_ERROR("cbhm item count(%d)", count);
219 eldbus_proxy_call(cbhm_proxy_get(), "CbhmShow", NULL, NULL, -1, "s", "0");
220 mIsFirstTimeHidden = true;
224 void HideClipboard( bool skipFirstHide )
226 if ( skipFirstHide && mIsFirstTimeHidden )
228 mIsFirstTimeHidden = false;
231 eldbus_proxy_call(cbhm_proxy_get(), "CbhmHide", NULL, NULL, -1, "");
232 mIsFirstTimeHidden = false;
236 bool IsVisible() const
241 static void _on_item_clicked(void *data, const Eldbus_Message *msg EINA_UNUSED)
243 static_cast<Clipboard::Impl*>(data)->RequestItem();
246 Eldbus_Proxy *eldbus_proxy;
247 Eldbus_Connection *cbhm_conn;
249 std::string mSendBuffer;
251 bool mIsFirstTimeHidden;
254 Clipboard::Clipboard(Impl* impl)
259 Clipboard::~Clipboard()
264 Dali::Clipboard Clipboard::Get()
266 Dali::Clipboard clipboard;
268 Dali::SingletonService service( SingletonService::Get() );
271 // Check whether the singleton is already created
272 Dali::BaseHandle handle = service.GetSingleton( typeid( Dali::Clipboard ) );
275 // If so, downcast the handle
276 clipboard = Dali::Clipboard( dynamic_cast< Clipboard* >( handle.GetObjectPtr() ) );
280 Clipboard::Impl* impl( new Clipboard::Impl() );
281 clipboard = Dali::Clipboard( new Clipboard(impl) );
282 service.Register( typeid(Dali::Clipboard), clipboard );
289 bool Clipboard::SetItem(const std::string &itemData )
291 mImpl->SetItem( itemData );
296 * Request clipboard service to give an item
298 void Clipboard::RequestItem()
300 mImpl->RequestItem();
304 * Get number of items in clipboard
306 unsigned int Clipboard::NumberOfItems()
308 return mImpl->GetCount();
311 void Clipboard::ShowClipboard()
313 mImpl->ShowClipboard();
316 void Clipboard::HideClipboard(bool skipFirstHide)
318 mImpl->HideClipboard(skipFirstHide);
321 bool Clipboard::IsVisible() const
323 return mImpl->IsVisible();
326 char* Clipboard::ExcuteBuffered( bool type, void *event )
328 return (type ? mImpl->ExcuteSend( event ) : mImpl->ExcuteReceive( event ));
331 } // namespace Adaptor
333 } // namespace Internal