* Add options to choose what to show in menu (home, desktop, trash, etc...)

* Use e_exec instead of a custom fork to run the filemanager, it follow PATH, so you don't have to write the full path
 * Modify a little the filemanager selector

SVN revision: 38902
This commit is contained in:
Davide Andreoli 2009-02-02 00:35:45 +00:00
parent bc08260f0e
commit 5cbbcd35c7
4 changed files with 216 additions and 47 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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)
{