diff --git a/src/e_mod_config.c b/src/e_mod_config.c index 6c89189..af483d9 100644 --- a/src/e_mod_config.c +++ b/src/e_mod_config.c @@ -7,6 +7,14 @@ struct _E_Config_Dialog_Data int auto_mount; int auto_open; char *fm; + int fm_chk; + Evas_Object *entry; + int show_home; + int show_desk; + int show_trash; + int show_root; + int show_temp; + int show_bookm; }; /* Local Function Prototypes */ @@ -70,12 +78,33 @@ _fill_data(E_Config_Dialog_Data *cfdata) /* load a temp copy of the config variables */ cfdata->auto_mount = places_conf->auto_mount; cfdata->auto_open = places_conf->auto_open; + + cfdata->show_home = places_conf->show_home; + cfdata->show_desk = places_conf->show_desk; + cfdata->show_trash = places_conf->show_trash; + cfdata->show_root = places_conf->show_root; + cfdata->show_temp = places_conf->show_temp; + cfdata->show_bookm = places_conf->show_bookm; + if (places_conf->fm) cfdata->fm = strdup(places_conf->fm); else cfdata->fm = strdup(""); } +void _custom_fm_click(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data *cfdata = data; + + if (e_widget_check_checked_get(obj)) + e_widget_disabled_set(cfdata->entry, 0); + else + { + e_widget_disabled_set(cfdata->entry, 1); + e_widget_entry_text_set(cfdata->entry, ""); + } +} + static Evas_Object * _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) { @@ -83,6 +112,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) o = e_widget_list_add(evas, 0, 0); + //General frame of = e_widget_framelist_add(evas, D_("General"), 0); e_widget_framelist_content_align_set(of, 0.0, 0.0); @@ -94,11 +124,38 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) &(cfdata->auto_open)); e_widget_framelist_object_append(of, ow); - ow = e_widget_label_add - (evas, D_("File manager (if blank uses Enlightenment)")); + ow = e_widget_check_add(evas, D_("Use a custom file manager"), &(cfdata->fm_chk)); + e_widget_check_checked_set(ow, strlen(cfdata->fm) > 0 ? 1 : 0); + e_widget_on_change_hook_set(ow, _custom_fm_click, cfdata); e_widget_framelist_object_append(of, ow); ow = e_widget_entry_add(evas, &(cfdata->fm), NULL, NULL, NULL); + e_widget_disabled_set(ow, strlen(cfdata->fm) > 0 ? 0 : 1); + cfdata->entry = ow; + e_widget_framelist_object_append(of, ow); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + //Display frame + of = e_widget_framelist_add(evas, D_("Show"), 0); + e_widget_framelist_content_align_set(of, 0.0, 0.0); + + ow = e_widget_check_add(evas, D_("Home"), &(cfdata->show_home)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_check_add(evas, D_("Desktop"), &(cfdata->show_desk)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_check_add(evas, D_("Trash"), &(cfdata->show_trash)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_check_add(evas, D_("Filesystem"), &(cfdata->show_root)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_check_add(evas, D_("Temp"), &(cfdata->show_temp)); + e_widget_framelist_object_append(of, ow); + + ow = e_widget_check_add(evas, D_("Favorites"), &(cfdata->show_bookm)); e_widget_framelist_object_append(of, ow); e_widget_list_object_append(o, of, 1, 1, 0.5); @@ -111,6 +168,12 @@ _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { places_conf->auto_mount = cfdata->auto_mount; places_conf->auto_open = cfdata->auto_open; + places_conf->show_home = cfdata->show_home; + places_conf->show_desk = cfdata->show_desk; + places_conf->show_trash = cfdata->show_trash; + places_conf->show_root = cfdata->show_root; + places_conf->show_temp = cfdata->show_temp; + places_conf->show_bookm = cfdata->show_bookm; const char *fm = eina_stringshare_add(cfdata->fm); eina_stringshare_del(places_conf->fm); diff --git a/src/e_mod_main.c b/src/e_mod_main.c index a40562c..f0c4fdb 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -93,9 +93,15 @@ e_modapi_init(E_Module *m) #define D conf_edd E_CONFIG_VAL(D, T, version, INT); E_CONFIG_VAL(D, T, fm, STR); - E_CONFIG_VAL(D, T, auto_mount, UCHAR); - E_CONFIG_VAL(D, T, auto_open, UCHAR); + E_CONFIG_VAL(D, T, auto_mount, UCHAR); + E_CONFIG_VAL(D, T, auto_open, UCHAR); E_CONFIG_LIST(D, T, conf_items, conf_item_edd); + E_CONFIG_VAL(D, T, show_home, UCHAR); + E_CONFIG_VAL(D, T, show_desk, UCHAR); + E_CONFIG_VAL(D, T, show_trash, UCHAR); + E_CONFIG_VAL(D, T, show_root, UCHAR); + E_CONFIG_VAL(D, T, show_temp, UCHAR); + E_CONFIG_VAL(D, T, show_bookm, UCHAR); /* Tell E to find any existing module data. First run ? */ places_conf = e_config_domain_load("module.places", conf_edd); @@ -332,6 +338,12 @@ _places_conf_new(void) IFMODCFG(0x008d); places_conf->auto_mount = 0; places_conf->auto_open = 0; + places_conf->show_home = 1; + places_conf->show_desk = 1; + places_conf->show_trash = 0; + places_conf->show_root = 0; + places_conf->show_temp = 0; + places_conf->show_bookm = 1; _places_conf_item_get(NULL); IFMODCFGEND; diff --git a/src/e_mod_main.h b/src/e_mod_main.h index 4ad26c0..fbd2454 100644 --- a/src/e_mod_main.h +++ b/src/e_mod_main.h @@ -40,6 +40,13 @@ struct _Config const char *fm; unsigned char auto_mount; unsigned char auto_open; + + unsigned char show_home; + unsigned char show_desk; + unsigned char show_trash; + unsigned char show_root; + unsigned char show_temp; + unsigned char show_bookm; }; typedef struct _Config_Item Config_Item; diff --git a/src/e_mod_places.c b/src/e_mod_places.c index 6ba46b3..9981f99 100644 --- a/src/e_mod_places.c +++ b/src/e_mod_places.c @@ -42,7 +42,9 @@ static void _places_update_size(Evas_Object *obj, Volume *vol); // Edje callbacks void _places_icon_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source); +void _places_custom_icon_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source); void _places_eject_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source); + // Hal callbacks void _places_mount_cb(void *user_data, void *method_return, DBusError *error); void _places_unmount_cb(void *user_data, void *method_return, DBusError *error); @@ -138,6 +140,59 @@ _places_volume_sort_cb(const void *d1, const void *d2) return strcmp(v1->label, v2->label); } + +void +_places_custom_volume(Evas_Object *box, const char *label, const char *icon, const char *uri) +{ + int min_w, min_h, max_w, max_h; + Evas_Object *o, *sep, *i; + + /* volume object */ + o = edje_object_add(evas_object_evas_get(box)); + edje_object_file_set(o, theme_file, "modules/places/main"); + + /* icon */ + i = edje_object_add(evas_object_evas_get(box)); + //edje_object_file_set(icon, theme_file, vol->icon); + edje_object_file_set(i, e_theme_edje_file_get("base/theme/fileman", icon), + icon); + edje_object_part_swallow(o, "icon", i); + + /* label */ + edje_object_part_text_set(o, "volume_label", label); + + /* gauge */ + edje_object_signal_emit(o, "gauge,hide", "places"); + edje_object_part_text_set(o, "size_label", ""); + + + /* orient the separator*/ + if (!e_box_orientation_get(box)) + edje_object_signal_emit(o, "separator,set,horiz", "places"); + else + edje_object_signal_emit(o, "separator,set,vert", "places"); + + /* connect signals from edje */ + edje_object_signal_callback_add(o, "icon,activated", "places", + _places_custom_icon_activated_cb, (void*)uri); + + /* pack the volume in the box */ + evas_object_show(o); + edje_object_size_min_get(o, &min_w, &min_h); + edje_object_size_max_get(o, &max_w, &max_h); + //if (!strcmp(vol->mount_point, "/")) + // e_box_pack_start(box, o); + //else + e_box_pack_end(box, o); + e_box_pack_options_set(o, + 1, 0, /* fill */ + 1, 0, /* expand */ + 0.5, 0.0, /* align */ + min_w, min_h, /* min */ + max_w, max_h /* max */ + ); +} + void places_fill_box(Evas_Object *box) { @@ -147,8 +202,19 @@ places_fill_box(Evas_Object *box) places_empty_box(box); + /*if (places_conf->show_home) + _places_custom_volume(box, D_("Home"), "e/icons/fileman/home", "/home/dave"); + if (places_conf->show_desk) + _places_custom_volume(box, D_("Desktop"), "e/icons/fileman/desktop", "/home/dave/Desktop"); + if (places_conf->show_trash) + _places_custom_volume(box, D_("Trash"), "e/icons/fileman/trash", "trash:///"); + if (places_conf->show_root) + _places_custom_volume(box, D_("Filesystem"), "e/icons/fileman/root", "/"); + if (places_conf->show_temp) + _places_custom_volume(box, D_("Temp"), "e/icons/fileman/tmp", "/tmp"); + */ + volumes = eina_list_sort(volumes, 0, _places_volume_sort_cb); - for (l = volumes; l; l = l->next) { Volume *vol = l->data; @@ -327,33 +393,59 @@ places_generate_menu(void *data, E_Menu *em) char buf[PATH_MAX]; /* Home */ - mi = e_menu_item_new(em); - e_menu_item_label_set(mi, D_("Home")); - e_util_menu_item_edje_icon_set(mi, "fileman/home"); - e_menu_item_callback_set(mi, _places_run_fm, (char*)e_user_homedir_get()); + if (places_conf->show_home) + { + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Home")); + e_util_menu_item_edje_icon_set(mi, "fileman/home"); + e_menu_item_callback_set(mi, _places_run_fm, (char*)e_user_homedir_get()); + } /* Desktop */ - mi = e_menu_item_new(em); - e_menu_item_label_set(mi, D_("Desktop")); - e_util_menu_item_edje_icon_set(mi, "fileman/desktop"); - snprintf(buf, sizeof(buf), "%s/Desktop", (char*)e_user_homedir_get()); - e_menu_item_callback_set(mi, _places_run_fm, strdup(buf)); //TODO free somewhere + if (places_conf->show_desk) + { + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Desktop")); + e_util_menu_item_edje_icon_set(mi, "fileman/desktop"); + snprintf(buf, sizeof(buf), "%s/Desktop", (char*)e_user_homedir_get()); + e_menu_item_callback_set(mi, _places_run_fm, strdup(buf)); //TODO free somewhere + } /* Trash */ - mi = e_menu_item_new(em); - e_menu_item_label_set(mi, D_("Trash")); - e_util_menu_item_edje_icon_set(mi, "fileman/folder"); - e_menu_item_callback_set(mi, _places_run_fm, "trash:///"); - - //separator - mi = e_menu_item_new(em); - e_menu_item_separator_set(mi, 1); + if (places_conf->show_trash) + { + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Trash")); + e_util_menu_item_edje_icon_set(mi, "fileman/folder"); + e_menu_item_callback_set(mi, _places_run_fm, "trash:///"); + } /* File System */ - mi = e_menu_item_new(em); - e_menu_item_label_set(mi, D_("Filesystem")); - e_util_menu_item_edje_icon_set(mi, "fileman/hdd"); - e_menu_item_callback_set(mi, _places_run_fm, "/"); + if (places_conf->show_root) + { + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Filesystem")); + e_util_menu_item_edje_icon_set(mi, "fileman/hdd"); + e_menu_item_callback_set(mi, _places_run_fm, "/"); + } + + /* Temp */ + if (places_conf->show_temp) + { + mi = e_menu_item_new(em); + e_menu_item_label_set(mi, D_("Temp")); + e_util_menu_item_edje_icon_set(mi, "fileman/tmp"); + e_menu_item_callback_set(mi, _places_run_fm, "/tmp"); + } + + //separator + if (places_conf->show_home || places_conf->show_desk || + places_conf->show_trash || places_conf->show_root || + places_conf->show_temp) + { + mi = e_menu_item_new(em); + e_menu_item_separator_set(mi, 1); + } /* Volumes */ Eina_List *l; @@ -381,12 +473,13 @@ places_generate_menu(void *data, E_Menu *em) e_menu_item_callback_set(mi, places_menu_click_cb, (void*)vol); } - //separator - mi = e_menu_item_new(em); - e_menu_item_separator_set(mi, 1); - /* Favorites */ - places_parse_bookmarks(em); + if (places_conf->show_bookm) + { + mi = e_menu_item_new(em); + e_menu_item_separator_set(mi, 1); + places_parse_bookmarks(em); + } e_menu_pre_activate_callback_set(em, NULL, NULL); } @@ -552,23 +645,10 @@ _places_error_show(const char *title, const char *text1, const char *text2, cons static void _places_run_fm_external(const char *fm, const char *directory) { - pid_t pid; + char exec[PATH_MAX]; - pid = fork(); - if (pid < 0) - { - perror("cannot fork to launch external file manager."); - return; - } - else if (pid == 0) - { - const char * const cmd[3] = {fm, directory, NULL}; - execv(fm, (char * const *)cmd); - fprintf(stderr, - "ERROR: could not exec external file manager \"%s\": %s.\n", - fm, strerror(errno)); - exit(-1); - } + snprintf(exec, PATH_MAX, "%s %s", (char*)fm, (char*)directory); + e_exec(NULL, NULL, exec, NULL, NULL); } static void @@ -674,6 +754,13 @@ _places_icon_activated_cb(void *data, Evas_Object *o, const char *emission, cons } } +void +_places_custom_icon_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source) +{ + //data is char *uri + _places_run_fm(data, NULL, NULL); +} + void _places_eject_activated_cb(void *data, Evas_Object *o, const char *emission, const char *source) {