2 #include "e_actions_intern.h"
3 #include "e_test_helper_intern.h"
4 #include "e_user_intern.h"
5 #include "e_utils_intern.h"
6 #include "e_theme_intern.h"
7 #include "e_signals_intern.h"
8 #include "e_security_intern.h"
9 #include "e_screensaver_intern.h"
10 #include "e_scale_intern.h"
11 #include "e_process_intern.h"
12 #include "e_comp_canvas_intern.h"
13 #include "e_comp_intern.h"
14 #include "e_prefix_intern.h"
15 #include "e_config_intern.h"
16 #include "e_keyrouter_intern.h"
17 #include "e_info_server_intern.h"
18 #include "e_icon_intern.h"
21 # include <sys/prctl.h>
24 # include <systemd/sd-daemon.h>
33 t1 = ecore_time_unix_get(); \
34 printf("ESTART: %1.5f [%1.5f] - %s\n", t1 - t0, t1 - t2, x); \
40 TRACE_DS_BEGIN(ESTART: %s, x); \
50 TRACE_DS_MARK(ESTART: %s, x); \
53 static double t0, t1, t2;
61 * i need to make more use of these when i'm baffled as to when something is
64 * void *(*__malloc_hook)(size_t size, const void *caller);
66 * void *(*__realloc_hook)(void *ptr, size_t size, const void *caller);
68 * void *(*__memalign_hook)(size_t alignment, size_t size,
69 * const void *caller);
71 * void (*__free_hook)(void *ptr, const void *caller);
73 * void (*__malloc_initialize_hook)(void);
75 * void (*__after_morecore_hook)(void);
78 static void my_init_hook(void);
79 static void my_free_hook(void *p, const void *caller);
81 static void (*old_free_hook)(void *ptr, const void *caller) = NULL;
82 void (*__free_hook)(void *ptr, const void *caller);
84 void (*__malloc_initialize_hook) (void) = my_init_hook;
88 old_free_hook = __free_hook;
89 __free_hook = my_free_hook;
92 //void *magicfree = NULL;
95 my_free_hook(void *p, const void *caller)
97 __free_hook = old_free_hook;
98 // if ((p) && (p == magicfree))
100 // printf("CAUGHT!!!!! %p ...\n", p);
104 __free_hook = my_free_hook;
108 /* local function prototypes */
109 static void _e_main_shutdown(int errcode);
110 static void _e_main_shutdown_push(int (*func)(void));
111 static void _e_main_parse_arguments(int argc, char **argv);
112 static Eina_Bool _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED);
113 static Eina_Bool _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED);
114 static int _e_main_dirs_init(void);
115 static int _e_main_dirs_shutdown(void);
116 static int _e_main_path_init(void);
117 static int _e_main_path_shutdown(void);
118 static int _e_main_screens_init(void);
119 static int _e_main_screens_shutdown(void);
120 static void _e_main_desk_save(void);
121 static void _e_main_desk_restore(void);
122 static Eina_Bool _e_main_cb_idle_before(void *data EINA_UNUSED);
123 static Eina_Bool _e_main_cb_idle_after(void *data EINA_UNUSED);
124 static void _e_main_create_wm_ready(void);
125 static void _e_main_hooks_clean(void);
126 static void _e_main_hook_call(E_Main_Hook_Point hookpoint, void *data EINA_UNUSED);
128 /* local variables */
129 static int _e_main_lvl = 0;
130 static int(*_e_main_shutdown_func[MAX_LEVEL]) (void);
132 static Ecore_Idle_Enterer *_idle_before = NULL;
133 static Ecore_Idle_Enterer *_idle_after = NULL;
135 static Eina_List *hooks = NULL;
137 static int _e_main_hooks_delete = 0;
138 static int _e_main_hooks_walking = 0;
140 static Eina_Inlist *_e_main_hooks[] =
142 [E_MAIN_HOOK_MODULE_LOAD_DONE] = NULL,
143 [E_MAIN_HOOK_E_INFO_READY] = NULL,
144 [E_MAIN_HOOK_POST_CLIENT_IDLER_BEFORE] = NULL
147 /* external variables */
148 E_API Eina_Bool starting = EINA_TRUE;
149 E_API Eina_Bool stopping = EINA_FALSE;
152 _xdg_check_str(const char *env, const char *str)
158 for (p = strstr(env, str); p; p++, p = strstr(p, str))
160 if ((!p[len]) || (p[len] == ':')) return EINA_TRUE;
166 _xdg_data_dirs_augment(void)
169 const char *p = e_prefix_get();
170 char newpath[PATH_MAX], buf[PATH_MAX + PATH_MAX + 200];
174 s = e_util_env_get("XDG_DATA_DIRS");
177 Eina_Bool pfxdata, pfx;
179 pfxdata = !_xdg_check_str(s, e_prefix_data_get());
180 snprintf(newpath, sizeof(newpath), "%s/share", p);
181 pfx = !_xdg_check_str(s, newpath);
184 snprintf(buf, sizeof(buf), "%s%s%s%s%s",
185 pfxdata ? e_prefix_data_get() : "",
190 e_util_env_set("XDG_DATA_DIRS", buf);
196 snprintf(buf, sizeof(buf), "%s:%s/share:/usr/local/share:/usr/share", e_prefix_data_get(), p);
197 e_util_env_set("XDG_DATA_DIRS", buf);
200 s = e_util_env_get("XDG_CONFIG_DIRS");
201 snprintf(newpath, sizeof(newpath), "%s/etc/xdg", p);
204 if (!_xdg_check_str(s, newpath))
206 snprintf(buf, sizeof(buf), "%s:%s", newpath, s);
207 e_util_env_set("XDG_CONFIG_DIRS", buf);
213 snprintf(buf, sizeof(buf), "%s:/etc/xdg", newpath);
214 e_util_env_set("XDG_CONFIG_DIRS", buf);
217 s = e_util_env_get("XDG_RUNTIME_DIR");
224 snprintf(buf, sizeof(buf), "/tmp/xdg-XXXXXX");
226 if (!dir) dir = "/tmp";
229 e_util_env_set("XDG_RUNTIME_DIR", dir);
230 snprintf(buf, sizeof(buf), "%s/.e-deleteme", dir);
231 ecore_file_mkdir(buf);
235 /* set menu prefix so we get our e menu */
236 s = e_util_env_get("XDG_MENU_PREFIX");
240 e_util_env_set("XDG_MENU_PREFIX", "e-");
244 _e_main_subsystem_defer(void *data EINA_UNUSED)
246 TRACE_DS_BEGIN(MAIN:SUBSYSTEMS DEFER);
248 /* try to init delayed subsystems */
250 TRACE_DS_BEGIN(MAIN:DEFERRED INTERNAL SUBSYSTEMS INIT);
252 TSB("[DEFERRED] DPMS Init");
255 e_error_message_show(_("Enlightenment cannot set up dpms.\n"));
258 TSE("[DEFERRED] DPMS Init Done");
259 _e_main_shutdown_push(e_dpms_shutdown);
261 TSB("[DEFERRED] E_Dnd Init");
264 e_error_message_show(_("Enlightenment cannot set up its dnd system.\n"));
267 TSE("[DEFERRED] E_Dnd Init Done");
268 _e_main_shutdown_push(e_dnd_shutdown);
270 TSB("[DEFERRED] E_Scale Init");
273 e_error_message_show(_("Enlightenment cannot set up its scale system.\n"));
276 TSE("[DEFERRED] E_Scale Init Done");
277 _e_main_shutdown_push(e_scale_shutdown);
279 TSB("[DEFERRED] E_Test_Helper Init");
280 e_test_helper_init();
281 _e_main_shutdown_push(e_test_helper_shutdown);
282 TSE("[DEFERRED] E_Test_Helper Done");
284 TSB("[DEFERRED] E_INFO_SERVER Init");
285 e_info_server_init();
286 _e_main_shutdown_push(e_info_server_shutdown);
287 TSE("[DEFERRED] E_INFO_SERVER Done");
290 TRACE_DS_BEGIN(MAIN:DEFERRED COMP JOB);
292 /* try to do deferred job of any subsystems*/
293 TSB("[DEFERRED] Compositor's deferred job");
294 e_comp_deferred_job();
295 TSE("[DEFERRED] Compositor's deferred job Done");
297 if (e_config->use_e_policy)
299 TSB("[DEFERRED] E_Policy's deferred job");
300 e_policy_deferred_job();
301 TSE("[DEFERRED] E_Policy's deferred job Done");
304 TSB("[DEFERRED] E_Module's deferred job");
305 e_module_deferred_job();
306 TSE("[DEFERRED] E_Module's deferred job Done");
310 return ECORE_CALLBACK_DONE;
316 _e_main_shutdown(-1);
317 return ECORE_CALLBACK_DONE;
321 _e_main_deferred_job_schedule(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
323 PRCTL("[Winsys] all modules loaded");
324 ecore_idler_add(_e_main_subsystem_defer, NULL);
325 return ECORE_CALLBACK_DONE;
328 /* externally accessible functions */
330 main(int argc, char **argv)
333 struct sigaction action;
336 # ifdef PR_SET_PTRACER
337 # ifdef PR_SET_PTRACER_ANY
338 prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY);
343 #ifdef TIZEN_TEST_GCOV
344 setenv("GCOV_PREFIX", "/tmp", 1);
347 /* for debugging by redirecting stdout & stderr of e to a log file to tail */
348 setvbuf(stdout, NULL, _IONBF, 0);
349 setvbuf(stderr, NULL, _IONBF, 0);
352 t0 = t1 = t2 = ecore_time_unix_get();
353 printf("ESTART(main) %1.5f\n", t0);
355 TRACE_DS_BEGIN(MAIN:BEGIN STARTUP);
356 TSB("Begin Startup");
357 PRCTL("[Winsys] start of main");
359 /* trap deadly bug signals and allow some form of sane recovery */
360 /* or ability to gdb attach and debug at this point - better than your */
361 /* wm/desktop vanishing and not knowing what happened */
363 /* don't install SIGBUS handler */
364 /* Wayland shm sets up a sigbus handler for catching invalid shm region */
365 /* access. If we setup our sigbus handler here, then the wl-shm sigbus */
366 /* handler will not function properly */
367 s = e_util_env_get("NOTIFY_SOCKET");
373 action.sa_sigaction = e_sigseg_act;
374 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
375 sigemptyset(&action.sa_mask);
376 sigaction(SIGSEGV, &action, NULL);
378 action.sa_sigaction = e_sigill_act;
379 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
380 sigemptyset(&action.sa_mask);
381 sigaction(SIGILL, &action, NULL);
383 action.sa_sigaction = e_sigfpe_act;
384 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
385 sigemptyset(&action.sa_mask);
386 sigaction(SIGFPE, &action, NULL);
388 action.sa_sigaction = e_sigabrt_act;
389 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
390 sigemptyset(&action.sa_mask);
391 sigaction(SIGABRT, &action, NULL);
392 TSE("Signal Trap Done");
398 e_error_message_show(_("Enlightenment cannot initialize Eina!\n"));
401 TSE("Eina Init Done");
402 _e_main_shutdown_push(eina_shutdown);
404 #ifdef OBJECT_HASH_CHECK
405 TSB("E_Object Hash Init");
406 e_object_hash_init();
407 TSE("E_Object Hash Init Done");
413 e_error_message_show(_("Enlightenment could not create a logging domain!\n"));
416 TSE("E_Log Init Done");
417 _e_main_shutdown_push(e_log_shutdown);
419 TSB("Determine Prefix");
420 if (!e_prefix_determine(argv[0]))
423 "ERROR: Enlightenment cannot determine it's installed\n"
424 " prefix from the system or argv[0].\n"
425 " This is because it is not on Linux AND has been\n"
426 " executed strangely. This is unusual.\n");
428 TSE("Determine Prefix Done");
430 TSB("Parse Arguments");
431 _e_main_parse_arguments(argc, argv);
432 TSE("Parse Arguments Done");
434 /*** Initialize Core EFL Libraries We Need ***/
439 e_error_message_show(_("Enlightenment cannot initialize Eet!\n"));
442 TSE("Eet Init Done");
443 _e_main_shutdown_push(eet_shutdown);
445 /* Allow ecore to not load system modules.
446 * Without it ecore_init will block until dbus authentication
447 * and registration are complete.
449 ecore_app_no_system_modules();
454 e_error_message_show(_("Enlightenment cannot initialize Ecore!\n"));
457 TSE("Ecore Init Done");
458 _e_main_shutdown_push(ecore_shutdown);
463 e_error_message_show(_("Enlightenment cannot initialize EIO!\n"));
466 TSE("EIO Init Done");
467 _e_main_shutdown_push(eio_shutdown);
469 TSB("Ecore Event Handlers");
470 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT,
471 _e_main_cb_signal_exit, NULL))
473 e_error_message_show(_("Enlightenment cannot set up an exit signal handler.\n"
474 "Perhaps you are out of memory?"));
477 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_HUP,
478 _e_main_cb_signal_hup, NULL))
480 e_error_message_show(_("Enlightenment cannot set up a HUP signal handler.\n"
481 "Perhaps you are out of memory?"));
484 TSE("Ecore Event Handlers Done");
486 TSB("Ecore_File Init");
487 if (!ecore_file_init())
489 e_error_message_show(_("Enlightenment cannot initialize Ecore_File!\n"));
492 TSE("Ecore_File Init Done");
493 _e_main_shutdown_push(ecore_file_shutdown);
495 TSB("E_Util_File_Monitor Init");
496 e_util_file_monitor_init();
497 TSE("E_Util_File_Monitor Init Done");
498 _e_main_shutdown_push(e_util_file_monitor_shutdown);
500 _idle_before = ecore_idle_enterer_before_add(_e_main_cb_idle_before, NULL);
502 TSB("XDG_DATA_DIRS Init");
503 _xdg_data_dirs_augment();
504 TSE("XDG_DATA_DIRS Init Done");
506 TSB("Ecore_Evas Init");
507 if (!ecore_evas_init())
509 e_error_message_show(_("Enlightenment cannot initialize Ecore_Evas!\n"));
512 TSE("Ecore_Evas Init Done");
517 e_error_message_show(_("Enlightenment cannot initialize Edje!\n"));
520 TSE("Edje Init Done");
521 _e_main_shutdown_push(edje_shutdown);
523 /*** Initialize E Subsystems We Need ***/
528 e_error_message_show(_("Enlightenment cannot set up user home path\n"));
531 TSE("E User Init Done");
532 _e_main_shutdown_push(e_user_shutdown);
534 TSB("E Directories Init");
535 /* setup directories we will be using for configurations storage etc. */
536 if (!_e_main_dirs_init())
538 e_error_message_show(_("Enlightenment cannot create directories in your home directory.\n"
539 "Perhaps you have no home directory or the disk is full?"));
542 TSE("E Directories Init Done");
543 _e_main_shutdown_push(_e_main_dirs_shutdown);
545 TSB("E_Config Init");
546 if (!e_config_init())
548 e_error_message_show(_("Enlightenment cannot set up its config system.\n"));
551 TSE("E_Config Init Done");
552 _e_main_shutdown_push(e_config_shutdown);
557 e_error_message_show(_("Enlightenment cannot set up its environment.\n"));
560 TSE("E_Env Init Done");
561 _e_main_shutdown_push(e_env_shutdown);
563 ecore_exe_run_priority_set(e_config->priority);
566 if (!_e_main_path_init())
568 e_error_message_show(_("Enlightenment cannot set up paths for finding files.\n"
569 "Perhaps you are out of memory?"));
572 TSE("E Paths Init Done");
573 _e_main_shutdown_push(_e_main_path_shutdown);
575 ecore_animator_frametime_set(1.0 / e_config->framerate);
580 e_error_message_show(_("Enlightenment cannot set up its theme system.\n"));
583 TSE("E_Theme Init Done");
584 _e_main_shutdown_push(e_theme_shutdown);
586 TSB("E_Actions Init");
587 if (!e_actions_init())
589 e_error_message_show(_("Enlightenment cannot set up its actions system.\n"));
592 TSE("E_Actions Init Done");
593 _e_main_shutdown_push(e_actions_shutdown);
595 /* these just add event handlers and can't fail
596 * timestamping them is dumb.
598 e_screensaver_preinit();
603 TRACE_DS_BEGIN(MAIN:WAIT /dev/dri/card0);
604 if (e_config->sleep_for_dri)
606 while(access("/dev/dri/card0", F_OK) != 0)
608 struct timespec req, rem;
610 req.tv_nsec = 50000000L;
611 nanosleep(&req, &rem);
619 e_error_message_show(_("Enlightenment cannot set up its msg system."));
622 TSE("E_Msg Init Done");
623 _e_main_shutdown_push(e_msg_shutdown);
625 e_module_event_init();
627 TSB("E_Pointer Init");
628 if (!e_pointer_init())
630 e_error_message_show(_("Enlightenment cannot set up its pointer system.\n"));
633 TSE("E_Pointer Init Done");
634 _e_main_shutdown_push(e_pointer_shutdown);
636 TRACE_DS_BEGIN(MAIN:SCREEN INIT);
638 if (!_e_main_screens_init())
640 e_error_message_show(_("Enlightenment set up window management for all the screens on your system\n"
641 "failed. Perhaps another window manager is running?\n"));
644 TSE("Screens Init Done");
645 _e_main_shutdown_push(_e_main_screens_shutdown);
648 TSB("E_Devicemgr Init");
649 if (!e_devicemgr_init())
651 e_error_message_show(_("Enlightenment cannot set up its device_manager system.\n"));
654 TSE("E_Devicemgr Init Done");
655 _e_main_shutdown_push(e_devicemgr_shutdown);
657 TSB("E_Keyrouter Init");
658 if (!e_keyrouter_init())
660 e_error_message_show(_("Enlightenment cannot set up its keyrouting system.\n"));
663 TSE("E_Keyrouter Init Done");
664 _e_main_shutdown_push(e_keyrouter_shutdown);
666 if (e_config->eom_enable)
671 e_error_message_show(_("Enlightenment cannot set up eom.\n"));
674 TSE("Eom Init Done");
675 _e_main_shutdown_push(e_eom_shutdown);
678 TSB("E_Screensaver Init");
679 if (!e_screensaver_init())
681 e_error_message_show(_("Enlightenment cannot configure the X screensaver.\n"));
684 TSE("E_Screensaver Init Done");
685 _e_main_shutdown_push(e_screensaver_shutdown);
687 TSB("E_Comp Freeze");
689 TSE("E_Comp Freeze Done");
691 TSB("E_Grabinput Init");
692 if (!e_grabinput_init())
694 e_error_message_show(_("Enlightenment cannot set up its grab input handling system.\n"));
697 TSE("E_Grabinput Init Done");
698 _e_main_shutdown_push(e_grabinput_shutdown);
700 TS("E_Gesture Init");
702 _e_main_shutdown_push(e_gesture_shutdown);
704 ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_deferred_job_schedule, NULL);
706 TSB("E_Module Init");
707 if (!e_module_init())
709 e_error_message_show(_("Enlightenment cannot set up its module system.\n"));
712 TSE("E_Module Init Done");
713 _e_main_shutdown_push(e_module_shutdown);
716 if (!e_mouse_update())
718 e_error_message_show(_("Enlightenment cannot configure the mouse settings.\n"));
721 TSE("E_Mouse Init Done");
726 e_error_message_show(_("Enlightenment cannot initialize the Icon Cache system.\n"));
729 TSE("E_Icon Init Done");
730 _e_main_shutdown_push(e_icon_shutdown);
732 if (e_config->use_e_policy)
734 TSB("E_Policy Init");
735 if (!e_policy_init())
737 e_error_message_show(_("Enlightenment cannot setup policy system!\n"));
740 TSE("E_Policy Init Done");
741 _e_main_shutdown_push(e_policy_shutdown);
744 TSB("E_Process Init");
745 if (!e_process_init())
747 e_error_message_show(_("Enlightenment cannot setup process managing system!\n"));
750 TSE("E_Process Init Done");
751 _e_main_shutdown_push(e_process_shutdown);
753 TSB("E_Security Init");
754 if (!e_security_init())
756 e_error_message_show(_("Enlightenment cannot setup security system!\n"));
759 TSE("E_Security Init Done");
760 _e_main_shutdown_push(e_security_shutdown);
764 TSE("Load Modules Done");
768 TSE("E_Comp Thaw Done");
770 if (e_config->use_thread_max_cpu)
774 cpus = eina_cpu_count();
777 TSM("Set ecore thread max");
778 ecore_thread_max_set(cpus);
782 _idle_after = ecore_idle_enterer_add(_e_main_cb_idle_after, NULL);
784 starting = EINA_FALSE;
786 TSM("MAIN LOOP AT LAST");
788 if (e_config->create_wm_ready)
789 _e_main_create_wm_ready();
794 TSM("[WM] Send start-up completion");
795 sd_notify(0, "READY=1");
797 TSM("[WM] Skip sending start-up completion. (no systemd)");
799 ecore_main_loop_begin();
801 ELOGF("COMP", "STOPPING enlightenment...", NULL);
802 stopping = EINA_TRUE;
805 e_comp_internal_save();
816 _e_main_shutdown(-1);
820 e_main_ts(const char *str)
823 t1 = ecore_time_unix_get();
824 printf("ESTART: %1.5f [%1.5f] - %s\n", t1 - t0, t1 - t2, str);
831 e_main_ts_begin(const char *str)
833 TRACE_DS_BEGIN(ESTART: %s, str);
834 return e_main_ts(str);
838 e_main_ts_end(const char *str)
841 return e_main_ts(str);
844 /* local functions */
846 _e_main_shutdown(int errcode)
852 printf("E: Begin Shutdown Procedure!\n");
854 E_FREE_LIST(hooks, e_main_hook_del);
856 if (_idle_before) ecore_idle_enterer_del(_idle_before);
858 if (_idle_after) ecore_idle_enterer_del(_idle_after);
861 dir = e_util_env_get("XDG_RUNTIME_DIR");
864 char buf_env[PATH_MAX - 12];
865 snprintf(buf_env, sizeof(buf_env), "%s", dir);
866 snprintf(buf, sizeof(buf), "%s/.e-deleteme", buf_env);
867 if (ecore_file_exists(buf)) ecore_file_recursive_rm(buf_env);
870 for (i = (_e_main_lvl - 1); i >= 0; i--)
871 (*_e_main_shutdown_func[i])();
872 #ifdef OBJECT_HASH_CHECK
873 e_object_hash_shutdown();
875 if (errcode < 0) exit(errcode);
879 _e_main_shutdown_push(int (*func)(void))
882 if (_e_main_lvl > MAX_LEVEL)
885 e_error_message_show("WARNING: too many init levels. MAX = %i\n",
889 _e_main_shutdown_func[_e_main_lvl - 1] = func;
893 _e_main_parse_arguments(int argc, char **argv)
897 /* handle some command-line parameters */
898 for (i = 1; i < argc; i++)
900 if ((!strcmp(argv[i], "-profile")) && (i < (argc - 1)))
903 if (!getenv("E_CONF_PROFILE"))
904 e_util_env_set("E_CONF_PROFILE", argv[i]);
906 else if ((!strcmp(argv[i], "-version")) ||
907 (!strcmp(argv[i], "--version")))
909 printf(_("Version: %s\n"), PACKAGE_VERSION);
910 _e_main_shutdown(-1);
912 else if ((!strcmp(argv[i], "-h")) ||
913 (!strcmp(argv[i], "-help")) ||
914 (!strcmp(argv[i], "--help")))
919 "\t-profile CONF_PROFILE\n"
920 "\t\tUse the configuration profile CONF_PROFILE instead of the user selected default or just \"default\".\n"
924 _e_main_shutdown(-1);
930 _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
932 /* called on ctrl-c, kill (pid) (also SIGINT, SIGTERM and SIGQIT) */
933 ecore_main_loop_quit();
934 return ECORE_CALLBACK_RENEW;
938 _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
940 ecore_main_loop_quit();
941 return ECORE_CALLBACK_RENEW;
945 _e_main_dirs_init(void)
947 if(getenv("E_CONF_RO"))
961 base = e_user_dir_get();
962 if (ecore_file_mksubdirs(base, dirs) != sizeof(dirs) / sizeof(dirs[0]) - 1)
964 e_error_message_show("Could not create one of the required "
965 "subdirectories of '%s'\n", base);
973 _e_main_dirs_shutdown(void)
979 _e_main_path_init(void)
983 /* setup data paths */
984 path_data = e_path_new();
987 e_error_message_show("Cannot allocate path for path_data\n");
990 e_prefix_data_concat_static(buf, "data");
991 e_path_default_path_append(path_data, buf);
993 /* setup image paths */
994 path_images = e_path_new();
997 e_error_message_show("Cannot allocate path for path_images\n");
1000 e_user_dir_concat_static(buf, "/images");
1001 e_path_default_path_append(path_images, buf);
1002 e_prefix_data_concat_static(buf, "data/images");
1003 e_path_default_path_append(path_images, buf);
1005 /* setup font paths */
1006 path_fonts = e_path_new();
1009 e_error_message_show("Cannot allocate path for path_fonts\n");
1012 e_user_dir_concat_static(buf, "/fonts");
1013 e_path_default_path_append(path_fonts, buf);
1014 e_prefix_data_concat_static(buf, "data/fonts");
1015 e_path_default_path_append(path_fonts, buf);
1017 /* setup icon paths */
1018 path_icons = e_path_new();
1021 e_error_message_show("Cannot allocate path for path_icons\n");
1024 e_user_dir_concat_static(buf, "/icons");
1025 e_path_default_path_append(path_icons, buf);
1026 e_prefix_data_concat_static(buf, "data/icons");
1027 e_path_default_path_append(path_icons, buf);
1029 /* setup module paths */
1030 path_modules = e_path_new();
1033 e_error_message_show("Cannot allocate path for path_modules\n");
1036 e_user_dir_concat_static(buf, "/modules");
1037 e_path_default_path_append(path_modules, buf);
1038 snprintf(buf, sizeof(buf), "%s/enlightenment/modules", e_prefix_lib_get());
1039 e_path_default_path_append(path_modules, buf);
1040 /* FIXME: eventually this has to go - moduels should have installers that
1041 * add appropriate install paths (if not installed to user homedir) to
1042 * e's module search dirs
1044 snprintf(buf, sizeof(buf), "%s/enlightenment/modules_extra", e_prefix_lib_get());
1045 e_path_default_path_append(path_modules, buf);
1047 /* setup background paths */
1048 path_backgrounds = e_path_new();
1049 if (!path_backgrounds)
1051 e_error_message_show("Cannot allocate path for path_backgrounds\n");
1054 e_user_dir_concat_static(buf, "/backgrounds");
1055 e_path_default_path_append(path_backgrounds, buf);
1056 e_prefix_data_concat_static(buf, "data/backgrounds");
1057 e_path_default_path_append(path_backgrounds, buf);
1059 path_messages = e_path_new();
1062 e_error_message_show("Cannot allocate path for path_messages\n");
1065 e_user_dir_concat_static(buf, "/locale");
1066 e_path_default_path_append(path_messages, buf);
1067 e_path_default_path_append(path_messages, e_prefix_locale_get());
1073 _e_main_path_shutdown(void)
1077 e_object_del(E_OBJECT(path_data));
1082 e_object_del(E_OBJECT(path_images));
1087 e_object_del(E_OBJECT(path_fonts));
1092 e_object_del(E_OBJECT(path_icons));
1097 e_object_del(E_OBJECT(path_modules));
1098 path_modules = NULL;
1100 if (path_backgrounds)
1102 e_object_del(E_OBJECT(path_backgrounds));
1103 path_backgrounds = NULL;
1107 e_object_del(E_OBJECT(path_messages));
1108 path_messages = NULL;
1114 _e_main_screens_init(void)
1116 TSB("\tscreens: client");
1117 if (!e_client_init()) return 0;
1118 TSE("\tscreens: client Done");
1120 TSB("Compositor Init");
1121 PRCTL("[Winsys] start of compositor init");
1124 e_error_message_show(_("Enlightenment cannot create a compositor.\n"));
1125 _e_main_shutdown(-1);
1127 TSE("Compositor Init Done");
1129 PRCTL("[Winsys] end of compositor init");
1130 _e_main_desk_restore();
1136 _e_main_screens_shutdown(void)
1139 e_client_shutdown();
1141 e_magnifier_shutdown();
1148 _e_main_desk_save(void)
1151 char env[1024], name[1024];
1154 EINA_LIST_FOREACH(e_comp->zones, l, zone)
1156 snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
1157 snprintf(env, sizeof(env), "%d,%d", zone->desk_x_current, zone->desk_y_current);
1158 e_util_env_set(name, env);
1163 _e_main_desk_restore(void)
1168 E_CLIENT_REVERSE_FOREACH(ec)
1170 zone = e_comp_zone_find_by_ec(ec);
1171 if ((!e_client_util_ignored_get(ec)) && e_desk_has_ec(e_desk_current_get(zone), ec))
1173 ec->want_focus = ec->take_focus = 1;
1180 _e_main_cb_idle_before(void *data EINA_UNUSED)
1182 e_comp_idler_before();
1183 _e_main_hook_call(E_MAIN_HOOK_POST_CLIENT_IDLER_BEFORE, NULL);
1186 return ECORE_CALLBACK_RENEW;
1190 _e_main_cb_idle_after(void *data EINA_UNUSED)
1192 static int first_idle = 1;
1203 return ECORE_CALLBACK_RENEW;
1207 _e_main_create_wm_ready(void)
1209 FILE *_wmready_checker = NULL;
1210 const char *path_wm_ready = "/run/.wm_ready";
1212 if (!e_util_file_realpath_check(path_wm_ready, EINA_TRUE))
1214 WRN("%s is maybe link, so delete it\n", path_wm_ready);
1217 _wmready_checker = fopen(path_wm_ready, "wb");
1218 if (_wmready_checker)
1220 TSM("[WM] WINDOW MANAGER is READY!!!");
1221 PRCTL("[Winsys] WINDOW MANAGER is READY!!!");
1222 fclose(_wmready_checker);
1224 /*TODO: Next lines should be removed. */
1225 FILE *_tmp_wm_ready_checker;
1227 _tmp_wm_ready_checker = fopen(path_wm_ready, "wb");
1229 if (_tmp_wm_ready_checker)
1231 TSM("[WM] temporary wm_ready path is created.");
1232 PRCTL("[Winsys] temporary wm_ready path is created.");
1233 fclose(_tmp_wm_ready_checker);
1237 TSM("[WM] temporary wm_ready path create failed.");
1238 PRCTL("[Winsys] temporary wm_ready path create failed.");
1243 TSM("[WM] WINDOW MANAGER is READY. BUT, failed to create .wm_ready file.");
1244 PRCTL("[Winsys] WINDOW MANAGER is READY. BUT, failed to create .wm_ready file.");
1249 _e_main_hooks_clean(void)
1255 for (x = 0; x < E_MAIN_HOOK_LAST; x++)
1256 EINA_INLIST_FOREACH_SAFE(_e_main_hooks[x], l, mh)
1258 if (!mh->delete_me) continue;
1259 _e_main_hooks[x] = eina_inlist_remove(_e_main_hooks[x],
1260 EINA_INLIST_GET(mh));
1266 _e_main_hook_call(E_Main_Hook_Point hookpoint, void *data EINA_UNUSED)
1270 _e_main_hooks_walking++;
1271 EINA_INLIST_FOREACH(_e_main_hooks[hookpoint], mh)
1273 if (mh->delete_me) continue;
1276 _e_main_hooks_walking--;
1277 if ((_e_main_hooks_walking == 0) && (_e_main_hooks_delete > 0))
1278 _e_main_hooks_clean();
1282 e_main_hook_add(E_Main_Hook_Point hookpoint, E_Main_Hook_Cb func, const void *data)
1286 EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_MAIN_HOOK_LAST, NULL);
1287 mh = E_NEW(E_Main_Hook, 1);
1288 EINA_SAFETY_ON_NULL_RETURN_VAL(mh, NULL);
1289 mh->hookpoint = hookpoint;
1291 mh->data = (void*)data;
1292 _e_main_hooks[hookpoint] = eina_inlist_append(_e_main_hooks[hookpoint],
1293 EINA_INLIST_GET(mh));
1298 e_main_hook_del(E_Main_Hook *mh)
1301 if (_e_main_hooks_walking == 0)
1303 _e_main_hooks[mh->hookpoint] = eina_inlist_remove(_e_main_hooks[mh->hookpoint],
1304 EINA_INLIST_GET(mh));
1308 _e_main_hooks_delete++;
1312 e_main_hook_call(E_Main_Hook_Point hookpoint)
1314 if ((hookpoint < 0) || (hookpoint >= E_MAIN_HOOK_LAST)) return;
1316 _e_main_hook_call(hookpoint, NULL);