e_scale: make an internal header
[platform/upstream/enlightenment.git] / src / bin / e_main.c
index 3c9d6b4..6b15f81 100644 (file)
@@ -1,4 +1,14 @@
 #include "e.h"
+#include "e_actions_intern.h"
+#include "e_test_helper_intern.h"
+#include "e_user_intern.h"
+#include "e_utils_intern.h"
+#include "e_theme_intern.h"
+#include "e_signals_intern.h"
+#include "e_security_intern.h"
+#include "e_screensaver_intern.h"
+#include "e_scale_intern.h"
+
 #ifdef __linux__
 # include <sys/prctl.h>
 #endif
@@ -93,7 +103,6 @@ static void      _e_main_shutdown_push(int (*func)(void));
 static void      _e_main_parse_arguments(int argc, char **argv);
 static Eina_Bool _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED);
 static Eina_Bool _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED);
-static Eina_Bool _e_main_cb_signal_user(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev);
 static int       _e_main_dirs_init(void);
 static int       _e_main_dirs_shutdown(void);
 static int       _e_main_path_init(void);
@@ -102,7 +111,6 @@ static int       _e_main_screens_init(void);
 static int       _e_main_screens_shutdown(void);
 static void      _e_main_desk_save(void);
 static void      _e_main_desk_restore(void);
-static void      _e_main_modules_load(Eina_Bool safe_mode);
 static Eina_Bool _e_main_cb_idle_before(void *data EINA_UNUSED);
 static Eina_Bool _e_main_cb_idle_after(void *data EINA_UNUSED);
 static void      _e_main_create_wm_ready(void);
@@ -110,17 +118,12 @@ static void      _e_main_hooks_clean(void);
 static void      _e_main_hook_call(E_Main_Hook_Point hookpoint, void *data EINA_UNUSED);
 
 /* local variables */
-static Eina_Bool really_know = EINA_FALSE;
-static Eina_Bool inloop = EINA_FALSE;
-
 static int _e_main_lvl = 0;
 static int(*_e_main_shutdown_func[MAX_LEVEL]) (void);
 
 static Ecore_Idle_Enterer *_idle_before = NULL;
 static Ecore_Idle_Enterer *_idle_after = NULL;
 
-static Ecore_Event_Handler *mod_init_end = NULL;
-
 static Eina_List *hooks = NULL;
 
 static int _e_main_hooks_delete = 0;
@@ -129,17 +132,13 @@ static int _e_main_hooks_walking = 0;
 static Eina_Inlist *_e_main_hooks[] =
 {
    [E_MAIN_HOOK_MODULE_LOAD_DONE] = NULL,
-   [E_MAIN_HOOK_E_INFO_READY] = NULL
+   [E_MAIN_HOOK_E_INFO_READY] = NULL,
+   [E_MAIN_HOOK_POST_CLIENT_IDLER_BEFORE] = NULL
 };
 
 /* external variables */
-E_API Eina_Bool e_precache_end = EINA_FALSE;
-E_API Eina_Bool good = EINA_FALSE;
-E_API Eina_Bool evil = EINA_FALSE;
 E_API Eina_Bool starting = EINA_TRUE;
 E_API Eina_Bool stopping = EINA_FALSE;
-E_API Eina_Bool restart = EINA_FALSE;
-E_API Eina_Bool e_nopause = EINA_FALSE;
 
 static Eina_Bool
 _xdg_check_str(const char *env, const char *str)
@@ -158,13 +157,13 @@ _xdg_check_str(const char *env, const char *str)
 static void
 _xdg_data_dirs_augment(void)
 {
-   const char *s;
+   char *s;
    const char *p = e_prefix_get();
-   char newpath[4096], buf[4096];
+   char newpath[PATH_MAX], buf[PATH_MAX + PATH_MAX + 200];
 
    if (!p) return;
 
-   s = getenv("XDG_DATA_DIRS");
+   s = e_util_env_get("XDG_DATA_DIRS");
    if (s)
      {
         Eina_Bool pfxdata, pfx;
@@ -182,6 +181,7 @@ _xdg_data_dirs_augment(void)
                s);
              e_util_env_set("XDG_DATA_DIRS", buf);
           }
+        E_FREE(s);
      }
    else
      {
@@ -189,7 +189,7 @@ _xdg_data_dirs_augment(void)
         e_util_env_set("XDG_DATA_DIRS", buf);
      }
 
-   s = getenv("XDG_CONFIG_DIRS");
+   s = e_util_env_get("XDG_CONFIG_DIRS");
    snprintf(newpath, sizeof(newpath), "%s/etc/xdg", p);
    if (s)
      {
@@ -198,6 +198,7 @@ _xdg_data_dirs_augment(void)
              snprintf(buf, sizeof(buf), "%s:%s", newpath, s);
              e_util_env_set("XDG_CONFIG_DIRS", buf);
           }
+        E_FREE(s);
      }
    else
      {
@@ -205,7 +206,10 @@ _xdg_data_dirs_augment(void)
         e_util_env_set("XDG_CONFIG_DIRS", buf);
      }
 
-   if (!getenv("XDG_RUNTIME_DIR"))
+   s = e_util_env_get("XDG_RUNTIME_DIR");
+   if (s)
+     E_FREE(s);
+   else
      {
         const char *dir;
 
@@ -221,22 +225,18 @@ _xdg_data_dirs_augment(void)
      }
 
    /* set menu prefix so we get our e menu */
-   if (!getenv("XDG_MENU_PREFIX"))
-     {
-        e_util_env_set("XDG_MENU_PREFIX", "e-");
-     }
+   s = e_util_env_get("XDG_MENU_PREFIX");
+   if (s)
+     E_FREE(s);
+   else
+     e_util_env_set("XDG_MENU_PREFIX", "e-");
 }
 
 static Eina_Bool
 _e_main_subsystem_defer(void *data EINA_UNUSED)
 {
-   int argc;
-   char **argv;
-
    TRACE_DS_BEGIN(MAIN:SUBSYSTEMS DEFER);
 
-   ecore_app_args_get(&argc, &argv);
-
    /* try to init delayed subsystems */
 
    TRACE_DS_BEGIN(MAIN:DEFERRED INTERNAL SUBSYSTEMS INIT);
@@ -250,14 +250,6 @@ _e_main_subsystem_defer(void *data EINA_UNUSED)
    TSE("[DEFERRED] DPMS Init Done");
    _e_main_shutdown_push(e_dpms_shutdown);
 
-   TSB("[DEFERRED] Screens Init: win");
-   if (!e_win_init())
-     {
-        e_error_message_show(_("Enlightenment cannot setup elementary trap!\n"));
-        goto failed;
-     }
-   TSE("[DEFERRED] Screens Init: win Done");
-
    TSB("[DEFERRED] E_Dnd Init");
    if (!e_dnd_init())
      {
@@ -329,9 +321,7 @@ _e_main_deferred_job_schedule(void *d EINA_UNUSED, int type EINA_UNUSED, void *e
 int
 main(int argc, char **argv)
 {
-   Eina_Bool safe_mode = EINA_FALSE;
-   double t = 0.0, tstart = 0.0;
-   char *s = NULL, buff[32];
+   char *s = NULL;
    struct sigaction action;
 
 #ifdef __linux__
@@ -341,6 +331,15 @@ main(int argc, char **argv)
 #  endif
 # endif
 #endif
+
+#ifdef TIZEN_TEST_GCOV
+   setenv("GCOV_PREFIX", "/tmp", 1);
+#endif
+
+   /* for debugging by redirecting stdout & stderr of e to a log file to tail */
+   setvbuf(stdout, NULL, _IONBF, 0);
+   setvbuf(stderr, NULL, _IONBF, 0);
+
 #ifdef TS_DO
    t0 = t1 = t2 = ecore_time_unix_get();
    printf("ESTART(main) %1.5f\n", t0);
@@ -357,7 +356,10 @@ main(int argc, char **argv)
    /* Wayland shm sets up a sigbus handler for catching invalid shm region */
    /* access. If we setup our sigbus handler here, then the wl-shm sigbus */
    /* handler will not function properly */
-   if (!getenv("NOTIFY_SOCKET"))
+   s = e_util_env_get("NOTIFY_SOCKET");
+   if (s)
+     E_FREE(s);
+   else
      {
         TSB("Signal Trap");
         action.sa_sigaction = e_sigseg_act;
@@ -382,19 +384,6 @@ main(int argc, char **argv)
         TSE("Signal Trap Done");
      }
 
-   t = ecore_time_unix_get();
-   s = getenv("E_START_TIME");
-   if ((s) && (!getenv("E_RESTART_OK")))
-     {
-        tstart = atof(s);
-        if ((t - tstart) < 5.0) safe_mode = EINA_TRUE;
-     }
-   tstart = t;
-   snprintf(buff, sizeof(buff), "%1.1f", tstart);
-   e_util_env_set("E_START_TIME", buff);
-
-   if (getenv("E_START_MTRACK"))
-     e_util_env_set("MTRACK", NULL);
    TSB("Eina Init");
    if (!eina_init())
      {
@@ -430,9 +419,6 @@ main(int argc, char **argv)
      }
    TSE("Determine Prefix Done");
 
-   /* for debugging by redirecting stdout of e to a log file to tail */
-   setvbuf(stdout, NULL, _IONBF, 0);
-
    TSB("Parse Arguments");
    _e_main_parse_arguments(argc, argv);
    TSE("Parse Arguments Done");
@@ -472,8 +458,6 @@ main(int argc, char **argv)
    TSE("EIO Init Done");
    _e_main_shutdown_push(eio_shutdown);
 
-   ecore_app_args_set(argc, (const char **)argv);
-
    TSB("Ecore Event Handlers");
    if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT,
                                 _e_main_cb_signal_exit, NULL))
@@ -489,13 +473,6 @@ main(int argc, char **argv)
                                "Perhaps you are out of memory?"));
         goto failed;
      }
-   if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_USER,
-                                _e_main_cb_signal_user, NULL))
-     {
-        e_error_message_show(_("Enlightenment cannot set up a USER signal handler.\n"
-                               "Perhaps you are out of memory?"));
-        goto failed;
-     }
    TSE("Ecore Event Handlers Done");
 
    TSB("Ecore_File Init");
@@ -507,6 +484,11 @@ main(int argc, char **argv)
    TSE("Ecore_File Init Done");
    _e_main_shutdown_push(ecore_file_shutdown);
 
+   TSB("E_Util_File_Monitor Init");
+   e_util_file_monitor_init();
+   TSE("E_Util_File_Monitor Init Done");
+   _e_main_shutdown_push(e_util_file_monitor_shutdown);
+
    _idle_before = ecore_idle_enterer_before_add(_e_main_cb_idle_before, NULL);
 
    TSB("XDG_DATA_DIRS Init");
@@ -521,9 +503,6 @@ main(int argc, char **argv)
      }
    TSE("Ecore_Evas Init Done");
 
-   /* e doesn't sync to compositor - it should be one */
-   ecore_evas_app_comp_sync_set(0);
-
    TSB("Edje Init");
    if (!edje_init())
      {
@@ -535,6 +514,15 @@ main(int argc, char **argv)
 
    /*** Initialize E Subsystems We Need ***/
 
+   TSB("E User Init");
+   if (!e_user_init())
+     {
+        e_error_message_show(_("Enlightenment cannot set up user home path\n"));
+        goto failed;
+     }
+   TSE("E User Init Done");
+   _e_main_shutdown_push(e_user_shutdown);
+
    TSB("E Directories Init");
    /* setup directories we will be using for configurations storage etc. */
    if (!_e_main_dirs_init())
@@ -602,7 +590,7 @@ main(int argc, char **argv)
    e_screensaver_preinit();
    e_zone_init();
    e_desk_init();
-   e_slot_init();
+   e_magnifier_init();
 
    TRACE_DS_BEGIN(MAIN:WAIT /dev/dri/card0);
    if (e_config->sleep_for_dri)
@@ -617,6 +605,15 @@ main(int argc, char **argv)
      }
    TRACE_DS_END();
 
+   TSB("E_Msg Init");
+   if (!e_msg_init())
+     {
+        e_error_message_show(_("Enlightenment cannot set up its msg system."));
+        goto failed;
+     }
+   TSE("E_Msg Init Done");
+   _e_main_shutdown_push(e_msg_shutdown);
+
    e_module_event_init();
 
    TSB("E_Pointer Init");
@@ -640,6 +637,24 @@ main(int argc, char **argv)
    _e_main_shutdown_push(_e_main_screens_shutdown);
    TRACE_DS_END();
 
+   TSB("E_Devicemgr Init");
+   if (!e_devicemgr_init())
+     {
+        e_error_message_show(_("Enlightenment cannot set up its device_manager system.\n"));
+        goto failed;
+     }
+   TSE("E_Devicemgr Init Done");
+   _e_main_shutdown_push(e_devicemgr_shutdown);
+
+   TSB("E_Keyrouter Init");
+   if (!e_keyrouter_init())
+     {
+        e_error_message_show(_("Enlightenment cannot set up its keyrouting system.\n"));
+        goto failed;
+     }
+   TSE("E_Keyrouter Init Done");
+   _e_main_shutdown_push(e_keyrouter_shutdown);
+
    if (e_config->eom_enable)
      {
         TSB("Eom Init");
@@ -737,19 +752,28 @@ main(int argc, char **argv)
    _e_main_shutdown_push(e_security_shutdown);
 
    TSB("Load Modules");
-   _e_main_modules_load(safe_mode);
+   e_module_all_load();
    TSE("Load Modules Done");
 
    TSB("E_Comp Thaw");
    e_comp_all_thaw();
    TSE("E_Comp Thaw Done");
 
+   if (e_config->use_thread_max_cpu)
+     {
+        int cpus;
+
+        cpus = eina_cpu_count();
+        if (cpus >= 1)
+          {
+             TSM("Set ecore thread max");
+             ecore_thread_max_set(cpus);
+          }
+     }
+
    _idle_after = ecore_idle_enterer_add(_e_main_cb_idle_after, NULL);
 
    starting = EINA_FALSE;
-   inloop = EINA_TRUE;
-
-   e_util_env_set("E_RESTART", "1");
 
    TSM("MAIN LOOP AT LAST");
 
@@ -766,9 +790,7 @@ main(int argc, char **argv)
 #endif
    ecore_main_loop_begin();
 
-   inloop = EINA_FALSE;
-
-   ELOGF("COMP", "STOPPING enlightenment...", NULL, NULL);
+   ELOGF("COMP", "STOPPING enlightenment...", NULL);
    stopping = EINA_TRUE;
 
    _e_main_desk_save();
@@ -776,14 +798,6 @@ main(int argc, char **argv)
 
    _e_main_shutdown(0);
 
-   if (restart)
-     {
-        e_util_env_set("E_RESTART_OK", "1");
-        if (getenv("E_START_MTRACK"))
-          e_util_env_set("MTRACK", "track");
-        ecore_app_restart();
-     }
-
    e_prefix_shutdown();
 
    return 0;
@@ -825,7 +839,7 @@ _e_main_shutdown(int errcode)
 {
    int i = 0;
    char buf[PATH_MAX];
-   const char *dir;
+   char *dir;
 
    printf("E: Begin Shutdown Procedure!\n");
 
@@ -836,13 +850,14 @@ _e_main_shutdown(int errcode)
    if (_idle_after) ecore_idle_enterer_del(_idle_after);
    _idle_after = NULL;
 
-   dir = getenv("XDG_RUNTIME_DIR");
+   dir = e_util_env_get("XDG_RUNTIME_DIR");
    if (dir)
      {
-        char buf_env[PATH_MAX];
+        char buf_env[PATH_MAX - 12];
         snprintf(buf_env, sizeof(buf_env), "%s", dir);
         snprintf(buf, sizeof(buf), "%s/.e-deleteme", buf_env);
         if (ecore_file_exists(buf)) ecore_file_recursive_rm(buf_env);
+        E_FREE(dir);
      }
    for (i = (_e_main_lvl - 1); i >= 0; i--)
      (*_e_main_shutdown_func[i])();
@@ -874,34 +889,12 @@ _e_main_parse_arguments(int argc, char **argv)
    /* handle some command-line parameters */
    for (i = 1; i < argc; i++)
      {
-        if (!strcmp(argv[i], "-good"))
-          {
-             good = EINA_TRUE;
-             evil = EINA_FALSE;
-             printf("LA LA LA\n");
-          }
-        else if (!strcmp(argv[i], "-evil"))
-          {
-             good = EINA_FALSE;
-             evil = EINA_TRUE;
-             printf("MUHAHAHAHHAHAHAHAHA\n");
-          }
-        else if (!strcmp(argv[i], "-psychotic"))
-          {
-             good = EINA_TRUE;
-             evil = EINA_TRUE;
-             printf("MUHAHALALALALALALALA\n");
-          }
-        else if ((!strcmp(argv[i], "-profile")) && (i < (argc - 1)))
+        if ((!strcmp(argv[i], "-profile")) && (i < (argc - 1)))
           {
              i++;
              if (!getenv("E_CONF_PROFILE"))
                e_util_env_set("E_CONF_PROFILE", argv[i]);
           }
-        else if (!strcmp(argv[i], "-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it"))
-          really_know = EINA_TRUE;
-        else if (!strcmp(argv[i], "-nopause"))
-          e_nopause = EINA_TRUE;
         else if ((!strcmp(argv[i], "-version")) ||
                  (!strcmp(argv[i], "--version")))
           {
@@ -915,25 +908,8 @@ _e_main_parse_arguments(int argc, char **argv)
              printf
                (_(
                  "Options:\n"
-                 "\t-display DISPLAY\n"
-                 "\t\tConnect to display named DISPLAY.\n"
-                 "\t\tEG: -display :1.0\n"
-                 "\t-fake-xinerama-screen WxH+X+Y\n"
-                 "\t\tAdd a FAKE xinerama screen (instead of the real ones)\n"
-                 "\t\tgiven the geometry. Add as many as you like. They all\n"
-                 "\t\treplace the real xinerama screens, if any. This can\n"
-                 "\t\tbe used to simulate xinerama.\n"
-                 "\t\tEG: -fake-xinerama-screen 800x600+0+0 -fake-xinerama-screen 800x600+800+0\n"
                  "\t-profile CONF_PROFILE\n"
                  "\t\tUse the configuration profile CONF_PROFILE instead of the user selected default or just \"default\".\n"
-                 "\t-good\n"
-                 "\t\tBe good.\n"
-                 "\t-evil\n"
-                 "\t\tBe evil.\n"
-                 "\t-psychotic\n"
-                 "\t\tBe psychotic.\n"
-                 "\t-i-really-know-what-i-am-doing-and-accept-full-responsibility-for-it\n"
-                 "\t\tIf you need this help, you don't need this option.\n"
                  "\t-version\n"
                  )
                );
@@ -953,29 +929,10 @@ _e_main_cb_signal_exit(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev
 static Eina_Bool
 _e_main_cb_signal_hup(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev EINA_UNUSED)
 {
-   restart = 1;
    ecore_main_loop_quit();
    return ECORE_CALLBACK_RENEW;
 }
 
-static Eina_Bool
-_e_main_cb_signal_user(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev)
-{
-   Ecore_Event_Signal_User *e = ev;
-
-   if (e->number == 1)
-     {
-//        E_Action *a = e_action_find("configuration");
-//        if ((a) && (a->func.go)) a->func.go(NULL, NULL);
-     }
-   else if (e->number == 2)
-     {
-        // comp module has its own handler for this for enabling/disabling fps debug
-     }
-   return ECORE_CALLBACK_RENEW;
-
-}
-
 static int
 _e_main_dirs_init(void)
 {
@@ -1170,11 +1127,10 @@ _e_main_screens_init(void)
 static int
 _e_main_screens_shutdown(void)
 {
-   e_win_shutdown();
    e_comp_shutdown();
    e_client_shutdown();
 
-   e_slot_shutdown();
+   e_magnifier_shutdown();
    e_desk_shutdown();
    e_zone_shutdown();
    return 1;
@@ -1199,78 +1155,26 @@ static void
 _e_main_desk_restore(void)
 {
    E_Client *ec;
+   E_Zone *zone;
 
    E_CLIENT_REVERSE_FOREACH(ec)
-     if ((!e_client_util_ignored_get(ec)) && e_client_util_desk_visible(ec, e_desk_current_get(ec->zone)))
-       {
-          ec->want_focus = ec->take_focus = 1;
-          break;
-       }
-}
-
-static Eina_Bool
-_e_main_modules_load_after(void *d EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
-{
-   E_FREE_FUNC(mod_init_end, ecore_event_handler_del);
-   return ECORE_CALLBACK_RENEW;
-}
-
-static void
-_e_main_modules_load(Eina_Bool safe_mode)
-{
-   if (!safe_mode)
-     e_module_all_load();
-   else
      {
-        E_Module *m;
-        char *crashmodule;
-
-        crashmodule = getenv("E_MODULE_LOAD");
-        if (crashmodule) m = e_module_new(crashmodule);
-
-        if ((crashmodule) && (m))
-          {
-             e_module_disable(m);
-             e_object_del(E_OBJECT(m));
-
-             e_error_message_show
-               (_("Enlightenment crashed early on start and has<br>"
-                  "been restarted. There was an error loading the<br>"
-                  "module named: %s. This module has been disabled<br>"
-                  "and will not be loaded."), crashmodule);
-             e_util_dialog_show
-               (_("Enlightenment crashed early on start and has been restarted"),
-               _("Enlightenment crashed early on start and has been restarted.<br>"
-                 "There was an error loading the module named: %s<br><br>"
-                 "This module has been disabled and will not be loaded."), crashmodule);
-             e_module_all_load();
-          }
-        else
+        zone = e_comp_zone_find_by_ec(ec);
+        if ((!e_client_util_ignored_get(ec)) && e_desk_has_ec(e_desk_current_get(zone), ec))
           {
-             e_error_message_show
-               (_("Enlightenment crashed early on start and has<br>"
-                  "been restarted. All modules have been disabled<br>"
-                  "and will not be loaded to help remove any problem<br>"
-                  "modules from your configuration. The module<br>"
-                  "configuration dialog should let you select your<br>"
-                  "modules again.\n"));
-             e_util_dialog_show
-               (_("Enlightenment crashed early on start and has been restarted"),
-               _("Enlightenment crashed early on start and has been restarted.<br>"
-                 "All modules have been disabled and will not be loaded to help<br>"
-                 "remove any problem modules from your configuration.<br><br>"
-                 "The module configuration dialog should let you select your<br>"
-                 "modules again."));
+             ec->want_focus = ec->take_focus = 1;
+             break;
           }
-        mod_init_end = ecore_event_handler_add(E_EVENT_MODULE_INIT_END, _e_main_modules_load_after, NULL);
      }
 }
 
 static Eina_Bool
 _e_main_cb_idle_before(void *data EINA_UNUSED)
 {
-   e_client_idler_before();
+   e_comp_idler_before();
+   _e_main_hook_call(E_MAIN_HOOK_POST_CLIENT_IDLER_BEFORE, NULL);
    edje_thaw();
+
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -1282,21 +1186,11 @@ _e_main_cb_idle_after(void *data EINA_UNUSED)
    eet_clearcache();
    edje_freeze();
 
-#ifdef E_RELEASE_BUILD
    if (first_idle)
      {
         TSM("SLEEP");
         first_idle = 0;
-        e_precache_end = EINA_TRUE;
-     }
-#else
-   if (first_idle++ < 60)
-     {
-        TSM("SLEEP");
-        if (!first_idle)
-          e_precache_end = EINA_TRUE;
      }
-#endif
 
    return ECORE_CALLBACK_RENEW;
 }