[dali_2.3.23] Merge branch 'devel/master'
[platform/core/uifw/dali-adaptor.git] / dali / internal / system / windows / trigger-event.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/system/windows/trigger-event.h>\r
20 \r
21 // EXTERNAL INCLUDES\r
22 #include <unistd.h>\r
23 \r
24 #include <dali/integration-api/debug.h>\r
25 \r
26 // INTERNAL INCLUDES\r
27 #include <dali/internal/system/common/file-descriptor-monitor.h>\r
28 #include <dali/internal/window-system/windows/platform-implement-win.h>\r
29 \r
30 namespace Dali\r
31 {\r
32 namespace Internal\r
33 {\r
34 namespace Adaptor\r
35 {\r
36 TriggerEvent::TriggerEvent(CallbackBase* callback, TriggerEventInterface::Options options)\r
37 : mCallback(callback),\r
38   mThreadID(-1),\r
39   mOptions(options)\r
40 {\r
41   // Create accompanying file descriptor.\r
42   mThreadID = WindowsPlatform::GetCurrentThreadId();\r
43 \r
44   if(mThreadID < 0)\r
45   {\r
46     DALI_LOG_ERROR("Unable to create TriggerEvent File descriptor\n");\r
47   }\r
48 \r
49   mSelfCallback = MakeCallback(this, &TriggerEvent::Triggered);\r
50 }\r
51 \r
52 TriggerEvent::~TriggerEvent()\r
53 {\r
54   delete mCallback;\r
55   delete mSelfCallback;\r
56 \r
57   if(mThreadID >= 0)\r
58   {\r
59     mThreadID = 0;\r
60   }\r
61 }\r
62 \r
63 void TriggerEvent::Trigger()\r
64 {\r
65   if(mThreadID >= 0)\r
66   {\r
67     // Increment event counter by 1.\r
68     // Writing to the file descriptor triggers the Dispatch() method in the other thread\r
69     // (if in multi-threaded environment).\r
70     WindowsPlatform::PostWinThreadMessage(WIN_CALLBACK_EVENT, reinterpret_cast<uint64_t>(mSelfCallback), 0, mThreadID);\r
71   }\r
72   else\r
73   {\r
74     DALI_LOG_WARNING("Attempting to write to an invalid file descriptor\n");\r
75   }\r
76 }\r
77 \r
78 void TriggerEvent::Triggered()\r
79 {\r
80   // Call the connected callback\r
81   CallbackBase::Execute(*mCallback);\r
82 \r
83   //check if we should delete ourselves after the trigger\r
84   if(mOptions == TriggerEventInterface::DELETE_AFTER_TRIGGER)\r
85   {\r
86     delete this;\r
87   }\r
88 }\r
89 \r
90 } // namespace Adaptor\r
91 \r
92 } // namespace Internal\r
93 \r
94 } // namespace Dali\r