1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #ifdef NEED_RUN_IN_TREE
6 # include "../../static_libs/buildsystem/buildsystem.h"
7 #endif
8
9 #include "ecore_wl2_private.h"
10
11 /* local variables */
12 static int _ecore_wl2_init_count = 0;
13
14 /* external variables */
15 Eina_Bool no_session_recovery;
16 int _ecore_wl2_log_dom = -1;
17
18 /* public API variables */
19 EAPI int ECORE_WL2_EVENT_CONNECT = 0;
20 EAPI int ECORE_WL2_EVENT_DISCONNECT = 0;
21 EAPI int ECORE_WL2_EVENT_GLOBAL_ADDED = 0;
22 EAPI int ECORE_WL2_EVENT_GLOBAL_REMOVED = 0;
23 EAPI int ECORE_WL2_EVENT_FOCUS_IN = 0;
24 EAPI int ECORE_WL2_EVENT_FOCUS_OUT = 0;
25 EAPI int ECORE_WL2_EVENT_DND_ENTER = 0;
26 EAPI int ECORE_WL2_EVENT_DND_LEAVE = 0;
27 EAPI int ECORE_WL2_EVENT_DND_MOTION = 0;
28 EAPI int ECORE_WL2_EVENT_DND_DROP = 0;
29 EAPI int ECORE_WL2_EVENT_DND_END = 0;
30 EAPI int ECORE_WL2_EVENT_DATA_SOURCE_END = 0;
31 EAPI int ECORE_WL2_EVENT_DATA_SOURCE_DROP = 0;
32 EAPI int ECORE_WL2_EVENT_DATA_SOURCE_ACTION = 0;
33 EAPI int ECORE_WL2_EVENT_DATA_SOURCE_TARGET = 0;
34 EAPI int ECORE_WL2_EVENT_DATA_SOURCE_SEND = 0;
35 EAPI int ECORE_WL2_EVENT_WINDOW_CONFIGURE = 0;
36 EAPI int ECORE_WL2_EVENT_SYNC_DONE = 0;
37 EAPI int ECORE_WL2_EVENT_OFFER_DATA_READY = 0;
38 EAPI int ECORE_WL2_EVENT_SEAT_NAME_CHANGED = 0;
39 EAPI int ECORE_WL2_EVENT_SEAT_CAPABILITIES_CHANGED = 0;
40 EAPI int ECORE_WL2_EVENT_DEVICE_ADDED = 0;
41 EAPI int ECORE_WL2_EVENT_DEVICE_REMOVED = 0;
42 EAPI int ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE = 0;
43 EAPI int ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED = 0;
44 EAPI int ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED = 0;
45 EAPI int ECORE_WL2_EVENT_SEAT_SELECTION = 0;
46 EAPI int ECORE_WL2_EVENT_OUTPUT_TRANSFORM = 0;
47 EAPI int ECORE_WL2_EVENT_WINDOW_ROTATE = 0;
48 EAPI int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE = 0;
49 EAPI int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE_DONE = 0;
50 EAPI int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_REQUEST = 0;
51 EAPI int ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_DONE = 0;
52 EAPI int ECORE_WL2_EVENT_AUX_HINT_ALLOWED = 0;
53 EAPI int ECORE_WL2_EVENT_AUX_HINT_SUPPORTED = 0;
54 EAPI int ECORE_WL2_EVENT_AUX_MESSAGE = 0;
55 EAPI int ECORE_WL2_EVENT_WINDOW_SHOW = 0;
56 EAPI int ECORE_WL2_EVENT_WINDOW_HIDE = 0;
57 EAPI int ECORE_WL2_EVENT_WINDOW_ACTIVATE = 0;
58 EAPI int ECORE_WL2_EVENT_WINDOW_DEACTIVATE = 0;
59 EAPI int ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE = 0;
60 EAPI int ECORE_WL2_EVENT_WINDOW_OFFSCREEN = 0;
61 EAPI int ECORE_WL2_EVENT_WINDOW_CREATE = 0;
62 EAPI int ECORE_WL2_EVENT_WINDOW_DESTROY = 0;
63
64 EAPI int _ecore_wl2_event_window_www = -1;
65 EAPI int _ecore_wl2_event_window_www_drag = -1;
66
67 static Eina_Array *supplied_modules = NULL;
68 static Eina_Array *local_modules = NULL;
69
70 static Eina_Bool
_ecore_wl2_surface_modules_init(void)71 _ecore_wl2_surface_modules_init(void)
72 {
73 const char *mod_dir;
74
75 #ifdef NEED_RUN_IN_TREE
76 # if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
77 if (getuid() == geteuid())
78 # endif
79 {
80 char path[PATH_MAX];
81 //when running in tree we are ignoring all the settings
82 //and just load the intree module that we have build
83 if (bs_mod_get(path, sizeof(path), "ecore_wl2/engines","dmabuf"))
84 {
85 Eina_Module *local_module = eina_module_new(path);
86 EINA_SAFETY_ON_NULL_RETURN_VAL(local_module, EINA_FALSE);
87
88 if (!eina_module_load(local_module))
89 {
90 ERR("Cannot load module %s", path);
91 eina_module_free(local_module);
92 local_module = NULL;
93 return EINA_FALSE;
94 }
95 return EINA_TRUE;
96 }
97 }
98 #endif
99 supplied_modules =
100 eina_module_arch_list_get(NULL, PACKAGE_LIB_DIR"/ecore_wl2/engines",
101 MODULE_ARCH);
102 eina_module_list_load(supplied_modules);
103
104 mod_dir = getenv("ECORE_WL2_SURFACE_MODULE_DIR");
105 if (mod_dir)
106 {
107 local_modules =
108 eina_module_list_get(NULL, mod_dir, EINA_TRUE, NULL, NULL);
109 eina_module_list_load(local_modules);
110 }
111
112 if (!supplied_modules && !local_modules)
113 return EINA_FALSE;
114
115 return EINA_TRUE;
116 }
117
118 static void
_ecore_wl2_surface_modules_unload(void)119 _ecore_wl2_surface_modules_unload(void)
120 {
121 eina_module_list_unload(supplied_modules);
122 eina_module_list_unload(local_modules);
123 }
124
125 /* public API functions */
126 EAPI int
ecore_wl2_init(void)127 ecore_wl2_init(void)
128 {
129 if (++_ecore_wl2_init_count != 1) return _ecore_wl2_init_count;
130
131 /* try to initialize Eina */
132 if (!eina_init()) return --_ecore_wl2_init_count;
133
134 /* try to create Eina logging domain */
135 _ecore_wl2_log_dom =
136 eina_log_domain_register("ecore_wl2", ECORE_WL2_DEFAULT_LOG_COLOR);
137 if (_ecore_wl2_log_dom < 0)
138 {
139 EINA_LOG_ERR("Cannot create a log domain for Ecore Wl2");
140 goto eina_err;
141 }
142
143 /* try to initialize Ecore */
144 if (!ecore_init())
145 {
146 ERR("Could not initialize Ecore");
147 goto ecore_err;
148 }
149
150 /* try to initialize Ecore_Event */
151 if (!ecore_event_init())
152 {
153 ERR("Could not initialize Ecore_Event");
154 goto ecore_event_err;
155 }
156
157 if (!_ecore_wl2_surface_modules_init())
158 {
159 ERR("Could not load surface modules");
160 goto module_load_err;
161 }
162
163 /* handle creating new Ecore_Wl2 event types */
164 ECORE_WL2_EVENT_CONNECT = ecore_event_type_new();
165 ECORE_WL2_EVENT_DISCONNECT = ecore_event_type_new();
166 ECORE_WL2_EVENT_GLOBAL_ADDED = ecore_event_type_new();
167 ECORE_WL2_EVENT_GLOBAL_REMOVED = ecore_event_type_new();
168 ECORE_WL2_EVENT_FOCUS_IN = ecore_event_type_new();
169 ECORE_WL2_EVENT_FOCUS_OUT = ecore_event_type_new();
170 ECORE_WL2_EVENT_DND_ENTER = ecore_event_type_new();
171 ECORE_WL2_EVENT_DND_LEAVE = ecore_event_type_new();
172 ECORE_WL2_EVENT_DND_MOTION = ecore_event_type_new();
173 ECORE_WL2_EVENT_DND_DROP = ecore_event_type_new();
174 ECORE_WL2_EVENT_DND_END = ecore_event_type_new();
175 ECORE_WL2_EVENT_DATA_SOURCE_END = ecore_event_type_new();
176 ECORE_WL2_EVENT_DATA_SOURCE_DROP = ecore_event_type_new();
177 ECORE_WL2_EVENT_DATA_SOURCE_ACTION = ecore_event_type_new();
178 ECORE_WL2_EVENT_DATA_SOURCE_TARGET = ecore_event_type_new();
179 ECORE_WL2_EVENT_DATA_SOURCE_SEND = ecore_event_type_new();
180 ECORE_WL2_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
181 ECORE_WL2_EVENT_SYNC_DONE = ecore_event_type_new();
182 ECORE_WL2_EVENT_OFFER_DATA_READY = ecore_event_type_new();
183 ECORE_WL2_EVENT_SEAT_NAME_CHANGED = ecore_event_type_new();
184 ECORE_WL2_EVENT_SEAT_CAPABILITIES_CHANGED = ecore_event_type_new();
185 ECORE_WL2_EVENT_DEVICE_ADDED = ecore_event_type_new();
186 ECORE_WL2_EVENT_DEVICE_REMOVED = ecore_event_type_new();
187 _ecore_wl2_event_window_www = ecore_event_type_new();
188 _ecore_wl2_event_window_www_drag = ecore_event_type_new();
189 ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE = ecore_event_type_new();
190 ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED = ecore_event_type_new();
191 ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED = ecore_event_type_new();
192 ECORE_WL2_EVENT_SEAT_SELECTION = ecore_event_type_new();
193 ECORE_WL2_EVENT_OUTPUT_TRANSFORM = ecore_event_type_new();
194 ECORE_WL2_EVENT_WINDOW_ROTATE = ecore_event_type_new();
195 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE = ecore_event_type_new();
196 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE_DONE = ecore_event_type_new();
197 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_REQUEST = ecore_event_type_new();
198 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_DONE = ecore_event_type_new();
199 ECORE_WL2_EVENT_AUX_HINT_ALLOWED = ecore_event_type_new();
200 ECORE_WL2_EVENT_AUX_HINT_SUPPORTED = ecore_event_type_new();
201 ECORE_WL2_EVENT_AUX_MESSAGE = ecore_event_type_new();
202 ECORE_WL2_EVENT_WINDOW_SHOW = ecore_event_type_new();
203 ECORE_WL2_EVENT_WINDOW_HIDE = ecore_event_type_new();
204 ECORE_WL2_EVENT_WINDOW_ACTIVATE = ecore_event_type_new();
205 ECORE_WL2_EVENT_WINDOW_DEACTIVATE = ecore_event_type_new();
206 ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE = ecore_event_type_new();
207 ECORE_WL2_EVENT_WINDOW_OFFSCREEN = ecore_event_type_new();
208 ECORE_WL2_EVENT_WINDOW_CREATE = ecore_event_type_new();
209 ECORE_WL2_EVENT_WINDOW_DESTROY = ecore_event_type_new();
210
211 if (!no_session_recovery)
212 no_session_recovery = !!getenv("EFL_NO_WAYLAND_SESSION_RECOVERY");
213
214 return _ecore_wl2_init_count;
215
216 module_load_err:
217 ecore_event_shutdown();
218
219 ecore_event_err:
220 ecore_shutdown();
221
222 ecore_err:
223 eina_log_domain_unregister(_ecore_wl2_log_dom);
224 _ecore_wl2_log_dom = -1;
225
226 eina_err:
227 eina_shutdown();
228 return --_ecore_wl2_init_count;
229 }
230
231 EAPI int
ecore_wl2_shutdown(void)232 ecore_wl2_shutdown(void)
233 {
234 if (_ecore_wl2_init_count < 1)
235 {
236 EINA_LOG_ERR("Ecore_Wl2 shutdown called without Ecore_Wl2 Init");
237 return 0;
238 }
239
240 if (--_ecore_wl2_init_count != 0) return _ecore_wl2_init_count;
241
242 /* reset events */
243 ecore_event_type_flush(ECORE_WL2_EVENT_CONNECT,
244 ECORE_WL2_EVENT_DISCONNECT,
245 ECORE_WL2_EVENT_GLOBAL_ADDED,
246 ECORE_WL2_EVENT_GLOBAL_REMOVED,
247 ECORE_WL2_EVENT_FOCUS_IN,
248 ECORE_WL2_EVENT_FOCUS_OUT,
249 ECORE_WL2_EVENT_DND_ENTER,
250 ECORE_WL2_EVENT_DND_LEAVE,
251 ECORE_WL2_EVENT_DND_MOTION,
252 ECORE_WL2_EVENT_DND_DROP,
253 ECORE_WL2_EVENT_DND_END,
254 ECORE_WL2_EVENT_DATA_SOURCE_END,
255 ECORE_WL2_EVENT_DATA_SOURCE_DROP,
256 ECORE_WL2_EVENT_DATA_SOURCE_ACTION,
257 ECORE_WL2_EVENT_DATA_SOURCE_TARGET,
258 ECORE_WL2_EVENT_DATA_SOURCE_SEND,
259 ECORE_WL2_EVENT_WINDOW_CONFIGURE,
260 ECORE_WL2_EVENT_SYNC_DONE,
261 ECORE_WL2_EVENT_OFFER_DATA_READY,
262 ECORE_WL2_EVENT_SEAT_NAME_CHANGED,
263 ECORE_WL2_EVENT_SEAT_CAPABILITIES_CHANGED,
264 ECORE_WL2_EVENT_DEVICE_ADDED,
265 ECORE_WL2_EVENT_DEVICE_REMOVED,
266 ECORE_WL2_EVENT_WINDOW_CONFIGURE_COMPLETE,
267 ECORE_WL2_EVENT_SEAT_KEYMAP_CHANGED,
268 ECORE_WL2_EVENT_SEAT_KEYBOARD_REPEAT_CHANGED,
269 ECORE_WL2_EVENT_SEAT_SELECTION,
270 ECORE_WL2_EVENT_OUTPUT_TRANSFORM,
271 ECORE_WL2_EVENT_WINDOW_ROTATE,
272 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE,
273 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_PREPARE_DONE,
274 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_REQUEST,
275 ECORE_WL2_EVENT_WINDOW_ROTATION_CHANGE_DONE,
276 ECORE_WL2_EVENT_AUX_HINT_ALLOWED,
277 ECORE_WL2_EVENT_AUX_HINT_SUPPORTED,
278 ECORE_WL2_EVENT_AUX_MESSAGE,
279 ECORE_WL2_EVENT_WINDOW_SHOW,
280 ECORE_WL2_EVENT_WINDOW_HIDE,
281 ECORE_WL2_EVENT_WINDOW_ACTIVATE,
282 ECORE_WL2_EVENT_WINDOW_DEACTIVATE,
283 ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE,
284 ECORE_WL2_EVENT_WINDOW_OFFSCREEN,
285 ECORE_WL2_EVENT_WINDOW_CREATE,
286 ECORE_WL2_EVENT_WINDOW_DESTROY);
287
288 /* shutdown Ecore_Event */
289 ecore_event_shutdown();
290
291 /* shutdown Ecore */
292 ecore_shutdown();
293
294 /* unregister logging domain */
295 eina_log_domain_unregister(_ecore_wl2_log_dom);
296 _ecore_wl2_log_dom = -1;
297
298 _ecore_wl2_surface_modules_unload();
299
300 /* shutdown eina */
301 eina_shutdown();
302
303 return _ecore_wl2_init_count;
304 }
305
306 EAPI void
ecore_wl2_session_recovery_disable(void)307 ecore_wl2_session_recovery_disable(void)
308 {
309 no_session_recovery = EINA_TRUE;
310 }
311