2 * Copyright (c) 2016 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 <pepper-dali/internal/compositor-impl.h>
22 #include <pepper-dali/internal/extensions/tizen-policy.h>
25 #include <dali/integration-api/debug.h>
26 #include <wayland-server.h>
27 #include <wayland-tbm-server.h>
28 #include <tizen-extension-client-protocol.h>
29 #include <Ecore_Wayland.h>
43 #if defined(DEBUG_ENABLED)
44 Integration::Log::Filter* gPepperCompositorLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_PEPPER_COMPOSITOR" );
47 static void EmbeddedCompositorGetSocket( void* data, struct tizen_embedded_compositor* embeddedCompositor, int fd )
49 int* socketFd = (int*)data;
55 static const struct tizen_embedded_compositor_listener tizenEmbeddedCompositorListener =
57 EmbeddedCompositorGetSocket
60 } // unnamed namespace
62 CompositorPtr Compositor::New( Application application, const std::string& name )
64 CompositorPtr impl = new Compositor();
66 // Second-phase init of the implementation
67 impl->Initialize( application, name );
72 Compositor::Compositor()
73 : mCompositor( NULL ),
85 Compositor::~Compositor()
87 Extension::TizenPolicyShutdown();
91 wayland_tbm_server_deinit( mTbmServer );
96 pepper_compositor_destroy( mCompositor );
101 ecore_main_fd_handler_del( mFdHandler );
105 const std::string& Compositor::GetName() const
110 void* Compositor::GetCompositorHandle()
112 return static_cast< void* >( mCompositor );
115 void Compositor::Initialize( Application application, const std::string& name )
117 // Get socket fd from server
118 int socketFd = GetSocketFdFromServer();
121 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::Initialize: socket fd is invalid.\n" );
126 mCompositor = pepper_compositor_create_fd( name.c_str(), socketFd );
129 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::Initialize: pepper_compositor_create_fd is failed. [%d]\n", socketFd );
133 mDisplay = pepper_compositor_get_display( mCompositor );
136 mShell = Pepper::Shell::New( Pepper::Compositor( this ) );
139 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::Initialize: Fail to create shell.\n" );
140 pepper_compositor_destroy( mCompositor );
145 if( !Extension::TizenPolicyInit( mCompositor ) )
147 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::Initialize: Fail to init extension.\n" );
148 pepper_compositor_destroy( mCompositor );
153 mTbmServer = wayland_tbm_server_init( mDisplay, NULL, -1, 0 );
156 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::Initialize: wayland_tbm_server_init is failed.\n" );
157 Extension::TizenPolicyShutdown();
158 pepper_compositor_destroy( mCompositor );
164 mInput = Pepper::Input::New( Pepper::Compositor( this ) );
167 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::Initialize: Fail to create input.\n" );
168 wayland_tbm_server_deinit( mTbmServer );
170 Extension::TizenPolicyShutdown();
171 pepper_compositor_destroy( mCompositor );
176 mSocketName = pepper_compositor_get_socket_name( mCompositor );
178 mEventLoop = wl_display_get_event_loop( mDisplay );
180 int loopFd = wl_event_loop_get_fd( mEventLoop );
182 mFdHandler = ecore_main_fd_handler_add( loopFd, (Ecore_Fd_Handler_Flags)(ECORE_FD_READ | ECORE_FD_ERROR), Compositor::FdReadCallback, this, NULL, NULL );
184 ecore_main_fd_handler_prepare_callback_set( mFdHandler, Compositor::FdPrepareCallback, this );
187 mOutput = Pepper::Output::New( Pepper::Compositor( this ), application, mInput );
190 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::Initialize: Fail to create output.\n" );
192 ecore_main_fd_handler_del( mFdHandler );
194 wayland_tbm_server_deinit( mTbmServer );
196 Extension::TizenPolicyShutdown();
197 pepper_compositor_destroy( mCompositor );
202 mOutput.ObjectViewAddedSignal().Connect( this, &Compositor::OnObjectViewAdded );
203 mOutput.ObjectViewDeletedSignal().Connect( this, &Compositor::OnObjectViewDeleted );
205 DALI_LOG_INFO( gPepperCompositorLogging, Debug::Verbose, "Compositor::Initialize: success. socket name = %s\n", mSocketName.c_str() );
208 int Compositor::GetSocketFdFromServer()
212 Ecore_Wl_Global* global;
213 struct tizen_embedded_compositor* embeddedCompositor = NULL;
216 list = ecore_wl_globals_get();
219 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::GetSocketFdFromServer: ecore_wl_globals_get returns NULL.\n" );
223 EINA_INLIST_FOREACH_SAFE( list, tmp, global )
225 if( !strcmp( global->interface, "tizen_embedded_compositor" ) )
227 embeddedCompositor = static_cast< struct tizen_embedded_compositor* >( wl_registry_bind( ecore_wl_registry_get(), global->id, &tizen_embedded_compositor_interface, 1 ) );
229 tizen_embedded_compositor_add_listener( embeddedCompositor, &tizenEmbeddedCompositorListener, &fd );
234 if( !embeddedCompositor )
236 DALI_LOG_INFO( gPepperCompositorLogging, Debug::General, "Compositor::GetSocketFdFromServer: tizen_embedded_compositor is not supported.\n" );
240 tizen_embedded_compositor_get_socket( embeddedCompositor );
243 tizen_embedded_compositor_destroy( embeddedCompositor );
248 Pepper::Compositor::CompositorSignalType& Compositor::ObjectViewAddedSignal()
250 return mObjectViewAddedSignal;
253 Pepper::Compositor::CompositorSignalType& Compositor::ObjectViewDeletedSignal()
255 return mObjectViewDeletedSignal;
258 void Compositor::OnObjectViewAdded( Pepper::Output output, Pepper::ObjectView objectView )
260 Pepper::Compositor handle( this );
261 mObjectViewAddedSignal.Emit( handle, objectView );
263 DALI_LOG_INFO( gPepperCompositorLogging, Debug::Verbose, "Compositor::ObjectViewAddedSignal: ObjectView is added!\n" );
266 void Compositor::OnObjectViewDeleted( Pepper::Output output, Pepper::ObjectView objectView )
268 Pepper::Compositor handle( this );
269 mObjectViewDeletedSignal.Emit( handle, objectView );
271 DALI_LOG_INFO( gPepperCompositorLogging, Debug::Verbose, "Compositor::ObjectViewDeletedSignal: ObjectView is deleted!\n" );
274 Eina_Bool Compositor::FdReadCallback( void* data, Ecore_Fd_Handler* handler )
276 Compositor* compositor = static_cast< Compositor* >( data );
278 wl_event_loop_dispatch( compositor->mEventLoop, 0 );
280 return ECORE_CALLBACK_RENEW;
283 void Compositor::FdPrepareCallback( void* data, Ecore_Fd_Handler* handler )
285 Compositor* compositor = static_cast< Compositor* >( data );
287 wl_display_flush_clients( compositor->mDisplay );
290 } // namespace Internal
292 } // namespace Pepper