224 lines
5.1 KiB
C
224 lines
5.1 KiB
C
#include "e.h"
|
|
|
|
EAPI int E_EVENT_INIT_DONE = 0;
|
|
|
|
/* local function prototypes */
|
|
static Eina_Bool _e_init_cb_exe_event_del(void *data __UNUSED__, int type __UNUSED__, void *event);
|
|
|
|
/* local variables */
|
|
static const char *title = NULL;
|
|
static const char *version = NULL;
|
|
static Ecore_Exe *init_exe = NULL;
|
|
static Ecore_Event_Handler *exe_del_handler = NULL;
|
|
static Ecore_Ipc_Client *client = NULL;
|
|
static int done = 0;
|
|
static int undone = 0;
|
|
static Eina_List *stats = NULL;
|
|
|
|
/* public functions */
|
|
EINTERN int
|
|
e_init_init(void)
|
|
{
|
|
E_EVENT_INIT_DONE = ecore_event_type_new();
|
|
exe_del_handler =
|
|
ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
|
|
_e_init_cb_exe_event_del, NULL);
|
|
client = NULL;
|
|
done = 0;
|
|
return 1;
|
|
}
|
|
|
|
EINTERN int
|
|
e_init_shutdown(void)
|
|
{
|
|
/* if not killed, kill init */
|
|
e_init_hide();
|
|
if (title) eina_stringshare_del(title);
|
|
if (version) eina_stringshare_del(version);
|
|
title = NULL;
|
|
version = NULL;
|
|
if (exe_del_handler) ecore_event_handler_del(exe_del_handler);
|
|
exe_del_handler = NULL;
|
|
return 1;
|
|
}
|
|
|
|
EAPI void
|
|
e_init_show(void)
|
|
{
|
|
char buf[8192], *theme, *tit, *ver;
|
|
const char *s = NULL;
|
|
|
|
/* exec init */
|
|
|
|
if (!e_config->init_default_theme)
|
|
s = e_path_find(path_themes, "default.edj");
|
|
else if (e_config->init_default_theme[0] == '/')
|
|
s = eina_stringshare_add(e_config->init_default_theme);
|
|
else
|
|
s = e_path_find(path_themes, e_config->init_default_theme);
|
|
|
|
if (s) theme = strdup(e_util_filename_escape(s));
|
|
else theme = strdup("XdX");
|
|
if (s) eina_stringshare_del(s);
|
|
|
|
if (title) tit = strdup(e_util_filename_escape(title));
|
|
else tit = strdup("XtX");
|
|
|
|
if (version) ver = strdup(e_util_filename_escape(version));
|
|
else ver = strdup("XvX");
|
|
|
|
snprintf(buf, sizeof(buf),
|
|
"%s/enlightenment/utils/enlightenment_init \'%s\' \'%i\' \'%s\' \'%s\'",
|
|
e_prefix_lib_get(), theme,
|
|
e_config->font_hinting, tit, ver);
|
|
printf("RUN INIT: %s\n", buf);
|
|
free(theme);
|
|
free(tit);
|
|
free(ver);
|
|
/* FIXME: add font path to cmd-line */
|
|
init_exe = ecore_exe_run(buf, NULL);
|
|
}
|
|
|
|
EAPI void
|
|
e_init_hide(void)
|
|
{
|
|
if (init_exe) ecore_exe_terminate(init_exe);
|
|
}
|
|
|
|
EAPI void
|
|
e_init_title_set(const char *str)
|
|
{
|
|
if (title) eina_stringshare_del(title);
|
|
title = eina_stringshare_add(str);
|
|
}
|
|
|
|
EAPI void
|
|
e_init_version_set(const char *str)
|
|
{
|
|
if (version) eina_stringshare_del(version);
|
|
version = eina_stringshare_add(str);
|
|
}
|
|
|
|
EAPI void
|
|
e_init_status_set(const char *str)
|
|
{
|
|
if (!init_exe) return;
|
|
// printf("---STAT %p %s\n", client, str);
|
|
if (!client)
|
|
{
|
|
stats = eina_list_append(stats, eina_stringshare_add(str));
|
|
return;
|
|
}
|
|
// printf("---SEND\n");
|
|
ecore_ipc_client_send(client, E_IPC_DOMAIN_INIT, 1, 0, 0, 0, (void *)str,
|
|
strlen(str) + 1);
|
|
ecore_ipc_client_flush(client);
|
|
}
|
|
|
|
EAPI void
|
|
e_init_done(void)
|
|
{
|
|
undone--;
|
|
if (undone > 0) return;
|
|
done = 1;
|
|
ecore_event_add(E_EVENT_INIT_DONE, NULL, NULL, NULL);
|
|
// printf("---DONE %p\n", client);
|
|
if (!client) return;
|
|
ecore_ipc_client_send(client, E_IPC_DOMAIN_INIT, 2, 0, 0, 0, NULL, 0);
|
|
ecore_ipc_client_flush(client);
|
|
}
|
|
|
|
EAPI void
|
|
e_init_undone(void)
|
|
{
|
|
undone++;
|
|
}
|
|
|
|
EAPI void
|
|
e_init_client_data(Ecore_Ipc_Event_Client_Data *e)
|
|
{
|
|
// printf("---new init client\n");
|
|
if (!client) client = e->client;
|
|
if (e->minor == 1)
|
|
{
|
|
if (e->data)
|
|
{
|
|
int i, num;
|
|
Ecore_X_Window *initwins;
|
|
|
|
num = e->size / sizeof(Ecore_X_Window);
|
|
initwins = e->data;
|
|
for (i = 0; i < num; i += 2)
|
|
{
|
|
Eina_List *l;
|
|
E_Manager *man;
|
|
|
|
EINA_LIST_FOREACH(e_manager_list(), l, man)
|
|
{
|
|
if (man->root == initwins[i + 0])
|
|
{
|
|
man->initwin = initwins[i + 1];
|
|
ecore_x_window_raise(man->initwin);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
while (stats)
|
|
{
|
|
const char *s;
|
|
|
|
s = stats->data;
|
|
stats = eina_list_remove_list(stats, stats);
|
|
// printf("---SPOOL %s\n", s);
|
|
e_init_status_set(s);
|
|
eina_stringshare_del(s);
|
|
}
|
|
}
|
|
else if (e->minor == 2)
|
|
{
|
|
e_config->show_splash = e->ref;
|
|
e_config_save_queue();
|
|
}
|
|
if (done) e_init_done();
|
|
}
|
|
|
|
EAPI void
|
|
e_init_client_del(Ecore_Ipc_Event_Client_Del *e)
|
|
{
|
|
// printf("---del init client\n");
|
|
if (e->client == client)
|
|
{
|
|
Eina_List *l;
|
|
E_Manager *man;
|
|
|
|
client = NULL;
|
|
EINA_LIST_FOREACH(e_manager_list(), l, man)
|
|
{
|
|
man->initwin = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
EAPI int
|
|
e_init_count_get(void)
|
|
{
|
|
return undone;
|
|
}
|
|
|
|
/* local functions */
|
|
static Eina_Bool
|
|
_e_init_cb_exe_event_del(void *data __UNUSED__, int type __UNUSED__, void *event)
|
|
{
|
|
Ecore_Exe_Event_Del *ev;
|
|
|
|
ev = event;
|
|
if (ev->exe == init_exe)
|
|
{
|
|
/* init exited */
|
|
// ecore_exe_free(init_exe);
|
|
init_exe = NULL;
|
|
}
|
|
return ECORE_CALLBACK_RENEW;
|
|
}
|
|
|