From b2aa6a27fed679fcfa41e60a56e6b08e4839d449 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Sun, 12 Aug 2007 09:54:33 +0000 Subject: [PATCH] Add file manager as a module. SVN revision: 31256 --- src/modules/fileman/.cvsignore | 7 + src/modules/fileman/Makefile.am | 33 + src/modules/fileman/e-module-fileman.edj | Bin 0 -> 5396 bytes src/modules/fileman/e_fwin.c | 1425 ++++++++++++++++++++++ src/modules/fileman/e_fwin.h | 18 + src/modules/fileman/e_mod_config.c | 167 +++ src/modules/fileman/e_mod_config.h | 10 + src/modules/fileman/e_mod_main.c | 262 ++++ src/modules/fileman/e_mod_main.h | 81 ++ src/modules/fileman/module.desktop.in | 4 + 10 files changed, 2007 insertions(+) create mode 100644 src/modules/fileman/.cvsignore create mode 100644 src/modules/fileman/Makefile.am create mode 100644 src/modules/fileman/e-module-fileman.edj create mode 100644 src/modules/fileman/e_fwin.c create mode 100644 src/modules/fileman/e_fwin.h create mode 100644 src/modules/fileman/e_mod_config.c create mode 100644 src/modules/fileman/e_mod_config.h create mode 100644 src/modules/fileman/e_mod_main.c create mode 100644 src/modules/fileman/e_mod_main.h create mode 100644 src/modules/fileman/module.desktop.in diff --git a/src/modules/fileman/.cvsignore b/src/modules/fileman/.cvsignore new file mode 100644 index 000000000..06d064a84 --- /dev/null +++ b/src/modules/fileman/.cvsignore @@ -0,0 +1,7 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +module.la +module.desktop diff --git a/src/modules/fileman/Makefile.am b/src/modules/fileman/Makefile.am new file mode 100644 index 000000000..4cca967ec --- /dev/null +++ b/src/modules/fileman/Makefile.am @@ -0,0 +1,33 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = fileman + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = \ +e-module-$(MODULE).edj module.desktop + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/modules/$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h \ + e_mod_config.c \ + e_mod_config.h \ + e_fwin.c \ + e_fwin.h + +module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h + +uninstall: + rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/fileman/e-module-fileman.edj b/src/modules/fileman/e-module-fileman.edj new file mode 100644 index 0000000000000000000000000000000000000000..14e50f680208f199f5debc79957c53e6e0d3152e GIT binary patch literal 5396 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 + */ +#include "e.h" +#include "e_mod_main.h" + +/* FIXME: fwin - he fm2 filemanager wrapped with a window and scrollframe. + * primitive BUT enough to test generic dnd and fm stuff more easily. don't + * play with this unless u want to help with it. NOT COMPLETE! BEWARE! + */ +/* FIXME: multiple selected files across different fwins - you can only dnd the + * ones in the 1 window src - not all selected ones. also selecting a new file + * in a new fwin doesnt deseclect other selections in other fwin's (unless + * multi-selecting) + */ + +typedef struct _E_Fwin E_Fwin; +typedef struct _E_Fwin_Apps_Dialog E_Fwin_Apps_Dialog; + +#define E_FWIN_TYPE 0xE0b0101f + +struct _E_Fwin +{ + E_Object e_obj_inherit; + + E_Win *win; + E_Zone *zone; + Evas_Object *scrollframe_obj; + Evas_Object *fm_obj; + Evas_Object *bg_obj; + E_Fwin_Apps_Dialog *fad; + + Evas_Object *under_obj; + Evas_Object *over_obj; + struct { + Evas_Coord x, y, max_x, max_y, w, h; + } fm_pan, fm_pan_last; + + const char *wallpaper_file; + const char *overlay_file; + const char *scrollframe_file; + const char *theme_file; + + Ecore_Event_Handler *zone_handler; +}; + +struct _E_Fwin_Apps_Dialog +{ + E_Dialog *dia; + E_Fwin *fwin; + char *app1, *app2; + Evas_Object *o_ilist, *o_fm; +}; + +typedef enum +{ + E_FWIN_EXEC_NONE, + E_FWIN_EXEC_DIRECT, + E_FWIN_EXEC_SH, + E_FWIN_EXEC_TERMINAL_DIRECT, + E_FWIN_EXEC_TERMINAL_SH, + E_FWIN_EXEC_DESKTOP +} E_Fwin_Exec_Type; + +/* local subsystem functions */ +static E_Fwin *_e_fwin_new(E_Container *con, const char *dev, const char *path); +static void _e_fwin_free(E_Fwin *fwin); +static void _e_fwin_cb_delete(E_Win *win); +static void _e_fwin_cb_resize(E_Win *win); +static void _e_fwin_deleted(void *data, Evas_Object *obj, void *event_info); +static const char *_e_fwin_custom_file_path_eval(E_Fwin *fwin, Efreet_Desktop *ef, const char *prev_path, const char *key); +static void _e_fwin_changed(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_selected(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_selection_change(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_menu_extend(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info); +static void _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fwin_cb_menu_extend_start(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info); +static void _e_fwin_cb_menu_open(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fwin_cb_menu_open_with(void *data, E_Menu *m, E_Menu_Item *mi); + +static void _e_fwin_cb_ilist_change(void *data); +static void _e_fwin_cb_ilist_selected(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_cb_fm_selection_change(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_cb_fm_selected(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_cb_open(void *data, E_Dialog *dia); +static void _e_fwin_cb_close(void *data, E_Dialog *dia); +static void _e_fwin_cb_dialog_free(void *obj); +static Evas_Bool _e_fwin_cb_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata); +static E_Fwin_Exec_Type _e_fwin_file_is_exec(E_Fm2_Icon_Info *ici); +static void _e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext); +static void _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files, int always); + +static void _e_fwin_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static void _e_fwin_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y); +static void _e_fwin_pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y); +static void _e_fwin_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); +static void _e_fwin_pan_scroll_update(E_Fwin *fwin); + +static void _e_fwin_zone_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static int _e_fwin_zone_move_resize(void *data, int type, void *event); + +/* local subsystem globals */ +static Evas_List *fwins = NULL; + +/* externally accessible functions */ +EAPI int +e_fwin_init(void) +{ + return 1; +} + +EAPI int +e_fwin_shutdown(void) +{ + Evas_List *l; + + l = fwins; + fwins = NULL; + while (l) + { + e_object_del(E_OBJECT(l->data)); + l = evas_list_remove_list(l, l); + } + return 1; +} + +/* FIXME: this opens a new window - we need a way to inherit a zone as the + * "fwin" window + */ +EAPI void +e_fwin_new(E_Container *con, const char *dev, const char *path) +{ + E_Fwin *fwin; + + fwin = _e_fwin_new(con, dev, path); +} + +EAPI void +e_fwin_zone_new(E_Zone *zone, const char *dev, const char *path) +{ + E_Fwin *fwin; + char buf[4096]; + const char *file; + Evas_Object *o; + E_Fm2_Config fmc; + + fwin = E_OBJECT_ALLOC(E_Fwin, E_FWIN_TYPE, _e_fwin_free); + if (!fwin) return; + fwin->zone = zone; + + /* Add Event Handler for zone move/resize */ + fwin->zone_handler = ecore_event_handler_add(E_EVENT_ZONE_MOVE_RESIZE, + _e_fwin_zone_move_resize, + fwin); + + /* Trap the mouse_down on zone so we can unselect */ + evas_object_event_callback_add(zone->bg_event_object, + EVAS_CALLBACK_MOUSE_DOWN, + _e_fwin_zone_cb_mouse_down, fwin); + + fwins = evas_list_append(fwins, fwin); + + o = e_fm2_add(zone->container->bg_evas); + fwin->fm_obj = o; + memset(&fmc, 0, sizeof(E_Fm2_Config)); +#if 0 + fmc.view.mode = E_FM2_VIEW_MODE_LIST; + fmc.icon.list.w = 24; + fmc.icon.list.h = 24; + fmc.icon.fixed.w = 1; + fmc.icon.fixed.h = 1; +#else + fmc.view.mode = E_FM2_VIEW_MODE_CUSTOM_ICONS; + fmc.icon.icon.w = fileman_config->icon.icon.w; + fmc.icon.icon.h = fileman_config->icon.icon.h; + fmc.icon.fixed.w = 0; + fmc.icon.fixed.h = 0; +#endif + + fmc.view.open_dirs_in_place = fileman_config->view.open_dirs_in_place; + fmc.view.selector = 0; + fmc.view.single_click = fileman_config->view.single_click; + fmc.view.no_subdir_jump = 0; + fmc.view.fit_custom_pos = 1; + fmc.icon.extension.show = fileman_config->icon.extension.show; + fmc.list.sort.no_case = 1; + fmc.list.sort.dirs.first = fileman_config->list.sort.dirs.first; + fmc.list.sort.dirs.last = fileman_config->list.sort.dirs.last; + fmc.selection.single = 0; + fmc.selection.windows_modifiers = 0; + e_fm2_config_set(o, &fmc); + e_fm2_custom_theme_content_set(o, "desktop"); + evas_object_smart_callback_add(o, "dir_changed", + _e_fwin_changed, fwin); + evas_object_smart_callback_add(o, "dir_deleted", + _e_fwin_deleted, fwin); + evas_object_smart_callback_add(o, "selected", + _e_fwin_selected, fwin); + evas_object_smart_callback_add(o, "selection_change", + _e_fwin_selection_change, fwin); + e_fm2_icon_menu_start_extend_callback_set(o, _e_fwin_cb_menu_extend_start, fwin); + e_fm2_icon_menu_end_extend_callback_set(o, _e_fwin_menu_extend, fwin); + e_fm2_underlay_hide(o); + evas_object_show(o); + + o = e_scrollframe_add(zone->container->bg_evas); + e_scrollframe_custom_theme_set(o, "base/theme/fileman", + "e/fileman/desktop/scrollframe"); + /* FIXME: this theme object will have more versions and options later + * for things like swallowing widgets/buttons ot providing them - a + * gadcon for starters for fm widgets. need to register the owning + * e_object of the gadcon so gadcon clients can get it and thus do + * things like find out what dirs/path the fwin is for etc. this will + * probably be how you add optional gadgets to fwin views like empty/full + * meters for disk usage, and other dir info/stats or controls. also it + * might be possible that we can have custom frames per dir later so need + * a way to set an edje file directly + */ + /* FIXME: allow specialised scrollframe obj per dir - get from e config, + * then look in the dir itself for a magic dot-file, if not - use theme. + * same as currently done for bg & overlay. also add to fm2 the ability + * to specify the .edj files to get the list and icon theme stuff from + */ + evas_object_data_set(fwin->fm_obj, "fwin", fwin); + e_scrollframe_extern_pan_set(o, fwin->fm_obj, + _e_fwin_pan_set, + _e_fwin_pan_get, + _e_fwin_pan_max_get, + _e_fwin_pan_child_size_get); + evas_object_propagate_events_set(fwin->fm_obj, 0); + fwin->scrollframe_obj = o; + evas_object_move(o, fwin->zone->x, fwin->zone->y); + evas_object_resize(o, fwin->zone->w, fwin->zone->h); + evas_object_show(o); + + e_fm2_window_object_set(fwin->fm_obj, E_OBJECT(fwin->zone)); + + evas_object_focus_set(fwin->fm_obj, 1); + + e_fm2_path_set(fwin->fm_obj, dev, path); + + file = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj)); + if (file) + snprintf(buf, sizeof(buf), "%s", file); + else + snprintf(buf, sizeof(buf), "%s", e_fm2_real_path_get(fwin->fm_obj)); +// return fwin; +} + +EAPI void +e_fwin_all_unsel(void *data) +{ + E_Fwin *fwin; + + fwin = data; + E_OBJECT_CHECK(fwin); + E_OBJECT_TYPE_CHECK(fwin, E_FWIN_TYPE); + e_fm2_all_unsel(fwin->fm_obj); +} + +EAPI void +e_fwin_zone_shutdown(E_Zone *zone) +{ + Evas_List *f; + + for (f = fwins; f; f = f->next) + { + E_Fwin *win; + + win = f->data; + if (win->zone != zone) continue; + e_object_del(E_OBJECT(win)); + win = NULL; + } +} + +/* local subsystem functions */ +static E_Fwin * +_e_fwin_new(E_Container *con, const char *dev, const char *path) +{ + E_Fwin *fwin; + char buf[4096]; + const char *file; + Evas_Object *o; + E_Fm2_Config fmc; + + fwin = E_OBJECT_ALLOC(E_Fwin, E_FWIN_TYPE, _e_fwin_free); + if (!fwin) return NULL; + fwin->win = e_win_new(con); + if (!fwin->win) + { + free(fwin); + return NULL; + } + fwins = evas_list_append(fwins, fwin); + e_win_delete_callback_set(fwin->win, _e_fwin_cb_delete); + e_win_resize_callback_set(fwin->win, _e_fwin_cb_resize); + fwin->win->data = fwin; + + o = edje_object_add(e_win_evas_get(fwin->win)); + e_theme_edje_object_set(o, "base/theme/fileman", + "e/fileman/default/window/main"); + evas_object_show(o); + fwin->bg_obj = o; + + o = e_fm2_add(e_win_evas_get(fwin->win)); + fwin->fm_obj = o; + memset(&fmc, 0, sizeof(E_Fm2_Config)); +#if 0 + fmc.view.mode = E_FM2_VIEW_MODE_LIST; + fmc.icon.list.w = 24; + fmc.icon.list.h = 24; + fmc.icon.fixed.w = 1; + fmc.icon.fixed.h = 1; +#else +// fmc.view.mode = E_FM2_VIEW_MODE_CUSTOM_ICONS; + fmc.view.mode = E_FM2_VIEW_MODE_GRID_ICONS; + fmc.icon.icon.w = fileman_config->icon.icon.w; + fmc.icon.icon.h = fileman_config->icon.icon.h; + fmc.icon.fixed.w = 0; + fmc.icon.fixed.h = 0; +#endif + + fmc.view.open_dirs_in_place = fileman_config->view.open_dirs_in_place; + fmc.view.selector = 0; + fmc.view.single_click = fileman_config->view.single_click; + fmc.view.no_subdir_jump = 0; + fmc.icon.extension.show = fileman_config->icon.extension.show; + fmc.list.sort.no_case = 1; + fmc.list.sort.dirs.first = fileman_config->list.sort.dirs.first; + fmc.list.sort.dirs.last = fileman_config->list.sort.dirs.last; + fmc.selection.single = 0; + fmc.selection.windows_modifiers = 0; + e_fm2_config_set(o, &fmc); + evas_object_smart_callback_add(o, "dir_changed", + _e_fwin_changed, fwin); + evas_object_smart_callback_add(o, "dir_deleted", + _e_fwin_deleted, fwin); + evas_object_smart_callback_add(o, "selected", + _e_fwin_selected, fwin); + evas_object_smart_callback_add(o, "selection_change", + _e_fwin_selection_change, fwin); + e_fm2_icon_menu_start_extend_callback_set(o, _e_fwin_cb_menu_extend_start, fwin); + e_fm2_icon_menu_end_extend_callback_set(o, _e_fwin_menu_extend, fwin); + evas_object_show(o); + + o = e_scrollframe_add(e_win_evas_get(fwin->win)); + /* FIXME: this theme object will have more versions and options later + * for things like swallowing widgets/buttons ot providing them - a + * gadcon for starters for fm widgets. need to register the owning + * e_object of the gadcon so gadcon clients can get it and thus do + * things like find out what dirs/path the fwin is for etc. this will + * probably be how you add optional gadgets to fwin views like empty/full + * meters for disk usage, and other dir info/stats or controls. also it + * might be possible that we can have custom frames per dir later so need + * a way to set an edje file directly + */ + /* FIXME: allow specialised scrollframe obj per dir - get from e config, + * then look in the dir itself for a magic dot-file, if not - use theme. + * same as currently done for bg & overlay. also add to fm2 the ability + * to specify the .edj files to get the list and icon theme stuff from + */ + e_scrollframe_custom_theme_set(o, "base/theme/fileman", + "e/fileman/default/scrollframe"); + evas_object_data_set(fwin->fm_obj, "fwin", fwin); + e_scrollframe_extern_pan_set(o, fwin->fm_obj, + _e_fwin_pan_set, + _e_fwin_pan_get, + _e_fwin_pan_max_get, + _e_fwin_pan_child_size_get); + evas_object_propagate_events_set(fwin->fm_obj, 0); + fwin->scrollframe_obj = o; + evas_object_move(o, 0, 0); + evas_object_show(o); + + o = edje_object_add(e_win_evas_get(fwin->win)); + edje_object_part_swallow(fwin->bg_obj, "e.swallow.bg", o); + evas_object_pass_events_set(o, 1); + fwin->under_obj = o; + + o = edje_object_add(e_win_evas_get(fwin->win)); + edje_object_part_swallow(e_scrollframe_edje_object_get(fwin->scrollframe_obj), "e.swallow.overlay", o); + evas_object_pass_events_set(o, 1); + fwin->over_obj = o; + + e_fm2_window_object_set(fwin->fm_obj, E_OBJECT(fwin->win)); + + evas_object_focus_set(fwin->fm_obj, 1); + + e_fm2_path_set(fwin->fm_obj, dev, path); + + snprintf(buf, sizeof(buf), "_fwin::/%s", e_fm2_real_path_get(fwin->fm_obj)); + e_win_name_class_set(fwin->win, "E", buf); + file = ecore_file_file_get(e_fm2_real_path_get(fwin->fm_obj)); + if (file) + snprintf(buf, sizeof(buf), "%s", file); + else + snprintf(buf, sizeof(buf), "%s", e_fm2_real_path_get(fwin->fm_obj)); + e_win_title_set(fwin->win, buf); + e_win_size_min_set(fwin->win, 24, 24); + e_win_resize(fwin->win, 280, 200); + e_win_show(fwin->win); + if (fwin->win->border) + { + if (fwin->win->border->internal_icon) + evas_stringshare_del(fwin->win->border->internal_icon); + fwin->win->border->internal_icon = + evas_stringshare_add("enlightenment/fileman"); + } + + return fwin; +} + +static void +_e_fwin_free(E_Fwin *fwin) +{ + if (fwin->fad) + { + e_object_del(E_OBJECT(fwin->fad->dia)); + fwin->fad = NULL; + } + if (fwin->win) e_object_del(E_OBJECT(fwin->win)); + if (fwin->fm_obj) evas_object_del(fwin->fm_obj); + if (fwin->scrollframe_obj) evas_object_del(fwin->scrollframe_obj); + + if (fwin->zone) + { + evas_object_event_callback_del(fwin->zone->bg_event_object, + EVAS_CALLBACK_MOUSE_DOWN, + _e_fwin_zone_cb_mouse_down); + } + + if (fwin->zone_handler) + ecore_event_handler_del(fwin->zone_handler); + + fwins = evas_list_remove(fwins, fwin); + if (fwin->wallpaper_file) evas_stringshare_del(fwin->wallpaper_file); + if (fwin->overlay_file) evas_stringshare_del(fwin->overlay_file); + if (fwin->scrollframe_file) evas_stringshare_del(fwin->scrollframe_file); + if (fwin->theme_file) evas_stringshare_del(fwin->theme_file); + free(fwin); +} + +static void +_e_fwin_cb_delete(E_Win *win) +{ + E_Fwin *fwin; + + fwin = win->data; + e_object_del(E_OBJECT(fwin)); +} + +static void +_e_fwin_cb_resize(E_Win *win) +{ + E_Fwin *fwin; + + fwin = win->data; + if (fwin->bg_obj) + { + if (fwin->win) + evas_object_resize(fwin->bg_obj, fwin->win->w, fwin->win->h); + else if (fwin->zone) + evas_object_resize(fwin->bg_obj, fwin->zone->w, fwin->zone->h); + } + if (fwin->win) + evas_object_resize(fwin->scrollframe_obj, fwin->win->w, fwin->win->h); + else if (fwin->zone) + evas_object_resize(fwin->scrollframe_obj, fwin->zone->w, fwin->zone->h); +} + +static void +_e_fwin_deleted(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin *fwin; + + fwin = data; + e_object_del(E_OBJECT(fwin)); +} + +static const char * +_e_fwin_custom_file_path_eval(E_Fwin *fwin, Efreet_Desktop *ef, const char *prev_path, const char *key) +{ + char buf[PATH_MAX]; + const char *res, *ret = NULL; + + /* get a X-something custom tage from the .desktop for the dir */ + res = ecore_hash_get(ef->x, key); + /* free the old path */ + if (prev_path) evas_stringshare_del(prev_path); + /* if there was no key found - return NULL */ + if (!res) return NULL; + + /* it's a full path */ + if (res[0] == '/') + ret = evas_stringshare_add(res); + /* relative path to the dir */ + else + { + snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(fwin->fm_obj), res); + ret = evas_stringshare_add(buf); + } + return ret; +} + +static void +_e_fwin_changed(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin *fwin; + Efreet_Desktop *ef; + char buf[PATH_MAX]; + + fwin = data; + /* FIXME: first look in E config for a special override for this dir's bg + * or overlay + */ + snprintf(buf, sizeof(buf), "%s/.directory.desktop", e_fm2_real_path_get(fwin->fm_obj)); + ef = efreet_desktop_new(buf); + if (ef) + { + fwin->wallpaper_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->wallpaper_file, "X-Enlightenment-Directory-Wallpaper"); + fwin->overlay_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->overlay_file, "X-Enlightenment-Directory-Overlay"); + fwin->scrollframe_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->scrollframe_file, "X-Enlightenment-Directory-Scrollframe"); + fwin->theme_file = _e_fwin_custom_file_path_eval(fwin, ef, fwin->theme_file, "X-Enlightenment-Directory-Theme"); +// FIXME: there is no way to just unref an efreet desktop - free completely +// frees - doesnt just unref. + efreet_desktop_free(ef); + } + if (fwin->under_obj) + { + evas_object_hide(fwin->under_obj); + edje_object_file_set(fwin->under_obj, NULL, NULL); + if (fwin->wallpaper_file) + edje_object_file_set(fwin->under_obj, fwin->wallpaper_file, "e/desktop/background"); + evas_object_show(fwin->under_obj); + } + if (fwin->over_obj) + { + evas_object_hide(fwin->over_obj); + edje_object_file_set(fwin->over_obj, NULL, NULL); + if (fwin->overlay_file) + edje_object_file_set(fwin->over_obj, fwin->overlay_file, "e/desktop/background"); + evas_object_show(fwin->over_obj); + } + if (fwin->scrollframe_obj) + { + if ((fwin->scrollframe_file) && + (e_util_edje_collection_exists(fwin->scrollframe_file, "e/fileman/default/scrollframe"))) + e_scrollframe_custom_edje_file_set(fwin->scrollframe_obj, + (char *)fwin->scrollframe_file, + "e/fileman/default/scrollframe"); + else + { + if (fwin->zone) + e_scrollframe_custom_theme_set(fwin->scrollframe_obj, + "base/theme/fileman", + "e/fileman/desktop/scrollframe"); + else + e_scrollframe_custom_theme_set(fwin->scrollframe_obj, + "base/theme/fileman", + "e/fileman/default/scrollframe"); + } + e_scrollframe_child_pos_set(fwin->scrollframe_obj, 0, 0); + } + if ((fwin->theme_file) && (ecore_file_exists(fwin->theme_file))) + e_fm2_custom_theme_set(obj, fwin->theme_file); + else + e_fm2_custom_theme_set(obj, NULL); +} + +static void +_e_fwin_selected(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin *fwin; + Evas_List *selected; + + fwin = data; + selected = e_fm2_selected_list_get(fwin->fm_obj); + if (!selected) return; + _e_fwin_file_open_dialog(fwin, selected, 0); + evas_list_free(selected); +} + +static void +_e_fwin_selection_change(void *data, Evas_Object *obj, void *event_info) +{ + Evas_List *l; + E_Fwin *fwin; + + fwin = data; + for (l = fwins; l; l = l->next) + { + if (l->data != fwin) + e_fwin_all_unsel(l->data); + } +} + +static void +_e_fwin_menu_extend(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info) +{ + E_Fwin *fwin; + E_Menu_Item *mi; + + fwin = data; + if (e_fm2_has_parent_get(obj)) + { + mi = e_menu_item_new(m); + e_menu_item_separator_set(mi, 1); + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Go to Parent Directory")); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/parent"), + "e/fileman/default/button/parent"); + e_menu_item_callback_set(mi, _e_fwin_parent, obj); + } + /* FIXME: if info != null then check mime type and offer options based + * on that + */ +} + +static void +_e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi) +{ + e_fm2_parent_go(data); +} + +static void +_e_fwin_cb_menu_extend_start(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info) +{ + E_Menu_Item *mi; + E_Fwin *fwin; + + fwin = data; + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Open")); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/open"), + "e/fileman/default/button/open"); + e_menu_item_callback_set(mi, _e_fwin_cb_menu_open, fwin); + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Open with...")); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/open"), + "e/fileman/default/button/open"); + e_menu_item_callback_set(mi, _e_fwin_cb_menu_open_with, fwin); +} + +static void +_e_fwin_cb_menu_open(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Fwin *fwin; + Evas_List *selected; + + fwin = data; + selected = e_fm2_selected_list_get(fwin->fm_obj); + if (!selected) return; + _e_fwin_file_open_dialog(fwin, selected, 0); + evas_list_free(selected); +} + +static void +_e_fwin_cb_menu_open_with(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Fwin *fwin; + Evas_List *selected; + + fwin = data; + selected = e_fm2_selected_list_get(fwin->fm_obj); + if (!selected) return; + _e_fwin_file_open_dialog(fwin, selected, 1); + evas_list_free(selected); +} + + +static void +_e_fwin_cb_ilist_change(void *data) +{ + E_Fwin_Apps_Dialog *fad; + + fad = data; + E_FREE(fad->app2); + if (fad->o_fm) e_fm2_select_set(fad->o_fm, NULL, 0); +} + +static void +_e_fwin_cb_ilist_selected(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin_Apps_Dialog *fad; + + fad = data; + _e_fwin_cb_open(fad, fad->dia); +} + +static void +_e_fwin_cb_fm_selection_change(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin_Apps_Dialog *fad; + Evas_List *sel; + E_Fm2_Icon_Info *ici; + + fad = data; + E_FREE(fad->app1); + if (fad->o_ilist) e_widget_ilist_unselect(fad->o_ilist); + E_FREE(fad->app2); + sel = e_fm2_selected_list_get(obj); + if (sel) + { + ici = sel->data; + fad->app2 = strdup(ici->file); + evas_list_free(sel); + } +} + +static void +_e_fwin_cb_fm_selected(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin_Apps_Dialog *fad; + + fad = data; + _e_fwin_cb_open(fad, fad->dia); +} + +static void +_e_fwin_cb_open(void *data, E_Dialog *dia) +{ + E_Fwin_Apps_Dialog *fad; + Efreet_Desktop *desktop = NULL; + char pcwd[4096], buf[4096]; + Evas_List *selected, *l; + E_Fm2_Icon_Info *ici; + Ecore_List *files = NULL; + + fad = data; + if (fad->app1) desktop = efreet_util_desktop_file_id_find(fad->app1); + else if (fad->app2) desktop = efreet_util_desktop_file_id_find(fad->app2); + if (desktop) + { + getcwd(pcwd, sizeof(pcwd)); + chdir(e_fm2_real_path_get(fad->fwin->fm_obj)); + + selected = e_fm2_selected_list_get(fad->fwin->fm_obj); + if (selected) + { + files = ecore_list_new(); + ecore_list_free_cb_set(files, free); + for (l = selected; l; l = l->next) + { + E_Fwin_Exec_Type ext; + + ici = l->data; + /* this snprintf is silly - but it's here in case i really do + * need to provide full paths (seems silly since we chdir + * into the dir) + */ + buf[0] = 0; + ext = _e_fwin_file_is_exec(ici); + if (ext != E_FWIN_EXEC_NONE) + _e_fwin_file_exec(fad->fwin, ici, ext); + else + { + if (!((ici->link) && (ici->mount))) + { + if (ici->link) + { + if (!S_ISDIR(ici->statinfo.st_mode)) + snprintf(buf, sizeof(buf), "%s", ici->file); + } + else + { + if (!S_ISDIR(ici->statinfo.st_mode)) + snprintf(buf, sizeof(buf), "%s", ici->file); + } + } + } + if (buf[0] != 0) + { + if (ici->mime) + e_exehist_mime_desktop_add(ici->mime, desktop); + ecore_list_append(files, strdup(ici->file)); + } + } + evas_list_free(selected); + if (fad->fwin->win) + e_exec(fad->fwin->win->border->zone, desktop, NULL, files, "fwin"); + else if (fad->fwin->zone) + e_exec(fad->fwin->zone, desktop, NULL, files, "fwin"); + ecore_list_destroy(files); + } + chdir(pcwd); + } + e_object_del(E_OBJECT(fad->dia)); +} + +static void +_e_fwin_cb_close(void *data, E_Dialog *dia) +{ + E_Fwin_Apps_Dialog *fad; + + fad = data; + e_object_del(E_OBJECT(fad->dia)); +} + +static void +_e_fwin_cb_dialog_free(void *obj) +{ + E_Dialog *dia; + E_Fwin_Apps_Dialog *fad; + + dia = (E_Dialog *)obj; + fad = dia->data; + E_FREE(fad->app1); + E_FREE(fad->app2); + fad->fwin->fad = NULL; + free(fad); +} + +static Evas_Bool +_e_fwin_cb_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + Evas_List **mlist; + + mlist = fdata; + *mlist = evas_list_append(*mlist, key); + return 1; +} + +static E_Fwin_Exec_Type +_e_fwin_file_is_exec(E_Fm2_Icon_Info *ici) +{ + /* special file or dir - can't exec anyway */ + if ((S_ISCHR(ici->statinfo.st_mode)) || + (S_ISBLK(ici->statinfo.st_mode)) || + (S_ISFIFO(ici->statinfo.st_mode)) || + (S_ISSOCK(ici->statinfo.st_mode))) + return E_FWIN_EXEC_NONE; + /* it is executable */ + if ((ici->statinfo.st_mode & S_IXOTH) || + ((getgid() == ici->statinfo.st_gid) && + (ici->statinfo.st_mode & S_IXGRP)) || + ((getuid() == ici->statinfo.st_uid) && + (ici->statinfo.st_mode & S_IXUSR))) + { + /* no mimetype */ + if (!ici->mime) + { + return E_FWIN_EXEC_DIRECT; + } + /* mimetype */ + else + { + /* FIXME: - this could be config */ + if (!strcmp(ici->mime, "application/x-desktop")) + { + return E_FWIN_EXEC_DESKTOP; + } + else if ((!strcmp(ici->mime, "application/x-sh")) || + (!strcmp(ici->mime, "application/x-shellscript")) || + (!strcmp(ici->mime, "application/x-csh")) || + (!strcmp(ici->mime, "application/x-perl")) || + (!strcmp(ici->mime, "application/x-shar")) || + (!strcmp(ici->mime, "text/x-csh")) || + (!strcmp(ici->mime, "text/x-python")) || + (!strcmp(ici->mime, "text/x-sh")) + ) + { + return E_FWIN_EXEC_DIRECT; + } + } + } + else + { + /* mimetype */ + if (ici->mime) + { + /* FIXME: - this could be config */ + if (!strcmp(ici->mime, "application/x-desktop")) + { + return E_FWIN_EXEC_DESKTOP; + } + else if ((!strcmp(ici->mime, "application/x-sh")) || + (!strcmp(ici->mime, "application/x-shellscript")) || + (!strcmp(ici->mime, "text/x-sh")) + ) + { + return E_FWIN_EXEC_TERMINAL_SH; + } + } + else if ((e_util_glob_match(ici->file, "*.desktop")) || + (e_util_glob_match(ici->file, "*.kdelink")) + ) + { + return E_FWIN_EXEC_DESKTOP; + } + else if (e_util_glob_match(ici->file, "*.run")) + { + return E_FWIN_EXEC_TERMINAL_SH; + } + } + return E_FWIN_EXEC_NONE; +} + +static void +_e_fwin_file_exec(E_Fwin *fwin, E_Fm2_Icon_Info *ici, E_Fwin_Exec_Type ext) +{ + char buf[4096]; + Efreet_Desktop *desktop; + + /* FIXME: execute file ici with either a terminal, the shell, or directly + * or open the .desktop and exec it */ + switch (ext) + { + case E_FWIN_EXEC_NONE: + break; + case E_FWIN_EXEC_DIRECT: + if (fwin->win) + e_exec(fwin->win->border->zone, NULL, ici->file, NULL, "fwin"); + else if (fwin->zone) + e_exec(fwin->zone, NULL, ici->file, NULL, "fwin"); + break; + case E_FWIN_EXEC_SH: + snprintf(buf, sizeof(buf), "/bin/sh %s", e_util_filename_escape(ici->file)); + if (fwin->win) + e_exec(fwin->win->border->zone, NULL, buf, NULL, NULL); + else if (fwin->zone) + e_exec(fwin->zone, NULL, buf, NULL, NULL); + break; + case E_FWIN_EXEC_TERMINAL_DIRECT: + snprintf(buf, sizeof(buf), "%s %s", e_config->exebuf_term_cmd, e_util_filename_escape(ici->file)); + if (fwin->win) + e_exec(fwin->win->border->zone, NULL, buf, NULL, NULL); + else if (fwin->zone) + e_exec(fwin->zone, NULL, buf, NULL, NULL); + break; + case E_FWIN_EXEC_TERMINAL_SH: + snprintf(buf, sizeof(buf), "%s /bin/sh %s", e_config->exebuf_term_cmd, e_util_filename_escape(ici->file)); + if (fwin->win) + e_exec(fwin->win->border->zone, NULL, buf, NULL, NULL); + else if (fwin->zone) + e_exec(fwin->zone, NULL, buf, NULL, NULL); + break; + case E_FWIN_EXEC_DESKTOP: + snprintf(buf, sizeof(buf), "%s/%s", e_fm2_real_path_get(fwin->fm_obj), ici->file); + desktop = efreet_desktop_new(buf); + if (desktop) + { + if (fwin->win) + e_exec(fwin->win->border->zone, desktop, NULL, NULL, NULL); + else if (fwin->zone) + e_exec(fwin->zone, desktop, NULL, NULL, NULL); + efreet_desktop_free(desktop); + } + break; + default: + break; + } +} + +static void +_e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files, int always) +{ + E_Fwin *fwin2 = NULL; + E_Dialog *dia; + Evas_Coord mw, mh; + Evas_Object *o, *ocon, *of, *oi, *mt; + Evas *evas; + Evas_List *l; + Evas_List *apps; + E_Fwin_Apps_Dialog *fad; + E_Fm2_Config fmc; + E_Fm2_Icon_Info *ici; + char buf[PATH_MAX]; + const char *f; + int need_dia = 0; + Evas_Hash *mimes = NULL; + Evas_List *mlist = NULL; + + if (fwin->fad) + { + e_object_del(E_OBJECT(fwin->fad->dia)); + fwin->fad = NULL; + } + if (!always) + { + for (l = files; l; l = l->next) + { + ici = l->data; + printf("O: %s -- %i\n", ici->link, ici->removable); + if ((ici->link) && (ici->mount)) + { + if (fwin->win) + fwin2 = _e_fwin_new(fwin->win->container, ici->link, "/"); + else if (fwin->zone) + fwin2 = _e_fwin_new(fwin->zone->container, ici->link, "/"); + } + else if ((ici->link) && (ici->removable)) + { + snprintf(buf, sizeof(buf), "removable:%s", ici->link); + if (fwin->win) + fwin2 = _e_fwin_new(fwin->win->container, buf, "/"); + else if (fwin->zone) + fwin2 = _e_fwin_new(fwin->zone->container, buf, "/"); + } + else if (ici->real_link) + { + if (S_ISDIR(ici->statinfo.st_mode)) + { + if (fwin->win) + fwin2 = _e_fwin_new(fwin->win->container, NULL, ici->real_link); + else if (fwin->zone) + fwin2 = _e_fwin_new(fwin->zone->container, NULL, ici->real_link); + } + else + need_dia = 1; + } + else + { + snprintf(buf, sizeof(buf), "%s/%s", + e_fm2_real_path_get(fwin->fm_obj), ici->file); + if (S_ISDIR(ici->statinfo.st_mode)) + { + if (fwin->win) + fwin2 = _e_fwin_new(fwin->win->container, NULL, buf); + else + fwin2 = _e_fwin_new(fwin->zone->container, NULL, buf); + } + else + need_dia = 1; + } + if (fwin2) + { + if ((fwin2->win) && (fwin2->win->border)) + { + Evas_Object *oic; + const char *itype = NULL; + + oic = e_fm2_icon_get(evas_object_evas_get(fwin->fm_obj), + ici->ic, NULL, NULL, 0, &itype); + if (oic) + { + const char *file = NULL, *group = NULL; + + if (fwin2->win->border->internal_icon) + evas_stringshare_del(fwin2->win->border->internal_icon); + fwin2->win->border->internal_icon = NULL; + if (fwin2->win->border->internal_icon_key) + evas_stringshare_del(fwin2->win->border->internal_icon_key); + fwin2->win->border->internal_icon_key = NULL; + + if (!strcmp(evas_object_type_get(oic), "edje")) + { + edje_object_file_get(oic, &file, &group); + if (file) + { + fwin2->win->border->internal_icon = + evas_stringshare_add(file); + if (group) + fwin2->win->border->internal_icon_key = + evas_stringshare_add(group); + } + } + else + { + file = e_icon_file_get(oic); + fwin2->win->border->internal_icon = + evas_stringshare_add(file); + } + evas_object_del(oic); + } + if (ici->label) + e_win_title_set(fwin2->win, ici->label); + else if (ici->file) + e_win_title_set(fwin2->win, ici->file); + } + fwin2 = NULL; + } + } + if (!need_dia) return; + need_dia = 0; + } + + /* 1. build hash of mimetypes */ + for (l = files; l; l = l->next) + { + ici = l->data; + if (!((ici->link) && (ici->mount))) + { + if (_e_fwin_file_is_exec(ici) == E_FWIN_EXEC_NONE) + { + if (ici->link) + { + f = e_fm_mime_filename_get(ici->link); + mimes = evas_hash_del(mimes, f, (void *)1); + mimes = evas_hash_direct_add(mimes, f, (void *)1); + } + else + { + snprintf(buf, sizeof(buf), "%s/%s", + e_fm2_real_path_get(fwin->fm_obj), ici->file); + mimes = evas_hash_del(mimes, ici->mime, (void *)1); + mimes = evas_hash_direct_add(mimes, ici->mime, (void *)1); + } + } + } + } + /* 2. for each mimetype list apps that handle it */ + if (mimes) + { + evas_hash_foreach(mimes, _e_fwin_cb_hash_foreach, &mlist); + evas_hash_free(mimes); + } + /* 3. add apps to a list so its a unique app list */ + apps = NULL; + if (mlist) + { + Ecore_List *ml; + Efreet_Desktop *desktop; + + for (l = mlist; l; l = l->next) + { + ml = efreet_util_desktop_mime_list(l->data); + if (ml) + { + ecore_list_first_goto(ml); + while ((desktop = ecore_list_next(ml))) + apps = evas_list_append(apps, desktop); + ecore_list_destroy(ml); + } + } + } + + if (!always) + { + /* FIXME: well this is simplisitic - if only 1 mime type is being + * opened then look for the previously used app for that mimetype and + * if found, use that. + * + * we could get more sophisitcated. + * 1. find apps for each mimetype in mlist. if all prev used apps are + * the same, then use previously used app. + * OR if this fails + * 2. find all apps for each mimetype. find the one used the most. + * if that app can handle all mimetypes in the list - use that. if not + * find the next most often listed app - if that can handle all apps, + * use it, if not fall back again - and so on - if all apps listed do + * not contain 1 that handles all the mime types - fall back to dialog + */ + if (evas_list_count(mlist) <= 1) + { + Efreet_Desktop *desktop = NULL; + char pcwd[4096]; + Ecore_List *files_list = NULL; + + need_dia = 1; + if (mlist) desktop = e_exehist_mime_desktop_get(mlist->data); + getcwd(pcwd, sizeof(pcwd)); + chdir(e_fm2_real_path_get(fwin->fm_obj)); + + files_list = ecore_list_new(); + ecore_list_free_cb_set(files_list, free); + for (l = files; l; l = l->next) + { + ici = l->data; + if (_e_fwin_file_is_exec(ici) == E_FWIN_EXEC_NONE) + ecore_list_append(files_list, strdup(ici->file)); + } + for (l = files; l; l = l->next) + { + E_Fwin_Exec_Type ext; + + ici = l->data; + ext = _e_fwin_file_is_exec(ici); + if (ext != E_FWIN_EXEC_NONE) + { + _e_fwin_file_exec(fwin, ici, ext); + need_dia = 0; + } + } + if (desktop) + { + if (fwin->win) + { + if (e_exec(fwin->win->border->zone, desktop, NULL, files_list, "fwin")) + need_dia = 0; + } + else if (fwin->zone) + { + if (e_exec(fwin->zone, desktop, NULL, files_list, "fwin")) + need_dia = 0; + } + } + ecore_list_destroy(files_list); + + chdir(pcwd); + if (!need_dia) + { + if (apps) evas_list_free(apps); + evas_list_free(mlist); + return; + } + } + } + evas_list_free(mlist); + + fad = E_NEW(E_Fwin_Apps_Dialog, 1); + if (fwin->win) + dia = e_dialog_new(fwin->win->border->zone->container, + "E", "_fwin_open_apps"); + else if (fwin->zone) + dia = e_dialog_new(fwin->zone->container, + "E", "_fwin_open_apps"); + e_dialog_title_set(dia, _("Open with...")); + e_dialog_border_icon_set(dia, "enlightenment/applications"); + e_dialog_button_add(dia, _("Open"), "enlightenment/open", + _e_fwin_cb_open, fad); + e_dialog_button_add(dia, _("Close"), "enlightenment/close", + _e_fwin_cb_close, fad); + + fad->dia = dia; + fad->fwin = fwin; + fwin->fad = fad; + dia->data = fad; + e_object_free_attach_func_set(E_OBJECT(dia), _e_fwin_cb_dialog_free); + + evas = e_win_evas_get(dia->win); + + o = e_widget_list_add(evas, 1, 1); + ocon = o; + + if (apps) + { + of = e_widget_framelist_add(evas, _("Specific Applications"), 0); + o = e_widget_ilist_add(evas, 24, 24, &(fad->app1)); + fad->o_ilist = o; + for (l = apps; l; l = l->next) + { + Efreet_Desktop *desktop; + + desktop = l->data; + oi = e_util_desktop_icon_add(desktop, "24x24", evas); + e_widget_ilist_append(o, oi, desktop->name, + _e_fwin_cb_ilist_change, fad, + efreet_util_path_to_file_id(desktop->orig_path)); + } + evas_list_free(apps); + e_widget_ilist_go(o); + e_widget_min_size_set(o, 160, 240); + e_widget_framelist_object_append(of, o); + e_widget_list_object_append(ocon, of, 1, 1, 0.5); + evas_object_smart_callback_add(o, "selected", + _e_fwin_cb_ilist_selected, fad); + } + + of = e_widget_framelist_add(evas, _("All Applications"), 0); + mt = e_fm2_add(evas); + fad->o_fm = mt; + memset(&fmc, 0, sizeof(E_Fm2_Config)); + fmc.view.mode = E_FM2_VIEW_MODE_LIST; + fmc.view.open_dirs_in_place = 0; + fmc.view.selector = 1; + fmc.view.single_click = 0; + fmc.view.no_subdir_jump = 1; + fmc.icon.list.w = 24; + fmc.icon.list.h = 24; + fmc.icon.fixed.w = 1; + fmc.icon.fixed.h = 1; + fmc.icon.extension.show = 1; + fmc.icon.key_hint = NULL; + fmc.list.sort.no_case = 1; + fmc.list.sort.dirs.first = 1; + fmc.list.sort.dirs.last = 0; + fmc.selection.single = 1; + fmc.selection.windows_modifiers = 0; + e_fm2_config_set(mt, &fmc); + e_fm2_icon_menu_flags_set(mt, E_FM2_MENU_NO_SHOW_HIDDEN | E_FM2_MENU_NO_REMEMBER_ORDERING | E_FM2_MENU_NO_NEW_DIRECTORY | E_FM2_MENU_NO_RENAME | E_FM2_MENU_NO_DELETE); + evas_object_smart_callback_add(mt, "selection_change", + _e_fwin_cb_fm_selection_change, fad); + evas_object_smart_callback_add(mt, "selected", + _e_fwin_cb_fm_selected, fad); + snprintf(buf, sizeof(buf), "%s/.e/e/applications/all", e_user_homedir_get()); + e_fm2_path_set(mt, buf, "/"); + o = e_widget_scrollframe_pan_add(evas, mt, + e_fm2_pan_set, + e_fm2_pan_get, + e_fm2_pan_max_get, + e_fm2_pan_child_size_get); + e_widget_min_size_set(o, 160, 240); + e_widget_framelist_object_append(of, o); + e_widget_list_object_append(ocon, of, 1, 1, 0.5); + + e_widget_min_size_get(ocon, &mw, &mh); + e_dialog_content_set(dia, ocon, mw, mh); + + e_dialog_show(dia); +} + +static void +_e_fwin_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + E_Fwin *fwin; + + fwin = evas_object_data_get(obj, "fwin"); + e_fm2_pan_set(obj, x, y); +// printf("PAN %p -> %i %i\n", fwin, x, y); + if (x > fwin->fm_pan.max_x) x = fwin->fm_pan.max_x; + if (y > fwin->fm_pan.max_y) y = fwin->fm_pan.max_y; + if (x < 0) x = 0; + if (y < 0) y = 0; + fwin->fm_pan.x = x; + fwin->fm_pan.y = y; + _e_fwin_pan_scroll_update(fwin); +} + +static void +_e_fwin_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y) +{ + E_Fwin *fwin; + + fwin = evas_object_data_get(obj, "fwin"); + e_fm2_pan_get(obj, x, y); +// printf("PAN %p == %i %i\n", fwin, *x, *y); + fwin->fm_pan.x = *x; + fwin->fm_pan.y = *y; +} + +static void +_e_fwin_pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y) +{ + E_Fwin *fwin; + + fwin = evas_object_data_get(obj, "fwin"); + e_fm2_pan_max_get(obj, x, y); +// printf("PAN %p MAX == %i %i\n", fwin, *x, *y); + fwin->fm_pan.max_x = *x; + fwin->fm_pan.max_y = *y; + _e_fwin_pan_scroll_update(fwin); +} + +static void +_e_fwin_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + E_Fwin *fwin; + + fwin = evas_object_data_get(obj, "fwin"); + e_fm2_pan_child_size_get(obj, w, h); +// printf("PAN %p SZ == %ix%i\n", fwin, *w, *h); + fwin->fm_pan.w = *w; + fwin->fm_pan.h = *h; + _e_fwin_pan_scroll_update(fwin); +} + +static void +_e_fwin_pan_scroll_update(E_Fwin *fwin) +{ + Edje_Message_Int_Set *msg; + + if ((fwin->fm_pan.x == fwin->fm_pan_last.x) && + (fwin->fm_pan.y == fwin->fm_pan_last.y) && + (fwin->fm_pan.max_x == fwin->fm_pan_last.max_x) && + (fwin->fm_pan.max_y == fwin->fm_pan_last.max_y) && + (fwin->fm_pan.w == fwin->fm_pan_last.w) && + (fwin->fm_pan.h == fwin->fm_pan_last.h)) return; + msg = alloca(sizeof(Edje_Message_Int_Set) - + sizeof(int) + + (6 * sizeof(int))); + msg->count = 6; + msg->val[0] = fwin->fm_pan.x; + msg->val[1] = fwin->fm_pan.y; + msg->val[2] = fwin->fm_pan.max_x; + msg->val[3] = fwin->fm_pan.max_y; + msg->val[4] = fwin->fm_pan.w; + msg->val[5] = fwin->fm_pan.h; +// printf("SEND MSG %i %i | %i %i | %ix%i\n", +// fwin->fm_pan.x, fwin->fm_pan.y, +// fwin->fm_pan.max_x, fwin->fm_pan.max_y, +// fwin->fm_pan.w, fwin->fm_pan.h); + if (fwin->under_obj) + edje_object_message_send(fwin->under_obj, EDJE_MESSAGE_INT_SET, 1, msg); + if (fwin->over_obj) + edje_object_message_send(fwin->over_obj, EDJE_MESSAGE_INT_SET, 1, msg); + if (fwin->scrollframe_obj) + edje_object_message_send(e_scrollframe_edje_object_get(fwin->scrollframe_obj), EDJE_MESSAGE_INT_SET, 1, msg); + fwin->fm_pan_last.x = fwin->fm_pan.x; + fwin->fm_pan_last.y = fwin->fm_pan.y; + fwin->fm_pan_last.max_x = fwin->fm_pan.max_x; + fwin->fm_pan_last.max_y = fwin->fm_pan.max_y; + fwin->fm_pan_last.w = fwin->fm_pan.w; + fwin->fm_pan_last.h = fwin->fm_pan.h; +} + +static void +_e_fwin_zone_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + E_Fwin *fwin; + + fwin = data; + if (!fwin) return; + e_fwin_all_unsel(fwin); +} + +static int +_e_fwin_zone_move_resize(void *data, int type, void *event) +{ + E_Event_Zone_Move_Resize *ev; + E_Fwin *fwin; + + if (type != E_EVENT_ZONE_MOVE_RESIZE) return 1; + fwin = data; + ev = event; + if (!fwin) return 1; + if (fwin->bg_obj) + { + evas_object_move(fwin->bg_obj, ev->zone->x, ev->zone->y); + evas_object_resize(fwin->bg_obj, ev->zone->w, ev->zone->h); + } + if (fwin->scrollframe_obj) + { + evas_object_move(fwin->scrollframe_obj, ev->zone->x, ev->zone->y); + evas_object_resize(fwin->scrollframe_obj, ev->zone->w, ev->zone->h); + } + return 1; +} diff --git a/src/modules/fileman/e_fwin.h b/src/modules/fileman/e_fwin.h new file mode 100644 index 000000000..73c36b884 --- /dev/null +++ b/src/modules/fileman/e_fwin.h @@ -0,0 +1,18 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#ifdef E_TYPEDEFS + +#else +#ifndef E_FWIN_H +#define E_FWIN_H + +EAPI int e_fwin_init (void); +EAPI int e_fwin_shutdown (void); +EAPI void e_fwin_new (E_Container *con, const char *dev, const char *path); +EAPI void e_fwin_zone_new (E_Zone *zone, const char *dev, const char *path); +EAPI void e_fwin_zone_shutdown (E_Zone *zone); +EAPI void e_fwin_all_unsel (void *data); + +#endif +#endif diff --git a/src/modules/fileman/e_mod_config.c b/src/modules/fileman/e_mod_config.c new file mode 100644 index 000000000..cb85d05e6 --- /dev/null +++ b/src/modules/fileman/e_mod_config.c @@ -0,0 +1,167 @@ +#include "e.h" +#include "e_mod_main.h" +#include "e_mod_config.h" + +struct _E_Config_Dialog_Data +{ + /* general view mode */ + struct { + E_Fm2_View_Mode mode; + int open_dirs_in_place; + int selector; + int single_click; + int no_subdir_jump; + int no_subdir_drop; + int always_order; + int link_drop; + int fit_custom_pos; + } view; + /* display of icons */ + struct { + struct { + int w, h; + } icon; + struct { + int w, h; + } list; + struct { + int w; + int h; + } fixed; + struct { + int show; + } extension; + const char *key_hint; + } icon; + /* how to sort files */ + struct { + struct { + int no_case; + struct { + int first; + int last; + } dirs; + } sort; + } list; + /* control how you can select files */ + struct { + int single; + int windows_modifiers; + } selection; + /* the background - if any, and how to handle it */ + /* FIXME: not implemented yet */ + struct { + const char *background; + const char *frame; + const char *icons; + int fixed; + } theme; + + E_Config_Dialog *cfd; +}; + +static void *_create_data(E_Config_Dialog *cfd); +static void _fill_data(E_Config_Dialog_Data *cfdata); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); + +void +_config_fileman_module(E_Container *con) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + + if (e_config_dialog_find("E", "_config_fileman_dialog")) return; + v = E_NEW(E_Config_Dialog_View, 1); + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _basic_apply; + v->basic.create_widgets = _basic_create; + cfd = e_config_dialog_new(con, _("Fileman Settings"), "E", + "_config_fileman_dialog", + "enlightenment/fileman", 0, v, NULL); +} + +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + _fill_data(cfdata); + return cfdata; +} + +static void +_fill_data(E_Config_Dialog_Data *cfdata) +{ + /* Disable changing view mode for now until they are ready */ + //cfdata->view.mode = fileman_config->view.mode; + + cfdata->view.open_dirs_in_place = fileman_config->view.open_dirs_in_place; + cfdata->view.single_click = fileman_config->view.single_click; + cfdata->icon.icon.w = fileman_config->icon.icon.w; + cfdata->icon.icon.h = fileman_config->icon.icon.h; + cfdata->icon.extension.show = fileman_config->icon.extension.show; + cfdata->list.sort.dirs.first = fileman_config->list.sort.dirs.first; +} + +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + E_FREE(cfdata); +} + +static int +_basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + /* Disable changing view mode for now until they are ready */ + //fileman_config->view.mode = cfdata->view.mode; + + fileman_config->view.open_dirs_in_place = cfdata->view.open_dirs_in_place; + fileman_config->view.single_click = cfdata->view.single_click; + fileman_config->icon.extension.show = cfdata->icon.extension.show; + + /* Make these two equal so that icons are proportioned correctly */ + fileman_config->icon.icon.w = cfdata->icon.icon.w; + fileman_config->icon.icon.h = cfdata->icon.icon.w; + + fileman_config->list.sort.dirs.first = cfdata->list.sort.dirs.first; + fileman_config->list.sort.dirs.last = !(cfdata->list.sort.dirs.first); + + e_config_save_queue(); + + /* FIXME: reload/refresh existing fm's */ + + return 1; +} + +static Evas_Object * +_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *o, *ob; + + o = e_widget_list_add(evas, 1, 0); + + ob = e_widget_label_add(evas, _("Icon Size")); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + ob = e_widget_slider_add(evas, 1, 0, _("%1.0f"), 16.0, 256.0, 1.0, 0, + NULL, &(cfdata->icon.icon.w), 150); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + + ob = e_widget_check_add(evas, _("Open Dirs In Place"), + &(cfdata->view.open_dirs_in_place)); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + ob = e_widget_check_add(evas, _("Sort Dirs First"), + &(cfdata->list.sort.dirs.first)); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + ob = e_widget_check_add(evas, _("Use Single Click"), + &(cfdata->view.single_click)); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + ob = e_widget_check_add(evas, _("Show Icon Extension"), + &(cfdata->icon.extension.show)); + e_widget_list_object_append(o, ob, 1, 1, 0.5); + + return o; +} diff --git a/src/modules/fileman/e_mod_config.h b/src/modules/fileman/e_mod_config.h new file mode 100644 index 000000000..6845993fa --- /dev/null +++ b/src/modules/fileman/e_mod_config.h @@ -0,0 +1,10 @@ +#ifdef E_TYPEDEFS + +#else +#ifndef E_MOD_CONFIG_H +#define E_MOD_CONFIG_H + +void _config_fileman_module(E_Container *con); + +#endif +#endif diff --git a/src/modules/fileman/e_mod_main.c b/src/modules/fileman/e_mod_main.c new file mode 100644 index 000000000..c06dcfae4 --- /dev/null +++ b/src/modules/fileman/e_mod_main.c @@ -0,0 +1,262 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include "e.h" +#include "e_mod_main.h" + +/* actual module specifics */ +static void _e_mod_action_fileman_cb(E_Object *obj, const char *params); +static void _e_mod_fileman_cb(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_mod_menu_add(void *data, E_Menu *m); +static void _e_mod_fileman_config_load(void); + +static E_Module *conf_module = NULL; +static E_Action *act = NULL; +static E_Int_Menu_Augmentation *maug = NULL; + +static E_Config_DD *conf_edd = NULL; +Config *fileman_config = NULL; + +/* module setup */ +EAPI E_Module_Api e_modapi = +{ + E_MODULE_API_VERSION, + "Fileman" +}; + +EAPI void * +e_modapi_init(E_Module *m) +{ + Evas_List *l, *ll, *lll; + E_Manager *man; + E_Container *con; + E_Zone *zone; + + conf_module = m; + + /* Setup Config edd */ + _e_mod_fileman_config_load(); + + /* add module supplied action */ + act = e_action_add("fileman"); + if (act) + { + act->func.go = _e_mod_action_fileman_cb; + e_action_predef_name_set(_("Launch"), _("File Manager"), + "fileman", NULL, NULL, 0); + } + maug = e_int_menus_menu_augmentation_add("main/1", _e_mod_menu_add, + NULL, NULL, NULL); + e_module_delayed_set(m, 1); + + /* Hook into zones */ + for (l = e_manager_list(); l; l = l->next) + { + man = l->data; + for (ll = man->containers; ll; ll = ll->next) + { + con = ll->data; + for (lll = con->zones; lll; lll = lll->next) + { + zone = lll->data; + if ((zone->container->num == 0) && (zone->num == 0)) + e_fwin_zone_new(zone, "desktop", "/"); + else + { + char buf[256]; + + snprintf(buf, sizeof(buf), "%i", + (zone->container->num + zone->num)); + e_fwin_zone_new(zone, "desktop", buf); + } + } + } + } + + return m; +} + +EAPI int +e_modapi_shutdown(E_Module *m) +{ + Evas_List *l, *ll, *lll, *f; + E_Manager *man; + E_Container *con; + E_Zone *zone; + + /* Unhook zone fm */ + for (l = e_manager_list(); l; l = l->next) + { + man = l->data; + for (ll = man->containers; ll; ll = ll->next) + { + con = ll->data; + for (lll = con->zones; lll; lll = lll->next) + { + zone = lll->data; + if (!zone) continue; + e_fwin_zone_shutdown(zone); + } + } + } + + /* remove module-supplied menu additions */ + if (maug) + { + e_int_menus_menu_augmentation_del("main/1", maug); + maug = NULL; + } + /* remove module-supplied action */ + if (act) + { + e_action_predef_name_del(_("Launch"), _("File Manager")); + e_action_del("fileman"); + act = NULL; + } + + E_FREE(fileman_config); + E_CONFIG_DD_FREE(conf_edd); + conf_module = NULL; + return 1; +} + +EAPI int +e_modapi_save(E_Module *m) +{ + e_config_domain_save("module.fileman", conf_edd, fileman_config); + return 1; +} + +EAPI int +e_modapi_about(E_Module *m) +{ + e_module_dialog_show(m, + _("Enlightenment File Manager"), + _("A module for providing a file manager.")); + return 1; +} + +EAPI int +e_modapi_config(E_Module *m) +{ + E_Container *con; + + con = e_container_current_get(e_manager_current_get()); + _config_fileman_module(con); + return 1; +} + +/* action callback */ +static void +_e_mod_action_fileman_cb(E_Object *obj, const char *params) +{ + E_Zone *zone; + + if (obj) + { + if (obj->type == E_MANAGER_TYPE) + zone = e_util_zone_current_get((E_Manager *)obj); + else if (obj->type == E_CONTAINER_TYPE) + zone = e_util_zone_current_get(((E_Container *)obj)->manager); + else if (obj->type == E_ZONE_TYPE) + zone = e_util_zone_current_get(((E_Zone *)obj)->container->manager); + else + zone = e_util_zone_current_get(e_manager_current_get()); + } + if (!zone) zone = e_util_zone_current_get(e_manager_current_get()); + if (zone) e_fwin_new(zone->container, "favorites", "/"); +} + +/* menu item callback(s) */ +static int +_e_mod_fileman_defer_cb(void *data) +{ + E_Zone *zone; + + zone = data; + if (zone) e_fwin_new(zone->container, "favorites", "/"); + return 0; +} + +static void +_e_mod_fileman_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + ecore_idle_enterer_add(_e_mod_fileman_defer_cb, m->zone); +} + +/* menu item add hook */ +static void +_e_mod_menu_add(void *data, E_Menu *m) +{ + E_Menu_Item *mi; + +#ifdef ENABLE_FILES + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Files")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/fileman"); + e_menu_item_callback_set(mi, _e_mod_fileman_cb, NULL); +#endif +} + +/* Abstract fileman config load/create to one function for maintainability */ +static void +_e_mod_fileman_config_load(void) +{ + conf_edd = E_CONFIG_DD_NEW("Fileman_Config", Config); + #undef T + #undef D + #define T Config + #define D conf_edd + E_CONFIG_VAL(D, T, view.mode, INT); + E_CONFIG_VAL(D, T, view.open_dirs_in_place, UCHAR); + E_CONFIG_VAL(D, T, view.selector, UCHAR); + E_CONFIG_VAL(D, T, view.single_click, UCHAR); + E_CONFIG_VAL(D, T, view.no_subdir_jump, UCHAR); + E_CONFIG_VAL(D, T, view.no_subdir_drop, UCHAR); + E_CONFIG_VAL(D, T, view.always_order, UCHAR); + E_CONFIG_VAL(D, T, view.link_drop, UCHAR); + E_CONFIG_VAL(D, T, view.fit_custom_pos, UCHAR); + E_CONFIG_VAL(D, T, icon.icon.w, INT); + E_CONFIG_VAL(D, T, icon.icon.h, INT); + E_CONFIG_VAL(D, T, icon.list.w, INT); + E_CONFIG_VAL(D, T, icon.list.h, INT); + E_CONFIG_VAL(D, T, icon.fixed.w, UCHAR); + E_CONFIG_VAL(D, T, icon.fixed.h, UCHAR); + E_CONFIG_VAL(D, T, icon.extension.show, UCHAR); + E_CONFIG_VAL(D, T, list.sort.no_case, UCHAR); + E_CONFIG_VAL(D, T, list.sort.dirs.first, UCHAR); + E_CONFIG_VAL(D, T, list.sort.dirs.last, UCHAR); + E_CONFIG_VAL(D, T, selection.single, UCHAR); + E_CONFIG_VAL(D, T, selection.windows_modifiers, UCHAR); + E_CONFIG_VAL(D, T, theme.background, STR); + E_CONFIG_VAL(D, T, theme.frame, STR); + E_CONFIG_VAL(D, T, theme.icons, STR); + E_CONFIG_VAL(D, T, theme.fixed, UCHAR); + + fileman_config = e_config_domain_load("module.fileman", conf_edd); + if (!fileman_config) + { + fileman_config = E_NEW(Config, 1); + fileman_config->view.mode = E_FM2_VIEW_MODE_GRID_ICONS; + fileman_config->icon.icon.w = 48; + fileman_config->icon.icon.h = 48; + fileman_config->icon.fixed.w = 0; + fileman_config->icon.fixed.h = 0; + fileman_config->view.open_dirs_in_place = 0; + fileman_config->view.selector = 0; + fileman_config->view.single_click = 0; + fileman_config->view.no_subdir_jump = 0; + fileman_config->icon.extension.show = 1; + fileman_config->list.sort.no_case = 1; + fileman_config->list.sort.dirs.first = 1; + fileman_config->list.sort.dirs.last = 0; + fileman_config->selection.single = 0; + fileman_config->selection.windows_modifiers = 0; + } + /* UCHAR's give nasty compile warnings about comparisons so not gonna limit those */ + E_CONFIG_LIMIT(fileman_config->view.mode, E_FM2_VIEW_MODE_ICONS, E_FM2_VIEW_MODE_LIST); + E_CONFIG_LIMIT(fileman_config->icon.icon.w, 16, 256); + E_CONFIG_LIMIT(fileman_config->icon.icon.h, 16, 256); + E_CONFIG_LIMIT(fileman_config->icon.list.w, 16, 256); + E_CONFIG_LIMIT(fileman_config->icon.list.h, 16, 256); +} diff --git a/src/modules/fileman/e_mod_main.h b/src/modules/fileman/e_mod_main.h new file mode 100644 index 000000000..8bfb2d597 --- /dev/null +++ b/src/modules/fileman/e_mod_main.h @@ -0,0 +1,81 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +typedef struct _Config Config; + +#define E_TYPEDEFS 1 +#include "e_fwin.h" + +#undef E_TYPEDEFS +#include "e_fwin.h" + +struct _Config +{ + /* general view mode */ + struct { + E_Fm2_View_Mode mode; + unsigned char open_dirs_in_place; + unsigned char selector; + unsigned char single_click; + unsigned char no_subdir_jump; + unsigned char no_subdir_drop; + unsigned char always_order; + unsigned char link_drop; + unsigned char fit_custom_pos; + } view; + /* display of icons */ + struct { + struct { + int w, h; + } icon; + struct { + int w, h; + } list; + struct { + unsigned char w; + unsigned char h; + } fixed; + struct { + unsigned char show; + } extension; + const char *key_hint; + } icon; + /* how to sort files */ + struct { + struct { + unsigned char no_case; + struct { + unsigned char first; + unsigned char last; + } dirs; + } sort; + } list; + /* control how you can select files */ + struct { + unsigned char single; + unsigned char windows_modifiers; + } selection; + /* the background - if any, and how to handle it */ + /* FIXME: not implemented yet */ + struct { + const char *background; + const char *frame; + const char *icons; + unsigned char fixed; + } theme; +}; + +EAPI extern E_Module_Api e_modapi; + +EAPI void *e_modapi_init (E_Module *m); +EAPI int e_modapi_shutdown (E_Module *m); +EAPI int e_modapi_save (E_Module *m); +EAPI int e_modapi_about (E_Module *m); +EAPI int e_modapi_config (E_Module *m); + +extern Config *fileman_config; + +#endif diff --git a/src/modules/fileman/module.desktop.in b/src/modules/fileman/module.desktop.in new file mode 100644 index 000000000..f6ddeff33 --- /dev/null +++ b/src/modules/fileman/module.desktop.in @@ -0,0 +1,4 @@ +[Desktop Entry] +Type=Link +Name=File Manager +Icon=e-module-fileman