3 # include <sys/prctl.h>
12 t1 = ecore_time_unix_get(); \
13 printf("ESTART: %1.5f [%1.5f] - %s\n", t1 - t0, t1 - t2, x); \
16 static double t0, t1, t2;
21 * i need to make more use of these when i'm baffled as to when something is
24 * void *(*__malloc_hook)(size_t size, const void *caller);
26 * void *(*__realloc_hook)(void *ptr, size_t size, const void *caller);
28 * void *(*__memalign_hook)(size_t alignment, size_t size,
29 * const void *caller);
31 * void (*__free_hook)(void *ptr, const void *caller);
33 * void (*__malloc_initialize_hook)(void);
35 * void (*__after_morecore_hook)(void);
38 static void my_init_hook(void);
39 static void my_free_hook(void *p, const void *caller);
41 static void (*old_free_hook)(void *ptr, const void *caller) = NULL;
42 void (*__free_hook)(void *ptr, const void *caller);
44 void (*__malloc_initialize_hook) (void) = my_init_hook;
48 old_free_hook = __free_hook;
49 __free_hook = my_free_hook;
52 //void *magicfree = NULL;
55 my_free_hook(void *p, const void *caller)
57 __free_hook = old_free_hook;
58 // if ((p) && (p == magicfree))
60 // printf("CAUGHT!!!!! %p ...\n", p);
64 __free_hook = my_free_hook;
68 /* local function prototypes */
69 static void _e_main_shutdown(int errcode);
70 static void _e_main_shutdown_push(int (*func)(void));
71 static void _e_main_parse_arguments(int argc, char **argv);
72 static Eina_Bool _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED);
73 static Eina_Bool _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED);
74 static Eina_Bool _e_main_cb_signal_user(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev);
75 static int _e_main_dirs_init(void);
76 static int _e_main_dirs_shutdown(void);
77 static int _e_main_path_init(void);
78 static int _e_main_path_shutdown(void);
79 static int _e_main_screens_init(void);
80 static int _e_main_screens_shutdown(void);
81 static void _e_main_desk_save(void);
82 static void _e_main_desk_restore(void);
83 static void _e_main_modules_load(Eina_Bool safe_mode);
84 static Eina_Bool _e_main_cb_idle_before(void *data EINA_UNUSED);
85 static Eina_Bool _e_main_cb_idle_after(void *data EINA_UNUSED);
86 static void _e_main_create_wm_ready(void);
89 static Eina_Bool really_know = EINA_FALSE;
90 static Eina_Bool inloop = EINA_FALSE;
91 static jmp_buf x_fatal_buff;
93 static int _e_main_lvl = 0;
94 static int(*_e_main_shutdown_func[MAX_LEVEL]) (void);
96 static Ecore_Idle_Enterer *_idle_before = NULL;
97 static Ecore_Idle_Enterer *_idle_after = NULL;
99 static Ecore_Event_Handler *mod_init_end = NULL;
101 /* external variables */
102 E_API Eina_Bool e_precache_end = EINA_FALSE;
103 E_API Eina_Bool x_fatal = EINA_FALSE;
104 E_API Eina_Bool good = EINA_FALSE;
105 E_API Eina_Bool evil = EINA_FALSE;
106 E_API Eina_Bool starting = EINA_TRUE;
107 E_API Eina_Bool stopping = EINA_FALSE;
108 E_API Eina_Bool restart = EINA_FALSE;
109 E_API Eina_Bool e_nopause = EINA_FALSE;
110 EINTERN const char *e_first_frame = NULL;
111 EINTERN double e_first_frame_start_time = -1;
114 _xdg_check_str(const char *env, const char *str)
120 for (p = strstr(env, str); p; p++, p = strstr(p, str))
122 if ((!p[len]) || (p[len] == ':')) return EINA_TRUE;
128 _xdg_data_dirs_augment(void)
131 const char *p = e_prefix_get();
132 char newpath[4096], buf[4096];
136 s = getenv("XDG_DATA_DIRS");
139 Eina_Bool pfxdata, pfx;
141 pfxdata = !_xdg_check_str(s, e_prefix_data_get());
142 snprintf(newpath, sizeof(newpath), "%s/share", p);
143 pfx = !_xdg_check_str(s, newpath);
146 snprintf(buf, sizeof(buf), "%s%s%s%s%s",
147 pfxdata ? e_prefix_data_get() : "",
152 e_util_env_set("XDG_DATA_DIRS", buf);
157 snprintf(buf, sizeof(buf), "%s:%s/share:/usr/local/share:/usr/share", e_prefix_data_get(), p);
158 e_util_env_set("XDG_DATA_DIRS", buf);
161 s = getenv("XDG_CONFIG_DIRS");
162 snprintf(newpath, sizeof(newpath), "%s/etc/xdg", p);
165 if (!_xdg_check_str(s, newpath))
167 snprintf(buf, sizeof(buf), "%s:%s", newpath, s);
168 e_util_env_set("XDG_CONFIG_DIRS", buf);
173 snprintf(buf, sizeof(buf), "%s:/etc/xdg", newpath);
174 e_util_env_set("XDG_CONFIG_DIRS", buf);
177 if (!getenv("XDG_RUNTIME_DIR"))
181 snprintf(buf, sizeof(buf), "/tmp/xdg-XXXXXX");
183 if (!dir) dir = "/tmp";
186 e_util_env_set("XDG_RUNTIME_DIR", dir);
187 snprintf(buf, sizeof(buf), "%s/.e-deleteme", dir);
188 ecore_file_mkdir(buf);
192 /* set menu prefix so we get our e menu */
193 if (!getenv("XDG_MENU_PREFIX"))
195 e_util_env_set("XDG_MENU_PREFIX", "e-");
200 _e_main_subsystem_defer(void *data EINA_UNUSED)
205 TRACE_DS_BEGIN(MAIN:SUBSYSTEMS DEFER);
207 ecore_app_args_get(&argc, &argv);
209 /* try to init delayed subsystems */
211 TRACE_DS_BEGIN(MAIN:DEFFERED EFL INIT);
213 TS("[DEFERRED] Edje Init");
216 e_error_message_show(_("Enlightenment cannot initialize Edje!\n"));
218 _e_main_shutdown(-1);
220 TS("[DEFERRED] Edje Init Done");
221 _e_main_shutdown_push(edje_shutdown);
224 TRACE_DS_BEGIN(MAIN:DEFERRED INTERNAL SUBSYSTEMS INIT);
226 TS("[DEFERRED] Screens Init: win");
229 e_error_message_show(_("Enlightenment cannot setup elementary trap!\n"));
231 _e_main_shutdown(-1);
233 TS("[DEFERRED] Screens Init: win Done");
235 TS("[DEFERRED] E_Dnd Init");
238 e_error_message_show(_("Enlightenment cannot set up its dnd system.\n"));
239 _e_main_shutdown(-1);
241 TS("[DEFERRED] E_Dnd Init Done");
242 _e_main_shutdown_push(e_dnd_shutdown);
244 TS("[DEFERRED] E_Pointer Init");
245 if (!e_pointer_init())
247 e_error_message_show(_("Enlightenment cannot set up its pointer system.\n"));
249 _e_main_shutdown(-1);
252 TS("[DEFERRED] E_Pointer Init Done");
253 _e_main_shutdown_push(e_pointer_shutdown);
255 TS("[DEFERRED] E_Scale Init");
258 e_error_message_show(_("Enlightenment cannot set up its scale system.\n"));
260 _e_main_shutdown(-1);
262 TS("[DEFERRED] E_Scale Init Done");
263 _e_main_shutdown_push(e_scale_shutdown);
265 TS("[DEFERRED] E_Test_Helper Init");
266 e_test_helper_init();
267 _e_main_shutdown_push(e_test_helper_shutdown);
268 TS("[DEFERRED] E_Test_Helper Done");
270 TS("[DEFERRED] E_INFO_SERVER Init");
271 e_info_server_init();
272 _e_main_shutdown_push(e_info_server_shutdown);
273 TS("[DEFERRED] E_INFO_SERVER Done");
276 TRACE_DS_BEGIN(MAIN:DEFERRED COMP JOB);
278 /* try to do deferred job of any subsystems*/
279 TS("[DEFERRED] Compositor's deferred job");
280 e_comp_deferred_job();
281 TS("[DEFERRED] Compositor's deferred job Done");
284 TRACE_DS_BEGIN(MAIN:DEFERRED MODULE JOB);
286 TS("[DEFERRED] E_Module's deferred job");
287 e_module_deferred_job();
288 TS("[DEFERRED] E_Module's deferred job Done");
293 return ECORE_CALLBACK_DONE;
297 _e_main_deferred_job_schedule(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
299 ecore_idler_add(_e_main_subsystem_defer, NULL);
300 return ECORE_CALLBACK_DONE;
303 /* externally accessible functions */
305 main(int argc, char **argv)
307 Eina_Bool safe_mode = EINA_FALSE;
308 double t = 0.0, tstart = 0.0;
309 char *s = NULL, buff[32];
310 struct sigaction action;
313 # ifdef PR_SET_PTRACER
314 # ifdef PR_SET_PTRACER_ANY
315 prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY);
320 t0 = t1 = t2 = ecore_time_unix_get();
321 printf("ESTART(main) %1.5f\n", t0);
323 TRACE_DS_BEGIN(MAIN:BEGIN STARTUP);
326 /* trap deadly bug signals and allow some form of sane recovery */
327 /* or ability to gdb attach and debug at this point - better than your */
328 /* wm/desktop vanishing and not knowing what happened */
330 /* don't install SIGBUS handler */
331 /* Wayland shm sets up a sigbus handler for catching invalid shm region */
332 /* access. If we setup our sigbus handler here, then the wl-shm sigbus */
333 /* handler will not function properly */
334 if (!getenv("NOTIFY_SOCKET"))
337 action.sa_sigaction = e_sigseg_act;
338 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
339 sigemptyset(&action.sa_mask);
340 sigaction(SIGSEGV, &action, NULL);
342 action.sa_sigaction = e_sigill_act;
343 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
344 sigemptyset(&action.sa_mask);
345 sigaction(SIGILL, &action, NULL);
347 action.sa_sigaction = e_sigfpe_act;
348 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
349 sigemptyset(&action.sa_mask);
350 sigaction(SIGFPE, &action, NULL);
352 action.sa_sigaction = e_sigabrt_act;
353 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
354 sigemptyset(&action.sa_mask);
355 sigaction(SIGABRT, &action, NULL);
356 TS("Signal Trap Done");
359 t = ecore_time_unix_get();
360 s = getenv("E_START_TIME");
361 if ((s) && (!getenv("E_RESTART_OK")))
364 if ((t - tstart) < 5.0) safe_mode = EINA_TRUE;
367 snprintf(buff, sizeof(buff), "%1.1f", tstart);
368 e_util_env_set("E_START_TIME", buff);
370 if (getenv("E_START_MTRACK"))
371 e_util_env_set("MTRACK", NULL);
375 e_error_message_show(_("Enlightenment cannot initialize Eina!\n"));
376 _e_main_shutdown(-1);
378 TS("Eina Init Done");
379 _e_main_shutdown_push(eina_shutdown);
381 #ifdef OBJECT_HASH_CHECK
382 TS("E_Object Hash Init");
383 e_object_hash_init();
384 TS("E_Object Hash Init Done");
390 e_error_message_show(_("Enlightenment could not create a logging domain!\n"));
391 _e_main_shutdown(-1);
393 TS("E_Log Init Done");
394 _e_main_shutdown_push(e_log_shutdown);
396 TS("Determine Prefix");
397 if (!e_prefix_determine(argv[0]))
400 "ERROR: Enlightenment cannot determine it's installed\n"
401 " prefix from the system or argv[0].\n"
402 " This is because it is not on Linux AND has been\n"
403 " executed strangely. This is unusual.\n");
405 TS("Determine Prefix Done");
407 /* for debugging by redirecting stdout of e to a log file to tail */
408 setvbuf(stdout, NULL, _IONBF, 0);
410 TS("Parse Arguments");
411 _e_main_parse_arguments(argc, argv);
412 TS("Parse Arguments Done");
414 /*** Initialize Core EFL Libraries We Need ***/
419 e_error_message_show(_("Enlightenment cannot initialize Eet!\n"));
420 _e_main_shutdown(-1);
423 _e_main_shutdown_push(eet_shutdown);
425 /* Allow ecore to not load system modules.
426 * Without it ecore_init will block until dbus authentication
427 * and registration are complete.
429 ecore_app_no_system_modules();
434 e_error_message_show(_("Enlightenment cannot initialize Ecore!\n"));
435 _e_main_shutdown(-1);
437 TS("Ecore Init Done");
438 _e_main_shutdown_push(ecore_shutdown);
440 e_first_frame = getenv("E_FIRST_FRAME");
441 if (e_first_frame && e_first_frame[0])
442 e_first_frame_start_time = ecore_time_get();
444 e_first_frame = NULL;
449 e_error_message_show(_("Enlightenment cannot initialize EIO!\n"));
450 _e_main_shutdown(-1);
453 _e_main_shutdown_push(eio_shutdown);
455 ecore_app_args_set(argc, (const char **)argv);
457 TS("Ecore Event Handlers");
458 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT,
459 _e_main_cb_signal_exit, NULL))
461 e_error_message_show(_("Enlightenment cannot set up an exit signal handler.\n"
462 "Perhaps you are out of memory?"));
463 _e_main_shutdown(-1);
465 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_HUP,
466 _e_main_cb_signal_hup, NULL))
468 e_error_message_show(_("Enlightenment cannot set up a HUP signal handler.\n"
469 "Perhaps you are out of memory?"));
470 _e_main_shutdown(-1);
472 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
473 _e_main_cb_signal_user, NULL))
475 e_error_message_show(_("Enlightenment cannot set up a USER signal handler.\n"
476 "Perhaps you are out of memory?"));
477 _e_main_shutdown(-1);
479 TS("Ecore Event Handlers Done");
481 TS("Ecore_File Init");
482 if (!ecore_file_init())
484 e_error_message_show(_("Enlightenment cannot initialize Ecore_File!\n"));
485 _e_main_shutdown(-1);
487 TS("Ecore_File Init Done");
488 _e_main_shutdown_push(ecore_file_shutdown);
490 _idle_before = ecore_idle_enterer_before_add(_e_main_cb_idle_before, NULL);
492 TS("XDG_DATA_DIRS Init");
493 _xdg_data_dirs_augment();
494 TS("XDG_DATA_DIRS Init Done");
496 TS("Ecore_Evas Init");
497 if (!ecore_evas_init())
499 e_error_message_show(_("Enlightenment cannot initialize Ecore_Evas!\n"));
500 _e_main_shutdown(-1);
502 TS("Ecore_Evas Init Done");
504 /* e doesn't sync to compositor - it should be one */
505 ecore_evas_app_comp_sync_set(0);
508 /*** Initialize E Subsystems We Need ***/
510 TS("E Directories Init");
511 /* setup directories we will be using for configurations storage etc. */
512 if (!_e_main_dirs_init())
514 e_error_message_show(_("Enlightenment cannot create directories in your home directory.\n"
515 "Perhaps you have no home directory or the disk is full?"));
516 _e_main_shutdown(-1);
518 TS("E Directories Init Done");
519 _e_main_shutdown_push(_e_main_dirs_shutdown);
522 if (!e_config_init())
524 e_error_message_show(_("Enlightenment cannot set up its config system.\n"));
525 _e_main_shutdown(-1);
527 TS("E_Config Init Done");
528 _e_main_shutdown_push(e_config_shutdown);
533 e_error_message_show(_("Enlightenment cannot set up its environment.\n"));
534 _e_main_shutdown(-1);
536 TS("E_Env Init Done");
537 _e_main_shutdown_push(e_env_shutdown);
539 ecore_exe_run_priority_set(e_config->priority);
542 if (!_e_main_path_init())
544 e_error_message_show(_("Enlightenment cannot set up paths for finding files.\n"
545 "Perhaps you are out of memory?"));
546 _e_main_shutdown(-1);
548 TS("E Paths Init Done");
549 _e_main_shutdown_push(_e_main_path_shutdown);
551 ecore_animator_frametime_set(1.0 / e_config->framerate);
556 e_error_message_show(_("Enlightenment cannot set up its theme system.\n"));
557 _e_main_shutdown(-1);
559 TS("E_Theme Init Done");
560 _e_main_shutdown_push(e_theme_shutdown);
562 TS("E_Actions Init");
563 if (!e_actions_init())
565 e_error_message_show(_("Enlightenment cannot set up its actions system.\n"));
566 _e_main_shutdown(-1);
568 TS("E_Actions Init Done");
569 _e_main_shutdown_push(e_actions_shutdown);
571 /* these just add event handlers and can't fail
572 * timestamping them is dumb.
574 e_screensaver_preinit();
578 if (e_config->sleep_for_dri)
580 while(access("/dev/dri/card0", F_OK) != 0)
582 struct timespec req, rem;
584 req.tv_nsec = 50000000L;
585 nanosleep(&req, &rem);
589 TRACE_DS_BEGIN(MAIN:SCREEN INIT);
591 if (!_e_main_screens_init())
593 e_error_message_show(_("Enlightenment set up window management for all the screens on your system\n"
594 "failed. Perhaps another window manager is running?\n"));
595 _e_main_shutdown(-1);
597 TS("Screens Init Done");
598 _e_main_shutdown_push(_e_main_screens_shutdown);
601 TS("E_Screensaver Init");
602 if (!e_screensaver_init())
604 e_error_message_show(_("Enlightenment cannot configure the X screensaver.\n"));
605 _e_main_shutdown(-1);
607 TS("E_Screensaver Init Done");
608 _e_main_shutdown_push(e_screensaver_shutdown);
612 TS("E_Comp Freeze Done");
614 TS("E_Grabinput Init");
615 if (!e_grabinput_init())
617 e_error_message_show(_("Enlightenment cannot set up its grab input handling system.\n"));
618 _e_main_shutdown(-1);
620 TS("E_Grabinput Init Done");
621 _e_main_shutdown_push(e_grabinput_shutdown);
623 ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_deferred_job_schedule, NULL);
626 if (!e_module_init())
628 e_error_message_show(_("Enlightenment cannot set up its module system.\n"));
629 _e_main_shutdown(-1);
631 TS("E_Module Init Done");
632 _e_main_shutdown_push(e_module_shutdown);
634 TS("E_Remember Init");
635 if (!e_remember_init())
637 e_error_message_show(_("Enlightenment cannot setup remember settings.\n"));
638 _e_main_shutdown(-1);
640 TS("E_Remember Init Done");
641 _e_main_shutdown_push(e_remember_shutdown);
644 if (!e_mouse_update())
646 e_error_message_show(_("Enlightenment cannot configure the mouse settings.\n"));
647 _e_main_shutdown(-1);
649 TS("E_Mouse Init Done");
654 e_error_message_show(_("Enlightenment cannot initialize the Icon Cache system.\n"));
655 _e_main_shutdown(-1);
657 TS("E_Icon Init Done");
658 _e_main_shutdown_push(e_icon_shutdown);
661 _e_main_modules_load(safe_mode);
662 TS("Load Modules Done");
666 TS("E_Comp Thaw Done");
668 _idle_after = ecore_idle_enterer_add(_e_main_cb_idle_after, NULL);
670 starting = EINA_FALSE;
673 e_util_env_set("E_RESTART", "1");
675 TS("MAIN LOOP AT LAST");
677 if (e_config->create_wm_ready)
678 _e_main_create_wm_ready();
681 if (!setjmp(x_fatal_buff))
682 ecore_main_loop_begin();
684 CRI("FATAL: X Died. Connection gone. Abbreviated Shutdown\n");
687 stopping = EINA_TRUE;
690 e_remember_internal_save();
691 e_comp_internal_save();
697 e_util_env_set("E_RESTART_OK", "1");
698 if (getenv("E_START_MTRACK"))
699 e_util_env_set("MTRACK", "track");
709 e_main_ts(const char *str)
712 t1 = ecore_time_unix_get();
713 printf("ESTART: %1.5f [%1.5f] - %s\n", t1 - t0, t1 - t2, str);
719 /* local functions */
721 _e_main_shutdown(int errcode)
727 printf("E: Begin Shutdown Procedure!\n");
729 if (_idle_before) ecore_idle_enterer_del(_idle_before);
731 if (_idle_after) ecore_idle_enterer_del(_idle_after);
734 dir = getenv("XDG_RUNTIME_DIR");
737 char buf_env[PATH_MAX];
738 snprintf(buf_env, sizeof(buf_env), "%s", dir);
739 snprintf(buf, sizeof(buf), "%s/.e-deleteme", buf_env);
740 if (ecore_file_exists(buf)) ecore_file_recursive_rm(buf_env);
742 for (i = (_e_main_lvl - 1); i >= 0; i--)
743 (*_e_main_shutdown_func[i])();
744 #ifdef OBJECT_HASH_CHECK
745 e_object_hash_shutdown();
747 if (errcode < 0) exit(errcode);
751 _e_main_shutdown_push(int (*func)(void))
754 if (_e_main_lvl > MAX_LEVEL)
757 e_error_message_show("WARNING: too many init levels. MAX = %i\n",
761 _e_main_shutdown_func[_e_main_lvl - 1] = func;
765 _e_main_parse_arguments(int argc, char **argv)
770 /* handle some command-line parameters */
771 for (i = 1; i < argc; i++)
773 if ((!strcmp(argv[i], "-display")) && (i < (argc - 1)))
776 e_util_env_set("DISPLAY", argv[i]);
778 else if (!strcmp(argv[i], "-good"))
782 printf("LA LA LA\n");
784 else if (!strcmp(argv[i], "-evil"))
788 printf("MUHAHAHAHHAHAHAHAHA\n");
790 else if (!strcmp(argv[i], "-psychotic"))
794 printf("MUHAHALALALALALALALA\n");
796 else if ((!strcmp(argv[i], "-profile")) && (i < (argc - 1)))
799 if (!getenv("E_CONF_PROFILE"))
800 e_util_env_set("E_CONF_PROFILE", argv[i]);
802 else if (!strcmp(argv[i], "-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it"))
803 really_know = EINA_TRUE;
804 else if (!strcmp(argv[i], "-nopause"))
805 e_nopause = EINA_TRUE;
806 else if ((!strcmp(argv[i], "-version")) ||
807 (!strcmp(argv[i], "--version")))
809 printf(_("Version: %s\n"), PACKAGE_VERSION);
810 _e_main_shutdown(-1);
812 else if ((!strcmp(argv[i], "-h")) ||
813 (!strcmp(argv[i], "-help")) ||
814 (!strcmp(argv[i], "--help")))
819 "\t-display DISPLAY\n"
820 "\t\tConnect to display named DISPLAY.\n"
821 "\t\tEG: -display :1.0\n"
822 "\t-fake-xinerama-screen WxH+X+Y\n"
823 "\t\tAdd a FAKE xinerama screen (instead of the real ones)\n"
824 "\t\tgiven the geometry. Add as many as you like. They all\n"
825 "\t\treplace the real xinerama screens, if any. This can\n"
826 "\t\tbe used to simulate xinerama.\n"
827 "\t\tEG: -fake-xinerama-screen 800x600+0+0 -fake-xinerama-screen 800x600+800+0\n"
828 "\t-profile CONF_PROFILE\n"
829 "\t\tUse the configuration profile CONF_PROFILE instead of the user selected default or just \"default\".\n"
835 "\t\tBe psychotic.\n"
836 "\t-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it\n"
837 "\t\tIf you need this help, you don't need this option.\n"
841 _e_main_shutdown(-1);
845 /* fix up DISPLAY to be :N.0 if no .screen is in it */
846 s = getenv("DISPLAY");
851 if (!(p = strrchr(s, ':')))
853 snprintf(buff, sizeof(buff), "%s:0.0", s);
854 e_util_env_set("DISPLAY", buff);
858 if (!strrchr(p, '.'))
860 snprintf(buff, sizeof(buff), "%s.0", s);
861 e_util_env_set("DISPLAY", buff);
866 /* we want to have been launched by enlightenment_start. there is a very */
867 /* good reason we want to have been launched this way, thus check */
868 if (!getenv("E_START"))
870 e_error_message_show(_("You are executing enlightenment directly. This is\n"
871 "bad. Please do not execute the \"enlightenment\"\n"
872 "binary. Use the \"enlightenment_start\" launcher. It\n"
873 "will handle setting up environment variables, paths,\n"
874 "and launching any other required services etc.\n"
875 "before enlightenment itself begins running.\n"));
876 _e_main_shutdown(-1);
881 _e_main_cb_x_fatal(void *data EINA_UNUSED)
883 e_error_message_show("Lost X Connection.\n");
884 ecore_main_loop_quit();
888 if (inloop) longjmp(x_fatal_buff, -99);
893 _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
895 /* called on ctrl-c, kill (pid) (also SIGINT, SIGTERM and SIGQIT) */
896 ecore_main_loop_quit();
897 return ECORE_CALLBACK_RENEW;
901 _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
904 ecore_main_loop_quit();
905 return ECORE_CALLBACK_RENEW;
909 _e_main_cb_signal_user(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev)
911 Ecore_Event_Signal_User *e = ev;
915 // E_Action *a = e_action_find("configuration");
916 // if ((a) && (a->func.go)) a->func.go(NULL, NULL);
918 else if (e->number == 2)
920 // comp module has its own handler for this for enabling/disabling fps debug
922 return ECORE_CALLBACK_RENEW;
927 _e_main_dirs_init(void)
938 base = e_user_dir_get();
939 if (ecore_file_mksubdirs(base, dirs) != sizeof(dirs) / sizeof(dirs[0]) - 1)
941 e_error_message_show("Could not create one of the required "
942 "subdirectories of '%s'\n", base);
950 _e_main_dirs_shutdown(void)
956 _e_main_path_init(void)
960 /* setup data paths */
961 path_data = e_path_new();
964 e_error_message_show("Cannot allocate path for path_data\n");
967 e_prefix_data_concat_static(buf, "data");
968 e_path_default_path_append(path_data, buf);
970 /* setup image paths */
971 path_images = e_path_new();
974 e_error_message_show("Cannot allocate path for path_images\n");
977 e_user_dir_concat_static(buf, "/images");
978 e_path_default_path_append(path_images, buf);
979 e_prefix_data_concat_static(buf, "data/images");
980 e_path_default_path_append(path_images, buf);
982 /* setup font paths */
983 path_fonts = e_path_new();
986 e_error_message_show("Cannot allocate path for path_fonts\n");
989 e_user_dir_concat_static(buf, "/fonts");
990 e_path_default_path_append(path_fonts, buf);
991 e_prefix_data_concat_static(buf, "data/fonts");
992 e_path_default_path_append(path_fonts, buf);
994 /* setup icon paths */
995 path_icons = e_path_new();
998 e_error_message_show("Cannot allocate path for path_icons\n");
1001 e_user_dir_concat_static(buf, "/icons");
1002 e_path_default_path_append(path_icons, buf);
1003 e_prefix_data_concat_static(buf, "data/icons");
1004 e_path_default_path_append(path_icons, buf);
1006 /* setup module paths */
1007 path_modules = e_path_new();
1010 e_error_message_show("Cannot allocate path for path_modules\n");
1013 e_user_dir_concat_static(buf, "/modules");
1014 e_path_default_path_append(path_modules, buf);
1015 snprintf(buf, sizeof(buf), "%s/enlightenment/modules", e_prefix_lib_get());
1016 e_path_default_path_append(path_modules, buf);
1017 /* FIXME: eventually this has to go - moduels should have installers that
1018 * add appropriate install paths (if not installed to user homedir) to
1019 * e's module search dirs
1021 snprintf(buf, sizeof(buf), "%s/enlightenment/modules_extra", e_prefix_lib_get());
1022 e_path_default_path_append(path_modules, buf);
1024 /* setup background paths */
1025 path_backgrounds = e_path_new();
1026 if (!path_backgrounds)
1028 e_error_message_show("Cannot allocate path for path_backgrounds\n");
1031 e_user_dir_concat_static(buf, "/backgrounds");
1032 e_path_default_path_append(path_backgrounds, buf);
1033 e_prefix_data_concat_static(buf, "data/backgrounds");
1034 e_path_default_path_append(path_backgrounds, buf);
1036 path_messages = e_path_new();
1039 e_error_message_show("Cannot allocate path for path_messages\n");
1042 e_user_dir_concat_static(buf, "/locale");
1043 e_path_default_path_append(path_messages, buf);
1044 e_path_default_path_append(path_messages, e_prefix_locale_get());
1050 _e_main_path_shutdown(void)
1054 e_object_del(E_OBJECT(path_data));
1059 e_object_del(E_OBJECT(path_images));
1064 e_object_del(E_OBJECT(path_fonts));
1069 e_object_del(E_OBJECT(path_icons));
1074 e_object_del(E_OBJECT(path_modules));
1075 path_modules = NULL;
1077 if (path_backgrounds)
1079 e_object_del(E_OBJECT(path_backgrounds));
1080 path_backgrounds = NULL;
1084 e_object_del(E_OBJECT(path_messages));
1085 path_messages = NULL;
1091 _e_main_screens_init(void)
1093 TS("\tscreens: client");
1094 if (!e_client_init()) return 0;
1096 TS("Compositor Init");
1099 e_error_message_show(_("Enlightenment cannot create a compositor.\n"));
1100 _e_main_shutdown(-1);
1103 _e_main_desk_restore();
1109 _e_main_screens_shutdown(void)
1113 e_client_shutdown();
1121 _e_main_desk_save(void)
1124 char env[1024], name[1024];
1127 EINA_LIST_FOREACH(e_comp->zones, l, zone)
1129 snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
1130 snprintf(env, sizeof(env), "%d,%d", zone->desk_x_current, zone->desk_y_current);
1131 e_util_env_set(name, env);
1136 _e_main_desk_restore(void)
1144 EINA_LIST_FOREACH(e_comp->zones, l, zone)
1150 snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
1153 snprintf(buf_e, sizeof(buf_e), "%s", env);
1154 if (!sscanf(buf_e, "%d,%d", &desk_x, &desk_y)) continue;
1155 desk = e_desk_at_xy_get(zone, desk_x, desk_y);
1156 if (!desk) continue;
1160 E_CLIENT_REVERSE_FOREACH(ec)
1161 if ((!e_client_util_ignored_get(ec)) && e_client_util_desk_visible(ec, e_desk_current_get(ec->zone)))
1163 ec->want_focus = ec->take_focus = 1;
1169 _e_main_modules_load_after(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
1171 E_FREE_FUNC(mod_init_end, ecore_event_handler_del);
1172 return ECORE_CALLBACK_RENEW;
1176 _e_main_modules_load(Eina_Bool safe_mode)
1179 e_module_all_load();
1185 crashmodule = getenv("E_MODULE_LOAD");
1186 if (crashmodule) m = e_module_new(crashmodule);
1188 if ((crashmodule) && (m))
1190 e_module_disable(m);
1191 e_object_del(E_OBJECT(m));
1193 e_error_message_show
1194 (_("Enlightenment crashed early on start and has<br>"
1195 "been restarted. There was an error loading the<br>"
1196 "module named: %s. This module has been disabled<br>"
1197 "and will not be loaded."), crashmodule);
1199 (_("Enlightenment crashed early on start and has been restarted"),
1200 _("Enlightenment crashed early on start and has been restarted.<br>"
1201 "There was an error loading the module named: %s<br><br>"
1202 "This module has been disabled and will not be loaded."), crashmodule);
1203 e_module_all_load();
1207 e_error_message_show
1208 (_("Enlightenment crashed early on start and has<br>"
1209 "been restarted. All modules have been disabled<br>"
1210 "and will not be loaded to help remove any problem<br>"
1211 "modules from your configuration. The module<br>"
1212 "configuration dialog should let you select your<br>"
1213 "modules again.\n"));
1215 (_("Enlightenment crashed early on start and has been restarted"),
1216 _("Enlightenment crashed early on start and has been restarted.<br>"
1217 "All modules have been disabled and will not be loaded to help<br>"
1218 "remove any problem modules from your configuration.<br><br>"
1219 "The module configuration dialog should let you select your<br>"
1222 mod_init_end = ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_modules_load_after, NULL);
1227 _e_main_cb_idle_before(void *data EINA_UNUSED)
1229 e_client_idler_before();
1230 e_pointer_idler_before();
1232 return ECORE_CALLBACK_RENEW;
1236 _e_main_cb_idle_after(void *data EINA_UNUSED)
1238 static int first_idle = 1;
1243 #ifdef E_RELEASE_BUILD
1248 e_precache_end = EINA_TRUE;
1251 if (first_idle++ < 60)
1255 e_precache_end = EINA_TRUE;
1259 return ECORE_CALLBACK_RENEW;
1263 _e_main_create_wm_ready(void)
1265 FILE *_wmready_checker = NULL;
1267 _wmready_checker = fopen("/run/.wm_ready", "wb");
1268 if (_wmready_checker)
1270 TS("[WM] WINDOW MANAGER is READY!!!");
1271 fclose(_wmready_checker);
1273 /*TODO: Next lines should be removed. */
1274 FILE *_tmp_wm_ready_checker;
1275 _tmp_wm_ready_checker = fopen("/tmp/.wm_ready", "wb");
1277 if (_tmp_wm_ready_checker)
1279 TS("[WM] temporary wm_ready path is created.");
1280 fclose(_tmp_wm_ready_checker);
1284 TS("[WM] temporary wm_ready path create failed.");
1289 TS("[WM] WINDOW MANAGER is READY. BUT, failed to create .wm_ready file.");