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 if (e_config->use_e_policy)
286 TRACE_DS_BEGIN(MAIN:DEFERRED POLICY JOB);
288 TS("[DEFERRED] E_Policy's deferred job");
289 e_policy_deferred_job();
290 TS("[DEFERRED] E_Policy's deferred job Done");
294 TRACE_DS_BEGIN(MAIN:DEFERRED MODULE JOB);
296 TS("[DEFERRED] E_Module's deferred job");
297 e_module_deferred_job();
298 TS("[DEFERRED] E_Module's deferred job Done");
303 return ECORE_CALLBACK_DONE;
307 _e_main_deferred_job_schedule(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
309 PRCTL("[Winsys] all modules loaded");
310 ecore_idler_add(_e_main_subsystem_defer, NULL);
311 return ECORE_CALLBACK_DONE;
314 /* externally accessible functions */
316 main(int argc, char **argv)
318 Eina_Bool safe_mode = EINA_FALSE;
319 double t = 0.0, tstart = 0.0;
320 char *s = NULL, buff[32];
321 struct sigaction action;
324 # ifdef PR_SET_PTRACER
325 # ifdef PR_SET_PTRACER_ANY
326 prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY);
331 t0 = t1 = t2 = ecore_time_unix_get();
332 printf("ESTART(main) %1.5f\n", t0);
334 TRACE_DS_BEGIN(MAIN:BEGIN STARTUP);
336 PRCTL("[Winsys] start of main");
338 /* trap deadly bug signals and allow some form of sane recovery */
339 /* or ability to gdb attach and debug at this point - better than your */
340 /* wm/desktop vanishing and not knowing what happened */
342 /* don't install SIGBUS handler */
343 /* Wayland shm sets up a sigbus handler for catching invalid shm region */
344 /* access. If we setup our sigbus handler here, then the wl-shm sigbus */
345 /* handler will not function properly */
346 if (!getenv("NOTIFY_SOCKET"))
349 action.sa_sigaction = e_sigseg_act;
350 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
351 sigemptyset(&action.sa_mask);
352 sigaction(SIGSEGV, &action, NULL);
354 action.sa_sigaction = e_sigill_act;
355 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
356 sigemptyset(&action.sa_mask);
357 sigaction(SIGILL, &action, NULL);
359 action.sa_sigaction = e_sigfpe_act;
360 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
361 sigemptyset(&action.sa_mask);
362 sigaction(SIGFPE, &action, NULL);
364 action.sa_sigaction = e_sigabrt_act;
365 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
366 sigemptyset(&action.sa_mask);
367 sigaction(SIGABRT, &action, NULL);
368 TS("Signal Trap Done");
371 t = ecore_time_unix_get();
372 s = getenv("E_START_TIME");
373 if ((s) && (!getenv("E_RESTART_OK")))
376 if ((t - tstart) < 5.0) safe_mode = EINA_TRUE;
379 snprintf(buff, sizeof(buff), "%1.1f", tstart);
380 e_util_env_set("E_START_TIME", buff);
382 if (getenv("E_START_MTRACK"))
383 e_util_env_set("MTRACK", NULL);
387 e_error_message_show(_("Enlightenment cannot initialize Eina!\n"));
388 _e_main_shutdown(-1);
390 TS("Eina Init Done");
391 _e_main_shutdown_push(eina_shutdown);
393 #ifdef OBJECT_HASH_CHECK
394 TS("E_Object Hash Init");
395 e_object_hash_init();
396 TS("E_Object Hash Init Done");
402 e_error_message_show(_("Enlightenment could not create a logging domain!\n"));
403 _e_main_shutdown(-1);
405 TS("E_Log Init Done");
406 _e_main_shutdown_push(e_log_shutdown);
408 TS("Determine Prefix");
409 if (!e_prefix_determine(argv[0]))
412 "ERROR: Enlightenment cannot determine it's installed\n"
413 " prefix from the system or argv[0].\n"
414 " This is because it is not on Linux AND has been\n"
415 " executed strangely. This is unusual.\n");
417 TS("Determine Prefix Done");
419 /* for debugging by redirecting stdout of e to a log file to tail */
420 setvbuf(stdout, NULL, _IONBF, 0);
422 TS("Parse Arguments");
423 _e_main_parse_arguments(argc, argv);
424 TS("Parse Arguments Done");
426 /*** Initialize Core EFL Libraries We Need ***/
431 e_error_message_show(_("Enlightenment cannot initialize Eet!\n"));
432 _e_main_shutdown(-1);
435 _e_main_shutdown_push(eet_shutdown);
437 /* Allow ecore to not load system modules.
438 * Without it ecore_init will block until dbus authentication
439 * and registration are complete.
441 ecore_app_no_system_modules();
446 e_error_message_show(_("Enlightenment cannot initialize Ecore!\n"));
447 _e_main_shutdown(-1);
449 TS("Ecore Init Done");
450 _e_main_shutdown_push(ecore_shutdown);
452 e_first_frame = getenv("E_FIRST_FRAME");
453 if (e_first_frame && e_first_frame[0])
454 e_first_frame_start_time = ecore_time_get();
456 e_first_frame = NULL;
461 e_error_message_show(_("Enlightenment cannot initialize EIO!\n"));
462 _e_main_shutdown(-1);
465 _e_main_shutdown_push(eio_shutdown);
467 ecore_app_args_set(argc, (const char **)argv);
469 TS("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?"));
475 _e_main_shutdown(-1);
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?"));
482 _e_main_shutdown(-1);
484 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
485 _e_main_cb_signal_user, NULL))
487 e_error_message_show(_("Enlightenment cannot set up a USER signal handler.\n"
488 "Perhaps you are out of memory?"));
489 _e_main_shutdown(-1);
491 TS("Ecore Event Handlers Done");
493 TS("Ecore_File Init");
494 if (!ecore_file_init())
496 e_error_message_show(_("Enlightenment cannot initialize Ecore_File!\n"));
497 _e_main_shutdown(-1);
499 TS("Ecore_File Init Done");
500 _e_main_shutdown_push(ecore_file_shutdown);
502 _idle_before = ecore_idle_enterer_before_add(_e_main_cb_idle_before, NULL);
504 TS("XDG_DATA_DIRS Init");
505 _xdg_data_dirs_augment();
506 TS("XDG_DATA_DIRS Init Done");
508 TS("Ecore_Evas Init");
509 if (!ecore_evas_init())
511 e_error_message_show(_("Enlightenment cannot initialize Ecore_Evas!\n"));
512 _e_main_shutdown(-1);
514 TS("Ecore_Evas Init Done");
516 /* e doesn't sync to compositor - it should be one */
517 ecore_evas_app_comp_sync_set(0);
520 /*** Initialize E Subsystems We Need ***/
522 TS("E Directories Init");
523 /* setup directories we will be using for configurations storage etc. */
524 if (!_e_main_dirs_init())
526 e_error_message_show(_("Enlightenment cannot create directories in your home directory.\n"
527 "Perhaps you have no home directory or the disk is full?"));
528 _e_main_shutdown(-1);
530 TS("E Directories Init Done");
531 _e_main_shutdown_push(_e_main_dirs_shutdown);
534 if (!e_config_init())
536 e_error_message_show(_("Enlightenment cannot set up its config system.\n"));
537 _e_main_shutdown(-1);
539 TS("E_Config Init Done");
540 _e_main_shutdown_push(e_config_shutdown);
545 e_error_message_show(_("Enlightenment cannot set up its environment.\n"));
546 _e_main_shutdown(-1);
548 TS("E_Env Init Done");
549 _e_main_shutdown_push(e_env_shutdown);
551 ecore_exe_run_priority_set(e_config->priority);
554 if (!_e_main_path_init())
556 e_error_message_show(_("Enlightenment cannot set up paths for finding files.\n"
557 "Perhaps you are out of memory?"));
558 _e_main_shutdown(-1);
560 TS("E Paths Init Done");
561 _e_main_shutdown_push(_e_main_path_shutdown);
563 ecore_animator_frametime_set(1.0 / e_config->framerate);
568 e_error_message_show(_("Enlightenment cannot set up its theme system.\n"));
569 _e_main_shutdown(-1);
571 TS("E_Theme Init Done");
572 _e_main_shutdown_push(e_theme_shutdown);
574 TS("E_Actions Init");
575 if (!e_actions_init())
577 e_error_message_show(_("Enlightenment cannot set up its actions system.\n"));
578 _e_main_shutdown(-1);
580 TS("E_Actions Init Done");
581 _e_main_shutdown_push(e_actions_shutdown);
583 /* these just add event handlers and can't fail
584 * timestamping them is dumb.
586 e_screensaver_preinit();
591 TRACE_DS_BEGIN(MAIN:WAIT /dev/dri/card0);
592 if (e_config->sleep_for_dri)
594 while(access("/dev/dri/card0", F_OK) != 0)
596 struct timespec req, rem;
598 req.tv_nsec = 50000000L;
599 nanosleep(&req, &rem);
604 TRACE_DS_BEGIN(MAIN:SCREEN INIT);
606 if (!_e_main_screens_init())
608 e_error_message_show(_("Enlightenment set up window management for all the screens on your system\n"
609 "failed. Perhaps another window manager is running?\n"));
610 _e_main_shutdown(-1);
612 TS("Screens Init Done");
613 _e_main_shutdown_push(_e_main_screens_shutdown);
616 TS("E_Screensaver Init");
617 if (!e_screensaver_init())
619 e_error_message_show(_("Enlightenment cannot configure the X screensaver.\n"));
620 _e_main_shutdown(-1);
622 TS("E_Screensaver Init Done");
623 _e_main_shutdown_push(e_screensaver_shutdown);
627 TS("E_Comp Freeze Done");
629 TS("E_Grabinput Init");
630 if (!e_grabinput_init())
632 e_error_message_show(_("Enlightenment cannot set up its grab input handling system.\n"));
633 _e_main_shutdown(-1);
635 TS("E_Grabinput Init Done");
636 _e_main_shutdown_push(e_grabinput_shutdown);
638 ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_deferred_job_schedule, NULL);
641 if (!e_module_init())
643 e_error_message_show(_("Enlightenment cannot set up its module system.\n"));
644 _e_main_shutdown(-1);
646 TS("E_Module Init Done");
647 _e_main_shutdown_push(e_module_shutdown);
649 TS("E_Remember Init");
650 if (!e_remember_init())
652 e_error_message_show(_("Enlightenment cannot setup remember settings.\n"));
653 _e_main_shutdown(-1);
655 TS("E_Remember Init Done");
656 _e_main_shutdown_push(e_remember_shutdown);
659 if (!e_mouse_update())
661 e_error_message_show(_("Enlightenment cannot configure the mouse settings.\n"));
662 _e_main_shutdown(-1);
664 TS("E_Mouse Init Done");
669 e_error_message_show(_("Enlightenment cannot initialize the Icon Cache system.\n"));
670 _e_main_shutdown(-1);
672 TS("E_Icon Init Done");
673 _e_main_shutdown_push(e_icon_shutdown);
675 if (e_config->use_e_policy)
678 if (!e_policy_init())
680 e_error_message_show(_("Enlightenment cannot setup policy system!\n"));
681 _e_main_shutdown(-1);
683 TS("E_Policy Init Done");
684 _e_main_shutdown_push(e_policy_shutdown);
687 TS("E_Process Init");
688 if (!e_process_init())
690 e_error_message_show(_("Enlightenment cannot setup process managing system!\n"));
691 _e_main_shutdown(-1);
693 TS("E_Process Init Done");
694 _e_main_shutdown_push(e_process_shutdown);
697 _e_main_modules_load(safe_mode);
698 TS("Load Modules Done");
702 TS("E_Comp Thaw Done");
704 _idle_after = ecore_idle_enterer_add(_e_main_cb_idle_after, NULL);
706 starting = EINA_FALSE;
709 e_util_env_set("E_RESTART", "1");
711 TS("MAIN LOOP AT LAST");
713 if (e_config->create_wm_ready)
714 _e_main_create_wm_ready();
717 if (!setjmp(x_fatal_buff))
718 ecore_main_loop_begin();
720 CRI("FATAL: X Died. Connection gone. Abbreviated Shutdown\n");
723 stopping = EINA_TRUE;
726 e_remember_internal_save();
727 e_comp_internal_save();
733 e_util_env_set("E_RESTART_OK", "1");
734 if (getenv("E_START_MTRACK"))
735 e_util_env_set("MTRACK", "track");
745 e_main_ts(const char *str)
748 t1 = ecore_time_unix_get();
749 printf("ESTART: %1.5f [%1.5f] - %s\n", t1 - t0, t1 - t2, str);
755 /* local functions */
757 _e_main_shutdown(int errcode)
763 printf("E: Begin Shutdown Procedure!\n");
765 if (_idle_before) ecore_idle_enterer_del(_idle_before);
767 if (_idle_after) ecore_idle_enterer_del(_idle_after);
770 dir = getenv("XDG_RUNTIME_DIR");
773 char buf_env[PATH_MAX];
774 snprintf(buf_env, sizeof(buf_env), "%s", dir);
775 snprintf(buf, sizeof(buf), "%s/.e-deleteme", buf_env);
776 if (ecore_file_exists(buf)) ecore_file_recursive_rm(buf_env);
778 for (i = (_e_main_lvl - 1); i >= 0; i--)
779 (*_e_main_shutdown_func[i])();
780 #ifdef OBJECT_HASH_CHECK
781 e_object_hash_shutdown();
783 if (errcode < 0) exit(errcode);
787 _e_main_shutdown_push(int (*func)(void))
790 if (_e_main_lvl > MAX_LEVEL)
793 e_error_message_show("WARNING: too many init levels. MAX = %i\n",
797 _e_main_shutdown_func[_e_main_lvl - 1] = func;
801 _e_main_parse_arguments(int argc, char **argv)
805 /* handle some command-line parameters */
806 for (i = 1; i < argc; i++)
808 if (!strcmp(argv[i], "-good"))
812 printf("LA LA LA\n");
814 else if (!strcmp(argv[i], "-evil"))
818 printf("MUHAHAHAHHAHAHAHAHA\n");
820 else if (!strcmp(argv[i], "-psychotic"))
824 printf("MUHAHALALALALALALALA\n");
826 else if ((!strcmp(argv[i], "-profile")) && (i < (argc - 1)))
829 if (!getenv("E_CONF_PROFILE"))
830 e_util_env_set("E_CONF_PROFILE", argv[i]);
832 else if (!strcmp(argv[i], "-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it"))
833 really_know = EINA_TRUE;
834 else if (!strcmp(argv[i], "-nopause"))
835 e_nopause = EINA_TRUE;
836 else if ((!strcmp(argv[i], "-version")) ||
837 (!strcmp(argv[i], "--version")))
839 printf(_("Version: %s\n"), PACKAGE_VERSION);
840 _e_main_shutdown(-1);
842 else if ((!strcmp(argv[i], "-h")) ||
843 (!strcmp(argv[i], "-help")) ||
844 (!strcmp(argv[i], "--help")))
849 "\t-display DISPLAY\n"
850 "\t\tConnect to display named DISPLAY.\n"
851 "\t\tEG: -display :1.0\n"
852 "\t-fake-xinerama-screen WxH+X+Y\n"
853 "\t\tAdd a FAKE xinerama screen (instead of the real ones)\n"
854 "\t\tgiven the geometry. Add as many as you like. They all\n"
855 "\t\treplace the real xinerama screens, if any. This can\n"
856 "\t\tbe used to simulate xinerama.\n"
857 "\t\tEG: -fake-xinerama-screen 800x600+0+0 -fake-xinerama-screen 800x600+800+0\n"
858 "\t-profile CONF_PROFILE\n"
859 "\t\tUse the configuration profile CONF_PROFILE instead of the user selected default or just \"default\".\n"
865 "\t\tBe psychotic.\n"
866 "\t-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it\n"
867 "\t\tIf you need this help, you don't need this option.\n"
871 _e_main_shutdown(-1);
877 _e_main_cb_x_fatal(void *data EINA_UNUSED)
879 e_error_message_show("Lost X Connection.\n");
880 ecore_main_loop_quit();
884 if (inloop) longjmp(x_fatal_buff, -99);
889 _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
891 /* called on ctrl-c, kill (pid) (also SIGINT, SIGTERM and SIGQIT) */
892 ecore_main_loop_quit();
893 return ECORE_CALLBACK_RENEW;
897 _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
900 ecore_main_loop_quit();
901 return ECORE_CALLBACK_RENEW;
905 _e_main_cb_signal_user(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev)
907 Ecore_Event_Signal_User *e = ev;
911 // E_Action *a = e_action_find("configuration");
912 // if ((a) && (a->func.go)) a->func.go(NULL, NULL);
914 else if (e->number == 2)
916 // comp module has its own handler for this for enabling/disabling fps debug
918 return ECORE_CALLBACK_RENEW;
923 _e_main_dirs_init(void)
934 base = e_user_dir_get();
935 if (ecore_file_mksubdirs(base, dirs) != sizeof(dirs) / sizeof(dirs[0]) - 1)
937 e_error_message_show("Could not create one of the required "
938 "subdirectories of '%s'\n", base);
946 _e_main_dirs_shutdown(void)
952 _e_main_path_init(void)
956 /* setup data paths */
957 path_data = e_path_new();
960 e_error_message_show("Cannot allocate path for path_data\n");
963 e_prefix_data_concat_static(buf, "data");
964 e_path_default_path_append(path_data, buf);
966 /* setup image paths */
967 path_images = e_path_new();
970 e_error_message_show("Cannot allocate path for path_images\n");
973 e_user_dir_concat_static(buf, "/images");
974 e_path_default_path_append(path_images, buf);
975 e_prefix_data_concat_static(buf, "data/images");
976 e_path_default_path_append(path_images, buf);
978 /* setup font paths */
979 path_fonts = e_path_new();
982 e_error_message_show("Cannot allocate path for path_fonts\n");
985 e_user_dir_concat_static(buf, "/fonts");
986 e_path_default_path_append(path_fonts, buf);
987 e_prefix_data_concat_static(buf, "data/fonts");
988 e_path_default_path_append(path_fonts, buf);
990 /* setup icon paths */
991 path_icons = e_path_new();
994 e_error_message_show("Cannot allocate path for path_icons\n");
997 e_user_dir_concat_static(buf, "/icons");
998 e_path_default_path_append(path_icons, buf);
999 e_prefix_data_concat_static(buf, "data/icons");
1000 e_path_default_path_append(path_icons, buf);
1002 /* setup module paths */
1003 path_modules = e_path_new();
1006 e_error_message_show("Cannot allocate path for path_modules\n");
1009 e_user_dir_concat_static(buf, "/modules");
1010 e_path_default_path_append(path_modules, buf);
1011 snprintf(buf, sizeof(buf), "%s/enlightenment/modules", e_prefix_lib_get());
1012 e_path_default_path_append(path_modules, buf);
1013 /* FIXME: eventually this has to go - moduels should have installers that
1014 * add appropriate install paths (if not installed to user homedir) to
1015 * e's module search dirs
1017 snprintf(buf, sizeof(buf), "%s/enlightenment/modules_extra", e_prefix_lib_get());
1018 e_path_default_path_append(path_modules, buf);
1020 /* setup background paths */
1021 path_backgrounds = e_path_new();
1022 if (!path_backgrounds)
1024 e_error_message_show("Cannot allocate path for path_backgrounds\n");
1027 e_user_dir_concat_static(buf, "/backgrounds");
1028 e_path_default_path_append(path_backgrounds, buf);
1029 e_prefix_data_concat_static(buf, "data/backgrounds");
1030 e_path_default_path_append(path_backgrounds, buf);
1032 path_messages = e_path_new();
1035 e_error_message_show("Cannot allocate path for path_messages\n");
1038 e_user_dir_concat_static(buf, "/locale");
1039 e_path_default_path_append(path_messages, buf);
1040 e_path_default_path_append(path_messages, e_prefix_locale_get());
1046 _e_main_path_shutdown(void)
1050 e_object_del(E_OBJECT(path_data));
1055 e_object_del(E_OBJECT(path_images));
1060 e_object_del(E_OBJECT(path_fonts));
1065 e_object_del(E_OBJECT(path_icons));
1070 e_object_del(E_OBJECT(path_modules));
1071 path_modules = NULL;
1073 if (path_backgrounds)
1075 e_object_del(E_OBJECT(path_backgrounds));
1076 path_backgrounds = NULL;
1080 e_object_del(E_OBJECT(path_messages));
1081 path_messages = NULL;
1087 _e_main_screens_init(void)
1089 TS("\tscreens: client");
1090 if (!e_client_init()) return 0;
1092 TS("Compositor Init");
1093 PRCTL("[Winsys] start of compositor init");
1096 e_error_message_show(_("Enlightenment cannot create a compositor.\n"));
1097 _e_main_shutdown(-1);
1100 PRCTL("[Winsys] end of compositor init");
1101 _e_main_desk_restore();
1107 _e_main_screens_shutdown(void)
1111 e_client_shutdown();
1120 _e_main_desk_save(void)
1123 char env[1024], name[1024];
1126 EINA_LIST_FOREACH(e_comp->zones, l, zone)
1128 snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
1129 snprintf(env, sizeof(env), "%d,%d", zone->desk_x_current, zone->desk_y_current);
1130 e_util_env_set(name, env);
1135 _e_main_desk_restore(void)
1143 EINA_LIST_FOREACH(e_comp->zones, l, zone)
1149 snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
1152 snprintf(buf_e, sizeof(buf_e), "%s", env);
1153 if (!sscanf(buf_e, "%d,%d", &desk_x, &desk_y)) continue;
1154 desk = e_desk_at_xy_get(zone, desk_x, desk_y);
1155 if (!desk) continue;
1159 E_CLIENT_REVERSE_FOREACH(ec)
1160 if ((!e_client_util_ignored_get(ec)) && e_client_util_desk_visible(ec, e_desk_current_get(ec->zone)))
1162 ec->want_focus = ec->take_focus = 1;
1168 _e_main_modules_load_after(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
1170 E_FREE_FUNC(mod_init_end, ecore_event_handler_del);
1171 return ECORE_CALLBACK_RENEW;
1175 _e_main_modules_load(Eina_Bool safe_mode)
1178 e_module_all_load();
1184 crashmodule = getenv("E_MODULE_LOAD");
1185 if (crashmodule) m = e_module_new(crashmodule);
1187 if ((crashmodule) && (m))
1189 e_module_disable(m);
1190 e_object_del(E_OBJECT(m));
1192 e_error_message_show
1193 (_("Enlightenment crashed early on start and has<br>"
1194 "been restarted. There was an error loading the<br>"
1195 "module named: %s. This module has been disabled<br>"
1196 "and will not be loaded."), crashmodule);
1198 (_("Enlightenment crashed early on start and has been restarted"),
1199 _("Enlightenment crashed early on start and has been restarted.<br>"
1200 "There was an error loading the module named: %s<br><br>"
1201 "This module has been disabled and will not be loaded."), crashmodule);
1202 e_module_all_load();
1206 e_error_message_show
1207 (_("Enlightenment crashed early on start and has<br>"
1208 "been restarted. All modules have been disabled<br>"
1209 "and will not be loaded to help remove any problem<br>"
1210 "modules from your configuration. The module<br>"
1211 "configuration dialog should let you select your<br>"
1212 "modules again.\n"));
1214 (_("Enlightenment crashed early on start and has been restarted"),
1215 _("Enlightenment crashed early on start and has been restarted.<br>"
1216 "All modules have been disabled and will not be loaded to help<br>"
1217 "remove any problem modules from your configuration.<br><br>"
1218 "The module configuration dialog should let you select your<br>"
1221 mod_init_end = ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_modules_load_after, NULL);
1226 _e_main_cb_idle_before(void *data EINA_UNUSED)
1228 e_client_idler_before();
1230 return ECORE_CALLBACK_RENEW;
1234 _e_main_cb_idle_after(void *data EINA_UNUSED)
1236 static int first_idle = 1;
1241 #ifdef E_RELEASE_BUILD
1246 e_precache_end = EINA_TRUE;
1249 if (first_idle++ < 60)
1253 e_precache_end = EINA_TRUE;
1257 return ECORE_CALLBACK_RENEW;
1261 _e_main_create_wm_ready(void)
1263 FILE *_wmready_checker = NULL;
1265 _wmready_checker = fopen("/run/.wm_ready", "wb");
1266 if (_wmready_checker)
1268 TS("[WM] WINDOW MANAGER is READY!!!");
1269 PRCTL("[Winsys] WINDOW MANAGER is READY!!!");
1270 fclose(_wmready_checker);
1272 /*TODO: Next lines should be removed. */
1273 FILE *_tmp_wm_ready_checker;
1274 _tmp_wm_ready_checker = fopen("/tmp/.wm_ready", "wb");
1276 if (_tmp_wm_ready_checker)
1278 TS("[WM] temporary wm_ready path is created.");
1279 PRCTL("[Winsys] temporary wm_ready path is created.");
1280 fclose(_tmp_wm_ready_checker);
1284 TS("[WM] temporary wm_ready path create failed.");
1285 PRCTL("[Winsys] temporary wm_ready path create failed.");
1290 TS("[WM] WINDOW MANAGER is READY. BUT, failed to create .wm_ready file.");
1291 PRCTL("[Winsys] WINDOW MANAGER is READY. BUT, failed to create .wm_ready file.");