Direct Rendering
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / windows / framework-win.cpp
1 /*\r
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  *\r
16  */\r
17 \r
18 // CLASS HEADER\r
19 #include <dali/internal/adaptor/common/framework.h>\r
20 \r
21 // EXTERNAL INCLUDES\r
22 #include <dali/integration-api/debug.h>\r
23 #include <windows.h>\r
24 \r
25 // INTERNAL INCLUDES\r
26 #include <dali/internal/system/common/callback-manager.h>\r
27 #include <dali/internal/window-system/windows/platform-implement-win.h>\r
28 \r
29 namespace Dali\r
30 {\r
31 namespace Internal\r
32 {\r
33 namespace Adaptor\r
34 {\r
35 namespace\r
36 {\r
37 /// Application Status Enum\r
38 enum\r
39 {\r
40   APP_CREATE,\r
41   APP_TERMINATE,\r
42   APP_PAUSE,\r
43   APP_RESUME,\r
44   APP_RESET,\r
45   APP_LANGUAGE_CHANGE,\r
46 };\r
47 \r
48 } // Unnamed namespace\r
49 /**\r
50  * Impl to hide WindowsSystem data members\r
51  */\r
52 struct Framework::Impl\r
53 {\r
54   // Constructor\r
55 \r
56   Impl(void* data)\r
57   : mAbortCallBack(NULL),\r
58     mCallbackManager(CallbackManager::New()),\r
59     mLanguage("NOT_SUPPORTED"),\r
60     mRegion("NOT_SUPPORTED")\r
61   {\r
62   }\r
63 \r
64   ~Impl()\r
65   {\r
66     delete mAbortCallBack;\r
67 \r
68     // we're quiting the main loop so\r
69     // mCallbackManager->RemoveAllCallBacks() does not need to be called\r
70     // to delete our abort handler\r
71     delete mCallbackManager;\r
72   }\r
73 \r
74   std::string GetLanguage() const\r
75   {\r
76     return mLanguage;\r
77   }\r
78 \r
79   std::string GetRegion() const\r
80   {\r
81     return mRegion;\r
82   }\r
83 \r
84   // Static methods\r
85 \r
86   /**\r
87    * Called by AppCore on application creation.\r
88    */\r
89   static bool AppCreate(void* data)\r
90   {\r
91     return static_cast<Framework*>(data)->AppStatusHandler(APP_CREATE, NULL);\r
92   }\r
93 \r
94   /**\r
95    * Called by AppCore when the application should terminate.\r
96    */\r
97   static void AppTerminate(void* data)\r
98   {\r
99     static_cast<Framework*>(data)->AppStatusHandler(APP_TERMINATE, NULL);\r
100   }\r
101 \r
102   /**\r
103    * Called by AppCore when the application is paused.\r
104    */\r
105   static void AppPause(void* data)\r
106   {\r
107     static_cast<Framework*>(data)->AppStatusHandler(APP_PAUSE, NULL);\r
108   }\r
109 \r
110   /**\r
111    * Called by AppCore when the application is resumed.\r
112    */\r
113   static void AppResume(void* data)\r
114   {\r
115     static_cast<Framework*>(data)->AppStatusHandler(APP_RESUME, NULL);\r
116   }\r
117 \r
118   /**\r
119    * Called by AppCore when the language changes on the device.\r
120    */\r
121   static void AppLanguageChange(void* data)\r
122   {\r
123     static_cast<Framework*>(data)->AppStatusHandler(APP_LANGUAGE_CHANGE, NULL);\r
124   }\r
125 \r
126   void Run()\r
127   {\r
128     MSG nMsg = {0};\r
129 \r
130     while(GetMessage(&nMsg, 0, NULL, NULL))\r
131     {\r
132       if(WIN_CALLBACK_EVENT == nMsg.message)\r
133       {\r
134         Dali::CallbackBase* callback = (Dali::CallbackBase*)nMsg.wParam;\r
135         Dali::CallbackBase::Execute(*callback);\r
136       }\r
137 \r
138       TranslateMessage(&nMsg);\r
139       DispatchMessage(&nMsg);\r
140 \r
141       mCallbackManager->ClearIdleCallbacks();\r
142 \r
143       if(WM_CLOSE == nMsg.message)\r
144       {\r
145         break;\r
146       }\r
147     }\r
148   }\r
149 \r
150   void Quit()\r
151   {\r
152   }\r
153 \r
154   void SetCallbackBase(CallbackBase* base)\r
155   {\r
156     mAbortCallBack = base;\r
157   }\r
158 \r
159   bool ExcuteCallback()\r
160   {\r
161     if(NULL != mAbortCallBack)\r
162     {\r
163       CallbackBase::Execute(*mAbortCallBack);\r
164       return true;\r
165     }\r
166     else\r
167     {\r
168       return false;\r
169     }\r
170   }\r
171 \r
172 private:\r
173   // Undefined\r
174   Impl(const Impl& impl) = delete;\r
175 \r
176   // Undefined\r
177   Impl& operator=(const Impl& impl) = delete;\r
178 \r
179 private:\r
180   // Data\r
181   CallbackBase*    mAbortCallBack;\r
182   CallbackManager* mCallbackManager;\r
183   std::string      mLanguage;\r
184   std::string      mRegion;\r
185 };\r
186 \r
187 Framework::Framework(Framework::Observer& observer, int* argc, char*** argv, Type type)\r
188 : mObserver(observer),\r
189   mInitialised(false),\r
190   mPaused(false),\r
191   mRunning(false),\r
192   mArgc(argc),\r
193   mArgv(argv),\r
194   mBundleName(""),\r
195   mBundleId(""),\r
196   mAbortHandler(MakeCallback(this, &Framework::AbortCallback)),\r
197   mImpl(NULL)\r
198 {\r
199   InitThreads();\r
200   mImpl = new Impl(this);\r
201 }\r
202 \r
203 Framework::~Framework()\r
204 {\r
205   if(mRunning)\r
206   {\r
207     Quit();\r
208   }\r
209 \r
210   delete mImpl;\r
211 }\r
212 \r
213 void Framework::Run()\r
214 {\r
215   mRunning = true;\r
216 \r
217   Impl::AppCreate(this);\r
218   mImpl->Run();\r
219   mRunning = false;\r
220 }\r
221 \r
222 void Framework::Quit()\r
223 {\r
224   Impl::AppTerminate(this);\r
225 }\r
226 \r
227 bool Framework::IsMainLoopRunning()\r
228 {\r
229   return mRunning;\r
230 }\r
231 \r
232 void Framework::AddAbortCallback(CallbackBase* callback)\r
233 {\r
234   mImpl->SetCallbackBase(callback);\r
235 }\r
236 \r
237 std::string Framework::GetBundleName() const\r
238 {\r
239   return mBundleName;\r
240 }\r
241 \r
242 void Framework::SetBundleName(const std::string& name)\r
243 {\r
244   mBundleName = name;\r
245 }\r
246 \r
247 std::string Framework::GetBundleId() const\r
248 {\r
249   return mBundleId;\r
250 }\r
251 \r
252 std::string Framework::GetResourcePath()\r
253 {\r
254   // "DALI_APPLICATION_PACKAGE" is used by Windows specifically to get the already configured Application package path.\r
255   const char* winEnvironmentVariable = "DALI_APPLICATION_PACKAGE";\r
256   char*       value                  = getenv(winEnvironmentVariable);\r
257 \r
258   std::string resourcePath;\r
259   if(value != NULL)\r
260   {\r
261     resourcePath = value;\r
262   }\r
263 \r
264   if(resourcePath.back() != '/')\r
265   {\r
266     resourcePath += "/";\r
267   }\r
268 \r
269   return resourcePath;\r
270 }\r
271 \r
272 std::string Framework::GetDataPath()\r
273 {\r
274   std::string result = app_get_data_path();\r
275   return result;\r
276 }\r
277 \r
278 void Framework::SetBundleId(const std::string& id)\r
279 {\r
280   mBundleId = id;\r
281 }\r
282 \r
283 void Framework::AbortCallback()\r
284 {\r
285   // if an abort call back has been installed run it.\r
286   if(false == mImpl->ExcuteCallback())\r
287   {\r
288     Quit();\r
289   }\r
290 }\r
291 \r
292 bool Framework::AppStatusHandler(int type, void* bundleData)\r
293 {\r
294   switch(type)\r
295   {\r
296     case APP_CREATE:\r
297     {\r
298       mInitialised = true;\r
299 \r
300       mObserver.OnInit();\r
301       break;\r
302     }\r
303     case APP_RESET:\r
304     {\r
305       mObserver.OnReset();\r
306       break;\r
307     }\r
308     case APP_RESUME:\r
309     {\r
310       mObserver.OnResume();\r
311       break;\r
312     }\r
313     case APP_TERMINATE:\r
314     {\r
315       mObserver.OnTerminate();\r
316       break;\r
317     }\r
318     case APP_PAUSE:\r
319     {\r
320       mObserver.OnPause();\r
321       break;\r
322     }\r
323     case APP_LANGUAGE_CHANGE:\r
324     {\r
325       mObserver.OnLanguageChanged();\r
326       break;\r
327     }\r
328     default:\r
329     {\r
330       break;\r
331     }\r
332   }\r
333 \r
334   return true;\r
335 }\r
336 \r
337 void Framework::InitThreads()\r
338 {\r
339 }\r
340 \r
341 std::string Framework::GetLanguage() const\r
342 {\r
343   return mImpl->GetLanguage();\r
344 }\r
345 \r
346 std::string Framework::GetRegion() const\r
347 {\r
348   return mImpl->GetRegion();\r
349 }\r
350 \r
351 } // namespace Adaptor\r
352 \r
353 } // namespace Internal\r
354 \r
355 } // namespace Dali\r