diff --git a/data/icons/default.edc b/data/icons/default.edc index 13c935868..a2c5d334a 100644 --- a/data/icons/default.edc +++ b/data/icons/default.edc @@ -7,6 +7,9 @@ images { image: "reset_button_0.png" LOSSY 90; image: "reset_button_glow_0.png" LOSSY 90; + + image: "theme_0.png" LOSSY 90; + image: "theme_glow_0.png" LOSSY 90; image: "windows.png" LOSSY 90; @@ -200,6 +203,66 @@ collections { } } } + group { + name: "theme"; + max: 64 64; + parts { + part { + name: "theme_button"; + mouse_events: 0; + description { + state: "default" 0.0; + aspect: 1.0 1.0; + max: 64 64; + image { + normal: "theme_0.png"; + } + } + } + part { + name: "theme_button_glow"; + mouse_events: 0; + description { + state: "default" 0.0; + visible: 0; + rel1 { + to: "theme_button"; + } + rel2 { + to: "theme_button"; + } + color: 255 255 255 0; + image { + normal: "theme_glow_0.png"; + } + } + description { + state: "hilited" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + } + programs { + program { + name: "theme_button_in"; + signal: "active"; + source: ""; + action: STATE_SET "hilited" 0.0; + transition: LINEAR 0.5; + target: "theme_button_glow"; + } + program { + name: "theme_button_out"; + signal: "passive"; + source: ""; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.5; + target: "theme_button_glow"; + } + } + } group { name: "windows"; max: 64 64; diff --git a/data/icons/images/Makefile.am b/data/icons/images/Makefile.am index 8c8e8f88d..553d10669 100644 --- a/data/icons/images/Makefile.am +++ b/data/icons/images/Makefile.am @@ -6,6 +6,8 @@ power_button_0.png \ power_button_glow_0.png \ reset_button_0.png \ reset_button_glow_0.png \ +theme_0.png \ +theme_glow_0.png \ windows.png \ module.png \ favorites.png \ diff --git a/data/icons/images/theme_0.png b/data/icons/images/theme_0.png new file mode 100644 index 000000000..e0fa8c91d Binary files /dev/null and b/data/icons/images/theme_0.png differ diff --git a/data/icons/images/theme_glow_0.png b/data/icons/images/theme_glow_0.png new file mode 100644 index 000000000..e061bd91e Binary files /dev/null and b/data/icons/images/theme_glow_0.png differ diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index c5694767e..fa506d96a 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -13,6 +13,7 @@ struct _Main_Data E_Menu *clients; E_Menu *modules; E_Menu *gadgets; + E_Menu *themes; }; /* local subsystem functions */ @@ -36,6 +37,8 @@ static void _e_int_menus_desktops_col_add_cb (void *data, E_Menu *m, E_Menu_Item static void _e_int_menus_desktops_col_del_cb (void *data, E_Menu *m, E_Menu_Item *mi); static void _e_int_menus_gadgets_pre_cb (void *data, E_Menu *m); static void _e_int_menus_gadgets_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_int_menus_themes_pre_cb (void *data, E_Menu *m); +static void _e_int_menus_themes_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi); /* externally accessible functions */ E_Menu * @@ -98,6 +101,15 @@ e_int_menus_main_new(void) e_path_find(path_icons, "default.edj"), "gadgets"); e_menu_item_submenu_set(mi, subm); + + subm = e_int_menus_themes_new(); + dat->themes = subm; + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Themes")); + e_menu_item_icon_edje_set(mi, + e_path_find(path_icons, "default.edj"), + "theme"); + e_menu_item_submenu_set(mi, subm); mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); @@ -191,6 +203,16 @@ e_int_menus_gadgets_new(void) return m; } +E_Menu * +e_int_menus_themes_new(void) +{ + E_Menu *m; + + m = e_menu_new(); + e_menu_pre_activate_callback_set(m, _e_int_menus_themes_pre_cb, NULL); + return m; +} + /* local subsystem functions */ static void _e_int_menus_main_del_hook(void *obj) @@ -207,6 +229,7 @@ _e_int_menus_main_del_hook(void *obj) e_object_del(E_OBJECT(dat->desktops)); e_object_del(E_OBJECT(dat->clients)); e_object_del(E_OBJECT(dat->gadgets)); + e_object_del(E_OBJECT(dat->themes)); free(dat); } } @@ -541,3 +564,102 @@ _e_int_menus_gadgets_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi) else e_gadman_mode_set(gm, E_GADMAN_MODE_NORMAL); } + +static void +_e_int_menus_themes_pre_cb(void *data, E_Menu *m) +{ + E_Menu_Item *mi; + E_Menu *root; + + e_menu_pre_activate_callback_set(m, NULL, NULL); + root = e_menu_root_get(m); + if ((root) && (root->zone)) + { + char buf[4096]; + char *homedir; + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Choose Theme")); + + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + + homedir = e_user_homedir_get(); + if (homedir) + { + snprintf(buf, sizeof(buf), "%s/.e/e/themes", homedir); + free(homedir); + } + + if(ecore_file_exists(buf) && ecore_file_is_dir(buf)) + { + Ecore_List *themes; + char *theme, *deftheme; + + themes = ecore_file_ls(buf); + theme = E_NEW(char, strlen(buf) + strlen("/default.edj") + 1); + snprintf(theme, strlen(buf) + strlen("/default.edj") + 1, "%s/default.edj", buf); + + if(ecore_file_exists("/home/hisham/.e/e/themes/default.edj")) + deftheme = ecore_file_readlink("/home/hisham/.e/e/themes/default.edj"); + if(deftheme) + { + char *s; + if((s = strrchr(deftheme, '/'))) + deftheme = s + 1; + } + + while((theme = ecore_list_next(themes))) + { + if(ecore_file_is_dir(theme) || !strrchr(theme,'.')) + continue; + if(!strncmp(strrchr(theme,'.'), ".edj", 4)) + { + mi = e_menu_item_new(m); + e_menu_item_radio_set(mi, 1); + if(deftheme) { + if(!strcmp(theme, deftheme)) + e_menu_item_toggle_set(mi, 1); + } + *(strrchr(theme,'.')) = '\0'; + e_menu_item_label_set(mi, _(theme)); + e_menu_item_callback_set(mi, _e_int_menus_themes_edit_mode_cb, NULL); + } + } + } + } + else + { + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("(Unused)")); + e_menu_item_callback_set(mi, NULL, NULL); + } +} + +static void +_e_int_menus_themes_edit_mode_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + char *theme; + char *homedir; + char buf[4096]; + + homedir = e_user_homedir_get(); + if (homedir) + { + snprintf(buf, sizeof(buf), "%s/.e/e/themes/default.edj", homedir); + theme = E_NEW(char, 4096); + snprintf(theme, 4096, "%s/.e/e/themes/%s.edj", homedir, mi->label); + free(homedir); + } + else + return; + + ecore_file_unlink(buf); + if(!symlink(theme, buf)) + { + printf("RESTART ON!\n"); + restart = 1; + ecore_main_loop_quit(); + } + +} diff --git a/src/bin/e_int_menus.h b/src/bin/e_int_menus.h index 0283d0586..9a4607abe 100644 --- a/src/bin/e_int_menus.h +++ b/src/bin/e_int_menus.h @@ -12,6 +12,7 @@ EAPI E_Menu *e_int_menus_clients_new(void); EAPI E_Menu *e_int_menus_apps_new(char *dir); EAPI E_Menu *e_int_menus_favorite_apps_new(void); EAPI E_Menu *e_int_menus_gadgets_new(void); +EAPI E_Menu *e_int_menus_themes_new(void); #endif #endif