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:DEFERRED INTERNAL SUBSYSTEMS INIT);
213 TS("[DEFERRED] Screens Init: win");
216 e_error_message_show(_("Enlightenment cannot setup elementary trap!\n"));
218 _e_main_shutdown(-1);
220 TS("[DEFERRED] Screens Init: win Done");
222 TS("[DEFERRED] E_Dnd Init");
225 e_error_message_show(_("Enlightenment cannot set up its dnd system.\n"));
226 _e_main_shutdown(-1);
228 TS("[DEFERRED] E_Dnd Init Done");
229 _e_main_shutdown_push(e_dnd_shutdown);
231 TS("[DEFERRED] E_Pointer Init");
232 if (!e_pointer_init())
234 e_error_message_show(_("Enlightenment cannot set up its pointer system.\n"));
236 _e_main_shutdown(-1);
239 TS("[DEFERRED] E_Pointer Init Done");
240 _e_main_shutdown_push(e_pointer_shutdown);
242 TS("[DEFERRED] E_Scale Init");
245 e_error_message_show(_("Enlightenment cannot set up its scale system.\n"));
247 _e_main_shutdown(-1);
249 TS("[DEFERRED] E_Scale Init Done");
250 _e_main_shutdown_push(e_scale_shutdown);
252 TS("[DEFERRED] E_Test_Helper Init");
253 e_test_helper_init();
254 _e_main_shutdown_push(e_test_helper_shutdown);
255 TS("[DEFERRED] E_Test_Helper Done");
257 TS("[DEFERRED] E_INFO_SERVER Init");
258 e_info_server_init();
259 _e_main_shutdown_push(e_info_server_shutdown);
260 TS("[DEFERRED] E_INFO_SERVER Done");
263 TRACE_DS_BEGIN(MAIN:DEFERRED COMP JOB);
265 /* try to do deferred job of any subsystems*/
266 TS("[DEFERRED] Compositor's deferred job");
267 e_comp_deferred_job();
268 TS("[DEFERRED] Compositor's deferred job Done");
271 if (e_config->use_e_policy)
273 TRACE_DS_BEGIN(MAIN:DEFERRED POLICY JOB);
275 TS("[DEFERRED] E_Policy's deferred job");
276 e_policy_deferred_job();
277 TS("[DEFERRED] E_Policy's deferred job Done");
281 TRACE_DS_BEGIN(MAIN:DEFERRED MODULE JOB);
283 TS("[DEFERRED] E_Module's deferred job");
284 e_module_deferred_job();
285 TS("[DEFERRED] E_Module's deferred job Done");
290 return ECORE_CALLBACK_DONE;
294 _e_main_deferred_job_schedule(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
296 PRCTL("[Winsys] all modules loaded");
297 ecore_idler_add(_e_main_subsystem_defer, NULL);
298 return ECORE_CALLBACK_DONE;
301 /* externally accessible functions */
303 main(int argc, char **argv)
305 Eina_Bool safe_mode = EINA_FALSE;
306 double t = 0.0, tstart = 0.0;
307 char *s = NULL, buff[32];
308 struct sigaction action;
311 # ifdef PR_SET_PTRACER
312 # ifdef PR_SET_PTRACER_ANY
313 prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY);
318 t0 = t1 = t2 = ecore_time_unix_get();
319 printf("ESTART(main) %1.5f\n", t0);
321 TRACE_DS_BEGIN(MAIN:BEGIN STARTUP);
323 PRCTL("[Winsys] start of main");
325 /* trap deadly bug signals and allow some form of sane recovery */
326 /* or ability to gdb attach and debug at this point - better than your */
327 /* wm/desktop vanishing and not knowing what happened */
329 /* don't install SIGBUS handler */
330 /* Wayland shm sets up a sigbus handler for catching invalid shm region */
331 /* access. If we setup our sigbus handler here, then the wl-shm sigbus */
332 /* handler will not function properly */
333 if (!getenv("NOTIFY_SOCKET"))
336 action.sa_sigaction = e_sigseg_act;
337 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
338 sigemptyset(&action.sa_mask);
339 sigaction(SIGSEGV, &action, NULL);
341 action.sa_sigaction = e_sigill_act;
342 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
343 sigemptyset(&action.sa_mask);
344 sigaction(SIGILL, &action, NULL);
346 action.sa_sigaction = e_sigfpe_act;
347 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
348 sigemptyset(&action.sa_mask);
349 sigaction(SIGFPE, &action, NULL);
351 action.sa_sigaction = e_sigabrt_act;
352 action.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
353 sigemptyset(&action.sa_mask);
354 sigaction(SIGABRT, &action, NULL);
355 TS("Signal Trap Done");
358 t = ecore_time_unix_get();
359 s = getenv("E_START_TIME");
360 if ((s) && (!getenv("E_RESTART_OK")))
363 if ((t - tstart) < 5.0) safe_mode = EINA_TRUE;
366 snprintf(buff, sizeof(buff), "%1.1f", tstart);
367 e_util_env_set("E_START_TIME", buff);
369 if (getenv("E_START_MTRACK"))
370 e_util_env_set("MTRACK", NULL);
374 e_error_message_show(_("Enlightenment cannot initialize Eina!\n"));
375 _e_main_shutdown(-1);
377 TS("Eina Init Done");
378 _e_main_shutdown_push(eina_shutdown);
380 #ifdef OBJECT_HASH_CHECK
381 TS("E_Object Hash Init");
382 e_object_hash_init();
383 TS("E_Object Hash Init Done");
389 e_error_message_show(_("Enlightenment could not create a logging domain!\n"));
390 _e_main_shutdown(-1);
392 TS("E_Log Init Done");
393 _e_main_shutdown_push(e_log_shutdown);
395 TS("Determine Prefix");
396 if (!e_prefix_determine(argv[0]))
399 "ERROR: Enlightenment cannot determine it's installed\n"
400 " prefix from the system or argv[0].\n"
401 " This is because it is not on Linux AND has been\n"
402 " executed strangely. This is unusual.\n");
404 TS("Determine Prefix Done");
406 /* for debugging by redirecting stdout of e to a log file to tail */
407 setvbuf(stdout, NULL, _IONBF, 0);
409 TS("Parse Arguments");
410 _e_main_parse_arguments(argc, argv);
411 TS("Parse Arguments Done");
413 /*** Initialize Core EFL Libraries We Need ***/
418 e_error_message_show(_("Enlightenment cannot initialize Eet!\n"));
419 _e_main_shutdown(-1);
422 _e_main_shutdown_push(eet_shutdown);
424 /* Allow ecore to not load system modules.
425 * Without it ecore_init will block until dbus authentication
426 * and registration are complete.
428 ecore_app_no_system_modules();
433 e_error_message_show(_("Enlightenment cannot initialize Ecore!\n"));
434 _e_main_shutdown(-1);
436 TS("Ecore Init Done");
437 _e_main_shutdown_push(ecore_shutdown);
439 e_first_frame = getenv("E_FIRST_FRAME");
440 if (e_first_frame && e_first_frame[0])
441 e_first_frame_start_time = ecore_time_get();
443 e_first_frame = NULL;
448 e_error_message_show(_("Enlightenment cannot initialize EIO!\n"));
449 _e_main_shutdown(-1);
452 _e_main_shutdown_push(eio_shutdown);
454 ecore_app_args_set(argc, (const char **)argv);
456 TS("Ecore Event Handlers");
457 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT,
458 _e_main_cb_signal_exit, NULL))
460 e_error_message_show(_("Enlightenment cannot set up an exit signal handler.\n"
461 "Perhaps you are out of memory?"));
462 _e_main_shutdown(-1);
464 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_HUP,
465 _e_main_cb_signal_hup, NULL))
467 e_error_message_show(_("Enlightenment cannot set up a HUP signal handler.\n"
468 "Perhaps you are out of memory?"));
469 _e_main_shutdown(-1);
471 if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
472 _e_main_cb_signal_user, NULL))
474 e_error_message_show(_("Enlightenment cannot set up a USER signal handler.\n"
475 "Perhaps you are out of memory?"));
476 _e_main_shutdown(-1);
478 TS("Ecore Event Handlers Done");
480 TS("Ecore_File Init");
481 if (!ecore_file_init())
483 e_error_message_show(_("Enlightenment cannot initialize Ecore_File!\n"));
484 _e_main_shutdown(-1);
486 TS("Ecore_File Init Done");
487 _e_main_shutdown_push(ecore_file_shutdown);
489 _idle_before = ecore_idle_enterer_before_add(_e_main_cb_idle_before, NULL);
491 TS("XDG_DATA_DIRS Init");
492 _xdg_data_dirs_augment();
493 TS("XDG_DATA_DIRS Init Done");
495 TS("Ecore_Evas Init");
496 if (!ecore_evas_init())
498 e_error_message_show(_("Enlightenment cannot initialize Ecore_Evas!\n"));
499 _e_main_shutdown(-1);
501 TS("Ecore_Evas Init Done");
503 /* e doesn't sync to compositor - it should be one */
504 ecore_evas_app_comp_sync_set(0);
509 e_error_message_show(_("Enlightenment cannot initialize Edje!\n"));
510 _e_main_shutdown(-1);
512 TS("Edje Init Done");
513 _e_main_shutdown_push(edje_shutdown);
515 /*** Initialize E Subsystems We Need ***/
517 TS("E Directories Init");
518 /* setup directories we will be using for configurations storage etc. */
519 if (!_e_main_dirs_init())
521 e_error_message_show(_("Enlightenment cannot create directories in your home directory.\n"
522 "Perhaps you have no home directory or the disk is full?"));
523 _e_main_shutdown(-1);
525 TS("E Directories Init Done");
526 _e_main_shutdown_push(_e_main_dirs_shutdown);
529 if (!e_config_init())
531 e_error_message_show(_("Enlightenment cannot set up its config system.\n"));
532 _e_main_shutdown(-1);
534 TS("E_Config Init Done");
535 _e_main_shutdown_push(e_config_shutdown);
540 e_error_message_show(_("Enlightenment cannot set up its environment.\n"));
541 _e_main_shutdown(-1);
543 TS("E_Env Init Done");
544 _e_main_shutdown_push(e_env_shutdown);
546 ecore_exe_run_priority_set(e_config->priority);
549 if (!_e_main_path_init())
551 e_error_message_show(_("Enlightenment cannot set up paths for finding files.\n"
552 "Perhaps you are out of memory?"));
553 _e_main_shutdown(-1);
555 TS("E Paths Init Done");
556 _e_main_shutdown_push(_e_main_path_shutdown);
558 ecore_animator_frametime_set(1.0 / e_config->framerate);
563 e_error_message_show(_("Enlightenment cannot set up its theme system.\n"));
564 _e_main_shutdown(-1);
566 TS("E_Theme Init Done");
567 _e_main_shutdown_push(e_theme_shutdown);
569 TS("E_Actions Init");
570 if (!e_actions_init())
572 e_error_message_show(_("Enlightenment cannot set up its actions system.\n"));
573 _e_main_shutdown(-1);
575 TS("E_Actions Init Done");
576 _e_main_shutdown_push(e_actions_shutdown);
578 /* these just add event handlers and can't fail
579 * timestamping them is dumb.
581 e_screensaver_preinit();
586 TRACE_DS_BEGIN(MAIN:WAIT /dev/dri/card0);
587 if (e_config->sleep_for_dri)
589 while(access("/dev/dri/card0", F_OK) != 0)
591 struct timespec req, rem;
593 req.tv_nsec = 50000000L;
594 nanosleep(&req, &rem);
599 TRACE_DS_BEGIN(MAIN:SCREEN INIT);
601 if (!_e_main_screens_init())
603 e_error_message_show(_("Enlightenment set up window management for all the screens on your system\n"
604 "failed. Perhaps another window manager is running?\n"));
605 _e_main_shutdown(-1);
607 TS("Screens Init Done");
608 _e_main_shutdown_push(_e_main_screens_shutdown);
611 TS("E_Screensaver Init");
612 if (!e_screensaver_init())
614 e_error_message_show(_("Enlightenment cannot configure the X screensaver.\n"));
615 _e_main_shutdown(-1);
617 TS("E_Screensaver Init Done");
618 _e_main_shutdown_push(e_screensaver_shutdown);
622 TS("E_Comp Freeze Done");
624 TS("E_Grabinput Init");
625 if (!e_grabinput_init())
627 e_error_message_show(_("Enlightenment cannot set up its grab input handling system.\n"));
628 _e_main_shutdown(-1);
630 TS("E_Grabinput Init Done");
631 _e_main_shutdown_push(e_grabinput_shutdown);
633 ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_deferred_job_schedule, NULL);
636 if (!e_module_init())
638 e_error_message_show(_("Enlightenment cannot set up its module system.\n"));
639 _e_main_shutdown(-1);
641 TS("E_Module Init Done");
642 _e_main_shutdown_push(e_module_shutdown);
644 TS("E_Remember Init");
645 if (!e_remember_init())
647 e_error_message_show(_("Enlightenment cannot setup remember settings.\n"));
648 _e_main_shutdown(-1);
650 TS("E_Remember Init Done");
651 _e_main_shutdown_push(e_remember_shutdown);
654 if (!e_mouse_update())
656 e_error_message_show(_("Enlightenment cannot configure the mouse settings.\n"));
657 _e_main_shutdown(-1);
659 TS("E_Mouse Init Done");
664 e_error_message_show(_("Enlightenment cannot initialize the Icon Cache system.\n"));
665 _e_main_shutdown(-1);
667 TS("E_Icon Init Done");
668 _e_main_shutdown_push(e_icon_shutdown);
670 if (e_config->use_e_policy)
673 if (!e_policy_init())
675 e_error_message_show(_("Enlightenment cannot setup policy system!\n"));
676 _e_main_shutdown(-1);
678 TS("E_Policy Init Done");
679 _e_main_shutdown_push(e_policy_shutdown);
682 TS("E_Process Init");
683 if (!e_process_init())
685 e_error_message_show(_("Enlightenment cannot setup process managing system!\n"));
686 _e_main_shutdown(-1);
688 TS("E_Process Init Done");
689 _e_main_shutdown_push(e_process_shutdown);
692 _e_main_modules_load(safe_mode);
693 TS("Load Modules Done");
697 TS("E_Comp Thaw Done");
699 _idle_after = ecore_idle_enterer_add(_e_main_cb_idle_after, NULL);
701 starting = EINA_FALSE;
704 e_util_env_set("E_RESTART", "1");
706 TS("MAIN LOOP AT LAST");
708 if (e_config->create_wm_ready)
709 _e_main_create_wm_ready();
712 if (!setjmp(x_fatal_buff))
713 ecore_main_loop_begin();
715 CRI("FATAL: X Died. Connection gone. Abbreviated Shutdown\n");
718 stopping = EINA_TRUE;
721 e_remember_internal_save();
722 e_comp_internal_save();
728 e_util_env_set("E_RESTART_OK", "1");
729 if (getenv("E_START_MTRACK"))
730 e_util_env_set("MTRACK", "track");
740 e_main_ts(const char *str)
743 t1 = ecore_time_unix_get();
744 printf("ESTART: %1.5f [%1.5f] - %s\n", t1 - t0, t1 - t2, str);
750 /* local functions */
752 _e_main_shutdown(int errcode)
758 printf("E: Begin Shutdown Procedure!\n");
760 if (_idle_before) ecore_idle_enterer_del(_idle_before);
762 if (_idle_after) ecore_idle_enterer_del(_idle_after);
765 dir = getenv("XDG_RUNTIME_DIR");
768 char buf_env[PATH_MAX];
769 snprintf(buf_env, sizeof(buf_env), "%s", dir);
770 snprintf(buf, sizeof(buf), "%s/.e-deleteme", buf_env);
771 if (ecore_file_exists(buf)) ecore_file_recursive_rm(buf_env);
773 for (i = (_e_main_lvl - 1); i >= 0; i--)
774 (*_e_main_shutdown_func[i])();
775 #ifdef OBJECT_HASH_CHECK
776 e_object_hash_shutdown();
778 if (errcode < 0) exit(errcode);
782 _e_main_shutdown_push(int (*func)(void))
785 if (_e_main_lvl > MAX_LEVEL)
788 e_error_message_show("WARNING: too many init levels. MAX = %i\n",
792 _e_main_shutdown_func[_e_main_lvl - 1] = func;
796 _e_main_parse_arguments(int argc, char **argv)
800 /* handle some command-line parameters */
801 for (i = 1; i < argc; i++)
803 if (!strcmp(argv[i], "-good"))
807 printf("LA LA LA\n");
809 else if (!strcmp(argv[i], "-evil"))
813 printf("MUHAHAHAHHAHAHAHAHA\n");
815 else if (!strcmp(argv[i], "-psychotic"))
819 printf("MUHAHALALALALALALALA\n");
821 else if ((!strcmp(argv[i], "-profile")) && (i < (argc - 1)))
824 if (!getenv("E_CONF_PROFILE"))
825 e_util_env_set("E_CONF_PROFILE", argv[i]);
827 else if (!strcmp(argv[i], "-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it"))
828 really_know = EINA_TRUE;
829 else if (!strcmp(argv[i], "-nopause"))
830 e_nopause = EINA_TRUE;
831 else if ((!strcmp(argv[i], "-version")) ||
832 (!strcmp(argv[i], "--version")))
834 printf(_("Version: %s\n"), PACKAGE_VERSION);
835 _e_main_shutdown(-1);
837 else if ((!strcmp(argv[i], "-h")) ||
838 (!strcmp(argv[i], "-help")) ||
839 (!strcmp(argv[i], "--help")))
844 "\t-display DISPLAY\n"
845 "\t\tConnect to display named DISPLAY.\n"
846 "\t\tEG: -display :1.0\n"
847 "\t-fake-xinerama-screen WxH+X+Y\n"
848 "\t\tAdd a FAKE xinerama screen (instead of the real ones)\n"
849 "\t\tgiven the geometry. Add as many as you like. They all\n"
850 "\t\treplace the real xinerama screens, if any. This can\n"
851 "\t\tbe used to simulate xinerama.\n"
852 "\t\tEG: -fake-xinerama-screen 800x600+0+0 -fake-xinerama-screen 800x600+800+0\n"
853 "\t-profile CONF_PROFILE\n"
854 "\t\tUse the configuration profile CONF_PROFILE instead of the user selected default or just \"default\".\n"
860 "\t\tBe psychotic.\n"
861 "\t-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it\n"
862 "\t\tIf you need this help, you don't need this option.\n"
866 _e_main_shutdown(-1);
872 _e_main_cb_x_fatal(void *data EINA_UNUSED)
874 e_error_message_show("Lost X Connection.\n");
875 ecore_main_loop_quit();
879 if (inloop) longjmp(x_fatal_buff, -99);
884 _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
886 /* called on ctrl-c, kill (pid) (also SIGINT, SIGTERM and SIGQIT) */
887 ecore_main_loop_quit();
888 return ECORE_CALLBACK_RENEW;
892 _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
895 ecore_main_loop_quit();
896 return ECORE_CALLBACK_RENEW;
900 _e_main_cb_signal_user(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev)
902 Ecore_Event_Signal_User *e = ev;
906 // E_Action *a = e_action_find("configuration");
907 // if ((a) && (a->func.go)) a->func.go(NULL, NULL);
909 else if (e->number == 2)
911 // comp module has its own handler for this for enabling/disabling fps debug
913 return ECORE_CALLBACK_RENEW;
918 _e_main_dirs_init(void)
929 base = e_user_dir_get();
930 if (ecore_file_mksubdirs(base, dirs) != sizeof(dirs) / sizeof(dirs[0]) - 1)
932 e_error_message_show("Could not create one of the required "
933 "subdirectories of '%s'\n", base);
941 _e_main_dirs_shutdown(void)
947 _e_main_path_init(void)
951 /* setup data paths */
952 path_data = e_path_new();
955 e_error_message_show("Cannot allocate path for path_data\n");
958 e_prefix_data_concat_static(buf, "data");
959 e_path_default_path_append(path_data, buf);
961 /* setup image paths */
962 path_images = e_path_new();
965 e_error_message_show("Cannot allocate path for path_images\n");
968 e_user_dir_concat_static(buf, "/images");
969 e_path_default_path_append(path_images, buf);
970 e_prefix_data_concat_static(buf, "data/images");
971 e_path_default_path_append(path_images, buf);
973 /* setup font paths */
974 path_fonts = e_path_new();
977 e_error_message_show("Cannot allocate path for path_fonts\n");
980 e_user_dir_concat_static(buf, "/fonts");
981 e_path_default_path_append(path_fonts, buf);
982 e_prefix_data_concat_static(buf, "data/fonts");
983 e_path_default_path_append(path_fonts, buf);
985 /* setup icon paths */
986 path_icons = e_path_new();
989 e_error_message_show("Cannot allocate path for path_icons\n");
992 e_user_dir_concat_static(buf, "/icons");
993 e_path_default_path_append(path_icons, buf);
994 e_prefix_data_concat_static(buf, "data/icons");
995 e_path_default_path_append(path_icons, buf);
997 /* setup module paths */
998 path_modules = e_path_new();
1001 e_error_message_show("Cannot allocate path for path_modules\n");
1004 e_user_dir_concat_static(buf, "/modules");
1005 e_path_default_path_append(path_modules, buf);
1006 snprintf(buf, sizeof(buf), "%s/enlightenment/modules", e_prefix_lib_get());
1007 e_path_default_path_append(path_modules, buf);
1008 /* FIXME: eventually this has to go - moduels should have installers that
1009 * add appropriate install paths (if not installed to user homedir) to
1010 * e's module search dirs
1012 snprintf(buf, sizeof(buf), "%s/enlightenment/modules_extra", e_prefix_lib_get());
1013 e_path_default_path_append(path_modules, buf);
1015 /* setup background paths */
1016 path_backgrounds = e_path_new();
1017 if (!path_backgrounds)
1019 e_error_message_show("Cannot allocate path for path_backgrounds\n");
1022 e_user_dir_concat_static(buf, "/backgrounds");
1023 e_path_default_path_append(path_backgrounds, buf);
1024 e_prefix_data_concat_static(buf, "data/backgrounds");
1025 e_path_default_path_append(path_backgrounds, buf);
1027 path_messages = e_path_new();
1030 e_error_message_show("Cannot allocate path for path_messages\n");
1033 e_user_dir_concat_static(buf, "/locale");
1034 e_path_default_path_append(path_messages, buf);
1035 e_path_default_path_append(path_messages, e_prefix_locale_get());
1041 _e_main_path_shutdown(void)
1045 e_object_del(E_OBJECT(path_data));
1050 e_object_del(E_OBJECT(path_images));
1055 e_object_del(E_OBJECT(path_fonts));
1060 e_object_del(E_OBJECT(path_icons));
1065 e_object_del(E_OBJECT(path_modules));
1066 path_modules = NULL;
1068 if (path_backgrounds)
1070 e_object_del(E_OBJECT(path_backgrounds));
1071 path_backgrounds = NULL;
1075 e_object_del(E_OBJECT(path_messages));
1076 path_messages = NULL;
1082 _e_main_screens_init(void)
1084 TS("\tscreens: client");
1085 if (!e_client_init()) return 0;
1087 TS("Compositor Init");
1088 PRCTL("[Winsys] start of compositor init");
1091 e_error_message_show(_("Enlightenment cannot create a compositor.\n"));
1092 _e_main_shutdown(-1);
1095 PRCTL("[Winsys] end of compositor init");
1096 _e_main_desk_restore();
1102 _e_main_screens_shutdown(void)
1106 e_client_shutdown();
1115 _e_main_desk_save(void)
1118 char env[1024], name[1024];
1121 EINA_LIST_FOREACH(e_comp->zones, l, zone)
1123 snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
1124 snprintf(env, sizeof(env), "%d,%d", zone->desk_x_current, zone->desk_y_current);
1125 e_util_env_set(name, env);
1130 _e_main_desk_restore(void)
1138 EINA_LIST_FOREACH(e_comp->zones, l, zone)
1144 snprintf(name, sizeof(name), "DESK_%d_%d", 0, zone->num);
1147 snprintf(buf_e, sizeof(buf_e), "%s", env);
1148 if (!sscanf(buf_e, "%d,%d", &desk_x, &desk_y)) continue;
1149 desk = e_desk_at_xy_get(zone, desk_x, desk_y);
1150 if (!desk) continue;
1154 E_CLIENT_REVERSE_FOREACH(ec)
1155 if ((!e_client_util_ignored_get(ec)) && e_client_util_desk_visible(ec, e_desk_current_get(ec->zone)))
1157 ec->want_focus = ec->take_focus = 1;
1163 _e_main_modules_load_after(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
1165 E_FREE_FUNC(mod_init_end, ecore_event_handler_del);
1166 return ECORE_CALLBACK_RENEW;
1170 _e_main_modules_load(Eina_Bool safe_mode)
1173 e_module_all_load();
1179 crashmodule = getenv("E_MODULE_LOAD");
1180 if (crashmodule) m = e_module_new(crashmodule);
1182 if ((crashmodule) && (m))
1184 e_module_disable(m);
1185 e_object_del(E_OBJECT(m));
1187 e_error_message_show
1188 (_("Enlightenment crashed early on start and has<br>"
1189 "been restarted. There was an error loading the<br>"
1190 "module named: %s. This module has been disabled<br>"
1191 "and will not be loaded."), crashmodule);
1193 (_("Enlightenment crashed early on start and has been restarted"),
1194 _("Enlightenment crashed early on start and has been restarted.<br>"
1195 "There was an error loading the module named: %s<br><br>"
1196 "This module has been disabled and will not be loaded."), crashmodule);
1197 e_module_all_load();
1201 e_error_message_show
1202 (_("Enlightenment crashed early on start and has<br>"
1203 "been restarted. All modules have been disabled<br>"
1204 "and will not be loaded to help remove any problem<br>"
1205 "modules from your configuration. The module<br>"
1206 "configuration dialog should let you select your<br>"
1207 "modules again.\n"));
1209 (_("Enlightenment crashed early on start and has been restarted"),
1210 _("Enlightenment crashed early on start and has been restarted.<br>"
1211 "All modules have been disabled and will not be loaded to help<br>"
1212 "remove any problem modules from your configuration.<br><br>"
1213 "The module configuration dialog should let you select your<br>"
1216 mod_init_end = ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_modules_load_after, NULL);
1221 _e_main_cb_idle_before(void *data EINA_UNUSED)
1223 e_client_idler_before();
1225 return ECORE_CALLBACK_RENEW;
1229 _e_main_cb_idle_after(void *data EINA_UNUSED)
1231 static int first_idle = 1;
1236 #ifdef E_RELEASE_BUILD
1241 e_precache_end = EINA_TRUE;
1244 if (first_idle++ < 60)
1248 e_precache_end = EINA_TRUE;
1252 return ECORE_CALLBACK_RENEW;
1256 _e_main_create_wm_ready(void)
1258 FILE *_wmready_checker = NULL;
1260 _wmready_checker = fopen("/run/.wm_ready", "wb");
1261 if (_wmready_checker)
1263 TS("[WM] WINDOW MANAGER is READY!!!");
1264 PRCTL("[Winsys] WINDOW MANAGER is READY!!!");
1265 fclose(_wmready_checker);
1267 /*TODO: Next lines should be removed. */
1268 FILE *_tmp_wm_ready_checker;
1269 _tmp_wm_ready_checker = fopen("/tmp/.wm_ready", "wb");
1271 if (_tmp_wm_ready_checker)
1273 TS("[WM] temporary wm_ready path is created.");
1274 PRCTL("[Winsys] temporary wm_ready path is created.");
1275 fclose(_tmp_wm_ready_checker);
1279 TS("[WM] temporary wm_ready path create failed.");
1280 PRCTL("[Winsys] temporary wm_ready path create failed.");
1285 TS("[WM] WINDOW MANAGER is READY. BUT, failed to create .wm_ready file.");
1286 PRCTL("[Winsys] WINDOW MANAGER is READY. BUT, failed to create .wm_ready file.");