8 #include <Ecore_Evas.h>
18 # define EAPI __declspec(dllexport)
20 # define EAPI __declspec(dllimport)
25 /* BROKEN in gcc 4 on amd64 */
27 # pragma GCC visibility push(hidden)
29 # define EAPI __attribute__ ((visibility("default")))
43 # define EINTERN __attribute__ ((visibility("hidden")))
52 #include "e_xinerama.h"
54 #include "e_xinerama.h"
56 EINTERN int e_init_init(void);
57 EINTERN int e_init_shutdown(void);
58 EAPI void e_init_show(void);
59 EAPI void e_init_hide(void);
60 EAPI void e_init_title_set(const char *str);
61 EAPI void e_init_version_set(const char *str);
62 EAPI void e_init_status_set(const char *str);
63 EAPI void e_init_done(void);
65 /* local subsystem functions */
66 static int _e_ipc_init(void);
67 static Eina_Bool _e_ipc_cb_server_add(void *data, int type, void *event);
68 static Eina_Bool _e_ipc_cb_server_del(void *data, int type, void *event);
69 static Eina_Bool _e_ipc_cb_server_data(void *data, int type, void *event);
71 /* local subsystem globals */
72 static Ecore_Ipc_Server *_e_ipc_server = NULL;
73 static const char *theme = NULL;
74 static int font_hinting = -1;
75 static int engine = -1;
76 static const char *title = NULL;
77 static const char *verstr = NULL;
78 static Eina_List *fpath = NULL;
79 static Ecore_X_Window *initwins = NULL;
80 static int initwins_num = 0;
81 static Ecore_Ipc_Server *server = NULL;
84 delayed_ok(void *data __UNUSED__)
86 kill(getppid(), SIGUSR2);
87 return ECORE_CALLBACK_CANCEL;
91 main(int argc, char **argv)
97 for (i = 1; i < argc; i++)
100 ((!strcmp(argv[i], "-h")) ||
101 (!strcmp(argv[i], "-help")) ||
102 (!strcmp(argv[i], "--help"))))
105 "This is an internal tool for Enlightenment.\n"
110 else if (!theme) theme = argv[i];
111 else if (engine < 0) engine = atoi(argv[i]);
112 else if (font_hinting < 0) font_hinting = atoi(argv[i]);
113 else if (!title) title = argv[i];
114 else if (!verstr) verstr = argv[i];
115 else fpath = eina_list_append(fpath, argv[i]);
120 ecore_app_args_set(argc, (const char **)argv);
124 edje_frametime_set(1.0 / 30.0);
125 s = getenv("E_SCALE");
127 if (s) scale = atof(s);
128 edje_scale_set(scale);
135 e_init_title_set(title);
136 e_init_version_set(verstr);
137 e_init_status_set("");
138 ecore_timer_add(0.2, delayed_ok, NULL);
139 ecore_main_loop_begin();
144 ecore_ipc_server_del(_e_ipc_server);
145 _e_ipc_server = NULL;
148 ecore_ipc_shutdown();
149 ecore_evas_shutdown();
158 /* local subsystem functions */
164 sdir = getenv("E_IPC_SOCKET");
167 printf("The E_IPC_SOCKET environment variable is not set. This is\n"
168 "exported by Enlightenment to all processes it launches.\n"
169 "This environment variable must be set and must point to\n"
170 "Enlightenment's IPC socket file (minus port number).\n");
173 _e_ipc_server = ecore_ipc_server_connect(ECORE_IPC_LOCAL_SYSTEM, sdir, 0, NULL);
174 if (!_e_ipc_server) return 0;
176 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_ADD, _e_ipc_cb_server_add, NULL);
177 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DEL, _e_ipc_cb_server_del, NULL);
178 ecore_event_handler_add(ECORE_IPC_EVENT_SERVER_DATA, _e_ipc_cb_server_data, NULL);
184 _e_ipc_cb_server_add(void *data __UNUSED__, int type __UNUSED__, void *event)
186 Ecore_Ipc_Event_Server_Add *e;
190 ecore_ipc_server_send(server,
191 7/*E_IPC_DOMAIN_INIT*/,
194 initwins, initwins_num * sizeof(Ecore_X_Window));
195 ecore_ipc_server_flush(server);
196 return ECORE_CALLBACK_PASS_ON;
200 _e_ipc_cb_server_del(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__)
203 ecore_main_loop_quit();
204 return ECORE_CALLBACK_PASS_ON;
208 _e_ipc_cb_server_data(void *data __UNUSED__, int type __UNUSED__, void *event)
210 Ecore_Ipc_Event_Server_Data *e;
213 if (e->major != 7/*E_IPC_DOMAIN_INIT*/) return ECORE_CALLBACK_PASS_ON;
217 if (e->data) e_init_status_set(e->data);
226 return ECORE_CALLBACK_PASS_ON;
229 static void _e_init_cb_signal_disable(void *data, Evas_Object *obj, const char *emission, const char *source);
230 static void _e_init_cb_signal_enable(void *data, Evas_Object *obj, const char *emission, const char *source);
231 static void _e_init_cb_signal_done_ok(void *data, Evas_Object *obj, const char *emission, const char *source);
232 static Eina_Bool _e_init_cb_window_configure(void *data, int ev_type, void *ev);
233 static Eina_Bool _e_init_cb_timeout(void *data);
234 static Ecore_Evas *_e_init_evas_new(Ecore_X_Window root, int w, int h, Ecore_X_Window *winret);
236 /* local subsystem globals */
237 static Ecore_X_Window _e_init_root_win = 0;
238 static Ecore_X_Window _e_init_win = 0;
239 static Ecore_Evas *_e_init_ecore_evas = NULL;
240 static Evas *_e_init_evas = NULL;
241 static Evas_Object *_e_init_object = NULL;
242 static Ecore_Event_Handler *_e_init_configure_handler = NULL;
243 static Ecore_Timer *_e_init_timeout_timer = NULL;
245 /* externally accessible functions */
249 Ecore_X_Window root, *roots;
251 Eina_List *l, *screens;
257 _e_init_configure_handler =
258 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CONFIGURE,
259 _e_init_cb_window_configure, NULL);
262 roots = ecore_x_window_root_list(&num);
263 if ((!roots) || (num <= 0)) return 0;
265 _e_init_root_win = root;
268 initwins = malloc(num * 2 * sizeof(Ecore_X_Window));
269 initwins_num = num * 2;
271 /* extra root windows/screens */
272 for (i = 1; i < num; i++)
274 ecore_x_window_size_get(roots[i], &w, &h);
275 _e_init_ecore_evas = _e_init_evas_new(roots[i], w, h, &_e_init_win);
276 _e_init_evas = ecore_evas_get(_e_init_ecore_evas);
277 initwins[(i * 2) + 0] = roots[i];
278 initwins[(i * 2) + 1] = _e_init_win;
280 o = edje_object_add(_e_init_evas);
281 edje_object_file_set(o, s, "e/init/extra_screen");
282 evas_object_move(o, 0, 0);
283 evas_object_resize(o, w, h);
287 /* primary screen/root */
288 ecore_x_window_size_get(root, &w, &h);
289 _e_init_ecore_evas = _e_init_evas_new(root, w, h, &_e_init_win);
290 _e_init_evas = ecore_evas_get(_e_init_ecore_evas);
292 initwins[1] = _e_init_win;
294 /* look at xinerama asto how to slice this up */
295 screens = (Eina_List *)e_xinerama_screens_get();
300 EINA_LIST_FOREACH(screens, l, scr)
302 o = edje_object_add(_e_init_evas);
305 edje_object_file_set(o, s, "e/init/splash");
309 edje_object_file_set(o, s, "e/init/extra_screen");
310 evas_object_move(o, scr->x, scr->y);
311 evas_object_resize(o, scr->w, scr->h);
317 o = edje_object_add(_e_init_evas);
318 edje_object_file_set(o, s, "e/init/splash");
320 evas_object_move(o, 0, 0);
321 evas_object_resize(o, w, h);
325 edje_object_part_text_set(_e_init_object, "e.text.disable_text",
326 "Disable splash screen");
327 edje_object_signal_callback_add(_e_init_object, "e,action,init,disable", "e",
328 _e_init_cb_signal_disable, NULL);
329 edje_object_signal_callback_add(_e_init_object, "e,action,init,enable", "e",
330 _e_init_cb_signal_enable, NULL);
331 edje_object_signal_callback_add(_e_init_object, "e,state,done_ok", "e",
332 _e_init_cb_signal_done_ok, NULL);
335 _e_init_timeout_timer = ecore_timer_add(240.0, _e_init_cb_timeout, NULL);
340 e_init_shutdown(void)
342 if (_e_init_configure_handler)
343 ecore_event_handler_del(_e_init_configure_handler);
344 _e_init_configure_handler = NULL;
352 if (!_e_init_ecore_evas) return;
353 ecore_evas_raise(_e_init_ecore_evas);
354 ecore_evas_show(_e_init_ecore_evas);
360 if (!_e_init_ecore_evas) return;
361 ecore_evas_hide(_e_init_ecore_evas);
362 evas_object_del(_e_init_object);
363 ecore_evas_free(_e_init_ecore_evas);
364 _e_init_ecore_evas = NULL;
367 _e_init_object = NULL;
371 e_init_title_set(const char *str)
373 if (!_e_init_object) return;
374 edje_object_part_text_set(_e_init_object, "e.text.title", str);
378 e_init_version_set(const char *str)
380 if (!_e_init_object) return;
381 edje_object_part_text_set(_e_init_object, "e.text.version", str);
385 e_init_status_set(const char *str)
387 if (!_e_init_object) return;
388 edje_object_part_text_set(_e_init_object, "e.text.status", str);
394 if (!_e_init_object) return;
395 edje_object_signal_emit(_e_init_object, "e,state,done", "e");
396 if (_e_init_timeout_timer) ecore_timer_del(_e_init_timeout_timer);
397 _e_init_timeout_timer = ecore_timer_add(60.0, _e_init_cb_timeout, NULL);
402 _e_init_cb_signal_disable(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
405 ecore_ipc_server_send(server,
406 7/*E_IPC_DOMAIN_INIT*/,
410 ecore_ipc_server_flush(server);
414 _e_init_cb_signal_enable(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
417 ecore_ipc_server_send(server,
418 7/*E_IPC_DOMAIN_INIT*/,
422 ecore_ipc_server_flush(server);
426 _e_init_cb_signal_done_ok(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
429 if (_e_init_timeout_timer)
431 ecore_timer_del(_e_init_timeout_timer);
432 _e_init_timeout_timer = NULL;
434 ecore_main_loop_quit();
438 _e_init_cb_window_configure(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
440 Ecore_X_Event_Window_Configure *e;
443 /* really simple - don't handle xinerama - because this event will only
444 * happen in single head */
445 if (e->win != _e_init_root_win) return ECORE_CALLBACK_PASS_ON;
446 ecore_evas_resize(_e_init_ecore_evas, e->w, e->h);
447 evas_object_resize(_e_init_object, e->w, e->h);
448 return ECORE_CALLBACK_PASS_ON;
452 _e_init_cb_timeout(void *data __UNUSED__)
455 _e_init_timeout_timer = NULL;
456 ecore_main_loop_quit();
457 return ECORE_CALLBACK_CANCEL;
461 _e_init_evas_new(Ecore_X_Window root, int w, int h, Ecore_X_Window *winret)
463 Ecore_Evas *ee = NULL;
468 if ((engine == 0) || (engine == 1))
470 ee = ecore_evas_software_x11_new(NULL, root, 0, 0, w, h);
471 ecore_evas_override_set(ee, 1);
472 ecore_evas_software_x11_direct_resize_set(ee, 1);
473 *winret = ecore_evas_software_x11_window_get(ee);
475 else if (engine == 2)
477 ee = ecore_evas_gl_x11_new(NULL, root, 0, 0, w, h);
478 ecore_evas_override_set(ee, 1);
479 ecore_evas_gl_x11_direct_resize_set(ee, 1);
480 *winret = ecore_evas_gl_x11_window_get(ee);
482 else if (engine == 3)
484 ee = ecore_evas_xrender_x11_new(NULL, root, 0, 0, w, h);
485 ecore_evas_override_set(ee, 1);
486 ecore_evas_xrender_x11_direct_resize_set(ee, 1);
487 *winret = ecore_evas_xrender_x11_window_get(ee);
489 else if (engine == 4)
491 ee = ecore_evas_software_x11_16_new(NULL, root, 0, 0, w, h);
492 ecore_evas_override_set(ee, 1);
493 ecore_evas_software_x11_16_direct_resize_set(ee, 1);
494 *winret = ecore_evas_software_x11_16_window_get(ee);
498 printf("The select engine is unknown or incorrectly set. Please specify a correct one.\n");
502 e = ecore_evas_get(ee);
504 evas_image_cache_set(e, 4096 * 1024);
505 evas_font_cache_set(e, 512 * 1024);
507 EINA_LIST_FOREACH(fpath, l, path)
508 evas_font_path_append(e, path);
510 if (font_hinting == 0)
512 if (evas_font_hinting_can_hint(e, EVAS_FONT_HINTING_BYTECODE))
513 evas_font_hinting_set(e, EVAS_FONT_HINTING_BYTECODE);
514 else if (evas_font_hinting_can_hint(e, EVAS_FONT_HINTING_AUTO))
515 evas_font_hinting_set(e, EVAS_FONT_HINTING_AUTO);
517 evas_font_hinting_set(e, EVAS_FONT_HINTING_NONE);
519 else if (font_hinting == 1)
521 if (evas_font_hinting_can_hint(e, EVAS_FONT_HINTING_AUTO))
522 evas_font_hinting_set(e, EVAS_FONT_HINTING_AUTO);
524 evas_font_hinting_set(e, EVAS_FONT_HINTING_NONE);
526 else if (font_hinting == 2)
527 evas_font_hinting_set(e, EVAS_FONT_HINTING_NONE);
529 ecore_evas_name_class_set(ee, "E", "Init_Window");
530 ecore_evas_title_set(ee, "Enlightenment Init");
532 ecore_evas_raise(ee);