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