Disabling Efreet icon cache
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / ubuntu / framework-ubuntu.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/adaptor/common/framework.h>
20
21 // EXTERNAL INCLUDES
22 #include <X11/Xlib.h>
23 #include <dali/internal/system/linux/dali-ecore.h>
24 #include <dali/internal/system/linux/dali-efreet.h>
25 #include <dali/internal/system/linux/dali-elementary.h>
26
27 #include <dali/integration-api/debug.h>
28
29 // INTERNAL INCLUDES
30 #include <dali/internal/system/common/callback-manager.h>
31
32 namespace Dali
33 {
34 namespace Internal
35 {
36 namespace Adaptor
37 {
38 namespace
39 {
40 /// Application Status Enum
41 enum
42 {
43   APP_CREATE,
44   APP_TERMINATE,
45   APP_PAUSE,
46   APP_RESUME,
47   APP_RESET,
48   APP_LANGUAGE_CHANGE,
49 };
50
51 } // Unnamed namespace
52
53 /**
54  * Impl to hide EFL data members
55  */
56 struct Framework::Impl
57 {
58   // Constructor
59
60   Impl(void* data)
61   : mAbortCallBack(NULL),
62     mCallbackManager(CallbackManager::New()),
63     mLanguage("NOT_SUPPORTED"),
64     mRegion("NOT_SUPPORTED")
65   {
66   }
67
68   ~Impl()
69   {
70     delete mAbortCallBack;
71
72     // we're quiting the main loop so
73     // mCallbackManager->RemoveAllCallBacks() does not need to be called
74     // to delete our abort handler
75     delete mCallbackManager;
76   }
77
78   std::string GetLanguage() const
79   {
80     return mLanguage;
81   }
82
83   std::string GetRegion() const
84   {
85     return mRegion;
86   }
87
88   // Data
89   CallbackBase*    mAbortCallBack;
90   CallbackManager* mCallbackManager;
91   std::string      mLanguage;
92   std::string      mRegion;
93
94   // Static methods
95
96   /**
97    * Called by AppCore on application creation.
98    */
99   static bool AppCreate(void* data)
100   {
101     return static_cast<Framework*>(data)->AppStatusHandler(APP_CREATE, NULL);
102   }
103
104   /**
105    * Called by AppCore when the application should terminate.
106    */
107   static void AppTerminate(void* data)
108   {
109     static_cast<Framework*>(data)->AppStatusHandler(APP_TERMINATE, NULL);
110   }
111
112   /**
113    * Called by AppCore when the application is paused.
114    */
115   static void AppPause(void* data)
116   {
117     static_cast<Framework*>(data)->AppStatusHandler(APP_PAUSE, NULL);
118   }
119
120   /**
121    * Called by AppCore when the application is resumed.
122    */
123   static void AppResume(void* data)
124   {
125     static_cast<Framework*>(data)->AppStatusHandler(APP_RESUME, NULL);
126   }
127
128   /**
129    * Called by AppCore when the language changes on the device.
130    */
131   static void AppLanguageChange(void* data)
132   {
133     static_cast<Framework*>(data)->AppStatusHandler(APP_LANGUAGE_CHANGE, NULL);
134   }
135 };
136
137 Framework::Framework(Framework::Observer& observer, int* argc, char*** argv, Type type)
138 : mObserver(observer),
139   mInitialised(false),
140   mPaused(false),
141   mRunning(false),
142   mArgc(argc),
143   mArgv(argv),
144   mBundleName(""),
145   mBundleId(""),
146   mAbortHandler(MakeCallback(this, &Framework::AbortCallback)),
147   mImpl(NULL)
148 {
149   InitThreads();
150   mImpl = new Impl(this);
151 }
152
153 Framework::~Framework()
154 {
155   if(mRunning)
156   {
157     Quit();
158   }
159
160   delete mImpl;
161 }
162
163 void Framework::Run()
164 {
165   mRunning = true;
166
167   efreet_cache_disable();
168   elm_init(mArgc ? *mArgc : 0, mArgv ? *mArgv : nullptr);
169
170   Impl::AppCreate(this);
171
172   elm_run();
173
174   mRunning = false;
175 }
176
177 void Framework::Quit()
178 {
179   Impl::AppTerminate(this);
180
181   elm_exit();
182 }
183
184 bool Framework::IsMainLoopRunning()
185 {
186   return mRunning;
187 }
188
189 void Framework::AddAbortCallback(CallbackBase* callback)
190 {
191   mImpl->mAbortCallBack = callback;
192 }
193
194 std::string Framework::GetBundleName() const
195 {
196   return mBundleName;
197 }
198
199 void Framework::SetBundleName(const std::string& name)
200 {
201   mBundleName = name;
202 }
203
204 std::string Framework::GetBundleId() const
205 {
206   return mBundleId;
207 }
208
209 std::string Framework::GetResourcePath()
210 {
211   // "DALI_APPLICATION_PACKAGE" is used by Ubuntu specifically to get the already configured Application package path.
212   const char* ubuntuEnvironmentVariable = "DALI_APPLICATION_PACKAGE";
213   char*       value                     = getenv(ubuntuEnvironmentVariable);
214   std::string resourcePath;
215   if(value != NULL)
216   {
217     resourcePath = value;
218   }
219
220   if(resourcePath.back() != '/')
221   {
222     resourcePath += "/";
223   }
224
225   return resourcePath;
226 }
227
228 std::string Framework::GetDataPath()
229 {
230   const char* ubuntuEnvironmentVariable = "DALI_APPLICATION_DATA_DIR";
231   char*       value                     = getenv(ubuntuEnvironmentVariable);
232   std::string dataPath;
233   if(value != NULL)
234   {
235     dataPath = value;
236   }
237
238   return dataPath;
239 }
240
241 void Framework::SetBundleId(const std::string& id)
242 {
243   mBundleId = id;
244 }
245
246 void Framework::AbortCallback()
247 {
248   // if an abort call back has been installed run it.
249   if(mImpl->mAbortCallBack)
250   {
251     CallbackBase::Execute(*mImpl->mAbortCallBack);
252   }
253   else
254   {
255     Quit();
256   }
257 }
258
259 bool Framework::AppStatusHandler(int type, void* bundleData)
260 {
261   switch(type)
262   {
263     case APP_CREATE:
264     {
265       mInitialised = true;
266
267       mObserver.OnInit();
268       break;
269     }
270
271     case APP_RESET:
272       mObserver.OnReset();
273       break;
274
275     case APP_RESUME:
276       mObserver.OnResume();
277       break;
278
279     case APP_TERMINATE:
280       mObserver.OnTerminate();
281       break;
282
283     case APP_PAUSE:
284       mObserver.OnPause();
285       break;
286
287     case APP_LANGUAGE_CHANGE:
288       mObserver.OnLanguageChanged();
289       break;
290
291     default:
292       break;
293   }
294
295   return true;
296 }
297
298 void Framework::InitThreads()
299 {
300   XInitThreads();
301 }
302
303 std::string Framework::GetLanguage() const
304 {
305   return mImpl->GetLanguage();
306 }
307
308 std::string Framework::GetRegion() const
309 {
310   return mImpl->GetRegion();
311 }
312
313 } // namespace Adaptor
314
315 } // namespace Internal
316
317 } // namespace Dali