From 27621d739b8e667363a2fcb70e2af0a620fe1fd8 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Mon, 5 Jun 2006 03:16:16 +0000 Subject: [PATCH] -Added new config item for init screens into e_config.h/c. -Bumped e_config.h File_Generation to coincide with added config value. -Fixed e_init.c to look for config value instead of hard-coded init.edj. -Newer Config Startup dialog that allows selecting (with previews) of the init. New init screens can now be copied into the init search directories, and easily selected via dialog. SVN revision: 23166 --- src/bin/e_config.c | 3 + src/bin/e_config.h | 5 +- src/bin/e_init.c | 18 ++- src/bin/e_int_config_startup.c | 285 +++++++++++++++++++++++++++++++-- 4 files changed, 294 insertions(+), 17 deletions(-) diff --git a/src/bin/e_config.c b/src/bin/e_config.c index fd145ce9b..5fdafe9fe 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -315,6 +315,7 @@ e_config_init(void) /**/ /* == already configurable via ipc */ E_CONFIG_VAL(D, T, config_version, INT); /**/ E_CONFIG_VAL(D, T, show_splash, INT); /**/ + E_CONFIG_VAL(D, T, init_default_theme, STR); E_CONFIG_VAL(D, T, desktop_default_background, STR); /**/ E_CONFIG_VAL(D, T, desktop_default_name, STR); /**/ E_CONFIG_LIST(D, T, desktop_backgrounds, _e_config_desktop_bg_edd); /**/ @@ -509,6 +510,7 @@ e_config_init(void) #define IFCFGEND } IFCFG(0x008d); e_config->show_splash = 1; + e_config->init_default_theme = NULL; e_config->desktop_default_background = NULL; e_config->desktop_default_name = evas_stringshare_add(_("Desktop %i, %i")); e_config->menus_scroll_speed = 1000.0; @@ -1784,6 +1786,7 @@ _e_config_free(void) if (cc->name) evas_stringshare_del(cc->name); E_FREE(cc); } + if (e_config->init_default_theme) evas_stringshare_del(e_config->init_default_theme); if (e_config->desktop_default_background) evas_stringshare_del(e_config->desktop_default_background); if (e_config->desktop_default_name) evas_stringshare_del(e_config->desktop_default_name); if (e_config->language) evas_stringshare_del(e_config->language); diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 2f772327e..1c472202f 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -47,10 +47,10 @@ typedef Eet_Data_Descriptor E_Config_DD; * defaults for e to work. */ #define E_CONFIG_FILE_EPOCH 0x0000 -/* increment this whenever a new set of configvalues are added but the users +/* increment this whenever a new set of config values are added but the users * config doesn't need top be wiped - simply new values need to be put in */ -#define E_CONFIG_FILE_GENERATION 0x0093 +#define E_CONFIG_FILE_GENERATION 0x0094 #define E_CONFIG_FILE_VERSION ((E_CONFIG_FILE_EPOCH << 16) | E_CONFIG_FILE_GENERATION) #define E_EVAS_ENGINE_DEFAULT 0 @@ -75,6 +75,7 @@ struct _E_Config { int config_version; int show_splash; //GUI + const char *init_default_theme; const char *desktop_default_background; // GUI Evas_List *desktop_backgrounds; // GUI const char *desktop_default_name; diff --git a/src/bin/e_init.c b/src/bin/e_init.c index d5aaabacf..889ed277d 100644 --- a/src/bin/e_init.c +++ b/src/bin/e_init.c @@ -67,8 +67,10 @@ e_init_init(void) /* first screen */ if (l == screens) { - /* FIXME: "init.edj" needs to come from config */ - s = e_path_find(path_init, "init.edj"), + if (!e_config->init_default_theme) + s = e_path_find(path_init, "init.edj"); + else + s = e_path_find(path_init, e_config->init_default_theme); edje_object_file_set(o, s, "init/splash"); if (s) evas_stringshare_del(s); _e_init_object = o; @@ -76,8 +78,10 @@ e_init_init(void) /* other screens */ else { - /* FIXME: "init.edj" needs to come from config */ - s = e_path_find(path_init, "init.edj"), + if (!e_config->init_default_theme) + s = e_path_find(path_init, "init.edj"); + else + s = e_path_find(path_init, e_config->init_default_theme); edje_object_file_set(o, s, "init/extra_screen"); if (s) evas_stringshare_del(s); } @@ -89,8 +93,10 @@ e_init_init(void) else { o = edje_object_add(_e_init_evas); - /* FIXME: "init.edj" needs to come from config */ - s = e_path_find(path_init, "init.edj"), + if (!e_config->init_default_theme) + s = e_path_find(path_init, "init.edj"); + else + s = e_path_find(path_init, e_config->init_default_theme); edje_object_file_set(o, s, "init/splash"); if (s) evas_stringshare_del(s); _e_init_object = o; diff --git a/src/bin/e_int_config_startup.c b/src/bin/e_int_config_startup.c index a82f1b304..219517bec 100644 --- a/src/bin/e_int_config_startup.c +++ b/src/bin/e_int_config_startup.c @@ -1,13 +1,22 @@ #include "e.h" static void *_create_data(E_Config_Dialog *cfd); -static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static void _load_inits(E_Config_Dialog *cfd, Evas_Object *il); +void _ilist_cb_init_selected(void *data); +static void _init_file_added(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path); + +static Ecore_File_Monitor *_init_file_monitor; struct _E_Config_Dialog_Data { int show_splash; + char *init_default_theme; + + E_Config_Dialog *cfd; + Evas_Object *il; }; EAPI E_Config_Dialog * @@ -31,6 +40,10 @@ static void _fill_data(E_Config_Dialog_Data *cfdata) { cfdata->show_splash = e_config->show_splash; + if (e_config->init_default_theme) + cfdata->init_default_theme = strdup(e_config->init_default_theme); + else + cfdata->init_default_theme = NULL; } static void * @@ -40,19 +53,38 @@ _create_data(E_Config_Dialog *cfd) cfdata = E_NEW(E_Config_Dialog_Data, 1); _fill_data(cfdata); + cfd->cfdata = cfdata; + cfdata->cfd = cfd; return cfdata; } static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { + if (_init_file_monitor) + { + ecore_file_monitor_del(_init_file_monitor); + _init_file_monitor = NULL; + } + if (cfdata->init_default_theme) free(cfdata->init_default_theme); free(cfdata); } static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) -{ +{ e_config->show_splash = cfdata->show_splash; + if (e_config->init_default_theme) + evas_stringshare_del(e_config->init_default_theme); + + if (!cfdata->init_default_theme[0]) + e_config->init_default_theme = NULL; + else + { + const char *f = ecore_file_get_file(cfdata->init_default_theme); + e_config->init_default_theme = evas_stringshare_add(f); + } + e_config_save_queue(); return 1; } @@ -60,14 +92,249 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) static Evas_Object * _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { - Evas_Object *o, *of, *ob; + Evas_Object *ot, *ob, *il, *im; + char path[4096]; - o = e_widget_list_add(evas, 0, 0); + ot = e_widget_table_add(evas, 0); + il = e_widget_ilist_add(evas, 48, 48, &(cfdata->init_default_theme)); + cfdata->il = il; + e_widget_ilist_selector_set(il, 1); + e_widget_min_size_set(il, 180, 40); - of = e_widget_framelist_add(evas, _("Startup Settings"), 0); + _load_inits(cfd, il); + im = cfd->data; + + e_widget_table_object_append(ot, il, 0, 0, 1, 2, 1, 1, 1, 1); + e_widget_table_object_append(ot, im, 1, 0, 1, 2, 1, 1, 1, 1); + ob = e_widget_check_add(evas, _("Show Splash Screen At Boot"), &(cfdata->show_splash)); - e_widget_framelist_object_append(of, ob); - e_widget_list_object_append(o, of, 1, 1, 0.5); + e_widget_table_object_append(ot, ob, 0, 3, 2, 1, 1, 0, 0, 0); - return o; + if (_init_file_monitor) + { + ecore_file_monitor_del(_init_file_monitor); + _init_file_monitor = NULL; + } + + snprintf(path, sizeof(path), "%s/.e/e/init", e_user_homedir_get()); + _init_file_monitor = ecore_file_monitor_add(path, _init_file_added, cfdata); + + return ot; +} + +static void +_load_inits(E_Config_Dialog *cfd, Evas_Object *il) +{ + Evas *evas; + Evas_Object *ic, *im, *o, *init_obj; + Evas_List *init_dirs, *init; + Ecore_Evas *eebuf; + Evas *evasbuf; + int i = 0; + int selnum = -1; + const char *s; + char *c; + char *homedir; + + if (!il) return; + + homedir = e_user_homedir_get(); + + evas = evas_object_evas_get(il); + init_obj = edje_object_add(cfd->dia->win->evas); + eebuf = ecore_evas_buffer_new(1, 1); + evasbuf = ecore_evas_get(eebuf); + o = edje_object_add(evasbuf); + + e_widget_ilist_header_append(il, NULL, _("Theme")); + i++; + + /* Load the init */ + s = e_path_find(path_init, "init.edj"); + c = strdup(s); + if (edje_object_file_set(o, s, "init/splash")) + { + Evas_Object *ic = NULL; + + ic = edje_object_add(evas); + e_util_edje_icon_set(ic, "enlightenment/run"); + + /* + ic = e_widget_preview_add(evas, 48, 48); + e_widget_preview_edje_set(ic, s, "init/splash"); + */ + + e_widget_ilist_append(il, ic, _("Theme Init"), _ilist_cb_init_selected, cfd, ""); + if (!e_config->init_default_theme) + selnum = i; + + i++; + } + im = e_widget_preview_add(cfd->dia->win->evas, 320, + (320 * e_zone_current_get(cfd->dia->win->container)->h) / + e_zone_current_get(cfd->dia->win->container)->w); + + e_widget_preview_edje_set(im, s, "init/splash"); + evas_object_del(init_obj); + + evas_object_del(o); + ecore_evas_free(eebuf); + if (s) evas_stringshare_del(s); + + /* Load other inits */ + init_dirs = e_path_dir_list_get(path_init); + for (init = init_dirs; init; init = init->next) + { + E_Path_Dir *d; + int detected; + char *init_file; + Ecore_List *inits; + + d = init->data; + if (!ecore_file_is_dir(d->dir)) continue; + inits = ecore_file_ls(d->dir); + if (!inits) continue; + + detected = 0; + if (homedir) + { + if (!strncmp(d->dir, homedir, strlen(homedir))) + { + e_widget_ilist_header_append(il, NULL, _("Personal")); + i++; + detected = 1; + } + } + if (!detected) + { + if (!strncmp(d->dir, e_prefix_data_get(), strlen(e_prefix_data_get()))) + { + e_widget_ilist_header_append(il, NULL, _("System")); + i++; + detected = 1; + } + } + if (!detected) + { + e_widget_ilist_header_append(il, NULL, _("Other")); + i++; + detected = 1; + } + + while ((init_file = ecore_list_next(inits))) + { + char full_path[4096]; + + snprintf(full_path, sizeof(full_path), "%s/%s", d->dir, init_file); + if (ecore_file_is_dir(full_path)) continue; + if (!e_util_edje_collection_exists(full_path, "init/splash")) continue; + + ic = edje_object_add(evas); + e_util_edje_icon_set(ic, "enlightenment/run"); + + /* + * Using live previews for icons in list here + * really drains resources. */ + + /* + ic = e_widget_preview_add(evas, 48, 48); + e_widget_preview_edje_set(ic, full_path, "init/splash"); + */ + + /* e_thumb_generate cannot handle init splash yet */ + + /* + if (!e_thumb_exists(full_path)) + ic = e_thumb_generate_begin(full_path, 48, 48, evas, &ic, NULL, NULL); + else + ic = e_thumb_evas_object_get(full_path, evas, 48, 48, 1); + */ + + e_widget_ilist_append(il, ic, ecore_file_strip_ext(init_file), _ilist_cb_init_selected, cfd, full_path); + + if ((e_config->init_default_theme) && + (!strcmp(e_config->init_default_theme, init_file))) + { + E_Zone *z; + + z = e_zone_current_get(cfd->dia->win->container); + + selnum = i; + evas_object_del(im); + im = e_widget_preview_add(cfd->dia->win->evas, 320, (320 * z->h) / z->w); + e_widget_preview_edje_set(im, full_path, "init/splash"); + } + i++; + } + free(init_file); + ecore_list_destroy(inits); + } + evas_list_free(init); + if (init_dirs) e_path_dir_list_free(init_dirs); + free(c); + cfd->data = im; + e_widget_ilist_go(il); + if (selnum >= 0) + e_widget_ilist_selected_set(il, selnum); + + free(homedir); +} + +void +_ilist_cb_init_selected(void *data) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_Data *cfdata; + Evas *evas; + const char *init; + const char *f; + + cfd = data; + cfdata = cfd->cfdata; + evas = cfd->dia->win->evas; + + if (!cfdata->init_default_theme[0]) + init = e_path_find(path_init, "init.edj"); + else + { + f = ecore_file_get_file(cfd->cfdata->init_default_theme); + init = e_path_find(path_init, f); + } + e_widget_preview_edje_set(cfd->data, init, "init/splash"); +} + +static void +_init_file_added(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_Data *cfdata; + Evas *evas; + Evas_Object *il, *ic; + char *file, *noext; + + cfdata = data; + if (!cfdata) return; + + il = cfdata->il; + if (!il) return; + + cfd = cfdata->cfd; + if (!cfd) return; + + evas = e_win_evas_get(cfd->dia->win); + + file = (char *)ecore_file_get_file((char *)path); + noext = ecore_file_strip_ext(file); + + if (event == ECORE_FILE_EVENT_CREATED_FILE) + { + if (e_util_edje_collection_exists((char *)path, "init/splash")) + { + ic = edje_object_add(evas); + e_util_edje_icon_set(ic, "enlightenment/run"); + e_widget_ilist_append(il, ic, noext, _ilist_cb_init_selected, cfd, (char *)path); + } + } + else if (event == ECORE_FILE_EVENT_DELETED_FILE) + e_widget_ilist_remove_label(il, noext); }