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/system/linux/callback-manager-ecore.h>
22 #include <dali/internal/system/linux/dali-ecore.h>
24 #include <dali/integration-api/debug.h>
39 * Structure contains the callback function and control options
47 CallbackData( CallbackBase* callback, bool hasReturnValue )
48 : mCallback( callback ),
49 mRemoveFromContainerFunction( NULL ),
52 mHasReturnValue( hasReturnValue )
61 delete mRemoveFromContainerFunction;
64 CallbackBase* mCallback; ///< call back
65 CallbackBase* mRemoveFromContainerFunction; ///< Called to remove the callbackdata from the callback container
66 Ecore_Idler* mIdler; ///< ecore idler
67 Ecore_Idle_Enterer* mIdleEnterer; ///< ecore idle enterer
68 bool mHasReturnValue; ///< true if the callback function has a return value.
75 * Called from the main thread while idle.
77 Eina_Bool IdleCallback(void *data)
79 Eina_Bool ret = ECORE_CALLBACK_CANCEL; // CALLBACK Cancel will delete the idler so we don't need to call ecore_idler_del
80 CallbackData *callbackData = static_cast< CallbackData * >( data );
82 if( callbackData->mHasReturnValue )
85 bool retValue = CallbackBase::ExecuteReturn< bool >( *callbackData->mCallback );
89 ret = ECORE_CALLBACK_RENEW;
93 // remove callback data from the container
94 CallbackBase::Execute( *callbackData->mRemoveFromContainerFunction, callbackData );
102 // remove callback data from the container
103 CallbackBase::Execute( *callbackData->mRemoveFromContainerFunction, callbackData );
106 CallbackBase::Execute( *callbackData->mCallback );
115 } // unnamed namespace
117 EcoreCallbackManager::EcoreCallbackManager()
123 void EcoreCallbackManager::Start()
125 DALI_ASSERT_DEBUG( mRunning == false );
130 void EcoreCallbackManager::Stop()
132 // make sure we're not called twice
133 DALI_ASSERT_DEBUG( mRunning == true );
135 RemoveAllCallbacks();
141 bool EcoreCallbackManager::AddIdleCallback( CallbackBase* callback, bool hasReturnValue )
148 CallbackData* callbackData = new CallbackData( callback, hasReturnValue );
150 callbackData->mRemoveFromContainerFunction = MakeCallback( this, &EcoreCallbackManager::RemoveCallbackFromContainer );
152 // add the call back to the container
153 mCallbackContainer.push_front(callbackData);
156 callbackData->mIdler = ecore_idler_add( IdleCallback, callbackData);
158 DALI_ASSERT_ALWAYS( ( callbackData->mIdler != NULL ) && "Idle method not created" );
163 void EcoreCallbackManager::RemoveIdleCallback( CallbackBase* callback )
165 for( CallbackList::iterator it = mCallbackContainer.begin(),
166 endIt = mCallbackContainer.end();
170 CallbackData* data = *it;
172 if( data->mCallback == callback )
174 // remove callback data from the container.
175 CallbackBase::Execute( *data->mRemoveFromContainerFunction, data );
177 ecore_idler_del( data->mIdler );
187 bool EcoreCallbackManager::ProcessIdle()
189 // @todo To be implemented.
193 void EcoreCallbackManager::ClearIdleCallbacks()
195 // @todo To be implemented.
198 bool EcoreCallbackManager::AddIdleEntererCallback( CallbackBase* callback )
205 CallbackData* callbackData = new CallbackData( callback, true );
207 callbackData->mRemoveFromContainerFunction = MakeCallback( this, &EcoreCallbackManager::RemoveCallbackFromContainer );
209 // add the call back to the container
210 mCallbackContainer.push_front( callbackData );
213 callbackData->mIdleEnterer = ecore_idle_enterer_add( IdleCallback, callbackData );
215 DALI_ASSERT_ALWAYS( ( callbackData->mIdleEnterer != NULL ) && "Idle method not created" );
220 void EcoreCallbackManager::RemoveIdleEntererCallback( CallbackBase* callback )
222 for( CallbackList::iterator it = mCallbackContainer.begin(),
223 endIt = mCallbackContainer.end();
227 CallbackData* data = *it;
229 if( data->mCallback == callback )
231 // remove callback data from the container.
232 CallbackBase::Execute( *data->mRemoveFromContainerFunction, data );
234 ecore_idle_enterer_del( data->mIdleEnterer );
244 void EcoreCallbackManager::RemoveCallbackFromContainer(CallbackData *callbackData)
246 mCallbackContainer.remove(callbackData);
249 void EcoreCallbackManager::RemoveAllCallbacks()
251 // always called from main thread
252 for( CallbackList::iterator iter = mCallbackContainer.begin(); iter != mCallbackContainer.end(); ++iter)
254 CallbackData* data = (*iter);
258 ecore_idler_del( data->mIdler );
260 else if( data->mIdleEnterer )
262 ecore_idle_enterer_del( data->mIdleEnterer );
267 mCallbackContainer.clear();
270 // Creates a concrete interface for CallbackManager
271 CallbackManager* CallbackManager::New()
273 return new EcoreCallbackManager;
276 } // namespace Adaptor
278 } // namespace Internal