/* * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 */ #include "e.h" #include #include #include #include #include #include /* TODO: * - scrolling * * - checking wether events belong to us (ecore events) * * - add ability to have icons on desktop (this works, but we need some fixes) * files should go on ~/.e/e/desktop for example. * * - when we select multiple items, the right click menu on the icons needs * to display some group related things and its actions need to work * on the group. * * - we need a redraw function that will just re-arrange and not do * the whole thing. for example, when we resize, we should just * check the file offset and fill the empty space with icons * * - is the offset code working properly? i have a feeling we're displayin * more icons that the visible space can take and they are being hidden. * * - emit all sorts of signals on double click, right click, single click... * * - aspect ratio on thumbnails. * * - add typebuffer like in evidence. * * - keyboard shortcuts for directory and file navigation. * * - allow for icon movement inside the canvas * * - add metadata system which allows us to save icon positions and will * eventually allow us to have custom icon sizes, custom bgs per dir... * * - double check dir monitoring. note: when we are in a dir that is constantly * changing, we cant keep calling redraw_new as it will kill us. * * - we need to fix the icon edc to allow us to have icon labels what will * wrap on wrap=char */ int E_EVENT_FM_RECONFIGURE; #ifdef EFM_DEBUG # define D(x) do {printf(__FILE__ ":%d: ", __LINE__); printf x; fflush(stdout);} while (0) #else # define D(x) ((void) 0) #endif typedef struct _E_Fm_Smart_Data E_Fm_Smart_Data; typedef struct _E_Fm_File_Attributes E_Fm_File_Attributes; typedef struct _E_Fm_File E_Fm_File; typedef struct _E_Fm_Icon_CFData E_Fm_Icon_CFData; typedef struct _E_Fm_Config E_Fm_Config; typedef struct _E_Fm_Thumb_Pending E_Fm_Thumb_Pending; typedef struct _E_Fm_Fake_Mouse_Up_Info E_Fm_Fake_Mouse_Up_Info; typedef struct _E_Fm_Assoc_App E_Fm_Assoc_App; typedef struct _E_Fm_Event_Reconfigure_Internal E_Fm_Event_Reconfigure_Internal; typedef enum _E_Fm_File_Type E_Fm_File_Type; typedef enum _E_Fm_Arrange E_Fm_Arrange; struct _E_Fm_File_Attributes { char name[PATH_MAX]; /* file name without parent directories */ dev_t device; /* ID of device containing file */ ino_t inode; /* inode number */ mode_t mode; /* protection */ nlink_t nlink; /* number of hard links */ uid_t owner; /* user ID of owner */ gid_t group; /* group ID of owner */ dev_t rdev; /* device ID (if special file) */ off_t size; /* total size, in bytes */ //blksize_t blksize; /* blocksize for filesystem I/O */ //blkcnt_t blocks; /* number of blocks allocated */ time_t atime; /* time of last access */ time_t mtime; /* time of last modification */ time_t ctime; /* time of last status change */ }; struct _E_Fm_File { E_Fm_File_Attributes *attr;; Evas_Object *icon; Evas_Object *icon_img; Evas_Object *entry; Evas_Object *event; Evas_Object *title; E_Fm_Smart_Data *sd; E_Menu *menu; struct { E_Dialog *dia; Evas_List *objects; } prop; struct { unsigned char selected : 1; } state; E_Fm_Icon_CFData *cfdata; void *data; }; struct _E_Fm_Icon_CFData { E_Fm_File *file; int readwrite; int protect; }; struct _E_Fm_Config { int width; int height; Evas_List *apps; }; struct _E_Fm_Thumb_Pending { E_Fm_File *file; pid_t pid; }; enum _E_Fm_File_Type { E_FILEMAN_FILETYPE_ALL = 0, E_FILEMAN_FILETYPE_NORMAL = 1, E_FILEMAN_FILETYPE_DIRECTORY = 2, E_FILEMAN_FILETYPE_FILE = 3, E_FILEMAN_FILETYPE_HIDDEN = 4, E_FILEMAN_FILETYPE_SYMLINK = 5, E_FILEMAN_FILETYPE_UNKNOWN = 6 }; enum _E_Fm_Arrange { E_FILEMAN_CANVAS_ARRANGE_NAME = 0, E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1, E_FILEMAN_CANVAS_ARRANGE_SIZE = 2, }; struct _E_Fm_Fake_Mouse_Up_Info { Evas *canvas; int button; }; struct _E_Fm_Assoc_App { char *mime; char *app; }; struct _E_Fm_Smart_Data { Evas_Object *bg; Evas_Object *clip; Evas_Object *layout; Evas_Object *object; E_Menu *menu; E_Win *win; Evas *evas; Evas_List *event_handlers; Evas_List *pending_thumbs; char *dir; Evas_List *files; Evas_List *files_raw; Ecore_File_Monitor *monitor; int arrange; int frozen; double position; Evas_Coord x, y, w, h; struct { unsigned char start : 1; int x, y; double time; E_Fm_File *file; Ecore_Evas *ecore_evas; Evas *evas; Ecore_X_Window win; Evas_Object *icon; Evas_Object *icon_img; } drag; struct { E_Drop_Handler *drop_file; } drop; struct { int w; int h; int x_space; int y_space; } icon_info; struct { int w; int h; } max; struct { Evas_List *files; E_Fm_File *current_file; struct { unsigned char enabled : 1; Evas_Coord x, y; Evas_Object *obj; Evas_List *files; } band; } selection; struct { E_Config_DD *main_edd; E_Config_DD *assoc_app_edd; E_Fm_Config *main; } conf; }; static void _e_fm_smart_add(Evas_Object *object); static void _e_fm_smart_del(Evas_Object *object); static void _e_fm_smart_raise(Evas_Object *object); static void _e_fm_smart_lower(Evas_Object *object); static void _e_fm_smart_stack_above(Evas_Object *object, Evas_Object *above); static void _e_fm_smart_stack_below(Evas_Object *object, Evas_Object *below); static void _e_fm_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y); static void _e_fm_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h); static void _e_fm_smart_show(Evas_Object *object); static void _e_fm_smart_hide(Evas_Object *object); static void _e_fm_redraw_new(E_Fm_Smart_Data *sd); static void _e_fm_redraw(E_Fm_Smart_Data *sd); static void _e_fm_stat_to_attr(struct stat st, E_Fm_File_Attributes *attr, char *name); static void _e_fm_selections_clear(E_Fm_Smart_Data *sd); static void _e_fm_selections_add(E_Fm_File *file); static void _e_fm_selections_del(E_Fm_File *file); static void _e_fm_selections_add_rect(E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); static void _e_fm_file_free(E_Fm_File *file); static void _e_fm_files_free(E_Fm_Smart_Data *sd); static Evas_Bool _e_fm_file_can_preview(E_Fm_File *file); static void _e_fm_file_delete(E_Fm_File *file); static Evas_Bool _e_fm_file_can_exec(E_Fm_File *file); static void _e_fm_file_exec(E_Fm_File *file); static E_Fm_File_Type _e_fm_file_type(E_Fm_File *file); static Evas_Bool _e_fm_file_open_assoc(E_Fm_File *file); static char *_e_fm_file_fullname(E_Fm_File *file); static Evas_Object *_e_fm_file_icon_mime_get(E_Fm_File *file); static Evas_Object *_e_fm_file_icon_get(E_Fm_File *file); static void _e_fm_file_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_file_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_file_icon_mouse_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_file_icon_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_file_menu_open(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_copy(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_cut(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_paste(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_rename(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_menu_properties(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_file_delete_yes_cb(void *data, E_Dialog *dia); static void _e_fm_file_delete_no_cb(void *data, E_Dialog *dia); static void _e_fm_fake_mouse_up_cb(void *data); static void _e_fm_fake_mouse_up_later(Evas *evas, int button); static void _e_fm_fake_mouse_up_all_later(Evas *evas); static int _e_fm_dir_files_sort_name_cb(void *d1, void *d2); static int _e_fm_dir_files_sort_modtime_cb(void *d1, void *d2); static void _e_fm_dir_set(E_Fm_Smart_Data *sd, const char *dir); static void _e_fm_dir_monitor_cb(void *data, Ecore_File_Monitor *ecore_file_monitor, Ecore_File_Event event, const char *path); static Evas_List *_e_fm_dir_files_get(char *dirname, E_Fm_File_Type type); static char *_e_fm_dir_pop(const char *path); static void _e_fm_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_fm_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static int _e_fm_win_mouse_move_cb(void *data, int type, void *event); static int _e_fm_grabbed_mouse_up_cb(void *data, int type, void *event); static void _e_fm_menu_arrange_cb(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm_menu_refresh_cb(void *data, E_Menu *m, E_Menu_Item *mi); static int _e_fm_drop_enter_cb(void *data, int type, void *event); static int _e_fm_drop_leave_cb(void *data, int type, void *event); static int _e_fm_drop_position_cb(void *data, int type, void *event); static int _e_fm_drop_selection_cb(void *data, int type, void *event); static void _e_fm_drop_cb(E_Drag *drag, int dropped); static int _e_fm_drop_drop_cb(void *data, int type, void *event); static int _e_fm_thumbnailer_exit(void *data, int type, void *event); static Ecore_Event_Handler *_e_fm_mouse_up_handler = NULL; static double _e_fm_grab_time = 0; static Evas_Smart *e_fm_smart = NULL; /* dumym for now */ static int dummy_val; /* externally accessible functions */ int e_fm_init(void) { if (!e_fm_smart) { e_fm_smart = evas_smart_new("e_fm", _e_fm_smart_add, /* add */ _e_fm_smart_del, /* del */ NULL, /* layer_set */ _e_fm_smart_raise, /* raise */ _e_fm_smart_lower, /* lower */ _e_fm_smart_stack_above, /* stack_above */ _e_fm_smart_stack_below, /* stack_below */ _e_fm_smart_move, /* move */ _e_fm_smart_resize, /* resize */ _e_fm_smart_show, /* show */ _e_fm_smart_hide, /* hide */ NULL, /* color_set */ NULL, /* clip_set */ NULL, /* clip_unset */ NULL); /* data*/ } E_EVENT_FM_RECONFIGURE = ecore_event_type_new(); return 1; } int e_fm_shutdown(void) { evas_smart_free(e_fm_smart); return 1; } Evas_Object * e_fm_add(Evas *evas) { return evas_object_smart_add(evas, e_fm_smart); } void e_fm_dir_set(Evas_Object *object, const char *dir) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; _e_fm_dir_set(sd, dir); } char * e_fm_dir_get(Evas_Object *object) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return NULL; return strdup(sd->dir); } void e_fm_e_win_set(Evas_Object *object, E_Win *win) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; sd->win = win; } E_Win * e_fm_e_win_get(Evas_Object *object) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return NULL; return sd->win; } void e_fm_menu_set(Evas_Object *object, E_Menu *menu) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; if (menu) sd->menu = menu; } E_Menu * e_fm_menu_get(Evas_Object *object) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return NULL; return sd->menu; } void e_fm_scroll_horizontal(Evas_Object *object, double percent) { } void e_fm_scroll_vertical(Evas_Object *object, double percent) { E_Fm_Smart_Data *sd; int offsetpx; Evas_Coord x, y, w, h; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; sd->position = percent; offsetpx = (percent) * (sd->max.h - sd->h); evas_object_geometry_get(sd->layout, &x, &y, &w, &h); e_icon_layout_clip_freeze(sd->layout); evas_object_move(sd->layout, x, sd->y - offsetpx); e_icon_layout_clip_thaw(sd->layout); } int e_fm_freeze(Evas_Object *object) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; sd->frozen++; evas_event_freeze(sd->evas); return sd->frozen; } int e_fm_thaw(Evas_Object *object) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; if(!sd->frozen) return 0; sd->frozen--; evas_event_thaw(sd->evas); return sd->frozen; } void e_fm_geometry_virtual_get(Evas_Object *object, Evas_Coord *w, Evas_Coord *h) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; if(w) *w = sd->max.w; if(h) *h = sd->max.h; } /* local subsystem functions */ static void _e_fm_smart_add(Evas_Object *object) { Evas *evas; char *homedir; char dir[PATH_MAX]; E_Fm_Smart_Data *sd; if ((!object) || !(evas = evas_object_evas_get(object))) return; sd = E_NEW(E_Fm_Smart_Data, 1); if (!sd) return; sd->object = object; sd->frozen = 0; sd->bg = evas_object_rectangle_add(evas); // this should become an edje evas_object_color_set(sd->bg, 0, 0, 0, 0); evas_object_show(sd->bg); evas_object_event_callback_add(sd->bg, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_mouse_down_cb, sd); evas_object_event_callback_add(sd->bg, EVAS_CALLBACK_MOUSE_UP, _e_fm_mouse_up_cb, sd); evas_object_event_callback_add(sd->bg, EVAS_CALLBACK_MOUSE_MOVE, _e_fm_mouse_move_cb, sd); evas_object_smart_member_add(sd->bg, object); sd->layout = e_icon_layout_add(evas); e_icon_layout_spacing_set(sd->layout, 15, 15); evas_object_stack_above(sd->layout, sd->bg); evas_object_show(sd->layout); sd->clip = evas_object_rectangle_add(evas); evas_object_smart_member_add(sd->clip, object); evas_object_move(sd->clip, -100000, -100000); evas_object_resize(sd->clip, 200000, 200000); evas_object_color_set(sd->clip, 255, 255, 255, 255); evas_object_clip_set(sd->bg, sd->clip); evas_object_clip_set(sd->layout, sd->clip); sd->icon_info.w = 48; sd->icon_info.h = 48; sd->icon_info.x_space = 15; sd->icon_info.y_space = 15; sd->monitor = NULL; sd->position = 0; sd->evas = evas; sd->pending_thumbs = NULL; sd->event_handlers = NULL; sd->selection.band.obj = edje_object_add(sd->evas); e_theme_edje_object_set(sd->selection.band.obj, "base/theme/fileman/rubberband", "fileman/rubberband"); sd->event_handlers = evas_list_append(sd->event_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_ENTER, _e_fm_drop_enter_cb, sd)); sd->event_handlers = evas_list_append(sd->event_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_LEAVE, _e_fm_drop_leave_cb, sd)); sd->event_handlers = evas_list_append(sd->event_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_POSITION, _e_fm_drop_position_cb, sd)); sd->event_handlers = evas_list_append(sd->event_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, _e_fm_drop_drop_cb, sd)); sd->event_handlers = evas_list_append(sd->event_handlers, ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _e_fm_drop_selection_cb, sd)); sd->event_handlers = evas_list_append(sd->event_handlers, ecore_event_handler_add(ECORE_EVENT_EXE_EXIT, _e_fm_thumbnailer_exit, sd)); sd->event_handlers = evas_list_append(sd->event_handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _e_fm_win_mouse_move_cb, sd)); sd->conf.main_edd = E_CONFIG_DD_NEW("E_Fm_Config", E_Fm_Config); sd->conf.assoc_app_edd = E_CONFIG_DD_NEW("E_Fm_Assoc_App",E_Fm_Assoc_App); #undef T #undef DD #define T E_Fm_Assoc_App #define DD sd->conf.assoc_app_edd E_CONFIG_VAL(DD, T, mime, STR); E_CONFIG_VAL(DD, T, app, STR); #undef T #undef DD #define T E_Fm_Config #define DD sd->conf.main_edd E_CONFIG_VAL(DD, T, width, INT); E_CONFIG_VAL(DD, T, height, INT); E_CONFIG_LIST(DD, T, apps, sd->conf.assoc_app_edd); sd->conf.main = e_config_domain_load("efm", sd->conf.main_edd); if(!sd->conf.main) { /* no saved config */ sd->conf.main = E_NEW(E_Fm_Config, 1); sd->conf.main->width = 640; sd->conf.main->height = 480; sd->conf.main->apps = NULL; /* some test values not meant for everyone */ { E_Fm_Assoc_App *assoc; assoc = E_NEW(E_Fm_Assoc_App, 1); assoc->mime = E_NEW(char *, 5); snprintf(assoc->mime, 5, "%s", ".jpg"); assoc->app = E_NEW(char *, 7); snprintf(assoc->app, 7, "gqview"); sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc); assoc = E_NEW(E_Fm_Assoc_App, 1); assoc->mime = E_NEW(char *, 5); snprintf(assoc->mime, 5, "%s", ".png"); assoc->app = E_NEW(char *, 7); snprintf(assoc->app, 7, "gqview"); sd->conf.main->apps = evas_list_append(sd->conf.main->apps, assoc); } } evas_object_smart_data_set(object, sd); if (getcwd(dir, sizeof(dir))) _e_fm_dir_set(sd, dir); } static void _e_fm_smart_del(Evas_Object *object) { E_Fm_Smart_Data *sd; Evas_List *l; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; e_config_domain_save("efm", sd->conf.main_edd, sd->conf.main); _e_fm_files_free(sd); for (l = sd->event_handlers; l; l = l->next) { Ecore_Event_Handler *h; h = l->data; ecore_event_handler_del(h); } evas_list_free(sd->event_handlers); sd->event_handlers = NULL; evas_object_del(sd->selection.band.obj); evas_object_del(sd->clip); evas_object_del(sd->bg); free(sd->dir); free(sd); } static void _e_fm_smart_raise(Evas_Object *object) { E_Fm_Smart_Data *sd; Evas_List *l; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_raise(sd->bg); for (l = sd->files; l; l = l->next) { E_Fm_File *file; file = l->data; evas_object_stack_above(file->icon, sd->bg); } } static void _e_fm_smart_lower(Evas_Object *object) { E_Fm_Smart_Data *sd; Evas_List *l; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_lower (sd->bg); for (l = sd->files; l; l = l->next) { E_Fm_File *file; file = l->data; evas_object_stack_above(file->icon, sd->bg); } } static void _e_fm_smart_stack_above(Evas_Object *object, Evas_Object *above) { E_Fm_Smart_Data *sd; Evas_List *l; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_stack_above(sd->bg, above); for (l = sd->files; l; l = l->next) { E_Fm_File *file; file = l->data; evas_object_stack_above(file->icon, sd->bg); } } static void _e_fm_smart_stack_below(Evas_Object *object, Evas_Object *below) { E_Fm_Smart_Data *sd; Evas_List *l; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_stack_below(sd->bg, below); for (l = sd->files; l; l = l->next) { E_Fm_File *file; file = l->data; evas_object_stack_above(file->icon, sd->bg); } } static void _e_fm_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_move(sd->bg, x, y); evas_object_move(sd->clip, x, y); evas_object_move(sd->layout, x, y); sd->x = x; sd->y = y; // _e_fm_redraw(sd); // no new } static void _e_fm_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h) { E_Fm_Smart_Data *sd; E_Event_Fm_Reconfigure *ev; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_resize(sd->bg, w, h); evas_object_resize(sd->clip, w, h); evas_object_resize(sd->layout, w, h); e_icon_layout_width_fix(sd->layout, w); e_icon_layout_virtual_size_get(sd->layout, &sd->max.w, &sd->max.h); sd->conf.main->width = w; sd->conf.main->height = h; sd->w = w; sd->h = h; // optimize // _e_fm_redraw(sd); // no new if(sd->position > 0.0) e_fm_scroll_vertical(object, sd->position); if(sd->frozen) return; ev = E_NEW(E_Event_Fm_Reconfigure, 1); if (ev) { Evas_Coord w, h; evas_object_geometry_get(sd->layout, NULL, NULL, &w, &h); ev->object = sd->object; ev->w = sd->max.w; ev->h = sd->max.h; ecore_event_add(E_EVENT_FM_RECONFIGURE, ev, NULL, NULL); } } static void _e_fm_smart_show(Evas_Object *object) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_show(sd->clip); } static void _e_fm_smart_hide(Evas_Object *object) { E_Fm_Smart_Data *sd; if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_hide(sd->clip); } static void _e_fm_redraw_new(E_Fm_Smart_Data *sd) { Evas_List *dirs = NULL; Evas_Coord x, y, w, h; Evas_Coord xo, yo; E_Fm_File *file; E_Fm_File_Attributes *attr; E_Event_Fm_Reconfigure *ev; if (!sd->dir) return; if (sd->files) _e_fm_files_free(sd); sd->files_raw = _e_fm_dir_files_get(sd->dir, E_FILEMAN_FILETYPE_NORMAL); dirs = sd->files_raw; if (sd->monitor) ecore_file_monitor_del(sd->monitor); sd->monitor = ecore_file_monitor_add(sd->dir, _e_fm_dir_monitor_cb, sd); attr = E_NEW(E_Fm_File_Attributes, 1); attr->mode = 0040000; snprintf(attr->name, PATH_MAX, ".."); dirs = evas_list_prepend(dirs, attr); e_icon_layout_freeze(sd->layout); while (dirs) { int icon_w, icon_h; attr = evas_list_data(dirs); file = E_NEW(E_Fm_File, 1); file->icon = edje_object_add(sd->evas); e_theme_edje_object_set(file->icon, "base/theme/fileman", "fileman/icon"); file->attr = attr; file->sd = sd; file->icon_img = _e_fm_file_icon_get(file); edje_object_part_swallow(file->icon, "icon_swallow", file->icon_img); edje_object_part_text_set(file->icon, "icon_title", attr->name); /* { Evas_Coord fw, fh, il, ir, it, ib; Evas_Textblock_Style *e_editable_text_style; e_editable_text_style = evas_textblock2_style_new(); evas_textblock2_style_set(e_editable_text_style, "DEFAULT='font=Vera font_size=10 align=center color=#000000 wrap=char'"); file->title = evas_object_textblock2_add(sd->evas); evas_object_textblock2_style_set(file->title, e_editable_text_style); evas_object_textblock2_text_markup_set(file->title, attr->name); evas_object_resize(file->title, sd->icon_info.w*2, 1); evas_object_textblock2_size_formatted_get(file->title, &fw, &fh); evas_object_textblock2_style_insets_get(file->title, &il, &ir, &it, &ib); evas_object_resize(file->title, sd->icon_info.w*2, fh + it + ib); edje_extern_object_min_size_set(file->title, sd->icon_info.w*2, fh + it + ib); edje_object_part_swallow(file->icon, "icon_title", file->title); } */ edje_object_size_min_calc(file->icon, &icon_w, &icon_h); evas_object_resize(file->icon, icon_w, icon_h); e_icon_layout_pack(sd->layout, file->icon); evas_object_show(file->icon); evas_object_event_callback_add(file->icon, EVAS_CALLBACK_MOUSE_DOWN, _e_fm_file_icon_mouse_down_cb, file); evas_object_event_callback_add(file->icon, EVAS_CALLBACK_MOUSE_UP, _e_fm_file_icon_mouse_up_cb, file); evas_object_event_callback_add(file->icon, EVAS_CALLBACK_MOUSE_IN, _e_fm_file_icon_mouse_in_cb, file); evas_object_event_callback_add(file->icon, EVAS_CALLBACK_MOUSE_OUT, _e_fm_file_icon_mouse_out_cb, file); sd->files = evas_list_append(sd->files, file); dirs = dirs->next; } e_icon_layout_thaw(sd->layout); if(sd->frozen) return; ev = E_NEW(E_Event_Fm_Reconfigure, 1); if (ev) { Evas_Coord w, h; evas_object_geometry_get(sd->layout, NULL, NULL, &w, &h); ev->object = sd->object; ev->w = sd->max.w; ev->h = sd->max.h; ecore_event_add(E_EVENT_FM_RECONFIGURE, ev, NULL, NULL); } } static void _e_fm_redraw(E_Fm_Smart_Data *sd) { E_Event_Fm_Reconfigure *ev; e_icon_layout_redraw_force(sd->layout); if(sd->frozen) return; ev = E_NEW(E_Event_Fm_Reconfigure, 1); if (ev) { Evas_Coord w, h; evas_object_geometry_get(sd->layout, NULL, NULL, &w, &h); ev->object = sd->object; ev->w = sd->max.w; ev->h = sd->max.h; ecore_event_add(E_EVENT_FM_RECONFIGURE, ev, NULL, NULL); } } static void _e_fm_selections_clear(E_Fm_Smart_Data *sd) { Evas_List *l; for (l = sd->selection.files; l; l = l->next) { E_Fm_File *file; file = l->data; if (!file) continue; edje_object_signal_emit(file->icon, "unclicked", ""); edje_object_signal_emit(file->icon_img, "unclicked", ""); file->state.selected = 0; } sd->selection.files = evas_list_free(sd->selection.files); sd->selection.current_file = NULL; sd->selection.band.files = evas_list_free(sd->selection.band.files); } static void _e_fm_selections_add(E_Fm_File *file) { if (!file) return; edje_object_signal_emit(file->icon, "clicked", ""); edje_object_signal_emit(file->icon_img, "clicked", ""); file->sd->selection.current_file = file; file->state.selected = 1; file->sd->selection.files = evas_list_append(file->sd->selection.files, file); } static void _e_fm_selections_add_rect(E_Fm_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) { Evas_List *l; for (l = sd->files; l; l = l->next) { E_Fm_File *file; Evas_Coord xx, yy, ww, hh; file = l->data; if (!file) continue; evas_object_geometry_get(file->icon, &xx, &yy, &ww, &hh); if (E_INTERSECTS(x, y, w, h, xx, yy, ww, hh)) { if (!evas_list_find(file->sd->selection.band.files, file)) { if (file->state.selected) _e_fm_selections_del(file); else _e_fm_selections_add(file); file->sd->selection.band.files = evas_list_append(file->sd->selection.band.files, file); } } else { if (evas_list_find(file->sd->selection.band.files, file)) { if (file->state.selected) _e_fm_selections_del(file); else _e_fm_selections_add(file); file->sd->selection.band.files = evas_list_remove(file->sd->selection.band.files, file); } } } } static void _e_fm_selections_del(E_Fm_File *file) { if (!file) return; edje_object_signal_emit(file->icon, "unclicked", ""); edje_object_signal_emit(file->icon_img, "unclicked", ""); file->state.selected = 0; file->sd->selection.files = evas_list_remove(file->sd->selection.files, file); file->sd->selection.current_file = evas_list_nth(file->sd->selection.files, 0); } static void _e_fm_dir_set(E_Fm_Smart_Data *sd, const char *dir) { if ((!sd) || (!dir)) return; if ((sd->dir) && (!strcmp(sd->dir, dir))) return; if (sd->dir) free (sd->dir); sd->dir = strdup(dir); sd->position = 0; _e_fm_selections_clear(sd); _e_fm_redraw_new(sd); } static void _e_fm_file_free(E_Fm_File *file) { e_icon_layout_unpack(file); evas_object_del(file->icon_img); evas_object_del(file->icon); evas_object_del(file->entry); evas_object_del(file->title); // evas_object_del(file->event); file->sd = NULL; E_FREE(file->attr); if (file->menu) e_object_del(E_OBJECT(file->menu)); free(file); } static void _e_fm_files_free(E_Fm_Smart_Data *sd) { E_Fm_File *file; Evas_List *l; if (!sd->files) return; for (l = sd->files; l; l = l->next) { file = l->data; _e_fm_file_free(file); } evas_list_free(sd->files); sd->files = NULL; sd->drag.file = NULL; _e_fm_selections_clear(sd); e_icon_layout_reset(sd->layout); } static void _e_fm_dir_monitor_cb(void *data, Ecore_File_Monitor *ecore_file_monitor, Ecore_File_Event event, const char *path) { E_Fm_Smart_Data *sd; sd = data; /* FIXME! */ return; if (event == ECORE_FILE_EVENT_DELETED_SELF) { char *dir; dir = _e_fm_dir_pop(sd->dir); /* FIXME: we need to fix this, uber hack alert */ if (sd->win) e_win_title_set(sd->win, dir); _e_fm_dir_set(sd, dir); free(dir); return; } // OPTIMIZE !! _e_fm_redraw_new(sd); } static void _e_fm_stat_to_attr(struct stat st, E_Fm_File_Attributes *attr, char *name) { if(!attr) return; snprintf(attr->name, PATH_MAX, "%s", name); attr->device = st.st_dev; attr->inode = st.st_ino; attr->mode = st.st_mode; attr->nlink = st.st_nlink; attr->owner = st.st_uid; attr->group = st.st_gid; attr->rdev = st.st_rdev; attr->size = st.st_size; // check portability of the following 2 fields //attr->st_blksize = st.st_blksize; //attr->blocks = st.st_blocks; attr->atime = st.st_atime; attr->mtime = st.st_mtime; attr->ctime = st.st_ctime; } static Evas_List * _e_fm_dir_files_get(char *dirname, E_Fm_File_Type type) { DIR *dir; char fullname[PATH_MAX]; struct dirent *dir_entry; Evas_List *files; files = NULL; if ((dir = opendir(dirname)) == NULL) return NULL; while ((dir_entry = readdir(dir)) != NULL) { E_Fm_File_Attributes *attr; struct stat st; if ((!strcmp(dir_entry->d_name, ".") || (!strcmp (dir_entry->d_name, "..")))) continue; if ((dir_entry->d_name[0] == '.') && (type != E_FILEMAN_FILETYPE_HIDDEN)) continue; snprintf(fullname, PATH_MAX, "%s/%s", dirname, dir_entry->d_name); if (stat(fullname, &st) == -1) { D(("stat(%s, &st) failed -- %d", errno)); continue; } attr = E_NEW(E_Fm_File_Attributes, 1); _e_fm_stat_to_attr(st, attr, dir_entry->d_name); files = evas_list_append(files, attr); } closedir(dir); files = evas_list_sort(files, evas_list_count(files), _e_fm_dir_files_sort_name_cb); return files; } static char * _e_fm_dir_pop(const char *path) { char *start, *end, *dir; int i; i = 0; start = strchr(path, '/'); end = strrchr(path ,'/'); if (start == end) { dir = strdup("/");; } else if ((!start) || (!end)) { dir = strdup(""); } else { dir = malloc((end - start + 1)); if (dir) { memcpy(dir, start, end - start); dir[end - start] = 0; } } return dir; } static Evas_Bool _e_fm_file_can_preview(E_Fm_File *file) { if (!file) return 0; if (S_ISREG(file->attr->mode) || S_ISLNK(file->attr->mode)) { char *ext; ext = strrchr(file->attr->name, '.'); if (!ext) return 0; return (!strcasecmp(ext, ".jpg")) || (!strcasecmp(ext, ".png")) || (!strcasecmp(ext, ".eap")); } return 0; } static void _e_fm_file_rename(E_Fm_File *file, const char* name) { char old_name[PATH_MAX], new_name[PATH_MAX]; if (!name || !name[0]) return; edje_object_part_text_set(file->icon, "icon_title", name); snprintf(old_name, PATH_MAX, "%s/%s", file->sd->dir, file->attr->name); snprintf(new_name, PATH_MAX, "%s/%s", file->sd->dir, name); ecore_file_mv(old_name, new_name); } static void _e_fm_file_delete(E_Fm_File *file) { char full_name[PATH_MAX]; if (!file) return; snprintf(full_name, PATH_MAX, "%s/%s", file->sd->dir, file->attr->name); if (!ecore_file_unlink(full_name)) { E_Dialog *dia; E_Fileman *fileman; char *text; fileman = file->data; dia = e_dialog_new(fileman->con); e_dialog_button_add(dia, _("Ok"), NULL, _e_fm_file_delete_no_cb, file); e_dialog_button_focus_num(dia, 1); e_dialog_title_set(dia, _("Error")); text = E_NEW(char, PATH_MAX + 256); snprintf(text, PATH_MAX + 256, _("Could not delete
%s ?"), file->attr->name); e_dialog_text_set(dia, text); e_dialog_show(dia); } file->sd->files = evas_list_remove(file->sd->files, file); _e_fm_file_free(file); } // TODO: overhaul static Evas_Object * _e_fm_file_icon_mime_get(E_Fm_File *file) { Evas_Object *icon_img; if (!file) return NULL; icon_img = edje_object_add(file->sd->evas); if (_e_fm_file_type(file) == E_FILEMAN_FILETYPE_DIRECTORY) { e_theme_edje_object_set(icon_img, "base/theme/fileman", "fileman/icons/folder"); } else { char *ext; ext = strrchr(file->attr->name, '.'); if (ext) { char part[PATH_MAX]; char *ext2; ext = strdup(ext); ext2 = ext; for(;*ext2;ext2++) *ext2 = (unsigned char)tolower((unsigned char)*ext2); snprintf(part, PATH_MAX, "fileman/icons/%s", (ext + 1)); if(!e_theme_edje_object_set(icon_img, "base/theme/fileman", part)) e_theme_edje_object_set(icon_img, "base/theme/fileman", "fileman/icons/file"); free(ext); } else e_theme_edje_object_set(icon_img, "base/theme/fileman", "fileman/icons/file"); } return icon_img; } static int _e_fm_thumbnailer_exit(void *data, int type, void *event) { Ecore_Event_Exe_Exit *ev; E_Fm_Smart_Data *sd; Evas_List *l; char *fullname; ev = event; sd = data; D(("_e_fm_thumbnailer_exit: %s\n", "searching for thumbnail..")); for (l = sd->pending_thumbs; l; l = l->next) { E_Fm_Thumb_Pending *pthumb; Evas_Object *thumb; pthumb = l->data; if (pthumb->pid != ev->pid) continue; if (pthumb->file->icon_img) { edje_object_part_unswallow(pthumb->file->icon, pthumb->file->icon_img); evas_object_del(pthumb->file->icon_img); pthumb->file->icon_img = NULL; } fullname = _e_fm_file_fullname(pthumb->file); thumb = e_thumb_evas_object_get(fullname, pthumb->file->sd->evas, pthumb->file->sd->icon_info.w, pthumb->file->sd->icon_info.h); free(fullname); if (thumb) { D(("_e_fm_thumbnailer_exit: thumb found for%s\n",pthumb->file->attr->name)); pthumb->file->icon_img = thumb; edje_object_part_swallow(pthumb->file->icon, "icon_swallow", pthumb->file->icon_img); } sd->pending_thumbs = evas_list_remove(sd->pending_thumbs, pthumb); break; } return 1; } static void _e_fm_file_thumb_generate_job(void *data) { E_Fm_Thumb_Pending *pthumb; pid_t pid; E_Fm_File *file; if (!data) return; file = data; pthumb = E_NEW(E_Fm_Thumb_Pending, 1); pthumb->file = file; pid = fork(); if (pid == 0) { /* child */ char *fullname; fullname = _e_fm_file_fullname(pthumb->file); if (fullname) { if (!e_thumb_exists(fullname)) e_thumb_create(fullname, pthumb->file->sd->icon_info.w, pthumb->file->sd->icon_info.h); free(fullname); } exit(0); } else if (pid > 0) { /* parent */ pthumb->pid = pid; pthumb->file->sd->pending_thumbs = evas_list_append(pthumb->file->sd->pending_thumbs, pthumb); } } static Evas_Object * _e_fm_file_icon_get(E_Fm_File *file) { char *fullname; if (!file) return NULL; if (!_e_fm_file_can_preview(file)) return _e_fm_file_icon_mime_get(file); fullname = _e_fm_file_fullname(file); if (fullname) { Evas_Object *o = NULL; if (e_thumb_exists(fullname)) o = e_thumb_evas_object_get(fullname, file->sd->evas, file->sd->icon_info.w, file->sd->icon_info.h); free(fullname); if (o) return o; } ecore_job_add(_e_fm_file_thumb_generate_job, file); return _e_fm_file_icon_mime_get(file); } static void _e_fm_file_menu_open(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; char *fullname; file = data; switch (_e_fm_file_type(file)) { case E_FILEMAN_FILETYPE_DIRECTORY: fullname = _e_fm_file_fullname(file); _e_fm_dir_set(file->sd, fullname); free(fullname); break; case E_FILEMAN_FILETYPE_FILE: if(!_e_fm_file_open_assoc(file)) if (_e_fm_file_can_exec(file)) _e_fm_file_exec(file); break; case E_FILEMAN_FILETYPE_ALL: case E_FILEMAN_FILETYPE_NORMAL: case E_FILEMAN_FILETYPE_HIDDEN: case E_FILEMAN_FILETYPE_UNKNOWN: break; } } static void _e_fm_file_menu_copy(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; file = data; } static void _e_fm_file_menu_cut(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; file = data; } static void _e_fm_file_menu_paste(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; file = data; } // TODO: This needs to capture the mouse and end // the entry when we click anywhere. static void _e_fm_file_menu_rename(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; file = data; file->entry = e_entry_add(file->sd->evas); edje_object_part_swallow(file->icon, "icon_title_edit_swallow", file->entry); edje_object_part_text_set(file->icon, "icon_title", ""); evas_object_focus_set(file->entry, 1); evas_object_show(file->entry); e_entry_cursor_show(file->entry); e_entry_text_set(file->entry, file->attr->name); e_entry_cursor_move_at_end(file->entry); e_entry_cursor_move_at_start(file->entry); _e_fm_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _e_fm_grabbed_mouse_up_cb, file); e_grabinput_get(file->sd->win->evas_win, 1, file->sd->win->evas_win); _e_fm_grab_time = ecore_time_get(); } static void _e_fm_file_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; E_Dialog *dia; char *text; file = data; dia = e_dialog_new(file->sd->win->container); e_dialog_button_add(dia, _("Yes"), NULL, _e_fm_file_delete_yes_cb, file); e_dialog_button_add(dia, _("No"), NULL, _e_fm_file_delete_no_cb, file); e_dialog_button_focus_num(dia, 1); e_dialog_title_set(dia, _("Confirm")); text = E_NEW(char, PATH_MAX + 256); snprintf(text, PATH_MAX + 256, _(" Are you sure you want to delete
%s ?"), file->attr->name); e_dialog_text_set(dia, text); e_dialog_show(dia); } static void _e_fm_file_delete_yes_cb(void *data, E_Dialog *dia) { E_Fm_File *file; E_Fm_Smart_Data *sd; file = data; sd = file->sd; _e_fm_file_delete(file); e_object_del(E_OBJECT(dia)); _e_fm_redraw(sd); // no_new } static void _e_fm_file_delete_no_cb(void *data, E_Dialog *dia) { e_object_del(E_OBJECT(dia)); } #if 0 static void _e_fm_icon_prop_fill_data( E_Fm_Icon_CFData *cfdata) { cfdata->protect = 1 cfdata->readwrite = 0; } static void * _e_fm_icon_prop_create_data(E_Config_Dialog *cfd) { E_Fm_Icon_CFData *cfdata; cfdata = E_NEW(CFData, 1); _fill_data(cfdata); return cfdata; } static void _e_fm_icon_prop_free_data(E_Config_Dialog *cfd, E_Fm_Icon_CFData *cfdata) { free(cfdata); } static int _e_fm_icon_prop_basic_apply_data(E_Config_Dialog *cfd, E_Fm_Icon_CFData *cfdata) { return 1; } static int _e_fm_icon_prop_advanced_apply_data(E_Config_Dialog *cfd, E_Fm_Icon_CFData *cfdata) { return 1; } static Evas_Object * _e_fm_icon_prop_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Fm_Icon_CFData *cfdata) { E_Fm_File *file; E_Win *win; Evas_Object *table; Evas_Object *name; Evas_Coord w, h; struct group *grp; struct passwd *usr; struct tm *t; char *fullname; char *size, *username, *groupname, *lastaccess, *lastmod, *permissions; char text[512]; E_Dialog *dia; Evas_Object *o, *ol, *hb; Evas_Coord mw, mh; E_Radio_Group *rg; Evas *e; file = cfdata->file; _e_fm_icon_prop_fill_data(cfdata); size = E_NEW(char, 64); snprintf(size, 64, "%ld KB", file->attr->size / 1024); username = E_NEW(char, 128); // max length of username? usr = getpwuid(file->attr->owner); snprintf(username, 128, "%s", usr->pw_name); //free(usr); groupname = E_NEW(char, 128); // max length of group? grp = getgrgid(file->attr->group); snprintf(groupname, 128, "%s", grp->gr_name); //free(grp); t = gmtime(&file->attr->atime); lastaccess = E_NEW(char, 128); strftime(lastaccess, 128, "%a %b %d %T %Y", t); t = gmtime(&file->attr->mtime); lastmod = E_NEW(char, 128); strftime(lastmod, 128, "%a %b %d %T %Y", t); permissions = E_NEW(char, 128); // todo snprintf(permissions, 128, "%s", ""); dia = e_dialog_new(file->sd->win->container); e_dialog_title_set(dia, _("Properties")); e = e_win_evas_get(dia->win); ol = e_widget_list_add(e, 0, 0); hb = e_widget_list_add(e, 1, 1); o = e_widget_frametable_add(e, _("General"), 0); snprintf(text, 512, _("File:")); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 0, 0, 1, 1, 1, 1, 1, 1); snprintf(text, 512, "%s", file->attr->name); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 1, 0, 1, 1, 1, 1, 1, 1); snprintf(text, 512, _("Size:")); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 0, 1, 1, 1, 1, 1, 1, 1); snprintf(text, 512, "%s Kb", size); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 1, 1, 1, 1, 1, 1, 1, 1); snprintf(text, 512, _("Type:")); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 0, 2, 1, 1, 1, 1, 1, 1); snprintf(text, 512, "%s", "An Image"); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 1, 2, 1, 1, 1, 1, 1, 1); e_widget_frametable_object_append(o, e_widget_check_add(e, _("Protect this file"), &dummy_val), 0, 3, 2, 1, 1, 1, 1, 1); rg = e_widget_radio_group_new(&dummy_val); e_widget_frametable_object_append(o, e_widget_radio_add(e, _("Let others see this file"), 0, rg), 0, 4, 2, 1, 1, 1, 1, 1); e_widget_frametable_object_append(o, e_widget_radio_add(e, _("Let others modify this file"), 0, rg), 0, 5, 2, 1, 1, 1, 1, 1); e_widget_list_object_append(ol, hb, 1, 0, 0.0); e_widget_min_size_get(ol, &w, &h); return ol; } static Evas_Object * _e_fm_icon_prop_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Fm_Icon_CFData *cfdata) { } static void _e_fm_file_menu_properties(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; E_Config_Dialog *cfd; E_Config_Dialog_View v; file = data; /* methods */ v.create_cfdata = _e_fm_icon_prop_create_data; v.free_cfdata = _e_fm_icon_prop_free_data; v.basic.apply_cfdata = _e_fm_icon_prop_basic_apply_data; v.basic.create_widgets = _e_fm_icon_prop_basic_create_widgets; v.advanced.apply_cfdata = _e_fm_icon_prop_advanced_apply_data; v.advanced.create_widgets = _e_fm_icon_prop_advanced_create_widgets; /* create config diaolg for NULL object/data */ cfd = e_config_dialog_new(file->sd->win->container, _("Properties"), NULL, 0, &v, NULL); } #endif static void _e_fm_file_menu_properties(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_File *file; E_Win *win; Evas_Object *table; Evas_Object *name; Evas_Object *bg; Evas_Coord w, h; struct group *grp; struct passwd *usr; struct tm *t; char *fullname; char *size, *username, *groupname, *lastaccess, *lastmod, *permissions; char text[512]; E_Dialog *dia; Evas_Object *o, *ol, *hb; Evas_Coord mw, mh; E_Radio_Group *rg; Evas *e; file = data; size = E_NEW(char, 64); snprintf(size, 64, "%ld KB", file->attr->size / 1024); username = E_NEW(char, 128); // max length of username? usr = getpwuid(file->attr->owner); snprintf(username, 128, "%s", usr->pw_name); //free(usr); groupname = E_NEW(char, 128); // max length of group? grp = getgrgid(file->attr->group); snprintf(groupname, 128, "%s", grp->gr_name); //free(grp); t = gmtime(&file->attr->atime); lastaccess = E_NEW(char, 128); strftime(lastaccess, 128, "%a %b %d %T %Y", t); t = gmtime(&file->attr->mtime); lastmod = E_NEW(char, 128); strftime(lastmod, 128, "%a %b %d %T %Y", t); permissions = E_NEW(char, 128); // todo snprintf(permissions, 128, "%s", ""); dia = e_dialog_new(file->sd->win->container); e_dialog_title_set(dia, _("Properties")); e = e_win_evas_get(dia->win); ol = e_widget_list_add(e, 0, 0); hb = e_widget_list_add(e, 1, 1); o = e_widget_frametable_add(e, _("General"), 0); snprintf(text, 512, _("File:")); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 0, 0, 1, 1, 1, 1, 1, 1); snprintf(text, 512, "%s", file->attr->name); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 1, 0, 1, 1, 1, 1, 1, 1); snprintf(text, 512, _("Size:")); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 0, 1, 1, 1, 1, 1, 1, 1); snprintf(text, 512, "%s Kb", size); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 1, 1, 1, 1, 1, 1, 1, 1); snprintf(text, 512, _("Type:")); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 0, 2, 1, 1, 1, 1, 1, 1); snprintf(text, 512, "%s", "An Image"); e_widget_frametable_object_append(o, e_widget_label_add(e, text), 1, 2, 1, 1, 1, 1, 1, 1); e_widget_frametable_object_append(o, e_widget_check_add(e, _("Protect this file"), &dummy_val), 0, 3, 2, 1, 1, 1, 1, 1); rg = e_widget_radio_group_new(&dummy_val); e_widget_frametable_object_append(o, e_widget_radio_add(e, _("Let others see this file"), 0, rg), 0, 4, 2, 1, 1, 1, 1, 1); e_widget_frametable_object_append(o, e_widget_radio_add(e, _("Let others modify this file"), 0, rg), 0, 5, 2, 1, 1, 1, 1, 1); /* Use those in advanced dialog. snprintf(text, 512, _("Owner:")); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, "%s", username); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, _("Group:")); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, "%s", groupname); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, _("Type:")); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); switch(_e_fm_file_type(file)) { case E_FILEMAN_FILETYPE_DIRECTORY: snprintf(text, 512, _("Directory")); break; case E_FILEMAN_FILETYPE_FILE: snprintf(text, 512, _("File")); break; case E_FILEMAN_FILETYPE_SYMLINK: snprintf(text, 512, _("Symlink")); break; default: snprintf(text, 512, _("Unknown")); break; } e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, _("Last Access:")); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, "%s", lastaccess); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, _("Last Modification")); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); snprintf(text, 512, "%s", lastmod); e_widget_framelist_object_append(o, e_widget_label_add(e, text)); */ e_widget_list_object_append(hb, o, 0, 1, 0.0); /* use those in the advanced dialog o = e_widget_framelist_add(e, _("Permissions"), 0); e_widget_framelist_object_append(o, e_widget_label_add(e, _("User:"))); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Read"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Write"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Execute"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_label_add(e, _("Group:"))); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Read"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Write"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Execute"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_label_add(e, _("World:"))); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Read"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Write"), &dummy_val)); e_widget_framelist_object_append(o, e_widget_check_add(e, _("Execute"), &dummy_val)); e_widget_list_object_append(hb, o, 0, 0, 0.0); */ e_widget_list_object_append(ol, hb, 1, 0, 0.0); o = e_widget_button_add(e, _("Advanced"), "enlightenment/configuration", NULL, NULL, NULL); e_widget_list_object_append(ol, o, 0, 0, 1.0); e_widget_min_size_get(ol, &w, &h); e_dialog_content_set(dia, ol, w, h); e_dialog_button_add(dia, _("OK"), NULL, NULL, NULL); //e_dialog_button_add(dia, _("Apply"), "enlightenment/reset", NULL, NULL); e_dialog_button_add(dia, _("Cancel"), "enlightenment/exit", NULL, NULL); e_win_centered_set(dia->win, 1); e_dialog_show(dia); file->prop.dia = dia; return; } static void _e_fm_fake_mouse_up_cb(void *data) { E_Fm_Fake_Mouse_Up_Info *info; info = data; if (!info) return; evas_event_feed_mouse_up(info->canvas, info->button, EVAS_BUTTON_NONE, ecore_x_current_time_get(), NULL); free(info); } static void _e_fm_fake_mouse_up_later(Evas *evas, int button) { E_Fm_Fake_Mouse_Up_Info *info; info = E_NEW(E_Fm_Fake_Mouse_Up_Info, 1); if (!info) return; info->canvas = evas; info->button = button; ecore_job_add(_e_fm_fake_mouse_up_cb, info); } static void _e_fm_fake_mouse_up_all_later(Evas *evas) { _e_fm_fake_mouse_up_later(evas, 1); _e_fm_fake_mouse_up_later(evas, 2); _e_fm_fake_mouse_up_later(evas, 3); } static int _e_fm_dir_files_sort_name_cb(void *d1, void *d2) { E_Fm_File_Attributes *de1, *de2; de1 = d1; de2 = d2; return (strcmp(de1->name, de2->name)); } static int _e_fm_dir_files_sort_modtime_cb(void *d1, void *d2) { E_Fm_File_Attributes *de1, *de2; de1 = (E_Fm_File_Attributes*)d1; de2 = (E_Fm_File_Attributes*)d2; return (de1->mtime > de2->mtime); } static void _e_fm_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fm_Smart_Data *sd; Evas_Event_Mouse_Up *ev; sd = data; ev = event_info; if (!sd->selection.band.obj) return; if (sd->selection.band.enabled) { sd->selection.band.enabled = 0; evas_object_resize(sd->selection.band.obj, 1, 1); evas_object_hide(sd->selection.band.obj); sd->selection.band.files = evas_list_free(sd->selection.band.files); } } static void _e_fm_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fm_Smart_Data *sd; Evas_Event_Mouse_Move *ev; ev = event_info; sd = data; if (!sd->selection.band.obj) return; if (sd->selection.band.enabled) { Evas_Coord x, y, w, h; evas_object_geometry_get(sd->selection.band.obj, &x, &y, &w, &h); if ((ev->cur.canvas.x > sd->selection.band.x) && (ev->cur.canvas.y < sd->selection.band.y)) { /* growing towards top right */ evas_object_move(sd->selection.band.obj, sd->selection.band.x, ev->cur.canvas.y); evas_object_resize(sd->selection.band.obj, ev->cur.canvas.x - sd->selection.band.x, sd->selection.band.y - ev->cur.canvas.y); } else if ((ev->cur.canvas.x > sd->selection.band.x) && (ev->cur.canvas.y > sd->selection.band.y)) { /* growing towards bottom right */ w = ev->cur.canvas.x - sd->selection.band.x; h = ev->cur.canvas.y - sd->selection.band.y; evas_object_resize(sd->selection.band.obj, w, h); } else if ((ev->cur.canvas.x < sd->selection.band.x) && (ev->cur.canvas.y < sd->selection.band.y)) { /* growing towards top left */ evas_object_move(sd->selection.band.obj, ev->cur.canvas.x, ev->cur.canvas.y); evas_object_resize(sd->selection.band.obj, sd->selection.band.x - ev->cur.canvas.x, sd->selection.band.y - ev->cur.canvas.y); } else if ((ev->cur.canvas.x < sd->selection.band.x) && (ev->cur.canvas.y > sd->selection.band.y)) { /* growing towards button left */ evas_object_move(sd->selection.band.obj, ev->cur.canvas.x, sd->selection.band.y); evas_object_resize(sd->selection.band.obj, sd->selection.band.x - ev->cur.canvas.x, ev->cur.canvas.y - sd->selection.band.y); } evas_object_geometry_get(sd->selection.band.obj, &x, &y, &w, &h); _e_fm_selections_add_rect(sd, x, y, w, h); } } static void _e_fm_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fm_Smart_Data *sd; Evas_Event_Mouse_Down *ev; E_Menu *mn; E_Menu_Item *mi; int x, y, w, h; ev = event_info; sd = data; switch (ev->button) { case 1: if (!evas_key_modifier_is_set(evas_key_modifier_get(sd->evas), "Control")) _e_fm_selections_clear(sd); sd->selection.band.enabled = 1; evas_object_move(sd->selection.band.obj, ev->canvas.x, ev->canvas.y); evas_object_resize(sd->selection.band.obj, 1, 1); evas_object_show(sd->selection.band.obj); sd->selection.band.x = ev->canvas.x; sd->selection.band.y = ev->canvas.y; break; case 3: if (!sd->win) break; mn = e_menu_new(); sd->menu = mn; mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Arrange Icons")); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/arrange"), "fileman/button/arrange"); mn = e_menu_new(); e_menu_item_submenu_set(mi, mn); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("By Name")); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 2); if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_NAME) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/arrange_name"), "fileman/button/arrange_name"); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("By Mod Time")); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 2); if (sd->arrange == E_FILEMAN_CANVAS_ARRANGE_MODTIME) e_menu_item_toggle_set(mi, 1); e_menu_item_callback_set(mi, _e_fm_menu_arrange_cb, sd); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/arrange_time"), "fileman/button/arrange_time"); mi = e_menu_item_new(sd->menu); e_menu_item_label_set(mi, _("View")); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/view"), "fileman/button/view"); mn = e_menu_new(); e_menu_item_submenu_set(mi, mn); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Name Only")); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 2); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/view_name"), "fileman/button/view_name"); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Details")); e_menu_item_radio_set(mi, 1); e_menu_item_radio_group_set(mi, 2); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/view_details"), "fileman/button/view_details"); mi = e_menu_item_new(sd->menu); e_menu_item_label_set(mi, _("Refresh")); e_menu_item_callback_set(mi, _e_fm_menu_refresh_cb, sd); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/refresh"), "fileman/button/refresh"); mi = e_menu_item_new(sd->menu); e_menu_item_label_set(mi, _("Properties")); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/properties"), "fileman/button/properties"); ecore_evas_geometry_get(sd->win->ecore_evas, &x, &y, &w, &h); e_menu_activate_mouse(sd->menu, sd->win->border->zone, ev->output.x + x, ev->output.y + y, 1, 1, E_MENU_POP_DIRECTION_DOWN, ev->timestamp); _e_fm_fake_mouse_up_all_later(sd->win->evas); break; } } static void _e_fm_file_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fm_File *file; Evas_Event_Mouse_Move *ev; ev = event_info; file = data; file->sd->drag.start = 0; } // TODO: // - send signals to edje for animations etc... static void _e_fm_file_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fm_File *file; Evas_Event_Mouse_Down *ev; ev = event_info; file = data; if (ev->button == 1) { if (_e_fm_file_type(file) == E_FILEMAN_FILETYPE_DIRECTORY && (ev->flags == EVAS_BUTTON_DOUBLE_CLICK)) { char *fullname = NULL; file->sd->drag.start = 0; if (!strcmp(file->attr->name, ".")) return; if (!strcmp(file->attr->name, "..")) { fullname = _e_fm_dir_pop(file->sd->dir); } else { fullname = _e_fm_file_fullname(file); } /* FIXME: we need to fix this, uber hack alert */ if (fullname) { if (file->sd->win) e_win_title_set(file->sd->win, fullname); _e_fm_dir_set(file->sd, fullname); free(fullname); } } else if (_e_fm_file_type(file) == E_FILEMAN_FILETYPE_FILE && (ev->flags == EVAS_BUTTON_DOUBLE_CLICK)) { char *fullname; file->sd->drag.start = 0; fullname = _e_fm_file_fullname(file); if(!_e_fm_file_open_assoc(file)) if (_e_fm_file_can_exec(file)) _e_fm_file_exec(file); free(fullname); } else { file->sd->drag.start = 1; file->sd->drag.y = -1; file->sd->drag.x = -1; file->sd->drag.file = file; if (!file->state.selected) { if (evas_key_modifier_is_set(evas_key_modifier_get(file->sd->evas), "Control")) file->sd->selection.files = evas_list_append(file->sd->selection.files, file); else _e_fm_selections_clear(file->sd); _e_fm_selections_add(file); } else { if (evas_key_modifier_is_set(evas_key_modifier_get(file->sd->evas), "Control")) _e_fm_selections_del(file); else { _e_fm_selections_clear(file->sd); _e_fm_selections_add(file); } } } } else if (ev->button == 3) { E_Menu *mn; E_Menu_Item *mi; int x, y, w, h; _e_fm_selections_clear(file->sd); _e_fm_selections_add(file); mn = e_menu_new(); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Open")); e_menu_item_callback_set(mi, _e_fm_file_menu_open, file); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/open"), "fileman/button/open"); mi = e_menu_item_new(mn); e_menu_item_separator_set(mi, 1); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Copy")); e_menu_item_callback_set(mi, _e_fm_file_menu_copy, file); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/copy"), "fileman/button/copy"); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Cut")); e_menu_item_callback_set(mi, _e_fm_file_menu_cut, file); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/cut"), "fileman/button/cut"); mi = e_menu_item_new(mn); e_menu_item_separator_set(mi, 1); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Rename")); e_menu_item_callback_set(mi, _e_fm_file_menu_rename, file); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/rename"), "fileman/button/rename"); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Delete")); e_menu_item_callback_set(mi, _e_fm_file_menu_delete, file); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/delete"), "fileman/button/delete"); mi = e_menu_item_new(mn); e_menu_item_separator_set(mi, 1); mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Properties")); e_menu_item_callback_set(mi, _e_fm_file_menu_properties, file); e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman", "fileman/button/properties"), "fileman/button/properties"); file->menu = mn; if (!file->sd->win) return; ecore_evas_geometry_get(file->sd->win->ecore_evas, &x, &y, &w, &h); e_menu_activate_mouse(file->menu, file->sd->win->border->zone, ev->output.x + x, ev->output.y + y, 1, 1, E_MENU_POP_DIRECTION_DOWN, ev->timestamp); _e_fm_fake_mouse_up_all_later(file->sd->win->evas); } } static void _e_fm_file_icon_mouse_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fm_File *file; Evas_Event_Mouse_In *ev; ev = event_info; file = data; edje_object_signal_emit(file->icon, "hilight", ""); edje_object_signal_emit(file->icon_img, "hilight", ""); } static void _e_fm_file_icon_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) { E_Fm_File *file; Evas_Event_Mouse_Out *ev; ev = event_info; file = data; edje_object_signal_emit(file->icon, "default", ""); edje_object_signal_emit(file->icon_img, "default", ""); } static void _e_fm_menu_arrange_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_Smart_Data *sd; sd = data; switch (e_menu_item_num_get(mi)) { case E_FILEMAN_CANVAS_ARRANGE_NAME: sd->files = evas_list_sort(sd->files, evas_list_count(sd->files), _e_fm_dir_files_sort_name_cb); sd->arrange = E_FILEMAN_CANVAS_ARRANGE_NAME; _e_fm_redraw(sd); // no_new break; case E_FILEMAN_CANVAS_ARRANGE_MODTIME: sd->files = evas_list_sort(sd->files, evas_list_count(sd->files), _e_fm_dir_files_sort_modtime_cb); sd->arrange = E_FILEMAN_CANVAS_ARRANGE_MODTIME; _e_fm_redraw(sd); // no new break; } } static void _e_fm_drop_cb(E_Drag *drag, int dropped) { /* FIXME: If someone takes this internal drop, we might want to not free it */ free(drag->data); } // TODO: add images for icons with image thumb and not edje part static int _e_fm_win_mouse_move_cb(void *data, int type, void *event) { E_Fm_Smart_Data *sd; E_Fm_File *file; Ecore_X_Event_Mouse_Move *ev; ev = event; sd = data; file = sd->drag.file; if (!file) return 1; if (sd->drag.start) { if ((sd->drag.x == -1) && (sd->drag.y == -1)) { sd->drag.x = ev->root.x; sd->drag.y = ev->root.y; } else { int dx, dy; dx = sd->drag.x - ev->root.x; dy = sd->drag.y - ev->root.y; if (((dx * dx) + (dy * dy)) > (100)) { E_Drag *drag; Evas_Object *o = NULL; Evas_Coord x, y, w, h; int cx, cy; char data[PATH_MAX]; const char *path = NULL, *part = NULL; const char *drop_types[] = { "text/uri-list" }; snprintf(data, sizeof(data), "file://%s/%s", sd->dir, file->attr->name); ecore_evas_geometry_get(sd->win->ecore_evas, &cx, &cy, NULL, NULL); evas_object_geometry_get(file->icon_img, &x, &y, &w, &h); drag = e_drag_new(sd->win->container, cx + x, cy + y, drop_types, 1, strdup(data), strlen(data), _e_fm_drop_cb); edje_object_file_get(file->icon_img, &path, &part); if ((path) && (part)) { o = edje_object_add(drag->evas); edje_object_file_set(o, path, part); } else { int iw, ih; o = evas_object_image_add(drag->evas); evas_object_image_size_get(file->icon_img, &iw, &ih); evas_object_image_size_set(o, iw, ih); evas_object_image_data_copy_set(o, evas_object_image_data_get(file->icon_img, 0)); evas_object_image_data_update_add(o, 0, 0, iw, ih); evas_object_image_fill_set(o, 0, 0, iw, ih); evas_object_resize(o, iw, ih); } if (!o) { /* FIXME: fallback icon for drag */ o = evas_object_rectangle_add(drag->evas); evas_object_color_set(o, 255, 255, 255, 255); } e_drag_object_set(drag, o); e_drag_resize(drag, w, h); e_drag_xdnd_start(drag, sd->drag.x, sd->drag.y); evas_event_feed_mouse_up(sd->evas, 1, EVAS_BUTTON_NONE, ev->time, NULL); sd->drag.start = 0; } } } return 1; } static int _e_fm_drop_enter_cb(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Enter *ev; E_Fm_Smart_Data *sd; ev = event; sd = data; if (ev->win != sd->win->evas_win) return 1; return 1; } static int _e_fm_drop_leave_cb(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Leave *ev; E_Fm_Smart_Data *sd; ev = event; sd = data; if (ev->win != sd->win->evas_win) return 1; return 1; } static int _e_fm_drop_position_cb(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Position *ev; E_Fm_Smart_Data *sd; Ecore_X_Rectangle rect; ev = event; sd = data; if (ev->win != sd->win->evas_win) return 1; rect.x = 0; rect.y = 0; rect.width = 0; rect.height = 0; ecore_x_dnd_send_status(1, 0, rect, ECORE_X_DND_ACTION_PRIVATE); return 1; } static int _e_fm_drop_drop_cb(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Drop *ev; E_Fm_Smart_Data *sd; ev = event; sd = data; if (ev->win != sd->win->evas_win) return 1; ecore_x_selection_xdnd_request(sd->win->evas_win, "text/uri-list"); return 1; } static int _e_fm_drop_selection_cb(void *data, int type, void *event) { Ecore_X_Event_Selection_Notify *ev; E_Fm_Smart_Data *sd; Ecore_X_Selection_Data_Files *files; int i; ev = event; sd = data; if (ev->win != sd->win->evas_win) return 1; files = ev->data; for (i = 0; i < files->num_files; i++) { char new_file[PATH_MAX]; snprintf(new_file, PATH_MAX, "%s/%s", sd->dir, ecore_file_get_file(files->files[i])); ecore_file_cp(strstr(files->files[i], "/"), new_file); } ecore_x_dnd_send_finished(); _e_fm_redraw_new(sd); return 1; } static void _e_fm_menu_refresh_cb(void *data, E_Menu *m, E_Menu_Item *mi) { E_Fm_Smart_Data *sd; sd = data; // optimize!! _e_fm_redraw_new(sd); } static int _e_fm_grabbed_mouse_up_cb(void *data, int type, void *event) { Ecore_X_Event_Mouse_Button_Up *ev; double t; E_Fm_File *file; const char *name; ev = event; file = data; t = ecore_time_get() - _e_fm_grab_time; if (t < 1.0) return 1; name = e_entry_text_get(file->entry); edje_object_part_unswallow(file->icon, file->entry); evas_object_focus_set(file->entry, 0); evas_object_del(file->entry); file->entry = NULL; _e_fm_file_rename(file, name); ecore_event_handler_del(_e_fm_mouse_up_handler); e_grabinput_release(file->sd->win->evas_win, file->sd->win->evas_win); return 0; } static E_Fm_File_Type _e_fm_file_type(E_Fm_File *file) { if (S_ISDIR(file->attr->mode)) return E_FILEMAN_FILETYPE_DIRECTORY; /* TODO: Handle links differently */ if (S_ISREG(file->attr->mode) || S_ISLNK(file->attr->mode)) return E_FILEMAN_FILETYPE_FILE; return E_FILEMAN_FILETYPE_UNKNOWN; } static Evas_Bool _e_fm_file_open_assoc(E_Fm_File *file) { char fullname[PATH_MAX * 2]; Evas_List *l; E_Fm_Assoc_App *assoc; Ecore_Exe *exe; for (l = file->sd->conf.main->apps; l; l = l->next) { char *ext; assoc = l->data; ext = strrchr(file->attr->name, '.'); if(!strcasecmp(ext, assoc->mime)) break; assoc = NULL; } if(!assoc) return FALSE; snprintf(fullname, PATH_MAX * 2, "%s %s", assoc->app, _e_fm_file_fullname(file)); printf("running: %s\n", fullname); exe = ecore_exe_run(fullname, NULL); if (!exe) { e_error_dialog_show(_("Run Error"), _("Enlightenment was unable fork a child process:\n" "\n" "%s\n" "\n"), fullname); return TRUE; } ecore_exe_tag_set(exe, "E/app"); return TRUE; } static Evas_Bool _e_fm_file_can_exec(E_Fm_File *file) { char *ext; char *fullname; ext = strrchr(file->attr->name, '.'); if(ext) { if(!strcasecmp(ext, ".eap")) return TRUE; } fullname = _e_fm_file_fullname(file); if(ecore_file_can_exec(fullname)) { free(fullname); return TRUE; } free(fullname); return FALSE; } static void _e_fm_file_exec(E_Fm_File *file) { Ecore_Exe *exe; char *fullname, *ext; ext = strrchr(file->attr->name, '.'); if(ext) { if(!strcasecmp(ext, ".eap")) { E_App *e_app; Ecore_Exe *exe; fullname = _e_fm_file_fullname(file); e_app = e_app_new(fullname, NULL); free(fullname); if(!e_app) return; exe = ecore_exe_run(e_app->exe, NULL); if (exe) ecore_exe_free(exe); e_object_unref(E_OBJECT(e_app)); return; } } fullname = _e_fm_file_fullname(file); exe = ecore_exe_run(fullname, NULL); if (!exe) { e_error_dialog_show(_("Run Error"), _("Enlightenment was unable fork a child process:\n" "\n" "%s\n" "\n"), fullname); free(fullname); return; } ecore_exe_tag_set(exe, "E/app"); free(fullname); } static char * _e_fm_file_fullname(E_Fm_File *file) { char fullname[PATH_MAX]; if (!strcmp(file->sd->dir, "/")) snprintf(fullname, sizeof(fullname), "/%s", file->attr->name); else snprintf(fullname, sizeof(fullname), "%s/%s", file->sd->dir, file->attr->name); return strdup(fullname); }