2 #include "e_fm_device.h"
6 #define ICON_BOTTOM_SPACE 100
8 /* in order to check files (ie: extensions) use simpler and faster
9 * strcasecmp version that instead of checking case for each
10 * character, check just the first and if it's upper, assume
11 * everything is uppercase, otherwise assume everything is lowercase.
13 //#define E_FM2_SIMPLE_STRCASE_FILES 1
15 /* FIXME: this is NOT complete. dnd not complete (started). only list view
16 * works. in icon view it needs to be much better about placement of icons and
17 * being able to save/load icon placement. it doesn't support backgrounds or
18 * custom frames or icons yet
21 typedef enum _E_Fm2_Action_Type
28 typedef struct _E_Fm2_Smart_Data E_Fm2_Smart_Data;
29 typedef struct _E_Fm2_Region E_Fm2_Region;
30 typedef struct _E_Fm2_Finfo E_Fm2_Finfo;
31 typedef struct _E_Fm2_Action E_Fm2_Action;
32 typedef struct _E_Fm2_Client E_Fm2_Client;
33 typedef struct _E_Fm2_Uri E_Fm2_Uri;
34 typedef struct _E_Fm2_Context_Menu_Data E_Fm2_Context_Menu_Data;
36 struct _E_Fm2_Smart_Data
39 Evas_Coord x, y, w, h, pw, ph;
42 Evas_Object *underlay;
46 Evas_Object *sel_rect;
70 } start, end, replace;
71 E_Fm2_Menu_Flags flags;
75 Eina_List *icons_place;
77 Ecore_Timer *scan_timer;
78 Ecore_Idler *sort_idler;
79 Ecore_Job *scroll_job;
80 Ecore_Job *resize_job;
81 Ecore_Job *refresh_job;
83 E_Entry_Dialog *entry_dialog;
84 E_Dialog *image_dialog;
85 Eina_Bool iconlist_changed : 1;
86 Eina_Bool order_file : 1;
87 Eina_Bool typebuf_visible : 1;
88 Eina_Bool show_hidden_files : 1;
89 Eina_Bool listing : 1;
90 Eina_Bool inherited_dir_props : 1;
91 signed char view_mode; /* -1 = unset */
92 signed short icon_size; /* -1 = unset */
93 E_Fm2_View_Flags view_flags;
96 const char *custom_theme;
97 const char *custom_theme_content;
101 Evas_Object *obj, *obj2;
102 Eina_List *last_insert;
103 Eina_List **list_index;
112 Eina_Bool deletions : 1;
124 E_Drop_Handler *drop_handler;
125 E_Fm2_Icon *drop_icon;
127 signed char drop_after;
128 Eina_Bool drop_show : 1;
129 Eina_Bool drop_in_show : 1;
130 Eina_Bool drop_all : 1;
132 Eina_Bool selecting : 1;
139 E_Fm2_Icon *iop_icon;
141 Eina_List *event_handlers;
146 E_Fm2_Smart_Data *sd;
147 Evas_Coord x, y, w, h;
149 Eina_Bool realized : 1;
154 E_Fm2_Smart_Data *sd;
155 E_Fm2_Region *region;
156 Evas_Coord x, y, w, h, min_w, min_h;
157 Evas_Object *obj, *obj_icon;
158 int saved_x, saved_y;
161 E_Entry_Dialog *entry_dialog;
162 Evas_Object *entry_widget;
163 E_Config_Dialog *prop_dialog;
166 E_Fm2_Icon_Info info;
176 Eina_Bool realized : 1;
177 Eina_Bool selected : 1;
178 Eina_Bool last_selected : 1;
179 Eina_Bool saved_pos : 1;
181 Eina_Bool down_sel : 1;
182 Eina_Bool removable_state_change : 1;
183 Eina_Bool thumb_failed : 1;
196 E_Fm2_Action_Type type;
205 Ecore_Ipc_Client *cl;
211 const char *hostname;
215 struct _E_Fm2_Context_Menu_Data
218 E_Fm2_Mime_Handler *handler;
221 static const char *_e_fm2_dev_path_map(const char *dev, const char *path);
222 static void _e_fm2_file_add(Evas_Object *obj, const char *file, int unique, const char *file_rel, int after, E_Fm2_Finfo *finf);
223 static void _e_fm2_file_del(Evas_Object *obj, const char *file);
224 static void _e_fm2_queue_process(Evas_Object *obj);
225 static void _e_fm2_queue_free(Evas_Object *obj);
226 static void _e_fm2_regions_free(Evas_Object *obj);
227 static void _e_fm2_regions_populate(Evas_Object *obj);
228 static void _e_fm2_icons_place(Evas_Object *obj);
229 static void _e_fm2_icons_free(Evas_Object *obj);
230 static void _e_fm2_regions_eval(Evas_Object *obj);
231 static void _e_fm2_config_free(E_Fm2_Config *cfg);
233 static void _e_fm2_dir_load_props(E_Fm2_Smart_Data *sd);
234 static void _e_fm2_dir_save_props(E_Fm2_Smart_Data *sd);
236 static Evas_Object *_e_fm2_file_fm2_find(const char *file);
237 static E_Fm2_Icon *_e_fm2_icon_find(Evas_Object *obj, const char *file);
238 static const char *_e_fm2_uri_escape(const char *path);
239 static Eina_List *_e_fm2_uri_path_list_get(Eina_List *uri_list);
240 static Eina_List *_e_fm2_uri_icon_list_get(Eina_List *uri);
242 static E_Fm2_Icon *_e_fm2_icon_new(E_Fm2_Smart_Data *sd, const char *file, E_Fm2_Finfo *finf);
243 static void _e_fm2_icon_unfill(E_Fm2_Icon *ic);
244 static int _e_fm2_icon_fill(E_Fm2_Icon *ic, E_Fm2_Finfo *finf);
245 static void _e_fm2_icon_free(E_Fm2_Icon *ic);
246 static void _e_fm2_icon_realize(E_Fm2_Icon *ic);
247 static void _e_fm2_icon_unrealize(E_Fm2_Icon *ic);
248 static Eina_Bool _e_fm2_icon_visible(const E_Fm2_Icon *ic);
249 static void _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj);
250 static Evas_Object *_e_fm2_icon_icon_direct_set(E_Fm2_Icon *ic, Evas_Object *o, Evas_Smart_Cb gen_func, void *data, int force_gen);
251 static void _e_fm2_icon_icon_set(E_Fm2_Icon *ic);
252 static void _e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force);
253 static void _e_fm2_icon_select(E_Fm2_Icon *ic);
254 static void _e_fm2_icon_deselect(E_Fm2_Icon *ic);
255 static int _e_fm2_icon_desktop_load(E_Fm2_Icon *ic);
257 static E_Fm2_Region *_e_fm2_region_new(E_Fm2_Smart_Data *sd);
258 static void _e_fm2_region_free(E_Fm2_Region *rg);
259 static void _e_fm2_region_realize(E_Fm2_Region *rg);
260 static void _e_fm2_region_unrealize(E_Fm2_Region *rg);
261 static int _e_fm2_region_visible(E_Fm2_Region *rg);
263 static void _e_fm2_icon_make_visible(E_Fm2_Icon *ic);
264 static void _e_fm2_icon_desel_any(Evas_Object *obj);
265 static E_Fm2_Icon *_e_fm2_icon_first_selected_find(Evas_Object *obj);
266 static E_Fm2_Icon *_e_fm2_icon_next_find(Evas_Object *obj, int next, int (*match_func)(E_Fm2_Icon *ic, void *data), void *data);
268 static void _e_fm2_icon_sel_first(Evas_Object *obj);
269 static void _e_fm2_icon_sel_last(Evas_Object *obj);
270 static void _e_fm2_icon_sel_any(Evas_Object *obj);
271 static void _e_fm2_icon_sel_prev(Evas_Object *obj);
272 static void _e_fm2_icon_sel_next(Evas_Object *obj);
273 static void _e_fm2_icon_sel_down(Evas_Object *obj);
274 static void _e_fm2_icon_sel_up(Evas_Object *obj);
276 static void _e_fm2_typebuf_show(Evas_Object *obj);
277 static void _e_fm2_typebuf_hide(Evas_Object *obj);
278 //static void _e_fm2_typebuf_history_prev(Evas_Object *obj);
279 //static void _e_fm2_typebuf_history_next(Evas_Object *obj);
280 static void _e_fm2_typebuf_run(Evas_Object *obj);
281 static void _e_fm2_typebuf_match(Evas_Object *obj, int next);
282 static void _e_fm2_typebuf_complete(Evas_Object *obj);
283 static void _e_fm2_typebuf_char_append(Evas_Object *obj, const char *ch);
284 static void _e_fm2_typebuf_char_backspace(Evas_Object *obj);
286 static void _e_fm2_cb_dnd_enter(void *data, const char *type, void *event);
287 static void _e_fm2_cb_dnd_move(void *data, const char *type, void *event);
288 static void _e_fm2_cb_dnd_leave(void *data, const char *type, void *event);
289 static void _e_fm2_cb_dnd_drop(void *data, const char *type, void *event);
290 static void _e_fm2_cb_icon_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
291 static void _e_fm2_cb_icon_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
292 static void _e_fm2_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
293 static void _e_fm2_cb_icon_thumb_dnd_gen(void *data, Evas_Object *obj, void *event_info);
294 static void _e_fm2_cb_icon_thumb_gen(void *data, Evas_Object *obj, void *event_info);
295 static void _e_fm2_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
296 static void _e_fm2_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
297 static void _e_fm2_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
298 static void _e_fm2_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
299 static void _e_fm2_cb_scroll_job(void *data);
300 static void _e_fm2_cb_resize_job(void *data);
301 static int _e_fm2_cb_icon_sort(const void *data1, const void *data2);
302 static Eina_Bool _e_fm2_cb_scan_timer(void *data);
303 static Eina_Bool _e_fm2_cb_sort_idler(void *data);
304 static Eina_Bool _e_fm2_cb_theme(void *data, int type __UNUSED__, void *event __UNUSED__);
306 static void _e_fm2_obj_icons_place(E_Fm2_Smart_Data *sd);
308 static void _e_fm2_smart_add(Evas_Object *object);
309 static void _e_fm2_smart_del(Evas_Object *object);
310 static void _e_fm2_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y);
311 static void _e_fm2_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h);
312 static void _e_fm2_smart_show(Evas_Object *object);
313 static void _e_fm2_smart_hide(Evas_Object *object);
314 static void _e_fm2_smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
315 static void _e_fm2_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
316 static void _e_fm2_smart_clip_unset(Evas_Object *obj);
318 static void _e_fm2_menu(Evas_Object *obj, unsigned int timestamp);
319 static void _e_fm2_menu_post_cb(void *data, E_Menu *m);
320 static void _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp);
321 static void _e_fm2_icon_menu_post_cb(void *data, E_Menu *m);
322 static void _e_fm2_icon_menu_item_cb(void *data, E_Menu *m, E_Menu_Item *mi);
323 static void _e_fm2_icon_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi);
324 static void _e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m, E_Menu_Item *mi);
325 static void _e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi);
326 static void _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi);
327 static void _e_fm2_view_menu_custom_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi);
328 static void _e_fm2_view_menu_list_cb(void *data, E_Menu *m, E_Menu_Item *mi);
329 static void _e_fm2_view_menu_use_default_cb(void *data, E_Menu *m, E_Menu_Item *mi);
330 static void _e_fm2_view_menu_set_background_cb(void *data, E_Menu *m, E_Menu_Item *mi);
331 static void _e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m, E_Menu_Item *mi);
332 static void _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title, void (*ok_cb)(void *data, E_Dialog *dia), void (*clear_cb)(void *data, E_Dialog *dia));
333 static void _e_fm2_view_image_sel_close(void *data, E_Dialog *dia);
334 static void _e_fm2_refresh(void *data, E_Menu *m, E_Menu_Item *mi);
335 static void _e_fm2_toggle_hidden_files(void *data, E_Menu *m, E_Menu_Item *mi);
336 static void _e_fm2_toggle_ordering(void *data, E_Menu *m, E_Menu_Item *mi);
337 static void _e_fm2_sort(void *data, E_Menu *m, E_Menu_Item *mi);
338 static void _e_fm2_new_directory(void *data, E_Menu *m, E_Menu_Item *mi);
339 static void _e_fm2_new_directory_delete_cb(void *obj);
340 static void _e_fm2_new_directory_yes_cb(char *text, void *data);
341 static void _e_fm2_new_directory_no_cb(void *data);
342 static void _e_fm2_file_rename(void *data, E_Menu *m, E_Menu_Item *mi);
343 static void _e_fm2_file_rename_delete_cb(void *obj);
344 static void _e_fm2_file_rename_yes_cb(char *text, void *data);
345 static void _e_fm2_file_rename_no_cb(void *data);
346 static void _e_fm2_file_application_properties(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__);
347 static void _e_fm2_file_properties(void *data, E_Menu *m, E_Menu_Item *mi);
348 static void _e_fm2_file_properties_delete_cb(void *obj);
349 static void _e_fm2_file_do_rename(const char *text, E_Fm2_Icon *ic);
351 static Evas_Object *_e_fm2_icon_entry_widget_add(E_Fm2_Icon *ic);
352 static void _e_fm2_icon_entry_widget_del(E_Fm2_Icon *ic);
353 static void _e_fm2_icon_entry_widget_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
354 static void _e_fm2_icon_entry_widget_accept(E_Fm2_Icon *ic);
356 static E_Dialog *_e_fm_retry_abort_dialog(int pid, const char *str);
357 static void _e_fm_retry_abort_delete_cb(void *obj);
358 static void _e_fm_retry_abort_retry_cb(void *data, E_Dialog *dialog);
359 static void _e_fm_retry_abort_abort_cb(void *data, E_Dialog *dialog);
361 static E_Dialog *_e_fm_overwrite_dialog(int pid, const char *str);
362 static void _e_fm_overwrite_delete_cb(void *obj);
363 static void _e_fm_overwrite_no_cb(void *data, E_Dialog *dialog);
364 static void _e_fm_overwrite_no_all_cb(void *data, E_Dialog *dialog);
365 static void _e_fm_overwrite_yes_cb(void *data, E_Dialog *dialog);
366 static void _e_fm_overwrite_yes_all_cb(void *data, E_Dialog *dialog);
368 static E_Dialog *_e_fm_error_dialog(int pid, const char *str);
369 static void _e_fm_error_delete_cb(void *obj);
370 static void _e_fm_error_retry_cb(void *data, E_Dialog *dialog);
371 static void _e_fm_error_abort_cb(void *data, E_Dialog *dialog);
372 static void _e_fm_error_ignore_this_cb(void *data, E_Dialog *dialog);
373 static void _e_fm_error_ignore_all_cb(void *data, E_Dialog *dialog);
375 static void _e_fm_device_error_dialog(const char *title, const char *msg, const char *pstr);
377 static void _e_fm2_file_delete(Evas_Object *obj);
378 static void _e_fm2_file_delete_menu(void *data, E_Menu *m, E_Menu_Item *mi);
379 static void _e_fm2_file_delete_delete_cb(void *obj);
380 static void _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog);
381 static void _e_fm2_file_delete_no_cb(void *data, E_Dialog *dialog);
382 static void _e_fm2_refresh_job_cb(void *data);
383 static void _e_fm_file_buffer_clear(void);
384 static void _e_fm2_file_cut(Evas_Object *obj);
385 static void _e_fm2_file_copy(Evas_Object *obj);
386 static void _e_fm2_file_paste(Evas_Object *obj);
387 static void _e_fm2_file_symlink(Evas_Object *obj);
388 static void _e_fm2_file_cut_menu(void *data, E_Menu *m, E_Menu_Item *mi);
389 static void _e_fm2_file_copy_menu(void *data, E_Menu *m, E_Menu_Item *mi);
390 static void _e_fm2_file_paste_menu(void *data, E_Menu *m, E_Menu_Item *mi);
391 static void _e_fm2_file_symlink_menu(void *data, E_Menu *m, E_Menu_Item *mi);
393 static void _e_fm2_live_file_add(Evas_Object *obj, const char *file, const char *file_rel, int after, E_Fm2_Finfo *finf);
394 static void _e_fm2_live_file_del(Evas_Object *obj, const char *file);
395 static void _e_fm2_live_file_changed(Evas_Object *obj, const char *file, E_Fm2_Finfo *finf);
396 static void _e_fm2_live_process_begin(Evas_Object *obj);
397 static void _e_fm2_live_process_end(Evas_Object *obj);
398 static void _e_fm2_live_process(Evas_Object *obj);
399 static Eina_Bool _e_fm2_cb_live_idler(void *data);
400 static Eina_Bool _e_fm2_cb_live_timer(void *data);
402 static int _e_fm2_theme_edje_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group);
403 static int _e_fm2_theme_edje_icon_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group);
405 static void _e_fm2_mouse_1_handler(E_Fm2_Icon *ic, int up, void *evas_event);
407 static void _e_fm2_client_spawn(void);
408 static E_Fm2_Client *_e_fm2_client_get(void);
409 static int _e_fm2_client_monitor_add(const char *path);
410 static void _e_fm2_client_monitor_del(int id, const char *path);
411 static int _e_fm_client_file_del(const char *args, Evas_Object *e_fm);
412 //static int _e_fm2_client_file_trash(const char *path, Evas_Object *e_fm);
413 static int _e_fm2_client_file_mkdir(const char *path, const char *rel, int rel_to, int x, int y, int res_w, int res_h, Evas_Object *e_fm);
414 static int _e_fm_client_file_move(const char *args, Evas_Object *e_fm);
415 static int _e_fm2_client_file_symlink(const char *path, const char *dest, const char *rel, int rel_to, int x, int y, int res_w, int res_h, Evas_Object *e_fm);
416 static int _e_fm_client_file_copy(const char *args, Evas_Object *e_fm);
417 static int _e_fm_client_file_symlink(const char *args, Evas_Object *e_fm);
419 static void _e_fm2_sel_rect_update(void *data);
420 static inline void _e_fm2_context_menu_append(Evas_Object *obj, const char *path, Eina_List *l, E_Menu *mn, E_Fm2_Icon *ic);
421 static int _e_fm2_context_list_sort(const void *data1, const void *data2);
423 static char *_e_fm_string_append_char(char *str, size_t *size, size_t *len, char c);
424 static char *_e_fm_string_append_quoted(char *str, size_t *size, size_t *len, const char *src);
426 void _e_fm2_path_parent_set(Evas_Object *obj, const char *path);
428 static void _e_fm2_volume_mount(void *data, E_Menu *m, E_Menu_Item *mi);
429 static void _e_fm2_volume_unmount(void *data, E_Menu *m, E_Menu_Item *mi);
430 static void _e_fm2_volume_eject(void *data, E_Menu *m, E_Menu_Item *mi);
432 static void _e_fm2_icon_removable_update(E_Fm2_Icon *ic);
433 static void _e_fm2_volume_icon_update(E_Volume *v);
435 static void _e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere);
437 static char *_e_fm2_meta_path = NULL;
438 static Evas_Smart *_e_fm2_smart = NULL;
439 static Eina_List *_e_fm2_list = NULL;
440 static Eina_List *_e_fm2_list_remove = NULL;
441 static int _e_fm2_list_walking = 0;
442 static Eina_List *_e_fm2_client_list = NULL;
443 static Eina_List *_e_fm2_menu_contexts = NULL;
444 static Eina_List *_e_fm_file_buffer = NULL; /* Files for copy&paste are saved here. */
445 static int _e_fm_file_buffer_cutting = 0;
446 static int _e_fm_file_buffer_copying = 0;
447 static const char *_e_fm2_icon_desktop_str = NULL;
448 static const char *_e_fm2_icon_thumb_str = NULL;
449 static const char *_e_fm2_mime_inode_directory = NULL;
450 static const char *_e_fm2_mime_app_desktop = NULL;
451 static const char *_e_fm2_mime_app_edje = NULL;
452 static const char *_e_fm2_mime_text_uri_list = NULL;
454 static Ecore_Timer *_e_fm2_mime_flush = NULL;
455 static Ecore_Timer *_e_fm2_mime_clear = NULL;
462 * _e_volume_edd_new()
463 * _e_storage_edd_new()
464 * _e_storage_volume_edd_init()
465 * _e_storage_volume_edd_shutdown()
468 #include "e_fm_shared_codec.h"
470 static inline Eina_Bool
471 _e_fm2_icon_realpath(const E_Fm2_Icon *ic, char *buf, int buflen)
473 int r = snprintf(buf, buflen, "%s/%s", ic->sd->realpath, ic->info.file);
477 static inline Eina_Bool
478 _e_fm2_icon_path(const E_Fm2_Icon *ic, char *buf, int buflen)
480 int r = snprintf(buf, buflen, "%s/%s", ic->sd->path, ic->info.file);
484 static inline Eina_Bool
485 _e_fm2_ext_is_edje(const char *ext)
487 #if E_FM2_SIMPLE_STRCASE_FILES
488 if ((ext[0] == 'e') && (ext[1] == 'd') && (ext[2] == 'j'))
490 else if ((ext[0] == 'E') && (ext[1] == 'D') && (ext[2] == 'J'))
495 return strcasecmp(ext, "edj") == 0;
499 static inline Eina_Bool
500 _e_fm2_ext_is_desktop(const char *ext)
502 #if E_FM2_SIMPLE_STRCASE_FILES
503 if ((ext[0] == 'd') &&
504 ((strcmp(ext + 1, "esktop") == 0) ||
505 (strcmp(ext + 1, "irectory") == 0)))
507 else if ((ext[0] == 'D') &&
508 ((strcmp(ext + 1, "ESKTOP") == 0) ||
509 (strcmp(ext + 1, "IRECTORY") == 0)))
514 if ((ext[0] != 'd') && (ext[0] != 'D'))
518 return (strcasecmp(ext, "esktop") == 0) ||
519 (strcasecmp(ext, "irectory") == 0);
523 static inline Eina_Bool
524 _e_fm2_ext_is_imc(const char *ext)
526 #if E_FM2_SIMPLE_STRCASE_FILES
527 if ((ext[0] == 'i') && (ext[1] == 'm') && (ext[2] == 'c'))
529 else if ((ext[0] == 'I') && (ext[1] == 'M') && (ext[2] == 'C'))
534 return strcasecmp(ext, "imc") == 0;
538 static inline Eina_Bool
539 _e_fm2_file_is_edje(const char *file)
541 const char *p = strrchr(file, '.');
542 return (p) && (_e_fm2_ext_is_edje(p + 1));
545 static inline Eina_Bool
546 _e_fm2_file_is_desktop(const char *file)
548 const char *p = strrchr(file, '.');
549 return (p) && (_e_fm2_ext_is_desktop(p + 1));
553 _e_fm2_view_mode_get(const E_Fm2_Smart_Data *sd)
555 if (sd->view_mode > -1)
556 return sd->view_mode;
557 return sd->config->view.mode;
560 static inline Evas_Coord
561 _e_fm2_icon_w_get(const E_Fm2_Smart_Data *sd)
563 if (sd->icon_size > -1)
564 return sd->icon_size * e_scale;
565 if (sd->config->icon.icon.w)
566 return sd->config->icon.icon.w;
567 return sd->config->icon.list.w;
570 static inline Evas_Coord
571 _e_fm2_icon_h_get(const E_Fm2_Smart_Data *sd)
573 if (sd->icon_size > -1)
574 return sd->icon_size * e_scale;
575 if (sd->config->icon.icon.h)
576 return sd->config->icon.icon.h;
577 return sd->config->icon.list.h;
580 static inline unsigned int
581 _e_fm2_icon_mime_size_normalize(const E_Fm2_Icon *ic)
583 return e_util_icon_size_normalize(_e_fm2_icon_w_get(ic->sd));
587 _e_fm2_mime_flush_cb(void *data __UNUSED__)
589 efreet_mime_type_cache_flush();
590 return ECORE_CALLBACK_RENEW;
594 _e_fm2_mime_clear_cb(void *data __UNUSED__)
596 efreet_mime_type_cache_clear();
597 return ECORE_CALLBACK_RENEW;
601 _e_fm2_op_registry_go_on(int id)
603 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
605 ere->status = E_FM2_OP_STATUS_IN_PROGRESS;
606 ere->needs_attention = 0;
608 e_fm2_op_registry_entry_changed(ere);
612 _e_fm2_op_registry_aborted(int id)
614 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
616 ere->status = E_FM2_OP_STATUS_ABORTED;
617 ere->needs_attention = 0;
620 e_fm2_op_registry_entry_changed(ere);
621 // XXX e_fm2_op_registry_entry_del(id);
625 _e_fm2_op_registry_error(int id, E_Dialog *dlg)
627 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
629 ere->status = E_FM2_OP_STATUS_ERROR;
630 ere->needs_attention = 1;
632 e_fm2_op_registry_entry_changed(ere);
636 _e_fm2_op_registry_needs_attention(int id, E_Dialog *dlg)
638 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
640 ere->needs_attention = 1;
642 e_fm2_op_registry_entry_changed(ere);
647 _e_fm2_op_registry_entry_print(const E_Fm2_Op_Registry_Entry *ere)
649 const char *status_strings[] =
651 "UNKNOWN", "IN_PROGRESS", "SUCCESSFUL", "ABORTED", "ERROR"
655 if (ere->status <= E_FM2_OP_STATUS_ERROR)
656 status = status_strings[ere->status];
658 status = status_strings[0];
660 printf("id: %8d, op: %2d [%s] finished: %hhu, needs_attention: %hhu\n"
661 " %3d%% (%" PRIi64 "/%" PRIi64 "), start_time: %10.0f, eta: %5ds, xwin: %#x\n"
664 ere->id, ere->op, status, ere->finished, ere->needs_attention,
665 ere->percent, ere->done, ere->total, ere->start_time, ere->eta,
666 e_fm2_op_registry_entry_xwin_get(ere),
671 _e_fm2_op_registry_entry_add_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
673 const E_Fm2_Op_Registry_Entry *ere = event;
674 printf("E FM OPERATION STARTED: id=%d, op=%d\n", ere->id, ere->op);
675 return ECORE_CALLBACK_RENEW;
679 _e_fm2_op_registry_entry_del_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
681 const E_Fm2_Op_Registry_Entry *ere = event;
682 puts("E FM OPERATION FINISHED:");
683 _e_fm2_op_registry_entry_print(ere);
685 return ECORE_CALLBACK_RENEW;
689 _e_fm2_op_registry_entry_changed_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
691 const E_Fm2_Op_Registry_Entry *ere = event;
692 puts("E FM OPERATION CHANGED:");
693 _e_fm2_op_registry_entry_print(ere);
695 return ECORE_CALLBACK_RENEW;
698 static Ecore_Event_Handler *_e_fm2_op_registry_entry_add_handler = NULL;
699 static Ecore_Event_Handler *_e_fm2_op_registry_entry_del_handler = NULL;
700 static Ecore_Event_Handler *_e_fm2_op_registry_entry_changed_handler = NULL;
712 _e_storage_volume_edd_init();
713 e_user_dir_concat_static(path, "fileman/metadata");
714 ecore_file_mkpath(path);
715 _e_fm2_meta_path = strdup(path);
718 static const Evas_Smart_Class sc =
721 EVAS_SMART_CLASS_VERSION,
722 _e_fm2_smart_add, /* add */
723 _e_fm2_smart_del, /* del */
724 _e_fm2_smart_move, /* move */
725 _e_fm2_smart_resize, /* resize */
726 _e_fm2_smart_show, /* show */
727 _e_fm2_smart_hide, /* hide */
728 _e_fm2_smart_color_set, /* color_set */
729 _e_fm2_smart_clip_set, /* clip_set */
730 _e_fm2_smart_clip_unset, /* clip_unset */
739 _e_fm2_smart = evas_smart_class_new(&sc);
741 // _e_fm2_client_spawn();
742 e_fm2_custom_file_init();
743 e_fm2_op_registry_init();
746 /* XXX: move this to a central/global place? */
747 _e_fm2_mime_flush = ecore_timer_add(60.0, _e_fm2_mime_flush_cb, NULL);
748 _e_fm2_mime_clear = ecore_timer_add(600.0, _e_fm2_mime_clear_cb, NULL);
750 _e_fm2_icon_desktop_str = eina_stringshare_add("DESKTOP");
751 _e_fm2_icon_thumb_str = eina_stringshare_add("THUMB");
752 _e_fm2_mime_inode_directory = eina_stringshare_add("inode/directory");
753 _e_fm2_mime_app_desktop = eina_stringshare_add("application/x-desktop");
754 _e_fm2_mime_app_edje = eina_stringshare_add("application/x-extension-edj");
755 _e_fm2_mime_text_uri_list = eina_stringshare_add("text/uri-list");
758 if (!_e_fm2_op_registry_entry_add_handler)
759 _e_fm2_op_registry_entry_add_handler =
760 ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_ADD,
761 _e_fm2_op_registry_entry_add_cb, NULL);
762 if (!_e_fm2_op_registry_entry_del_handler)
763 _e_fm2_op_registry_entry_del_handler =
764 ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_DEL,
765 _e_fm2_op_registry_entry_del_cb, NULL);
766 if (!_e_fm2_op_registry_entry_changed_handler)
767 _e_fm2_op_registry_entry_changed_handler =
768 ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_CHANGED,
769 _e_fm2_op_registry_entry_changed_cb, NULL);
778 eina_stringshare_replace(&_e_fm2_icon_desktop_str, NULL);
779 eina_stringshare_replace(&_e_fm2_icon_thumb_str, NULL);
780 eina_stringshare_replace(&_e_fm2_mime_inode_directory, NULL);
781 eina_stringshare_replace(&_e_fm2_mime_app_desktop, NULL);
782 eina_stringshare_replace(&_e_fm2_mime_app_edje, NULL);
783 eina_stringshare_replace(&_e_fm2_mime_text_uri_list, NULL);
786 if (_e_fm2_op_registry_entry_add_handler)
788 ecore_event_handler_del(_e_fm2_op_registry_entry_add_handler);
789 _e_fm2_op_registry_entry_add_handler = NULL;
791 if (_e_fm2_op_registry_entry_del_handler)
793 ecore_event_handler_del(_e_fm2_op_registry_entry_del_handler);
794 _e_fm2_op_registry_entry_del_handler = NULL;
796 if (_e_fm2_op_registry_entry_changed_handler)
798 ecore_event_handler_del(_e_fm2_op_registry_entry_changed_handler);
799 _e_fm2_op_registry_entry_changed_handler = NULL;
803 ecore_timer_del(_e_fm2_mime_flush);
804 _e_fm2_mime_flush = NULL;
805 ecore_timer_del(_e_fm2_mime_clear);
806 _e_fm2_mime_clear = NULL;
808 evas_smart_free(_e_fm2_smart);
810 E_FREE(_e_fm2_meta_path);
811 e_fm2_custom_file_shutdown();
812 _e_storage_volume_edd_shutdown();
813 e_fm2_op_registry_shutdown();
814 efreet_mime_shutdown();
821 e_fm2_add(Evas *evas)
823 return evas_object_smart_add(evas, _e_fm2_smart);
827 _e_fm2_cb_mount_ok(void *data)
829 E_Fm2_Smart_Data *sd;
831 sd = evas_object_smart_data_get(data);
832 if (!sd) return; // safety
834 if (sd->mount->volume->efm_mode != EFM_MODE_USING_HAL_MOUNT)
836 /* Clean up typebuf. */
837 _e_fm2_typebuf_hide(data);
838 /* we only just now have the mount point so we should do stuff we couldn't do before */
839 eina_stringshare_replace(&sd->realpath, sd->mount->volume->mount_point);
840 eina_stringshare_replace(&sd->mount->mount_point, sd->mount->volume->mount_point);
841 _e_fm2_dir_load_props(sd);
844 if ((sd->realpath) && (strcmp(sd->mount->mount_point, sd->realpath)))
846 e_fm2_path_set(sd->obj, "/", sd->mount->mount_point);
850 sd->id = _e_fm2_client_monitor_add(sd->mount->mount_point);
851 sd->listing = EINA_TRUE;
852 evas_object_smart_callback_call(data, "dir_changed", NULL);
853 sd->tmp.iter = EINA_FALSE;
858 _e_fm2_cb_mount_fail(void *data)
860 E_Fm2_Smart_Data *sd;
862 sd = evas_object_smart_data_get(data);
863 if (!sd) return; // safety
866 // At this moment E_Fm2_Mount object already deleted in e_fm_device.c
868 if (sd->config->view.open_dirs_in_place)
869 e_fm2_path_set(data, "favorites", "/");
871 evas_object_smart_callback_call(data, "dir_deleted", NULL);
876 _e_fm2_cb_unmount_ok(void *data)
878 E_Fm2_Smart_Data *sd;
880 sd = evas_object_smart_data_get(data);
885 if (sd->config->view.open_dirs_in_place)
886 _e_fm2_path_parent_set(data, sd->realpath);
888 evas_object_smart_callback_call(data, "dir_deleted", NULL);
893 _e_fm2_path_parent_set(Evas_Object *obj, const char *path)
895 char buf[PATH_MAX], *p;
898 p = strrchr(path, '/');
899 if (!p || (p == path))
900 e_fm2_path_set(obj, "/", "/");
906 strncpy(buf, path, idx);
908 e_fm2_path_set(obj, "/", buf);
911 e_fm2_path_set(obj, "/", "/");
916 e_fm2_path_set(Evas_Object *obj, const char *dev, const char *path)
918 E_Fm2_Smart_Data *sd;
919 const char *realpath;
921 sd = evas_object_smart_data_get(obj);
922 if (!sd || !path) return; // safety
923 if (!evas_object_type_get(obj)) return; // safety
924 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
926 /* internal config for now - don't see a pont making this configurable */
927 sd->regions.member_max = 64;
931 sd->config = E_NEW(E_Fm2_Config, 1);
932 if (!sd->config) return;
933 // sd->config->view.mode = E_FM2_VIEW_MODE_ICONS;
934 sd->config->view.mode = E_FM2_VIEW_MODE_LIST;
935 sd->config->view.open_dirs_in_place = EINA_TRUE;
936 sd->config->view.selector = EINA_TRUE;
937 sd->config->view.single_click = EINA_FALSE;
938 sd->config->view.single_click_delay = EINA_FALSE;
939 sd->config->view.no_subdir_jump = EINA_FALSE;
940 sd->config->icon.icon.w = 128;
941 sd->config->icon.icon.h = 128;
942 sd->config->icon.list.w = 24;
943 sd->config->icon.list.h = 24;
944 sd->config->icon.fixed.w = EINA_TRUE;
945 sd->config->icon.fixed.h = EINA_TRUE;
946 sd->config->icon.extension.show = EINA_FALSE;
947 sd->config->list.sort.no_case = EINA_TRUE;
948 sd->config->list.sort.dirs.first = EINA_TRUE;
949 sd->config->list.sort.dirs.last = EINA_FALSE;
950 sd->config->selection.single = EINA_FALSE;
951 sd->config->selection.windows_modifiers = EINA_FALSE;
952 sd->config->theme.background = NULL;
953 sd->config->theme.frame = NULL;
954 sd->config->theme.icons = NULL;
955 sd->config->theme.fixed = EINA_FALSE;
958 realpath = _e_fm2_dev_path_map(dev, path);
959 /* If the path doesn't exist, popup a dialog */
960 if (dev && strncmp(dev, "removable:", 10)
961 && !ecore_file_exists(realpath))
966 char text[4096 + 256];
968 man = e_manager_current_get();
970 con = e_container_current_get(man);
973 dialog = e_dialog_new(con, "E", "_fm_file_unexisting_path_dialog");
974 e_dialog_button_add(dialog, _("Close"), NULL, NULL, dialog);
975 e_dialog_button_focus_num(dialog, 0);
976 e_dialog_title_set(dialog, _("Nonexistent path"));
977 e_dialog_icon_set(dialog, "dialog-error", 64);
979 snprintf(text, sizeof(text), _("%s doesn't exist."), realpath);
981 e_dialog_text_set(dialog, text);
982 e_win_centered_set(dialog->win, 1);
983 e_dialog_show(dialog);
987 if (sd->realpath) _e_fm2_client_monitor_del(sd->id, sd->realpath);
988 sd->listing = EINA_FALSE;
990 eina_stringshare_replace(&sd->dev, dev);
991 eina_stringshare_replace(&sd->path, path);
992 eina_stringshare_del(sd->realpath);
993 sd->realpath = realpath;
994 _e_fm2_queue_free(obj);
995 _e_fm2_regions_free(obj);
996 _e_fm2_icons_free(obj);
997 edje_object_part_text_set(sd->overlay, "e.text.busy_label", "");
999 _e_fm2_dir_load_props(sd);
1001 /* If the path change from a mountpoint to something else, we fake-unmount */
1002 if (sd->mount && sd->mount->mount_point
1003 && strncmp(sd->mount->mount_point, sd->realpath,
1004 strlen(sd->mount->mount_point)))
1006 e_fm2_device_unmount(sd->mount);
1010 /* If the path is of type removable: we add a new mountpoint */
1011 if (sd->dev && !sd->mount && !strncmp(sd->dev, "removable:", 10))
1015 v = e_fm2_device_volume_find(sd->dev + sizeof("removable:") - 1);
1018 sd->mount = e_fm2_device_mount(v,
1019 _e_fm2_cb_mount_ok, _e_fm2_cb_mount_fail,
1020 _e_fm2_cb_unmount_ok, NULL, obj);
1021 if (v->efm_mode != EFM_MODE_USING_HAL_MOUNT) return;
1024 else if (sd->config->view.open_dirs_in_place == 0)
1027 m = e_fm2_device_mount_find(sd->realpath);
1029 sd->mount = e_fm2_device_mount(m->volume,
1030 _e_fm2_cb_mount_ok, _e_fm2_cb_mount_fail,
1031 _e_fm2_cb_unmount_ok, NULL, obj);
1034 if (!sd->mount || sd->mount->mounted)
1036 sd->id = _e_fm2_client_monitor_add(sd->realpath);
1037 sd->listing = EINA_TRUE;
1040 /* Clean up typebuf. */
1041 _e_fm2_typebuf_hide(obj);
1043 evas_object_smart_callback_call(obj, "dir_changed", NULL);
1044 sd->tmp.iter = EINA_FALSE;
1048 e_fm2_underlay_show(Evas_Object *obj)
1050 E_Fm2_Smart_Data *sd;
1052 sd = evas_object_smart_data_get(obj);
1053 if (!sd) return; // safety
1054 if (!evas_object_type_get(obj)) return; // safety
1055 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1056 evas_object_show(sd->underlay);
1060 e_fm2_underlay_hide(Evas_Object *obj)
1062 E_Fm2_Smart_Data *sd;
1064 sd = evas_object_smart_data_get(obj);
1065 if (!sd) return; // safety
1066 if (!evas_object_type_get(obj)) return; // safety
1067 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1068 evas_object_hide(sd->underlay);
1072 e_fm2_all_unsel(Evas_Object *obj)
1074 E_Fm2_Smart_Data *sd;
1076 sd = evas_object_smart_data_get(obj);
1077 if (!sd) return; // safety
1078 if (!evas_object_type_get(obj)) return; // safety
1079 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1080 _e_fm2_icon_desel_any(obj);
1084 e_fm2_all_sel(Evas_Object *obj)
1086 E_Fm2_Smart_Data *sd;
1088 sd = evas_object_smart_data_get(obj);
1089 if (!sd) return; // safety
1090 if (!evas_object_type_get(obj)) return; // safety
1091 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1092 _e_fm2_icon_sel_any(obj);
1096 e_fm2_custom_theme_set(Evas_Object *obj, const char *path)
1098 E_Fm2_Smart_Data *sd;
1100 sd = evas_object_smart_data_get(obj);
1101 if (!sd) return; // safety
1102 if (!evas_object_type_get(obj)) return; // safety
1103 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1104 eina_stringshare_replace(&sd->custom_theme, path);
1105 _e_fm2_theme_edje_object_set(sd, sd->drop, "base/theme/fileman",
1106 "list/drop_between");
1107 _e_fm2_theme_edje_object_set(sd, sd->drop_in, "base/theme/fileman",
1109 _e_fm2_theme_edje_object_set(sd, sd->overlay, "base/theme/fileman",
1111 _e_fm2_theme_edje_object_set(sd, sd->sel_rect, "base/theme/fileman",
1116 e_fm2_custom_theme_content_set(Evas_Object *obj, const char *content)
1118 E_Fm2_Smart_Data *sd;
1120 sd = evas_object_smart_data_get(obj);
1121 if (!sd) return; // safety
1122 if (!evas_object_type_get(obj)) return; // safety
1123 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1124 eina_stringshare_replace(&sd->custom_theme_content, content);
1125 _e_fm2_theme_edje_object_set(sd, sd->drop, "base/theme/fileman",
1126 "list/drop_between");
1127 _e_fm2_theme_edje_object_set(sd, sd->drop_in, "base/theme/fileman",
1129 _e_fm2_theme_edje_object_set(sd, sd->overlay, "base/theme/fileman",
1134 e_fm2_path_get(Evas_Object *obj, const char **dev, const char **path)
1136 E_Fm2_Smart_Data *sd;
1138 if (dev) *dev = NULL;
1139 if (path) *path = NULL;
1140 sd = evas_object_smart_data_get(obj);
1141 if (!sd) return; // safety
1142 if (!evas_object_type_get(obj)) return; // safety
1143 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1144 if (dev) *dev = sd->dev;
1145 if (path) *path = sd->path;
1148 static E_Fm2_Custom_File *
1149 _e_fm2_dir_load_props_from_parent(const char *path)
1151 E_Fm2_Custom_File *cf;
1154 if ((!path) || (path[0] == '\0') || (strcmp(path, "/") == 0))
1157 parent = ecore_file_dir_get(path);
1158 cf = e_fm2_custom_file_get(parent);
1159 if ((cf) && (cf->dir) && (cf->dir->prop.in_use))
1165 cf = _e_fm2_dir_load_props_from_parent(parent);
1171 _e_fm2_dir_load_props(E_Fm2_Smart_Data *sd)
1173 E_Fm2_Custom_File *cf;
1176 if (!sd->realpath) return; /* come back later */
1177 if (!(sd->view_flags & E_FM2_VIEW_LOAD_DIR_CUSTOM)) return;
1179 cf = e_fm2_custom_file_get(sd->realpath);
1180 if ((cf) && (cf->dir))
1184 if (sd->max.w - sd->w > 0)
1185 x = (sd->max.w - sd->w) * cf->dir->pos.x;
1189 if (sd->max.h - sd->h > 0)
1190 y = (sd->max.h - sd->h) * cf->dir->pos.y;
1194 e_fm2_pan_set(sd->obj, x, y);
1196 if (cf->dir->prop.in_use)
1198 sd->view_mode = cf->dir->prop.view_mode;
1199 sd->icon_size = cf->dir->prop.icon_size;
1200 sd->order_file = !!cf->dir->prop.order_file;
1201 sd->show_hidden_files = !!cf->dir->prop.show_hidden_files;
1202 sd->inherited_dir_props = EINA_FALSE;
1212 if (!(sd->view_flags & E_FM2_VIEW_INHERIT_DIR_CUSTOM))
1216 sd->order_file = EINA_FALSE;
1217 sd->show_hidden_files = EINA_FALSE;
1218 sd->inherited_dir_props = EINA_FALSE;
1222 sd->inherited_dir_props = EINA_TRUE;
1224 cf = _e_fm2_dir_load_props_from_parent(sd->realpath);
1225 if ((cf) && (cf->dir) && (cf->dir->prop.in_use))
1227 sd->view_mode = cf->dir->prop.view_mode;
1228 sd->icon_size = cf->dir->prop.icon_size;
1229 sd->order_file = !!cf->dir->prop.order_file;
1230 sd->show_hidden_files = !!cf->dir->prop.show_hidden_files;
1236 sd->order_file = EINA_FALSE;
1237 sd->show_hidden_files = EINA_FALSE;
1242 _e_fm2_dir_save_props(E_Fm2_Smart_Data *sd)
1244 E_Fm2_Custom_File *cf, cf0;
1245 E_Fm2_Custom_Dir dir0;
1247 if (!(sd->view_flags & E_FM2_VIEW_SAVE_DIR_CUSTOM)) return;
1249 cf = e_fm2_custom_file_get(sd->realpath);
1253 memset(cf, 0, sizeof(*cf));
1258 E_Fm2_Custom_File *cf2 = cf;
1260 memcpy(cf, cf2, sizeof(*cf2));
1264 if (sd->max.w - sd->w > 0)
1265 cf->dir->pos.x = sd->pos.x / (double)(sd->max.w - sd->w);
1267 cf->dir->pos.x = 0.0;
1269 if (sd->max.h - sd->h)
1270 cf->dir->pos.y = sd->pos.y / (double)(sd->max.h - sd->h);
1272 cf->dir->pos.y = 0.0;
1274 cf->dir->prop.icon_size = sd->icon_size;
1275 cf->dir->prop.view_mode = sd->view_mode;
1276 cf->dir->prop.order_file = sd->order_file;
1277 cf->dir->prop.show_hidden_files = sd->show_hidden_files;
1278 cf->dir->prop.in_use = !sd->inherited_dir_props;
1280 e_fm2_custom_file_set(sd->realpath, cf);
1281 e_fm2_custom_file_flush();
1285 e_fm2_refresh(Evas_Object *obj)
1287 E_Fm2_Smart_Data *sd;
1289 sd = evas_object_smart_data_get(obj);
1290 if (!sd) return; // safety
1291 if (!evas_object_type_get(obj)) return; // safety
1292 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1294 _e_fm2_dir_save_props(sd);
1296 _e_fm2_queue_free(obj);
1297 _e_fm2_regions_free(obj);
1298 _e_fm2_icons_free(obj);
1300 sd->order_file = EINA_FALSE;
1304 sd->listing = EINA_FALSE;
1305 _e_fm2_client_monitor_del(sd->id, sd->realpath);
1306 sd->id = _e_fm2_client_monitor_add(sd->realpath);
1307 sd->listing = EINA_TRUE;
1310 sd->tmp.iter = EINA_FALSE;
1314 e_fm2_has_parent_get(Evas_Object *obj)
1316 E_Fm2_Smart_Data *sd;
1318 sd = evas_object_smart_data_get(obj);
1319 if (!sd) return 0; // safety
1320 if (!evas_object_type_get(obj)) return 0; // safety
1321 if (strcmp(evas_object_type_get(obj), "e_fm")) return 0; // safety
1322 if (!sd->path) return 0;
1323 if ((sd->path[0] == 0) || (!strcmp(sd->path, "/"))) return 0;
1328 e_fm2_real_path_get(Evas_Object *obj)
1330 E_Fm2_Smart_Data *sd;
1332 sd = evas_object_smart_data_get(obj);
1333 if (!sd) return NULL; // safety
1334 if (!evas_object_type_get(obj)) return NULL; // safety
1335 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1336 return sd->realpath;
1340 e_fm2_parent_go(Evas_Object *obj)
1342 E_Fm2_Smart_Data *sd;
1345 sd = evas_object_smart_data_get(obj);
1346 if (!sd) return; // safety
1347 if (!evas_object_type_get(obj)) return; // safety
1348 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1349 if (!sd->path) return;
1350 path = strdup(sd->path);
1352 if ((p = strrchr(path, '/'))) *p = 0;
1354 e_fm2_path_set(obj, sd->dev, "/");
1356 e_fm2_path_set(obj, sd->dev, path);
1362 e_fm2_config_set(Evas_Object *obj, E_Fm2_Config *cfg)
1364 E_Fm2_Smart_Data *sd;
1366 sd = evas_object_smart_data_get(obj);
1367 if (!sd) return; // safety
1368 if (!evas_object_type_get(obj)) return; // safety
1369 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1370 if (sd->config) _e_fm2_config_free(sd->config);
1373 sd->config = E_NEW(E_Fm2_Config, 1);
1374 if (!sd->config) return;
1375 memcpy(sd->config, cfg, sizeof(E_Fm2_Config));
1376 sd->config->icon.key_hint = eina_stringshare_add(cfg->icon.key_hint);
1377 sd->config->theme.background = eina_stringshare_add(cfg->theme.background);
1378 sd->config->theme.frame = eina_stringshare_add(cfg->theme.frame);
1379 sd->config->theme.icons = eina_stringshare_add(cfg->theme.icons);
1383 e_fm2_config_get(Evas_Object *obj)
1385 E_Fm2_Smart_Data *sd;
1387 sd = evas_object_smart_data_get(obj);
1388 if (!sd) return NULL; // safety
1389 if (!evas_object_type_get(obj)) return NULL; // safety
1390 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1395 e_fm2_selected_list_get(Evas_Object *obj)
1397 E_Fm2_Smart_Data *sd;
1398 Eina_List *list = NULL, *l;
1401 sd = evas_object_smart_data_get(obj);
1402 if (!sd) return NULL; // safety
1403 if (!evas_object_type_get(obj)) return NULL; // safety
1404 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1405 EINA_LIST_FOREACH(sd->icons, l, ic)
1408 list = eina_list_append(list, &(ic->info));
1414 e_fm2_all_list_get(Evas_Object *obj)
1416 E_Fm2_Smart_Data *sd;
1417 Eina_List *list = NULL, *l;
1420 sd = evas_object_smart_data_get(obj);
1421 if (!sd) return NULL; // safety
1422 if (!evas_object_type_get(obj)) return NULL; // safety
1423 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1424 EINA_LIST_FOREACH(sd->icons, l, ic)
1426 list = eina_list_append(list, &(ic->info));
1432 e_fm2_select_set(Evas_Object *obj, const char *file, int select)
1434 E_Fm2_Smart_Data *sd;
1438 sd = evas_object_smart_data_get(obj);
1439 if (!sd) return; // safety
1440 if (!evas_object_type_get(obj)) return; // safety
1441 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1442 EINA_LIST_FOREACH(sd->icons, l, ic)
1444 if ((file) && (!strcmp(ic->info.file, file)))
1446 if (select) _e_fm2_icon_select(ic);
1447 else _e_fm2_icon_deselect(ic);
1451 if (ic->sd->config->selection.single)
1452 _e_fm2_icon_deselect(ic);
1453 ic->last_selected = EINA_FALSE;
1459 e_fm2_file_show(Evas_Object *obj, const char *file)
1461 E_Fm2_Smart_Data *sd;
1465 sd = evas_object_smart_data_get(obj);
1466 if (!sd) return; // safety
1467 if (!evas_object_type_get(obj)) return; // safety
1468 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1469 EINA_LIST_FOREACH(sd->icons, l, ic)
1471 if (!strcmp(ic->info.file, file))
1473 _e_fm2_icon_make_visible(ic);
1480 e_fm2_icon_menu_replace_callback_set(Evas_Object *obj, E_Fm_Cb func, void *data)
1482 E_Fm2_Smart_Data *sd;
1484 sd = evas_object_smart_data_get(obj);
1485 if (!sd) return; // safety
1486 if (!evas_object_type_get(obj)) return; // safety
1487 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1488 sd->icon_menu.replace.func = func;
1489 sd->icon_menu.replace.data = data;
1493 e_fm2_icon_menu_start_extend_callback_set(Evas_Object *obj, E_Fm_Cb func, void *data)
1495 E_Fm2_Smart_Data *sd;
1497 sd = evas_object_smart_data_get(obj);
1498 if (!sd) return; // safety
1499 if (!evas_object_type_get(obj)) return; // safety
1500 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1501 sd->icon_menu.start.func = func;
1502 sd->icon_menu.start.data = data;
1506 e_fm2_icon_menu_end_extend_callback_set(Evas_Object *obj, E_Fm_Cb func, void *data)
1508 E_Fm2_Smart_Data *sd;
1510 sd = evas_object_smart_data_get(obj);
1511 if (!sd) return; // safety
1512 if (!evas_object_type_get(obj)) return; // safety
1513 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1514 sd->icon_menu.end.func = func;
1515 sd->icon_menu.end.data = data;
1519 e_fm2_icon_menu_flags_set(Evas_Object *obj, E_Fm2_Menu_Flags flags)
1521 E_Fm2_Smart_Data *sd;
1523 sd = evas_object_smart_data_get(obj);
1524 if (!sd) return; // safety
1525 if (!evas_object_type_get(obj)) return; // safety
1526 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1527 sd->icon_menu.flags = flags;
1530 EAPI E_Fm2_Menu_Flags
1531 e_fm2_icon_menu_flags_get(Evas_Object *obj)
1533 E_Fm2_Smart_Data *sd;
1535 sd = evas_object_smart_data_get(obj);
1536 if (!sd) return 0; // safety
1537 if (!evas_object_type_get(obj)) return 0; // safety
1538 if (strcmp(evas_object_type_get(obj), "e_fm")) return 0; // safety
1539 return sd->icon_menu.flags;
1543 e_fm2_view_flags_set(Evas_Object *obj, E_Fm2_View_Flags flags)
1545 E_Fm2_Smart_Data *sd = evas_object_smart_data_get(obj);
1546 if (!sd) return; // safety
1547 if (!evas_object_type_get(obj)) return; // safety
1548 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1549 sd->view_flags = flags;
1552 EAPI E_Fm2_View_Flags
1553 e_fm2_view_flags_get(Evas_Object *obj)
1555 E_Fm2_Smart_Data *sd = evas_object_smart_data_get(obj);
1556 if (!sd) return 0; // safety
1557 if (!evas_object_type_get(obj)) return 0; // safety
1558 if (strcmp(evas_object_type_get(obj), "e_fm")) return 0; // safety
1559 return sd->view_flags;
1563 e_fm2_window_object_set(Evas_Object *obj, E_Object *eobj)
1565 E_Fm2_Smart_Data *sd;
1566 const char *drop[] = { "enlightenment/desktop", "enlightenment/border", "text/uri-list" };
1568 sd = evas_object_smart_data_get(obj);
1569 if (!sd) return; // safety
1570 if (!evas_object_type_get(obj)) return; // safety
1571 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1573 if (sd->drop_handler) e_drop_handler_del(sd->drop_handler);
1574 sd->drop_handler = e_drop_handler_add(sd->eobj,
1576 _e_fm2_cb_dnd_enter,
1578 _e_fm2_cb_dnd_leave,
1581 sd->x, sd->y, sd->w, sd->h);
1582 e_drop_handler_responsive_set(sd->drop_handler);
1586 e_fm2_icons_update(Evas_Object *obj)
1588 E_Fm2_Smart_Data *sd;
1591 char buf[PATH_MAX], *pfile;
1592 int bufused, buffree;
1594 sd = evas_object_smart_data_get(obj);
1595 if (!sd) return; // safety
1596 if (!evas_object_type_get(obj)) return; // safety
1597 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1599 bufused = eina_strlcpy(buf, sd->realpath, sizeof(buf));
1600 if (bufused >= (int)(sizeof(buf) - 2))
1603 if ((bufused > 0) && (buf[bufused - 1] != '/'))
1609 pfile = buf + bufused;
1610 buffree = sizeof(buf) - bufused;
1612 EINA_LIST_FOREACH(sd->icons, l, ic)
1614 E_Fm2_Custom_File *cf;
1616 eina_stringshare_del(ic->info.icon);
1617 ic->info.icon = NULL;
1618 ic->info.icon_type = EINA_FALSE;
1620 if (_e_fm2_file_is_desktop(ic->info.file))
1621 _e_fm2_icon_desktop_load(ic);
1623 if ((int)eina_strlcpy(pfile, ic->info.file, buffree) >= buffree)
1626 cf = e_fm2_custom_file_get(buf);
1631 eina_stringshare_replace(&ic->info.icon, cf->icon.icon);
1632 ic->info.icon_type = cf->icon.type;
1638 _e_fm2_icon_unrealize(ic);
1639 _e_fm2_icon_realize(ic);
1642 e_fm2_custom_file_flush();
1646 e_fm2_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
1648 E_Fm2_Smart_Data *sd;
1650 sd = evas_object_smart_data_get(obj);
1651 if (!sd) return; // safety
1652 if (!evas_object_type_get(obj)) return; // safety
1653 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1654 if (x > (sd->max.w - sd->w)) x = sd->max.w - sd->w;
1656 if (y > (sd->max.h - sd->h)) y = sd->max.h - sd->h;
1658 if ((sd->pos.x == x) && (sd->pos.y == y)) return;
1661 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
1662 sd->scroll_job = ecore_job_add(_e_fm2_cb_scroll_job, obj);
1666 e_fm2_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
1668 E_Fm2_Smart_Data *sd;
1670 sd = evas_object_smart_data_get(obj);
1671 if (!sd) return; // safety
1672 if (!evas_object_type_get(obj)) return; // safety
1673 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1674 if (x) *x = sd->pos.x;
1675 if (y) *y = sd->pos.y;
1679 e_fm2_pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
1681 E_Fm2_Smart_Data *sd;
1684 sd = evas_object_smart_data_get(obj);
1685 if (!sd) return; // safety
1686 if (!evas_object_type_get(obj)) return; // safety
1687 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1688 mx = sd->max.w - sd->w;
1690 my = sd->max.h - sd->h;
1697 e_fm2_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
1699 E_Fm2_Smart_Data *sd;
1701 sd = evas_object_smart_data_get(obj);
1702 if (!sd) return; // safety
1703 if (!evas_object_type_get(obj)) return; // safety
1704 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1705 if (w) *w = sd->max.w;
1706 if (h) *h = sd->max.h;
1710 e_fm2_all_icons_update(void)
1715 _e_fm2_list_walking++;
1716 EINA_LIST_FOREACH(_e_fm2_list, l, o)
1718 if ((_e_fm2_list_walking > 0) &&
1719 (eina_list_data_find(_e_fm2_list_remove, o))) continue;
1720 e_fm2_icons_update(o);
1722 _e_fm2_list_walking--;
1723 if (_e_fm2_list_walking == 0)
1725 EINA_LIST_FREE(_e_fm2_list_remove, o)
1727 _e_fm2_list = eina_list_remove(_e_fm2_list, o);
1733 _e_fm2_path_join(char *buf, int buflen, const char *base, const char *component)
1735 if ((!buf) || (!component))
1738 if (component[0] == '/')
1740 else if (component[0] == '\0')
1742 else if (component[0] == '.')
1744 if (component[1] == '/')
1751 if (snprintf(buf, buflen, "%s/%s", base, component) < buflen)
1756 else if ((component[1] == '.') && (component[2] == '/'))
1766 p = strrchr(base, '/');
1771 if (snprintf(buf, buflen, "%.*s/%s", len, base, component) < buflen)
1778 if (snprintf(buf, buflen, "%s/%s", base, component) < buflen)
1785 * Explicitly set an Edje icon from the given icon path.
1787 * @param iconpath path to edje file that contains 'icon' group.
1789 * @see _e_fm2_icon_explicit_get()
1791 static Evas_Object *
1792 _e_fm2_icon_explicit_edje_get(Evas *evas, const E_Fm2_Icon *ic __UNUSED__, const char *iconpath, const char **type_ret)
1794 Evas_Object *o = edje_object_add(evas);
1798 if (!edje_object_file_set(o, iconpath, "icon"))
1804 if (type_ret) *type_ret = "CUSTOM";
1809 * Explicitly set icon from theme using its name.
1811 * @param name will be prefixed by 'e/icons/' to form the group name in theme.
1813 * @see e_util_edje_icon_set()
1814 * @see _e_fm2_icon_explicit_get()
1816 static Evas_Object *
1817 _e_fm2_icon_explicit_theme_icon_get(Evas *evas, const E_Fm2_Icon *ic __UNUSED__, const char *name, const char **type_ret)
1819 Evas_Object *o = e_icon_add(evas);
1821 if (!o) return NULL;
1823 e_icon_scale_size_set(o, _e_fm2_icon_mime_size_normalize(ic));
1825 if (!e_util_icon_theme_set(o, name))
1831 if (type_ret) *type_ret = "THEME_ICON";
1836 * Explicitly set icon from file manager theem using its name.
1838 * @param name will be prefixed with 'base/theme/fileman' to form the
1839 * group name in theme.
1841 * @see _e_fm2_theme_edje_icon_object_set()
1842 * @see _e_fm2_icon_explicit_get()
1844 static Evas_Object *
1845 _e_fm2_icon_explicit_theme_get(Evas *evas, const E_Fm2_Icon *ic, const char *name, const char **type_ret)
1847 Evas_Object *o = edje_object_add(evas);
1851 if (!_e_fm2_theme_edje_icon_object_set(ic->sd, o, "base/theme/fileman", name))
1857 if (type_ret) *type_ret = "THEME";
1862 * Explicitly set icon to given value.
1864 * This will try to identify if icon is an edje or regular file or even
1865 * an icon name to get from icon set.
1867 * @param icon might be an absolute or relative path, or icon name or edje path.
1869 static Evas_Object *
1870 _e_fm2_icon_explicit_get(Evas *evas, const E_Fm2_Icon *ic, const char *icon, const char **type_ret)
1873 const char *iconpath;
1875 iconpath = _e_fm2_path_join(buf, sizeof(buf), ic->sd->realpath, icon);
1878 fprintf(stderr, "ERROR: could not create icon \"%s\".\n", icon);
1882 if (_e_fm2_file_is_edje(iconpath))
1883 return _e_fm2_icon_explicit_edje_get(evas, ic, iconpath, type_ret);
1886 Evas_Object *o = e_icon_add(evas);
1890 e_icon_scale_size_set(o, _e_fm2_icon_mime_size_normalize(ic));
1891 e_icon_file_set(o, iconpath);
1892 e_icon_fill_inside_set(o, 1);
1893 if (type_ret) *type_ret = "CUSTOM";
1901 * Creates an icon that generates a thumbnail if required.
1903 * @param group if given, will be used in e_thumb_icon_file_set()
1904 * @param cb function to callback when thumbnail generation is over.
1905 * @param data extra data to give to @p cb
1906 * @param force_gen whenever to force generation of thumbnails, even it exists.
1908 static Evas_Object *
1909 _e_fm2_icon_thumb_get(Evas *evas, const E_Fm2_Icon *ic, const char *group, Evas_Smart_Cb cb, void *data, int force_gen, const char **type_ret)
1914 if (ic->thumb_failed)
1917 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
1920 o = e_thumb_icon_add(evas);
1924 e_thumb_icon_file_set(o, buf, group);
1925 e_thumb_icon_size_set(o, 128, 128);
1927 if (cb) evas_object_smart_callback_add(o, "e_thumb_gen", cb, data);
1929 _e_fm2_icon_thumb(ic, o, force_gen);
1930 if (type_ret) *type_ret = "THUMB";
1935 * Generates the thumbnail of the given edje file.
1937 * It will use 'icon.key_hint' from config if set and then try some well
1938 * known groups like 'icon', 'e/desktop/background' and 'e/init/splash'.
1940 static Evas_Object *
1941 _e_fm2_icon_thumb_edje_get(Evas *evas, const E_Fm2_Icon *ic, Evas_Smart_Cb cb, void *data, int force_gen, const char **type_ret)
1944 const char **itr, *group;
1945 const char *known_groups[] = {
1948 "e/desktop/background",
1950 /* XXX TODO: add more? example 'screenshot', 'preview' */
1954 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
1957 known_groups[0] = ic->sd->config->icon.key_hint;
1958 if (known_groups[0])
1961 itr = known_groups + 1;
1964 if (edje_file_group_exists(buf, *itr))
1971 Eina_List *l = edje_file_collection_list(buf);
1974 group = eina_list_data_get(l);
1975 edje_file_collection_list_free(l);
1978 return _e_fm2_icon_thumb_get(evas, ic, group, cb, data, force_gen, type_ret);
1982 * Machinery for _e_fm2_icon_desktop_get() and others with instances of desktop.
1984 static Evas_Object *
1985 _e_fm2_icon_desktop_get_internal(Evas *evas, const E_Fm2_Icon *ic, Efreet_Desktop *desktop, const char **type_ret)
1992 if (_e_fm2_file_is_edje(desktop->icon))
1993 return _e_fm2_icon_explicit_edje_get(evas, ic, desktop->icon, type_ret);
1995 o = _e_fm2_icon_explicit_theme_icon_get(evas, ic, desktop->icon, type_ret);
1998 o = e_util_desktop_icon_add(desktop, 48, evas);
1999 // o = e_util_icon_theme_icon_add(desktop->icon, 48, evas);
2000 if (o && type_ret) *type_ret = "DESKTOP";
2005 * Use freedesktop.org '.desktop' files to set icon.
2007 static Evas_Object *
2008 _e_fm2_icon_desktop_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
2014 if (!ic->info.file) return NULL;
2016 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
2019 ef = efreet_desktop_new(buf);
2020 if (!ef) return NULL;
2022 o = _e_fm2_icon_desktop_get_internal(evas, ic, ef, type_ret);
2023 efreet_desktop_free(ef);
2027 static inline const char *
2028 _e_fm2_icon_mime_type_special_match(const E_Fm2_Icon *ic)
2031 const E_Config_Mime_Icon *mi;
2032 const char *mime = ic->info.mime;
2034 EINA_LIST_FOREACH(e_config->mime_icons, l, mi)
2035 if (mi->mime == mime) /* both in the same stringshare pool */
2041 static Evas_Object *
2042 _e_fm2_icon_mime_fdo_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
2047 size = _e_fm2_icon_mime_size_normalize(ic);
2048 icon = efreet_mime_type_icon_get(ic->info.mime, e_config->icon_theme, size);
2050 return _e_fm2_icon_explicit_get(evas, ic, icon, type_ret);
2054 static Evas_Object *
2055 _e_fm2_icon_mime_theme_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret __UNUSED__)
2060 if (snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", ic->info.mime) >=
2064 file = e_theme_edje_file_get("base/theme/icons", buf);
2065 if (file && file[0])
2067 Evas_Object *o = edje_object_add(evas);
2068 if (!o) return NULL;
2069 if (!edje_object_file_set(o, file, buf))
2081 * Use mime type information to set icon.
2083 static Evas_Object *
2084 _e_fm2_icon_mime_get(Evas *evas, const E_Fm2_Icon *ic, Evas_Smart_Cb gen_func __UNUSED__, void *data __UNUSED__, int force_gen __UNUSED__, const char **type_ret)
2086 Evas_Object *o = NULL;
2088 if (e_config->icon_theme_overrides)
2089 o = _e_fm2_icon_mime_fdo_get(evas, ic, type_ret);
2091 o = _e_fm2_icon_mime_theme_get(evas, ic, type_ret);
2095 if (!e_config->icon_theme_overrides)
2096 o = _e_fm2_icon_mime_fdo_get(evas, ic, type_ret);
2098 o = _e_fm2_icon_mime_theme_get(evas, ic, type_ret);
2104 * Discovers the executable of Input Method Config file and set icon.
2106 static Evas_Object *
2107 _e_fm2_icon_imc_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
2109 E_Input_Method_Config *imc;
2110 Efreet_Desktop *desktop;
2112 Evas_Object *o = NULL;
2118 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
2121 imc_ef = eet_open(buf, EET_FILE_MODE_READ);
2125 imc = e_intl_input_method_config_read(imc_ef);
2128 if (!imc->e_im_setup_exec)
2130 e_intl_input_method_config_free(imc);
2134 desktop = efreet_util_desktop_exec_find(imc->e_im_setup_exec);
2137 o = _e_fm2_icon_desktop_get_internal(evas, ic, desktop, type_ret);
2138 efreet_desktop_free(desktop);
2140 e_intl_input_method_config_free(imc);
2142 if ((o) && (type_ret)) *type_ret = "IMC";
2147 * Use heuristics to discover and set icon.
2149 static Evas_Object *
2150 _e_fm2_icon_discover_get(Evas *evas, const E_Fm2_Icon *ic, Evas_Smart_Cb gen_func, void *data, int force_gen, const char **type_ret)
2154 p = strrchr(ic->info.file, '.');
2155 if (!p) return NULL;
2158 if (_e_fm2_ext_is_edje(p))
2159 return _e_fm2_icon_thumb_edje_get(evas, ic, gen_func,
2160 data, force_gen, type_ret);
2161 else if (_e_fm2_ext_is_desktop(p))
2162 return _e_fm2_icon_desktop_get(evas, ic, type_ret);
2163 else if (_e_fm2_ext_is_imc(p))
2164 return _e_fm2_icon_imc_get(evas, ic, type_ret);
2169 * Get the object representing the icon.
2171 * @param evas canvas instance to use to store the icon.
2172 * @param ic icon to get information in order to find the icon.
2173 * @param gen_func if thumbnails need to be generated, call this function
2175 * @param data extra data to give to @p gen_func.
2176 * @param force_gen force thumbnail generation.
2177 * @param type_ret string that identifies type of icon.
2180 e_fm2_icon_get(Evas *evas, E_Fm2_Icon *ic,
2181 Evas_Smart_Cb gen_func,
2182 void *data, int force_gen, const char **type_ret)
2185 Evas_Object *o = NULL;
2189 if ((ic->info.icon[0] == '/') ||
2190 ((ic->info.icon[0] == '.') &&
2191 ((ic->info.icon[1] == '/') ||
2192 ((ic->info.icon[1] == '.') && (ic->info.icon[2] == '/')))))
2194 o = _e_fm2_icon_explicit_get(evas, ic, ic->info.icon, type_ret);
2198 o = _e_fm2_icon_explicit_theme_icon_get(evas, ic, ic->info.icon, type_ret);
2202 /* create thumbnails for edje files */
2203 if (_e_fm2_file_is_edje(ic->info.file))
2205 o = _e_fm2_icon_thumb_edje_get
2206 (evas, ic, gen_func, data, force_gen, type_ret);
2210 /* disabled until everyone has edje in mime.types:
2211 * use mimetype to identify edje.
2212 * if (ic->info.mime == _e_fm2_mime_app_edje)
2213 * return _e_fm2_icon_thumb_edje_get
2214 * (evas, ic, gen_func, data, force_gen, type_ret); */
2216 /* check user preferences */
2217 icon = _e_fm2_icon_mime_type_special_match(ic);
2220 if (icon == _e_fm2_icon_desktop_str)
2221 o = _e_fm2_icon_desktop_get(evas, ic, type_ret);
2222 else if (icon == _e_fm2_icon_thumb_str)
2224 if (!ic->thumb_failed)
2225 o = _e_fm2_icon_thumb_get
2226 (evas, ic, NULL, gen_func, data, force_gen, type_ret);
2228 else if (strncmp(icon, "e/icons/fileman/", 16) == 0)
2229 o = _e_fm2_icon_explicit_theme_get(evas, ic, icon + 16, type_ret);
2231 o = _e_fm2_icon_explicit_get(evas, ic, icon, type_ret);
2236 if ((!ic->thumb_failed) && (ic->info.icon_type == 1))
2238 o = _e_fm2_icon_thumb_get(evas, ic, NULL,
2239 gen_func, data, force_gen, type_ret);
2245 o = _e_fm2_icon_mime_get(evas, ic, gen_func, data, force_gen, type_ret);
2248 else if (ic->info.file)
2250 o = _e_fm2_icon_discover_get(evas, ic, gen_func, data,
2251 force_gen, type_ret);
2256 o = _e_fm2_icon_explicit_theme_icon_get(evas, ic, "unknown", type_ret);
2259 return _e_fm2_icon_explicit_theme_get(evas, ic, "text/plain", type_ret);
2262 EAPI E_Fm2_Icon_Info *
2263 e_fm2_icon_file_info_get(E_Fm2_Icon *ic)
2265 if (!ic) return NULL;
2270 e_fm2_icon_geometry_get(E_Fm2_Icon *ic, int *x, int *y, int *w, int *h)
2274 if (x) *x = 0; if (y) *y = 0; if (w) *w = 0; if (h) *h = 0;
2277 evas_object_geometry_get(ic->obj, &xx, &yy, &ww, &hh);
2285 /* FIXME: track real exe with exe del events etc. */
2286 static int _e_fm2_client_spawning = 0;
2289 _e_fm2_client_spawn(void)
2293 if (_e_fm2_client_spawning) return;
2294 snprintf(buf, sizeof(buf), "%s/enlightenment/utils/enlightenment_fm", e_prefix_lib_get());
2295 ecore_exe_run(buf, NULL);
2296 _e_fm2_client_spawning = 1;
2299 static E_Fm2_Client *
2300 _e_fm2_client_get(void)
2303 E_Fm2_Client *cl, *cl_chosen = NULL;
2304 int min_req = 0x7fffffff;
2306 /* if we don't have a slave - spane one */
2307 if (!_e_fm2_client_list)
2309 _e_fm2_client_spawn();
2312 EINA_LIST_FOREACH(_e_fm2_client_list, l, cl)
2314 if (cl->req < min_req)
2323 typedef struct _E_Fm2_Message E_Fm2_Message;
2325 struct _E_Fm2_Message
2327 int major, minor, ref, ref_to, response;
2332 static Eina_List *_e_fm2_messages = NULL;
2335 _e_fm2_client_message_queue(int major, int minor, int ref, int ref_to, int response, const void *data, int size)
2339 msg = E_NEW(E_Fm2_Message, 1);
2344 msg->ref_to = ref_to;
2345 msg->response = response;
2349 msg->data = malloc(size);
2351 memcpy(msg->data, data, size);
2358 _e_fm2_messages = eina_list_append(_e_fm2_messages, msg);
2362 _e_fm2_client_message_flush(E_Fm2_Client *cl, E_Fm2_Message *msg)
2364 _e_fm2_messages = eina_list_remove(_e_fm2_messages, msg);
2365 ecore_ipc_client_send(cl->cl, msg->major, msg->minor,
2366 msg->ref, msg->ref_to, msg->response,
2367 msg->data, msg->size);
2374 _e_fm2_client_messages_flush(void)
2376 while (_e_fm2_messages)
2380 cl = _e_fm2_client_get();
2382 _e_fm2_client_message_flush(cl, eina_list_data_get(_e_fm2_messages));
2387 _e_fm_client_send_new(int minor, void *data, int size)
2393 cl = _e_fm2_client_get();
2396 _e_fm2_client_message_queue(E_IPC_DOMAIN_FM, minor,
2402 ecore_ipc_client_send(cl->cl, E_IPC_DOMAIN_FM, minor,
2412 _e_fm_client_send(int minor, int id, void *data, int size)
2416 cl = _e_fm2_client_get();
2419 _e_fm2_client_message_queue(E_IPC_DOMAIN_FM, minor,
2425 ecore_ipc_client_send(cl->cl, E_IPC_DOMAIN_FM, minor,
2435 _e_fm2_client_monitor_add(const char *path)
2437 return _e_fm_client_send_new(E_FM_OP_MONITOR_START, (void *)path, strlen(path) + 1);
2441 _e_fm2_client_monitor_del(int id, const char *path)
2443 _e_fm_client_send(E_FM_OP_MONITOR_END, id, (void *)path, strlen(path) + 1);
2447 _e_fm_client_file_del(const char *files, Evas_Object *e_fm)
2449 int id = _e_fm_client_send_new(E_FM_OP_REMOVE, (void *)files, strlen(files) + 1);
2450 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_REMOVE, _e_fm2_operation_abort_internal);
2456 _e_fm2_client_file_trash(const char *path, Evas_Object *e_fm)
2458 int id = _e_fm_client_send_new(E_FM_OP_TRASH, (void *)path, strlen(path) + 1);
2459 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_TRASH, _e_fm2_operation_abort_internal);
2466 _e_fm2_client_file_mkdir(const char *path, const char *rel, int rel_to, int x, int y, int res_w __UNUSED__, int res_h __UNUSED__, Evas_Object *e_fm)
2473 l = l1 + 1 + l2 + 1 + (sizeof(int) * 3);
2476 strcpy(d + l1 + 1, rel);
2477 memcpy(d + l1 + 1 + l2 + 1, &rel_to, sizeof(int));
2478 memcpy(d + l1 + 1 + l2 + 1 + sizeof(int), &x, sizeof(int));
2479 memcpy(d + l1 + 1 + l2 + 1 + (2 * sizeof(int)), &y, sizeof(int));
2481 id = _e_fm_client_send_new(E_FM_OP_MKDIR, (void *)d, l);
2482 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MKDIR, _e_fm2_operation_abort_internal);
2487 _e_fm_client_file_move(const char *args, Evas_Object *e_fm)
2489 int id = _e_fm_client_send_new(E_FM_OP_MOVE, (void *)args, strlen(args) + 1);
2490 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MOVE, _e_fm2_operation_abort_internal);
2495 _e_fm2_client_file_symlink(const char *path, const char *dest, const char *rel, int rel_to, int x, int y, int res_w, int res_h, Evas_Object *e_fm)
2499 int l1, l2, l3, l, id;
2504 l = l1 + 1 + l2 + 1 + l3 + 1 + (sizeof(int) * 3);
2507 strcpy(d + l1 + 1, dest);
2508 strcpy(d + l1 + 1 + l2 + 1, rel);
2509 memcpy(d + l1 + 1 + l2 + 1 + l3 + 1, &rel_to, sizeof(int));
2510 memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + sizeof(int), &x, sizeof(int));
2511 memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + (2 * sizeof(int)), &y, sizeof(int));
2513 if ((x != -9999) && (y != -9999))
2515 E_Fm2_Custom_File *cf, cf0;
2517 cf = e_fm2_custom_file_get(dest);
2520 memset(&cf0, 0, sizeof(E_Fm2_Custom_File));
2525 cf->geom.res_w = res_w;
2526 cf->geom.res_h = res_h;
2528 e_fm2_custom_file_set(dest, cf);
2529 e_fm2_custom_file_flush();
2532 id = _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)d, l);
2533 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK, _e_fm2_operation_abort_internal);
2537 size_t size = 0, length = 0;
2539 args = _e_fm_string_append_quoted(args, &size, &length, path);
2540 args = _e_fm_string_append_char(args, &size, &length, ' ');
2541 args = _e_fm_string_append_quoted(args, &size, &length, dest);
2543 fputs("WARNING: using new E_FM_OP_SYMLINK, remove deprecated ASAP\n", stderr);
2544 int r = _e_fm_client_file_symlink(args, e_fm);
2557 _e_fm_client_file_copy(const char *args, Evas_Object *e_fm)
2559 int id = _e_fm_client_send_new(E_FM_OP_COPY, (void *)args, strlen(args) + 1);
2560 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_COPY, _e_fm2_operation_abort_internal);
2565 _e_fm_client_file_symlink(const char *args, Evas_Object *e_fm)
2567 int id = _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)args, strlen(args) + 1);
2568 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK, _e_fm2_operation_abort_internal);
2573 _e_fm2_client_mount(const char *udi, const char *mountpoint)
2584 l2 = strlen(mountpoint);
2585 l = l1 + 1 + l2 + 1;
2592 strcpy(d + l1 + 1, mountpoint);
2594 return _e_fm_client_send_new(E_FM_OP_MOUNT, (void *)d, l);
2598 _e_fm2_client_unmount(const char *udi)
2611 _e_fm2_client_get();
2613 return _e_fm_client_send_new(E_FM_OP_UNMOUNT, (void *)d, l);
2617 _e_fm2_client_eject(const char *udi)
2625 size = strlen(udi) + 1;
2626 data = alloca(size);
2629 return _e_fm_client_send_new(E_FM_OP_EJECT, data, size);
2633 _e_fm2_client_monitor_list_end(Evas_Object *obj)
2635 E_Fm2_Smart_Data *sd;
2637 sd = evas_object_smart_data_get(obj);
2639 if (sd->busy_count == 0)
2641 edje_object_signal_emit(sd->overlay, "e,state,busy,stop", "e");
2642 e_fm2_custom_file_flush();
2646 evas_object_del(sd->tmp.obj);
2651 evas_object_del(sd->tmp.obj2);
2652 sd->tmp.obj2 = NULL;
2656 ecore_timer_del(sd->scan_timer);
2657 sd->scan_timer = NULL;
2661 ecore_idler_del(sd->sort_idler);
2662 sd->sort_idler = NULL;
2664 E_FREE(sd->tmp.list_index);
2665 _e_fm2_queue_free(obj);
2666 _e_fm2_obj_icons_place(sd);
2667 _e_fm2_live_process_begin(obj);
2671 _e_fm2_file_force_update(const char *path)
2677 dir = ecore_file_dir_get(path);
2679 EINA_LIST_FOREACH(_e_fm2_list, l, o)
2681 if ((_e_fm2_list_walking > 0) &&
2682 (eina_list_data_find(_e_fm2_list_remove, o))) continue;
2683 if (!strcmp(e_fm2_real_path_get(o), dir))
2687 ic = _e_fm2_icon_find(o, ecore_file_file_get(path));
2692 memset(&finf, 0, sizeof(E_Fm2_Finfo));
2693 memcpy(&(finf.st), &(ic->info.statinfo),
2694 sizeof(struct stat));
2695 finf.broken_link = ic->info.broken_link;
2696 finf.lnk = ic->info.link;
2697 finf.rlnk = ic->info.real_link;
2698 ic->removable_state_change = EINA_TRUE;
2699 _e_fm2_live_file_changed(o, ecore_file_file_get(path),
2708 e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e)
2711 Eina_List *l, *dels = NULL;
2714 if (e->major != 6 /*E_IPC_DOMAIN_FM*/) return;
2715 EINA_LIST_FOREACH(_e_fm2_client_list, l, cl)
2717 if (cl->cl == e->client) break;
2721 cl = E_NEW(E_Fm2_Client, 1);
2723 _e_fm2_client_list = eina_list_prepend(_e_fm2_client_list, cl);
2724 /* FIXME: new client - send queued msgs */
2725 _e_fm2_client_spawning = 0;
2726 _e_fm2_client_messages_flush();
2729 _e_fm2_list_walking++;
2730 EINA_LIST_FOREACH(_e_fm2_list, l, obj)
2734 const char *dir, *path, *lnk, *rlnk, *file;
2737 E_Fm2_Smart_Data *sd;
2739 if ((_e_fm2_list_walking > 0) &&
2740 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
2741 dir = e_fm2_real_path_get(obj);
2742 sd = evas_object_smart_data_get(obj);
2745 case E_FM_OP_HELLO: /*hello*/
2746 // printf("E_FM_OP_HELLO\n");
2749 case E_FM_OP_OK: /*req ok*/
2750 // printf("E_FM_OP_OK\n");
2754 case E_FM_OP_FILE_ADD: /*file add*/
2755 // printf("E_FM_OP_FILE_ADD\n");
2756 case E_FM_OP_FILE_CHANGE: /*file change*/
2757 // printf("E_FM_OP_FILE_CHANGE\n");
2762 /* NOTE: i am NOT converting this data to portable arch/os independent
2763 * format. i am ASSUMING e_fm_main and e are local and built together
2764 * and thus this will work. if this ever changes this here needs to
2766 memcpy(&st, p, sizeof(struct stat));
2767 p += sizeof(struct stat);
2773 p += strlen(path) + 1;
2776 p += strlen(lnk) + 1;
2780 memcpy(&(finf.st), &st, sizeof(struct stat));
2781 finf.broken_link = broken_link;
2785 evdir = ecore_file_dir_get(path);
2786 if ((evdir) && (sd->id == e->ref_to) &&
2787 ((!strcmp(evdir, "") || ((dir) && (!strcmp(dir, evdir))))))
2789 // printf(" ch/add response = %i\n", e->response);
2790 if (e->response == 0) /*live changes*/
2792 if (e->minor == E_FM_OP_FILE_ADD) /*file add*/
2794 _e_fm2_live_file_add
2795 (obj, ecore_file_file_get(path),
2798 else if (e->minor == E_FM_OP_FILE_CHANGE) /*file change*/
2800 _e_fm2_live_file_changed
2801 (obj, (char *)ecore_file_file_get(path),
2805 else /*file add - listing*/
2807 if (e->minor == E_FM_OP_FILE_ADD) /*file add*/
2809 if (!sd->scan_timer)
2812 ecore_timer_add(0.5,
2813 _e_fm2_cb_scan_timer,
2816 if (sd->busy_count == 1)
2817 edje_object_signal_emit(sd->overlay, "e,state,busy,start", "e");
2821 file = ecore_file_file_get(path);
2822 if ((!strcmp(file, ".order")))
2823 sd->order_file = EINA_TRUE;
2826 if (!((file[0] == '.') &&
2827 (!sd->show_hidden_files)))
2828 _e_fm2_file_add(obj, file,
2833 if (e->response == 2) /* end of scan */
2835 sd->listing = EINA_FALSE;
2838 ecore_timer_del(sd->scan_timer);
2840 ecore_timer_add(0.0001,
2841 _e_fm2_cb_scan_timer,
2846 _e_fm2_client_monitor_list_end(obj);
2854 // printf(" ...\n");
2855 if ((sd->id == e->ref_to) && (path[0] == 0))
2857 // printf(" end response = %i\n", e->response);
2858 if (e->response == 2) /* end of scan */
2860 sd->listing = EINA_FALSE;
2863 ecore_timer_del(sd->scan_timer);
2865 ecore_timer_add(0.0001,
2866 _e_fm2_cb_scan_timer,
2871 _e_fm2_client_monitor_list_end(obj);
2876 if (evdir) free(evdir);
2880 case E_FM_OP_FILE_DEL: /*file del*/
2881 // printf("E_FM_OP_FILE_DEL\n");
2883 evdir = ecore_file_dir_get(path);
2884 if ((dir) && (evdir) && (sd->id == e->ref_to) && (!strcmp(dir, evdir)))
2886 _e_fm2_live_file_del
2887 (obj, ecore_file_file_get(path));
2889 if (evdir) free(evdir);
2892 case E_FM_OP_MONITOR_END: /*mon dir del*/
2893 // printf("E_FM_OP_MONITOR_END\n");
2895 /* FIXME dir should not be null but can. fix segv
2896 when mounting cdrom with udisk here
2897 btw monitor end seems to be a strange event for
2900 if ((dir) && (path) && (sd->id == e->ref_to) && (!strcmp(dir, path)))
2902 dels = eina_list_append(dels, obj);
2910 EINA_LIST_FREE(dels, obj)
2912 E_Fm2_Smart_Data *sd;
2914 sd = evas_object_smart_data_get(obj);
2915 if ((_e_fm2_list_walking > 0) &&
2916 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
2917 if (sd->config->view.open_dirs_in_place)
2918 _e_fm2_path_parent_set(obj, sd->realpath);
2920 evas_object_smart_callback_call(obj, "dir_deleted", NULL);
2922 _e_fm2_list_walking--;
2923 if (_e_fm2_list_walking == 0)
2925 EINA_LIST_FREE(_e_fm2_list_remove, obj)
2927 _e_fm2_list = eina_list_remove(_e_fm2_list, obj);
2932 case E_FM_OP_MONITOR_SYNC: /*mon list sync*/
2933 ecore_ipc_client_send(cl->cl, E_IPC_DOMAIN_FM, E_FM_OP_MONITOR_SYNC,
2938 case E_FM_OP_STORAGE_ADD: /*storage add*/
2939 if ((e->data) && (e->size > 0))
2943 s = _e_fm_shared_codec_storage_decode(e->data, e->size);
2944 if (s) e_fm2_device_storage_add(s);
2948 case E_FM_OP_STORAGE_DEL: /*storage del*/
2949 if ((e->data) && (e->size > 0))
2955 s = e_fm2_device_storage_find(udi);
2956 if (s) e_fm2_device_storage_del(s);
2960 case E_FM_OP_VOLUME_ADD: /*volume add*/
2961 if ((e->data) && (e->size > 0))
2965 v = _e_fm_shared_codec_volume_decode(e->data, e->size);
2968 e_fm2_device_volume_add(v);
2969 if (e_config->device_auto_mount && !v->mounted && !v->first_time)
2970 _e_fm2_client_mount(v->udi, v->mount_point);
2976 case E_FM_OP_VOLUME_DEL: /*volume del*/
2977 if ((e->data) && (e->size > 0))
2983 v = e_fm2_device_volume_find(udi);
2984 if (v) e_fm2_device_volume_del(v);
2988 case E_FM_OP_MOUNT_DONE: /*mount done*/
2989 if ((e->data) && (e->size > 1))
2992 char *udi, *mountpoint = NULL;
2995 if ((unsigned int)e->size != (strlen(udi) + 1))
2996 mountpoint = udi + strlen(udi) + 1;
2997 v = e_fm2_device_volume_find(udi);
3000 e_fm2_device_mount_add(v, mountpoint);
3001 _e_fm2_volume_icon_update(v);
3002 if (e_config->device_auto_open && !eina_list_count(v->mounts))
3007 a = e_action_find("fileman");
3008 m = e_manager_list();
3009 if (a && a->func.go && m && eina_list_data_get(m) && mountpoint)
3010 a->func.go(E_OBJECT(eina_list_data_get(m)), mountpoint);
3016 case E_FM_OP_UNMOUNT_DONE: /*unmount done*/
3017 if ((e->data) && (e->size > 1))
3023 v = e_fm2_device_volume_find(udi);
3026 e_fm2_device_mount_del(v);
3027 _e_fm2_volume_icon_update(v);
3032 case E_FM_OP_EJECT_DONE:
3035 case E_FM_OP_MOUNT_ERROR: /*mount error*/
3036 if (e->data && (e->size > 1))
3042 v = e_fm2_device_volume_find(udi);
3045 _e_fm_device_error_dialog(_("Mount Error"), _("Can't mount device"), e->data);
3046 e_fm2_device_mount_fail(v);
3051 case E_FM_OP_UNMOUNT_ERROR: /*unmount error*/
3052 if (e->data && (e->size > 1))
3058 v = e_fm2_device_volume_find(udi);
3061 _e_fm_device_error_dialog(_("Unmount Error"), _("Can't unmount device"), e->data);
3062 e_fm2_device_unmount_fail(v);
3067 case E_FM_OP_EJECT_ERROR:
3068 if (e->data && (e->size > 1))
3074 v = e_fm2_device_volume_find(udi);
3076 _e_fm_device_error_dialog(_("Eject Error"), _("Can't eject device"), e->data);
3080 case E_FM_OP_ERROR: /*error*/
3083 printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data);
3084 dlg = _e_fm_error_dialog(e->ref, e->data);
3085 _e_fm2_op_registry_error(e->ref, dlg);
3089 case E_FM_OP_ERROR_RETRY_ABORT: /*error*/
3092 printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data);
3093 dlg = _e_fm_retry_abort_dialog(e->ref, (char *)e->data);
3094 _e_fm2_op_registry_error(e->ref, dlg);
3098 case E_FM_OP_OVERWRITE: /*overwrite*/
3101 printf("%s:%s(%d) Overwrite from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data);
3102 dlg = _e_fm_overwrite_dialog(e->ref, (char *)e->data);
3103 _e_fm2_op_registry_needs_attention(e->ref, dlg);
3107 case E_FM_OP_PROGRESS: /*progress*/
3109 int percent, seconds;
3115 if (!e->data) return;
3117 #define UP(value, type) (value) = *(type *)p; p += sizeof(type)
3124 dst = p + strlen(src) + 1;
3125 // printf("%s:%s(%d) Progress from slave #%d:\n\t%d%% done,\n\t%d seconds left,\n\t%zd done,\n\t%zd total,\n\tsrc = %s,\n\tdst = %s.\n", __FILE__, __FUNCTION__, __LINE__, e->ref, percent, seconds, done, total, src, dst);
3127 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(e->ref);
3129 ere->percent = percent;
3133 e_fm2_op_registry_entry_files_set(ere, src, dst);
3134 if (ere->percent == 100)
3136 ere->status = E_FM2_OP_STATUS_SUCCESSFUL;
3139 e_fm2_op_registry_entry_changed(ere);
3143 case E_FM_OP_QUIT: /*finished*/
3145 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(e->ref);
3150 e_fm2_op_registry_entry_changed(ere);
3152 e_fm2_op_registry_entry_del(e->ref);
3162 e_fm2_client_del(Ecore_Ipc_Event_Client_Del *e)
3167 EINA_LIST_FOREACH(_e_fm2_client_list, l, cl)
3169 if (cl->cl == e->client)
3171 _e_fm2_client_list = eina_list_remove_list(_e_fm2_client_list, l);
3178 /* local subsystem functions */
3180 _e_fm2_dev_path_map(const char *dev, const char *path)
3182 char buf[PATH_MAX] = "", *s, *ss;
3185 /* map a device name to a mount point/path on the os (and append path) */
3187 /* FIXME: load mappings from config and use them first - maybe device
3188 * discovery should be done through config and not the below (except
3189 * maybe for home directory and root fs and other simple thngs */
3190 /* FIXME: also add other virtualized dirs like "backgrounds", "themes",
3192 #define CMP(x) ((dev) && (e_util_glob_case_match(dev, x)))
3193 #define PRT(args ...) snprintf(buf, sizeof(buf), ##args)
3201 if (eina_strlcpy(buf, path, sizeof(buf)) >=
3207 if (PRT("%s/%s", dev, path) >= (int)sizeof(buf))
3211 else if ((dev[0] == '~') && (dev[1] == '/') && (dev[2] == '\0'))
3213 s = (char *)e_user_homedir_get();
3214 if (PRT("%s/%s", s, path) >= (int)sizeof(buf))
3217 else if (strcmp(dev, "favorites") == 0)
3219 /* this is a virtual device - it's where your favorites list is
3220 * stored - a dir with
3221 .desktop files or symlinks (in fact anything
3224 if (e_user_dir_concat_static(buf, "fileman/favorites") >= sizeof(buf))
3227 else if (strcmp(dev, "desktop") == 0)
3229 char *custom_desktop_dir = getenv("XDG_DESKTOP_DIR");
3230 /* this is a virtual device - it's where your favorites list is
3231 * stored - a dir with
3232 .desktop files or symlinks (in fact anything
3235 if (custom_desktop_dir)
3239 custom_desktop_dir = e_util_shell_env_path_eval(custom_desktop_dir);
3240 len = strlen(custom_desktop_dir);
3242 if (len >= sizeof(buf))
3244 free(custom_desktop_dir);
3248 strncpy(buf, custom_desktop_dir, sizeof(buf));
3250 if (strcmp(path, "/"))
3252 if (len + 1 + strlen(path) >= sizeof(buf))
3254 free(custom_desktop_dir);
3258 strncpy(buf + len, path, sizeof(buf) - len);
3260 free(custom_desktop_dir);
3264 if (strcmp(path, "/") == 0)
3266 if (e_user_homedir_concat(buf, sizeof(buf),
3267 _("Desktop")) >= sizeof(buf))
3272 if (e_user_homedir_snprintf(buf, sizeof(buf), "%s-%s",
3278 ecore_file_mkpath(buf);
3280 else if (strcmp(dev, "temp") == 0)
3282 /* FIXME: replace all this removable, dvd and like with hal */
3283 else if (!strncmp(dev, "removable:", sizeof("removable:") - 1))
3287 v = e_fm2_device_volume_find(dev + strlen("removable:"));
3290 if ((!v->mount_point) && (v->efm_mode == EFM_MODE_USING_HAL_MOUNT))
3291 v->mount_point = e_fm2_device_volume_mountpoint_get(v);
3292 else if (!v->mount_point) return NULL;
3294 if (PRT("%s/%s", v->mount_point, path) >= (int)sizeof(buf))
3298 /* else if (CMP("dvd") || CMP("dvd-*")) */
3300 /* /\* FIXME: find dvd mountpoint optionally for dvd no. X *\/ */
3301 /* /\* maybe make part of the device mappings config? *\/ */
3303 /* else if (CMP("cd") || CMP("cd-*") || CMP("cdrom") || CMP("cdrom-*") || */
3304 /* CMP("dvd") || CMP("dvd-*")) */
3306 /* /\* FIXME: find cdrom or dvd mountpoint optionally for cd/dvd no. X *\/ */
3307 /* /\* maybe make part of the device mappings config? *\/ */
3310 /* FIXME: add code to find USB devices (multi-card readers or single,
3311 * usb thumb drives, other usb storage devices (usb hd's etc.)
3313 /* maybe make part of the device mappings config? */
3314 /* FIXME: add code for finding nfs shares, smb shares etc. */
3315 /* maybe make part of the device mappings config? */
3319 if (eina_strlcpy(buf, path, sizeof(buf)) >= sizeof(buf))
3323 /* strip out excess multiple slashes */
3327 if ((s[0] == '/') && (s[1] == '/'))
3339 /* strip out slashes at the end - unless its just "/" */
3341 while ((len > 1) && (buf[len - 1] == '/'))
3346 return eina_stringshare_add(buf);
3350 _e_fm2_file_add(Evas_Object *obj, const char *file, int unique, const char *file_rel, int after, E_Fm2_Finfo *finf)
3352 E_Fm2_Smart_Data *sd;
3353 E_Fm2_Icon *ic, *ic2;
3356 sd = evas_object_smart_data_get(obj);
3358 /* if we only want unique icon names - if it's there - ignore */
3361 EINA_LIST_FOREACH(sd->icons, l, ic)
3363 if (!strcmp(ic->info.file, file))
3365 sd->tmp.last_insert = NULL;
3369 EINA_LIST_FOREACH(sd->queue, l, ic)
3371 if (!strcmp(ic->info.file, file))
3373 sd->tmp.last_insert = NULL;
3378 /* create icon obj and append to unsorted list */
3379 ic = _e_fm2_icon_new(sd, file, finf);
3384 /* respekt da ordah! */
3386 sd->queue = eina_list_append(sd->queue, ic);
3389 /* insertion sort it here to spread the sort load into idle time */
3390 EINA_LIST_FOREACH(sd->queue, l, ic2)
3392 if (_e_fm2_cb_icon_sort(ic, ic2) < 0)
3394 sd->queue = eina_list_prepend_relative_list(sd->queue, ic, l);
3398 if (!l) sd->queue = eina_list_append(sd->queue, ic);
3403 EINA_LIST_FOREACH(sd->icons, l, ic2)
3405 if (!strcmp(ic2->info.file, file_rel))
3408 sd->icons = eina_list_append_relative(sd->icons, ic, ic2);
3410 sd->icons = eina_list_prepend_relative(sd->icons, ic, ic2);
3415 sd->icons = eina_list_append(sd->icons, ic);
3416 sd->icons_place = eina_list_append(sd->icons_place, ic);
3418 sd->tmp.last_insert = NULL;
3419 sd->iconlist_changed = EINA_TRUE;
3424 _e_fm2_file_del(Evas_Object *obj, const char *file)
3426 E_Fm2_Smart_Data *sd;
3430 sd = evas_object_smart_data_get(obj);
3432 EINA_LIST_FOREACH(sd->icons, l, ic)
3434 if (!strcmp(ic->info.file, file))
3436 sd->icons = eina_list_remove_list(sd->icons, l);
3437 sd->icons_place = eina_list_remove(sd->icons_place, ic);
3440 ic->region->list = eina_list_remove(ic->region->list, ic);
3443 _e_fm2_icon_free(ic);
3450 _e_fm_file_buffer_clear(void)
3453 EINA_LIST_FREE(_e_fm_file_buffer, s)
3454 eina_stringshare_del(s);
3456 _e_fm_file_buffer_cutting = 0;
3457 _e_fm_file_buffer_copying = 0;
3461 _e_fm2_buffer_fill(Evas_Object *obj)
3464 char buf[PATH_MAX], *pfile;
3465 int bufused, buffree;
3466 const char *realpath;
3467 const E_Fm2_Icon_Info *ici;
3469 sel = e_fm2_selected_list_get(obj);
3470 if (!sel) return EINA_FALSE;
3472 realpath = e_fm2_real_path_get(obj);
3473 if (!realpath) return EINA_FALSE;
3475 bufused = eina_strlcpy(buf, realpath, sizeof(buf));
3476 if (bufused >= (int)sizeof(buf) - 2) return EINA_FALSE;
3478 if ((bufused > 0) && (buf[bufused - 1] != '/'))
3484 pfile = buf + bufused;
3485 buffree = sizeof(buf) - bufused;
3487 EINA_LIST_FREE(sel, ici)
3490 if ((int)eina_strlcpy(pfile, ici->file, buffree) >= buffree) continue;
3491 _e_fm_file_buffer = eina_list_append(_e_fm_file_buffer, _e_fm2_uri_escape(buf));
3498 _e_fm2_file_cut(Evas_Object *obj)
3500 _e_fm_file_buffer_clear();
3501 _e_fm_file_buffer_cutting = _e_fm2_buffer_fill(obj);
3505 _e_fm2_file_copy(Evas_Object *obj)
3507 _e_fm_file_buffer_clear();
3508 _e_fm_file_buffer_copying = _e_fm2_buffer_fill(obj);
3512 _e_fm2_file_paste(Evas_Object *obj)
3514 E_Fm2_Smart_Data *sd;
3516 const char *filepath;
3521 sd = evas_object_smart_data_get(obj);
3524 /* Convert URI list to a list of real paths. */
3525 paths = _e_fm2_uri_path_list_get(_e_fm_file_buffer);
3526 EINA_LIST_FREE(paths, filepath)
3528 /* Get file's full path. */
3532 /* Check if file is protected. */
3533 if (e_filereg_file_protected(filepath))
3535 eina_stringshare_del(filepath);
3539 /* Put filepath into a string of args.
3540 * If there are more files, put an additional space.
3542 args = _e_fm_string_append_quoted(args, &size, &length, filepath);
3543 args = _e_fm_string_append_char(args, &size, &length, ' ');
3545 eina_stringshare_del(filepath);
3548 /* Add destination to the arguments. */
3549 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
3551 /* Roll the operation! */
3552 if (_e_fm_file_buffer_copying)
3554 _e_fm_client_file_copy(args, sd->obj);
3558 _e_fm_client_file_move(args, sd->obj);
3565 _e_fm2_file_symlink(Evas_Object *obj)
3567 E_Fm2_Smart_Data *sd;
3569 const char *filepath;
3574 sd = evas_object_smart_data_get(obj);
3577 /* Convert URI list to a list of real paths. */
3578 paths = _e_fm2_uri_path_list_get(_e_fm_file_buffer);
3579 EINA_LIST_FREE(paths, filepath)
3581 /* Get file's full path. */
3585 /* Check if file is protected. */
3586 if (e_filereg_file_protected(filepath))
3588 eina_stringshare_del(filepath);
3592 /* Put filepath into a string of args.
3593 * If there are more files, put an additional space.
3595 args = _e_fm_string_append_quoted(args, &size, &length, filepath);
3596 args = _e_fm_string_append_char(args, &size, &length, ' ');
3598 eina_stringshare_del(filepath);
3601 /* Add destination to the arguments. */
3602 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
3604 /* Roll the operation! */
3605 if (_e_fm_file_buffer_copying)
3606 _e_fm_client_file_symlink(args, sd->obj);
3612 _e_fm2_file_cut_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3614 E_Fm2_Smart_Data *sd = data;
3616 _e_fm2_file_cut(sd->obj);
3620 _e_fm2_file_copy_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3622 E_Fm2_Smart_Data *sd = data;
3624 _e_fm2_file_copy(sd->obj);
3628 _e_fm2_file_paste_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3630 E_Fm2_Smart_Data *sd = data;
3632 _e_fm2_file_paste(sd->obj);
3636 _e_fm2_file_symlink_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3638 E_Fm2_Smart_Data *sd = data;
3640 _e_fm2_file_symlink(sd->obj);
3644 _e_fm2_queue_process(Evas_Object *obj)
3646 E_Fm2_Smart_Data *sd;
3647 E_Fm2_Icon *ic, *ic2;
3649 int added = 0, i, p0, p1, n, v;
3653 sd = evas_object_smart_data_get(obj);
3657 if (sd->resize_job) ecore_job_del(sd->resize_job);
3658 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
3659 evas_object_smart_callback_call(sd->obj, "changed", NULL);
3660 sd->tmp.last_insert = NULL;
3663 // double tt = ecore_time_get();
3664 // int queued = eina_list_count(sd->queue);
3665 /* take unsorted and insert into the icon list - reprocess regions */
3666 t = ecore_time_get();
3667 if (!sd->tmp.last_insert)
3670 n = eina_list_count(sd->icons);
3671 E_FREE(sd->tmp.list_index);
3673 sd->tmp.list_index = calloc(n, sizeof(Eina_List *));
3674 if (sd->tmp.list_index)
3676 ll = sd->tmp.list_index;
3677 for (l = sd->icons; l; l = eina_list_next(l))
3682 /* binary search first queue */
3683 ic = eina_list_data_get(sd->queue);
3686 ll = sd->tmp.list_index;
3687 if (ll[i]) do /* avoid garbage deref */
3689 ic2 = eina_list_data_get(ll[i]);
3690 v = _e_fm2_cb_icon_sort(ic, ic2);
3691 if (v < 0) /* ic should go before ic2 */
3693 else /* ic should go at or after ic2 */
3698 while ((p1 - p0) > 1);
3705 l = sd->tmp.last_insert;
3706 EINA_LIST_FREE(sd->queue, ic)
3708 /* insertion sort - better than qsort for the way we are doing
3709 * things - incrimentally scan and sort as we go as we now know
3710 * that the queue files are in order, we speed up insertions to
3711 * a worst case of O(n) where n is the # of files in the list
3720 EINA_LIST_FOREACH(l, l, ic2)
3722 if (_e_fm2_cb_icon_sort(ic, ic2) < 0)
3725 sd->icons = eina_list_prepend(sd->icons, ic);
3727 sd->icons = eina_list_prepend_relative_list(sd->icons,
3729 sd->tmp.last_insert = l;
3736 sd->icons = eina_list_append(sd->icons, ic);
3737 sd->tmp.last_insert = eina_list_last(sd->icons);
3739 sd->icons_place = eina_list_append(sd->icons_place, ic);
3741 /* if we spent more than 1/20th of a second inserting - give up
3743 if ((ecore_time_get() - t) > 0.05) break;
3745 // printf("FM: SORT %1.3f (%i files) (%i queued, %i added) [%i iter]\n",
3746 // ecore_time_get() - tt, eina_list_count(sd->icons), queued,
3747 // added, sd->tmp.iter);
3748 snprintf(buf, sizeof(buf), _("%i Files"), eina_list_count(sd->icons));
3749 edje_object_part_text_set(sd->overlay, "e.text.busy_label", buf);
3750 if (sd->resize_job) ecore_job_del(sd->resize_job);
3751 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
3752 evas_object_smart_callback_call(sd->obj, "changed", NULL);
3757 _e_fm2_queue_free(Evas_Object *obj)
3759 E_Fm2_Smart_Data *sd;
3762 sd = evas_object_smart_data_get(obj);
3764 /* just free the icons in the queue and the queue itself */
3765 EINA_LIST_FREE(sd->queue, ic)
3766 _e_fm2_icon_free(ic);
3770 _e_fm2_regions_free(Evas_Object *obj)
3772 E_Fm2_Smart_Data *sd;
3775 sd = evas_object_smart_data_get(obj);
3777 /* free up all regions */
3778 EINA_LIST_FREE(sd->regions.list, rg)
3779 _e_fm2_region_free(rg);
3783 _e_fm2_regions_populate(Evas_Object *obj)
3785 E_Fm2_Smart_Data *sd;
3790 sd = evas_object_smart_data_get(obj);
3792 /* take the icon list and split into regions */
3794 evas_event_freeze(evas_object_evas_get(obj));
3796 EINA_LIST_FOREACH(sd->icons, l, ic)
3800 rg = _e_fm2_region_new(sd);
3801 sd->regions.list = eina_list_append(sd->regions.list, rg);
3804 rg->list = eina_list_append(rg->list, ic);
3816 rg->w += rg->x - ic->x;
3819 if ((ic->x + ic->w) > (rg->x + rg->w))
3821 rg->w += (ic->x + ic->w) - (rg->x + rg->w);
3825 rg->h += rg->y - ic->y;
3828 if ((ic->y + ic->h) > (rg->y + rg->h))
3830 rg->h += (ic->y + ic->h) - (rg->y + rg->h);
3833 if ((int)eina_list_count(rg->list) > sd->regions.member_max)
3836 _e_fm2_regions_eval(obj);
3837 EINA_LIST_FOREACH(sd->icons, l, ic)
3839 if ((!ic->region->realized) && (ic->realized))
3840 _e_fm2_icon_unrealize(ic);
3842 _e_fm2_obj_icons_place(sd);
3844 evas_event_thaw(evas_object_evas_get(obj));
3848 _e_fm2_icons_place_icons(E_Fm2_Smart_Data *sd)
3852 Evas_Coord x, y, rh;
3856 EINA_LIST_FOREACH(sd->icons, l, ic)
3858 if ((x > 0) && ((x + ic->w) > sd->w))
3867 if (ic->h > rh) rh = ic->h;
3868 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
3869 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
3874 _e_fm2_icons_place_grid_icons(E_Fm2_Smart_Data *sd)
3878 Evas_Coord x, y, gw, gh;
3882 EINA_LIST_FOREACH(sd->icons, l, ic)
3884 if (ic->w > gw) gw = ic->w;
3885 if (ic->h > gh) gh = ic->h;
3887 if (gw > 0) cols = sd->w / gw;
3888 if (cols < 1) cols = 1;
3889 x = 0; y = 0; col = 0;
3890 EINA_LIST_FOREACH(sd->icons, l, ic)
3892 ic->x = x + ((gw - ic->w) / 2);
3893 ic->y = y + (gh - ic->h);
3902 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
3903 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
3908 _e_fm2_icons_icon_overlaps(E_Fm2_Icon *ic)
3913 /* this is really slow... when we have a lot of icons */
3914 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
3916 if ((ic2 != ic) && (ic2->saved_pos))
3918 if (E_INTERSECTS(ic2->x, ic2->y, ic2->w, ic2->h,
3919 ic->x, ic->y, ic->w, ic->h))
3927 _e_fm2_icons_icon_row_ok(E_Fm2_Icon *ic)
3929 if (ic->x + ic->w > ic->sd->w) return 0;
3930 if (ic->x < 0) return 0;
3931 if (ic->y < 0) return 0;
3936 _e_fm2_icon_place_relative(E_Fm2_Icon *ic, E_Fm2_Icon *icr, int xrel, int yrel, int xa, int ya)
3941 if (xrel > 0) ic->x += icr->w;
3945 ic->x += (icr->w - ic->w) / 2;
3947 ic->x += icr->w - ic->w;
3949 if (yrel > 0) ic->y += icr->h;
3953 ic->y += (icr->h - ic->h) / 2;
3955 ic->y += icr->h - ic->h;
3959 _e_fm2_icons_place_icon(E_Fm2_Icon *ic)
3966 ic->saved_pos = EINA_TRUE;
3968 // if (!_e_fm2_icons_icon_overlaps(ic)) return;
3970 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 2);
3971 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3972 _e_fm2_icon_place_relative(ic, ic2, 0, -1, 0, 0);
3973 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3974 _e_fm2_icon_place_relative(ic, ic2, 0, -1, 1, 0);
3975 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3976 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 0);
3977 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3978 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 1);
3979 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3980 _e_fm2_icon_place_relative(ic, ic2, 0, 1, 0, 0);
3981 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3982 _e_fm2_icon_place_relative(ic, ic2, 0, 1, 1, 0);
3983 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3985 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
3987 if ((ic2 != ic) && (ic2->saved_pos))
3990 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 2);
3991 if (_e_fm2_icons_icon_row_ok(ic) &&
3992 !_e_fm2_icons_icon_overlaps(ic)) goto done;
3994 _e_fm2_icon_place_relative(ic, ic2, -1, 0, 0, 2);
3995 if (_e_fm2_icons_icon_row_ok(ic) &&
3996 !_e_fm2_icons_icon_overlaps(ic)) goto done;
4000 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
4002 if ((ic2 != ic) && (ic2->saved_pos))
4006 _e_fm2_icon_place_relative(ic, ic2, 0, 1, 1, 0);
4007 if (_e_fm2_icons_icon_row_ok(ic) &&
4008 !_e_fm2_icons_icon_overlaps(ic)) goto done;
4011 _e_fm2_icon_place_relative(ic, ic2, 0, -1, 1, 0);
4012 if (_e_fm2_icons_icon_row_ok(ic) &&
4013 !_e_fm2_icons_icon_overlaps(ic)) goto done;
4015 if ((ic2 != ic) && (ic2->saved_pos))
4017 // TODO: if uncomment this, change EINA_LIST_FOREACH to EINA_LIST_FOREACH_SAFE!
4018 // ic->sd->icons_place = eina_list_remove_list(ic->sd->icons_place, pl);
4026 _e_fm2_icons_place_custom_icons(E_Fm2_Smart_Data *sd)
4031 EINA_LIST_FOREACH(sd->icons, l, ic)
4035 /* FIXME: place using smart place fn */
4036 _e_fm2_icons_place_icon(ic);
4039 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4040 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4045 _e_fm2_icons_place_custom_grid_icons(E_Fm2_Smart_Data *sd)
4047 /* FIXME: not going to implement this at this stage */
4051 EINA_LIST_FOREACH(sd->icons, l, ic)
4055 /* FIXME: place using grid fn */
4058 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4059 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4064 _e_fm2_icons_place_custom_smart_grid_icons(E_Fm2_Smart_Data *sd)
4066 /* FIXME: not going to implement this at this stage */
4070 EINA_LIST_FOREACH(sd->icons, l, ic)
4074 /* FIXME: place using smart grid fn */
4077 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4078 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4083 _e_fm2_icons_place_list(E_Fm2_Smart_Data *sd)
4091 EINA_LIST_FOREACH(sd->icons, l, ic)
4095 if (sd->w > ic->min_w)
4100 ic->odd = (i & 0x01);
4101 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4102 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4105 EINA_LIST_FOREACH(sd->icons, l, ic)
4112 _e_fm2_icons_place(Evas_Object *obj)
4114 E_Fm2_Smart_Data *sd;
4116 sd = evas_object_smart_data_get(obj);
4118 /* take the icon list and find a location for them */
4121 switch (_e_fm2_view_mode_get(sd))
4123 case E_FM2_VIEW_MODE_ICONS:
4124 _e_fm2_icons_place_icons(sd);
4125 // sd->max.h += ICON_BOTTOM_SPACE;
4128 case E_FM2_VIEW_MODE_GRID_ICONS:
4129 _e_fm2_icons_place_grid_icons(sd);
4130 // sd->max.h += ICON_BOTTOM_SPACE;
4133 case E_FM2_VIEW_MODE_CUSTOM_ICONS:
4134 _e_fm2_icons_place_custom_icons(sd);
4135 // sd->max.h += ICON_BOTTOM_SPACE;
4138 case E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS:
4139 /* FIXME: not going to implement this at this stage */
4140 _e_fm2_icons_place_custom_grid_icons(sd);
4141 // sd->max.h += ICON_BOTTOM_SPACE;
4144 case E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS:
4145 /* FIXME: not going to implement this at this stage */
4146 _e_fm2_icons_place_custom_smart_grid_icons(sd);
4147 // sd->max.h += ICON_BOTTOM_SPACE;
4150 case E_FM2_VIEW_MODE_LIST:
4151 _e_fm2_icons_place_list(sd);
4157 /* tell our parent scrollview - if any, that we have changed */
4158 evas_object_smart_callback_call(sd->obj, "changed", NULL);
4162 _e_fm2_icons_free(Evas_Object *obj)
4164 E_Fm2_Smart_Data *sd;
4166 sd = evas_object_smart_data_get(obj);
4168 _e_fm2_queue_free(obj);
4169 /* free all icons */
4170 E_FREE_LIST(sd->icons, _e_fm2_icon_free);
4171 eina_list_free(sd->icons_place);
4172 sd->icons_place = NULL;
4173 sd->tmp.last_insert = NULL;
4174 E_FREE(sd->tmp.list_index);
4178 _e_fm2_regions_eval(Evas_Object *obj)
4180 E_Fm2_Smart_Data *sd;
4184 sd = evas_object_smart_data_get(obj);
4186 evas_event_freeze(evas_object_evas_get(obj));
4188 EINA_LIST_FOREACH(sd->regions.list, l, rg)
4190 if (_e_fm2_region_visible(rg))
4191 _e_fm2_region_realize(rg);
4193 _e_fm2_region_unrealize(rg);
4196 evas_event_thaw(evas_object_evas_get(obj));
4200 _e_fm2_config_free(E_Fm2_Config *cfg)
4202 if (cfg->icon.key_hint) eina_stringshare_del(cfg->icon.key_hint);
4203 if (cfg->theme.background) eina_stringshare_del(cfg->theme.background);
4204 if (cfg->theme.frame) eina_stringshare_del(cfg->theme.frame);
4205 if (cfg->theme.icons) eina_stringshare_del(cfg->theme.icons);
4209 static Evas_Object *
4210 _e_fm2_file_fm2_find(const char *file)
4216 dir = ecore_file_dir_get(file);
4217 if (!dir) return NULL;
4218 EINA_LIST_FOREACH(_e_fm2_list, l, obj)
4220 if ((_e_fm2_list_walking > 0) &&
4221 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
4222 if (!strcmp(e_fm2_real_path_get(obj), dir))
4233 _e_fm2_icon_find(Evas_Object *obj, const char *file)
4235 E_Fm2_Smart_Data *sd;
4239 sd = evas_object_smart_data_get(obj);
4240 if (!sd) return NULL;
4241 EINA_LIST_FOREACH(sd->icons, l, ic)
4243 if (!strcmp(ic->info.file, file)) return ic;
4248 /* Escape illegal caracters within an uri and return an eina_stringshare */
4250 _e_fm2_uri_escape(const char *path)
4252 char dest[PATH_MAX * 3 + 7];
4256 if (!path) return NULL;
4257 memset(dest, 0, PATH_MAX * 3 + 7);
4259 snprintf(dest, 8, "file://");
4261 /* Most app doesn't handle the hostname in the uri so it's put to NULL */
4262 for (i = 7, p = path; *p != '\0'; p++, i++)
4264 if (isalnum(*p) || strchr("/$-_.+!*'()", *p))
4268 snprintf(&(dest[i]), 4, "%%%02X", (unsigned char)*p);
4273 return eina_stringshare_add(dest);
4276 /* Parse a single uri and return an E_Fm2_Uri struct.
4277 * If the parsing have failed it return NULL.
4278 * The E_Fm2_Uri may have hostname parameter and always a path.
4279 * If there's no hostname in the uri then the hostname parameter is NULL
4282 _e_fm2_uri_parse(const char *val)
4286 char hostname[PATH_MAX], path[PATH_MAX];
4289 /* if value is a raw path: /path/to/blah just return it */
4292 uri = E_NEW(E_Fm2_Uri, 1);
4293 uri->hostname = NULL;
4294 uri->path = eina_stringshare_add(val);
4297 /* The shortest possible path is file:///
4298 * anything smaller than that can't be a valid uri
4300 if (strlen(val) <= 7 && strncmp(val, "file://", 7)) return NULL;
4301 memset(path, 0, PATH_MAX);
4303 /* An uri should be in a form file://<hostname>/<path> */
4307 for (i = 0; *p != '/' && *p != '\0' && i < _POSIX_HOST_NAME_MAX; p++, i++)
4312 /* See http://www.faqs.org/rfcs/rfc1738.html for the escaped chars */
4313 for (i = 0; *p != '\0' && i < PATH_MAX; i++, p++)
4318 path[i + 1] = *(++p);
4319 path[i] = (char)strtol(&(path[i]), NULL, 16);
4326 uri = E_NEW(E_Fm2_Uri, 1);
4327 if (hostname[0]) uri->hostname = eina_stringshare_add(hostname);
4328 else uri->hostname = NULL;
4329 uri->path = eina_stringshare_add(path);
4334 /* Takes an Eina_List of uri and return an Eina_List of real paths */
4336 _e_fm2_uri_path_list_get(Eina_List *uri_list)
4339 Eina_List *l, *path_list = NULL;
4340 char current_hostname[_POSIX_HOST_NAME_MAX];
4341 const char *uri_str;
4343 if (gethostname(current_hostname, _POSIX_HOST_NAME_MAX) == -1)
4344 current_hostname[0] = '\0';
4346 EINA_LIST_FOREACH(uri_list, l, uri_str)
4348 if (!(uri = _e_fm2_uri_parse(uri_str)))
4351 if (!uri->hostname || !strcmp(uri->hostname, "localhost")
4352 || !strcmp(uri->hostname, current_hostname))
4354 path_list = eina_list_append(path_list, uri->path);
4357 eina_stringshare_del(uri->path);
4359 if (uri->hostname) eina_stringshare_del(uri->hostname);
4367 _e_fm2_uri_icon_list_get(Eina_List *uri)
4369 Eina_List *icons = NULL;
4373 EINA_LIST_FOREACH(uri, l, path)
4379 fm = _e_fm2_file_fm2_find(path);
4382 const char *file = ecore_file_file_get(path);
4383 ic = _e_fm2_icon_find(fm, file);
4385 icons = eina_list_append(icons, ic);
4390 /**************************/
4393 _e_fm2_icon_new(E_Fm2_Smart_Data *sd, const char *file, E_Fm2_Finfo *finf)
4398 ic = E_NEW(E_Fm2_Icon, 1);
4399 ic->info.fm = sd->obj;
4401 ic->info.file = eina_stringshare_add(file);
4403 if (!_e_fm2_icon_fill(ic, finf))
4405 eina_stringshare_del(ic->info.file);
4413 _e_fm2_icon_unfill(E_Fm2_Icon *ic)
4415 eina_stringshare_del(ic->info.mime);
4416 eina_stringshare_del(ic->info.label);
4417 eina_stringshare_del(ic->info.comment);
4418 eina_stringshare_del(ic->info.generic);
4419 eina_stringshare_del(ic->info.icon);
4420 eina_stringshare_del(ic->info.link);
4421 eina_stringshare_del(ic->info.real_link);
4422 eina_stringshare_del(ic->info.category);
4423 ic->info.mime = NULL;
4424 ic->info.label = NULL;
4425 ic->info.comment = NULL;
4426 ic->info.generic = NULL;
4427 ic->info.icon = NULL;
4428 ic->info.link = NULL;
4429 ic->info.real_link = NULL;
4430 ic->info.mount = EINA_FALSE;
4431 ic->info.removable = EINA_FALSE;
4432 ic->info.removable_full = EINA_FALSE;
4433 ic->info.deleted = EINA_FALSE;
4434 ic->info.broken_link = EINA_FALSE;
4438 _e_fm2_icon_geom_adjust(E_Fm2_Icon *ic, int saved_x, int saved_y, int saved_w __UNUSED__, int saved_h __UNUSED__, int saved_res_w, int saved_res_h)
4440 int qx, qy, rx, ry, x, y;
4442 if (!((_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS) &&
4443 (ic->sd->config->view.fit_custom_pos) &&
4444 (saved_res_w > 0) &&
4447 if (saved_res_w >= 3) qx = saved_x / (saved_res_w / 3);
4449 rx = saved_x - ((saved_res_w / 2) * qx);
4450 x = ((ic->sd->w / 2) * qx) + rx;
4453 if (saved_res_h >= 3) qy = saved_y / (saved_res_h / 3);
4455 ry = saved_y - ((saved_res_h / 2) * qy);
4456 y = ((ic->sd->h / 2) * qy) + ry;
4461 _e_fm2_icon_fill(E_Fm2_Icon *ic, E_Fm2_Finfo *finf)
4463 Evas_Coord mw = 0, mh = 0;
4464 Evas_Object *obj, *obj2;
4465 char buf[PATH_MAX], *lnk;
4467 E_Fm2_Custom_File *cf;
4469 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
4471 cf = e_fm2_custom_file_get(buf);
4474 memcpy(&(ic->info.statinfo), &(finf->st), sizeof(struct stat));
4475 if ((finf->lnk) && (finf->lnk[0]))
4476 ic->info.link = eina_stringshare_add(finf->lnk);
4478 ic->info.link = NULL;
4479 if ((finf->rlnk) && (finf->rlnk[0]))
4480 ic->info.real_link = eina_stringshare_add(finf->rlnk);
4482 ic->info.real_link = NULL;
4483 ic->info.broken_link = finf->broken_link;
4487 printf("FIXME: remove old non finf icon fill code\n");
4488 /* FIXME: this should go away... get this from the fm slave proc above */
4489 lnk = ecore_file_readlink(buf);
4490 if (stat(buf, &(ic->info.statinfo)) == -1)
4493 ic->info.broken_link = EINA_TRUE;
4503 ic->info.link = eina_stringshare_add(lnk);
4504 ic->info.real_link = eina_stringshare_add(lnk);
4510 snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, lnk);
4511 rp = ecore_file_realpath(buf);
4514 ic->info.link = eina_stringshare_add(rp);
4517 ic->info.real_link = eina_stringshare_add(lnk);
4521 /* FIXME: end go away chunk */
4524 if (S_ISDIR(ic->info.statinfo.st_mode))
4526 ic->info.mime = eina_stringshare_ref(_e_fm2_mime_inode_directory);
4528 else if (ic->info.real_link)
4530 mime = efreet_mime_type_get(ic->info.real_link);
4532 /* XXX REMOVE/DEPRECATE ME LATER */
4533 mime = e_fm_mime_filename_get(ic->info.file);
4534 if (mime) ic->info.mime = eina_stringshare_add(mime);
4539 mime = efreet_mime_type_get(buf);
4541 /* XXX REMOVE/DEPRECATE ME LATER */
4542 mime = e_fm_mime_filename_get(ic->info.file);
4543 if (mime) ic->info.mime = eina_stringshare_add(mime);
4546 if (_e_fm2_file_is_desktop(ic->info.file))
4547 _e_fm2_icon_desktop_load(ic);
4555 eina_stringshare_replace(&ic->info.icon, cf->icon.icon);
4557 ic->info.icon_type = cf->icon.type;
4561 ic->saved_pos = EINA_TRUE;
4564 if (cf->geom.w > 0) ic->w = cf->geom.w;
4565 if (cf->geom.h > 0) ic->h = cf->geom.h;
4566 _e_fm2_icon_geom_adjust(ic, cf->geom.x, cf->geom.y, cf->geom.w, cf->geom.h, cf->geom.res_w, cf->geom.res_h);
4570 evas_event_freeze(evas_object_evas_get(ic->sd->obj));
4573 switch (_e_fm2_view_mode_get(ic->sd))
4575 case E_FM2_VIEW_MODE_ICONS:
4576 case E_FM2_VIEW_MODE_GRID_ICONS:
4577 case E_FM2_VIEW_MODE_CUSTOM_ICONS:
4578 case E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS:
4579 case E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS:
4580 /* FIXME: need to define icon edjes. here goes:
4582 * fileman/icon/fixed
4583 * fileman/icon/variable
4584 * fileman/list/fixed
4585 * fileman/list/variable
4586 * fileman/list_odd/fixed
4587 * fileman/list_odd/variable
4590 if ((!ic->sd->config->icon.fixed.w) || (!ic->sd->config->icon.fixed.h))
4592 obj = ic->sd->tmp.obj;
4595 obj = edje_object_add(evas_object_evas_get(ic->sd->obj));
4596 if ((ic->sd->config->icon.fixed.w) && (ic->sd->config->icon.fixed.h))
4597 _e_fm2_theme_edje_object_set(ic->sd, obj,
4598 "base/theme/fileman",
4601 _e_fm2_theme_edje_object_set(ic->sd, obj,
4602 "base/theme/fileman",
4604 ic->sd->tmp.obj = obj;
4606 _e_fm2_icon_label_set(ic, obj);
4607 obj2 = ic->sd->tmp.obj2;
4610 obj2 = evas_object_rectangle_add(evas_object_evas_get(ic->sd->obj));
4611 ic->sd->tmp.obj2 = obj2;
4613 /* FIXME: if icons are allowed to have their own size - use it */
4614 edje_extern_object_min_size_set(obj2, _e_fm2_icon_w_get(ic->sd), _e_fm2_icon_h_get(ic->sd));
4615 edje_extern_object_max_size_set(obj2, _e_fm2_icon_w_get(ic->sd), _e_fm2_icon_h_get(ic->sd));
4616 edje_object_part_swallow(obj, "e.swallow.icon", obj2);
4617 edje_object_size_min_calc(obj, &mw, &mh);
4621 if (ic->sd->config->icon.fixed.w) ic->w = _e_fm2_icon_w_get(ic->sd);
4622 if (ic->sd->config->icon.fixed.h) ic->h = _e_fm2_icon_h_get(ic->sd);
4627 case E_FM2_VIEW_MODE_LIST:
4629 obj = ic->sd->tmp.obj;
4632 obj = edje_object_add(evas_object_evas_get(ic->sd->obj));
4633 // vairable sized list items are pretty usless - ignore.
4634 // if (ic->sd->config->icon.fixed.w)
4635 _e_fm2_theme_edje_object_set(ic->sd, obj,
4636 "base/theme/fileman",
4639 // _e_fm2_theme_edje_object_set(ic->sd, obj, "base/theme/fileman",
4640 // "list/variable");
4641 ic->sd->tmp.obj = obj;
4643 _e_fm2_icon_label_set(ic, obj);
4644 obj2 = ic->sd->tmp.obj2;
4647 obj2 = evas_object_rectangle_add(evas_object_evas_get(ic->sd->obj));
4648 ic->sd->tmp.obj2 = obj2;
4650 edje_extern_object_min_size_set(obj2, ic->sd->config->icon.list.w, ic->sd->config->icon.list.h);
4651 edje_extern_object_max_size_set(obj2, ic->sd->config->icon.list.w, ic->sd->config->icon.list.h);
4652 edje_object_part_swallow(obj, "e.swallow.icon", obj2);
4653 edje_object_size_min_calc(obj, &mw, &mh);
4655 if (mw < ic->sd->w) ic->w = ic->sd->w;
4666 evas_event_thaw(evas_object_evas_get(ic->sd->obj));
4671 _e_fm2_icon_free(E_Fm2_Icon *ic)
4673 /* free icon, object data etc. etc. */
4674 if (ic->sd->drop_icon == ic)
4676 /* FIXME: call hide call */
4677 ic->sd->drop_icon = NULL;
4679 _e_fm2_icon_unrealize(ic);
4682 e_menu_post_deactivate_callback_set(ic->menu, NULL, NULL);
4683 e_object_del(E_OBJECT(ic->menu));
4688 e_object_del(E_OBJECT(ic->dialog));
4691 if (ic->entry_dialog)
4693 e_object_del(E_OBJECT(ic->entry_dialog));
4694 ic->entry_dialog = NULL;
4696 if (ic->entry_widget)
4697 _e_fm2_icon_entry_widget_del(ic);
4698 if (ic->prop_dialog)
4700 e_object_del(E_OBJECT(ic->prop_dialog));
4701 ic->prop_dialog = NULL;
4703 eina_stringshare_del(ic->info.file);
4704 eina_stringshare_del(ic->info.mime);
4705 eina_stringshare_del(ic->info.label);
4706 eina_stringshare_del(ic->info.comment);
4707 eina_stringshare_del(ic->info.generic);
4708 eina_stringshare_del(ic->info.icon);
4709 eina_stringshare_del(ic->info.link);
4710 eina_stringshare_del(ic->info.real_link);
4711 eina_stringshare_del(ic->info.category);
4716 _e_fm2_icon_realize(E_Fm2_Icon *ic)
4718 if (ic->realized) return;
4719 /* actually create evas objects etc. */
4720 ic->realized = EINA_TRUE;
4721 evas_event_freeze(evas_object_evas_get(ic->sd->obj));
4722 ic->obj = edje_object_add(evas_object_evas_get(ic->sd->obj));
4723 edje_object_freeze(ic->obj);
4724 evas_object_smart_member_add(ic->obj, ic->sd->obj);
4725 evas_object_stack_below(ic->obj, ic->sd->drop);
4726 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
4728 const char *stacking;
4730 // if (ic->sd->config->icon.fixed.w)
4733 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4734 "base/theme/widgets",
4737 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4738 "base/theme/widgets",
4740 stacking = edje_object_data_get(ic->obj, "stacking");
4743 if (!strcmp(stacking, "below"))
4744 evas_object_stack_above(ic->obj, ic->sd->underlay);
4745 else if (!strcmp(stacking, "above"))
4746 evas_object_stack_below(ic->obj, ic->sd->drop);
4753 // _e_fm2_theme_edje_object_set(ic->sd, ic->obj, "base/theme/widgets",
4754 // "list_odd/variable");
4756 // _e_fm2_theme_edje_object_set(ic->sd, ic->obj, "base/theme/widgets",
4757 // "list/variable");
4762 if (ic->sd->config->icon.fixed.w)
4763 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4764 "base/theme/fileman",
4767 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4768 "base/theme/fileman",
4771 _e_fm2_icon_label_set(ic, ic->obj);
4772 evas_object_clip_set(ic->obj, ic->sd->clip);
4773 evas_object_move(ic->obj,
4774 ic->sd->x + ic->x - ic->sd->pos.x,
4775 ic->sd->y + ic->y - ic->sd->pos.y);
4776 evas_object_resize(ic->obj, ic->w, ic->h);
4778 evas_object_event_callback_add(ic->obj, EVAS_CALLBACK_MOUSE_DOWN, _e_fm2_cb_icon_mouse_down, ic);
4779 evas_object_event_callback_add(ic->obj, EVAS_CALLBACK_MOUSE_UP, _e_fm2_cb_icon_mouse_up, ic);
4780 evas_object_event_callback_add(ic->obj, EVAS_CALLBACK_MOUSE_MOVE, _e_fm2_cb_icon_mouse_move, ic);
4782 _e_fm2_icon_icon_set(ic);
4784 edje_object_thaw(ic->obj);
4785 evas_event_thaw(evas_object_evas_get(ic->sd->obj));
4786 evas_object_show(ic->obj);
4790 const char *selectraise;
4792 /* FIXME: need new signal to INSTANTLY activate - no anim */
4793 /* FIXME: while listing dirs need to use icons in-place and not
4794 * unrealize and re-realize */
4795 edje_object_signal_emit(ic->obj, "e,state,selected", "e");
4796 edje_object_signal_emit(ic->obj_icon, "e,state,selected", "e");
4797 selectraise = edje_object_data_get(ic->obj, "selectraise");
4798 if ((selectraise) && (!strcmp(selectraise, "on")))
4799 evas_object_stack_below(ic->obj, ic->sd->drop);
4802 if (ic->info.removable)
4803 _e_fm2_icon_removable_update(ic);
4807 _e_fm2_icon_unrealize(E_Fm2_Icon *ic)
4809 if (!ic->realized) return;
4810 /* delete evas objects */
4811 ic->realized = EINA_FALSE;
4812 evas_object_del(ic->obj);
4814 evas_object_del(ic->obj_icon);
4815 ic->obj_icon = NULL;
4819 _e_fm2_icon_visible(const E_Fm2_Icon *ic)
4821 /* return if the icon is visible */
4823 ((ic->x - ic->sd->pos.x) < (ic->sd->w + OVERCLIP)) &&
4824 ((ic->x + ic->w - ic->sd->pos.x) > (-OVERCLIP)) &&
4825 ((ic->y - ic->sd->pos.y) < (ic->sd->h + OVERCLIP)) &&
4826 ((ic->y + ic->h - ic->sd->pos.y) > (-OVERCLIP))
4833 _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj)
4840 edje_object_part_text_set(obj, "e.text.label", ic->info.label);
4843 if ((ic->sd->config->icon.extension.show) ||
4844 (S_ISDIR(ic->info.statinfo.st_mode)))
4845 edje_object_part_text_set(obj, "e.text.label", ic->info.file);
4848 /* remove extension. handle double extensions like .tar.gz too
4849 * also be fuzzy - up to 4 chars of extn is ok - eg .html but 5 or
4850 * more is considered part of the name
4852 eina_strlcpy(buf, ic->info.file, sizeof(buf));
4855 p = strrchr(buf, '.');
4856 if ((p) && ((len - (p - buf)) < 6))
4861 p = strrchr(buf, '.');
4862 if ((p) && ((len - (p - buf)) < 6)) *p = 0;
4864 edje_object_part_text_set(obj, "e.text.label", buf);
4868 static Evas_Object *
4869 _e_fm2_icon_icon_direct_set(E_Fm2_Icon *ic, Evas_Object *o, Evas_Smart_Cb gen_func, void *data, int force_gen)
4873 oic = e_fm2_icon_get(evas_object_evas_get(o), ic,
4874 gen_func, data, force_gen, NULL);
4877 edje_object_part_swallow(o, "e.swallow.icon", oic);
4878 evas_object_show(oic);
4884 _e_fm2_icon_icon_set(E_Fm2_Icon *ic)
4886 if (!ic->realized) return;
4887 ic->obj_icon = _e_fm2_icon_icon_direct_set(ic, ic->obj,
4888 _e_fm2_cb_icon_thumb_gen,
4893 _e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force)
4896 ((_e_fm2_icon_visible(ic)) &&
4898 (!ic->sd->sort_idler) &&
4899 (!ic->sd->listing)))
4900 e_thumb_icon_begin(oic);
4904 _e_fm2_icon_select(E_Fm2_Icon *ic)
4906 if (ic->selected) return;
4907 ic->selected = EINA_TRUE;
4908 ic->last_selected = EINA_TRUE;
4911 const char *selectraise;
4913 if (ic->sd->iop_icon)
4914 _e_fm2_icon_entry_widget_accept(ic->sd->iop_icon);
4916 edje_object_signal_emit(ic->obj, "e,state,selected", "e");
4917 edje_object_signal_emit(ic->obj_icon, "e,state,selected", "e");
4918 evas_object_stack_below(ic->obj, ic->sd->drop);
4919 selectraise = edje_object_data_get(ic->obj, "selectraise");
4920 if ((selectraise) && (!strcmp(selectraise, "on")))
4921 evas_object_stack_below(ic->obj, ic->sd->drop);
4926 _e_fm2_icon_deselect(E_Fm2_Icon *ic)
4928 if (!ic->selected) return;
4929 ic->selected = EINA_FALSE;
4930 ic->last_selected = EINA_FALSE;
4933 const char *stacking, *selectraise;
4935 if (ic->entry_widget)
4936 _e_fm2_icon_entry_widget_accept(ic);
4938 edje_object_signal_emit(ic->obj, "e,state,unselected", "e");
4939 edje_object_signal_emit(ic->obj_icon, "e,state,unselected", "e");
4940 stacking = edje_object_data_get(ic->obj, "stacking");
4941 selectraise = edje_object_data_get(ic->obj, "selectraise");
4942 if ((selectraise) && (!strcmp(selectraise, "on")))
4944 if ((stacking) && (!strcmp(stacking, "below")))
4945 evas_object_stack_above(ic->obj, ic->sd->underlay);
4951 _e_fm2_icon_desktop_url_eval(const char *val)
4956 if (strlen(val) < 6) return NULL;
4957 if (strncmp(val, "file:", 5)) return NULL;
4958 path = (char *)val + 5;
4959 p = e_util_shell_env_path_eval(path);
4960 if (!p) return NULL;
4962 while (*path == '/') path++;
4964 s = eina_stringshare_add(path);
4970 _e_fm2_icon_desktop_load(E_Fm2_Icon *ic)
4973 Efreet_Desktop *desktop;
4975 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
4978 desktop = efreet_desktop_new(buf);
4979 // printf("efreet_desktop_new(%s) = %p\n", buf, desktop);
4980 if (!desktop) goto error;
4981 // if (desktop->type != EFREET_DESKTOP_TYPE_LINK) goto error;
4983 ic->info.removable = EINA_FALSE;
4984 ic->info.removable_full = EINA_FALSE;
4985 ic->info.label = eina_stringshare_add(desktop->name);
4986 ic->info.generic = eina_stringshare_add(desktop->generic_name);
4987 ic->info.comment = eina_stringshare_add(desktop->comment);
4988 ic->info.icon = eina_stringshare_add(desktop->icon);
4990 ic->info.link = _e_fm2_icon_desktop_url_eval(desktop->url);
4995 type = eina_hash_find(desktop->x, "X-Enlightenment-Type");
4998 if (!strcmp(type, "Mount")) ic->info.mount = EINA_TRUE;
4999 else if (!strcmp(type, "Removable"))
5001 ic->info.removable = EINA_TRUE;
5002 if ((!e_fm2_device_storage_find(ic->info.link)) &&
5003 (!e_fm2_device_volume_find(ic->info.link)))
5005 /* delete .desktop for non existing device */
5006 if (ecore_file_remove(buf))
5007 _e_fm2_live_file_del(ic->sd->obj, ic->info.file);
5009 _e_fm2_file_del(ic->sd->obj, ic->info.file);
5011 efreet_desktop_free(desktop);
5015 type = eina_hash_find(desktop->x, "X-Enlightenment-Removable-State");
5018 if (!strcmp(type, "Full"))
5019 ic->info.removable_full = EINA_TRUE;
5023 /* FIXME: get category */
5024 ic->info.category = NULL;
5025 efreet_desktop_free(desktop);
5029 eina_stringshare_del(ic->info.label);
5030 eina_stringshare_del(ic->info.comment);
5031 eina_stringshare_del(ic->info.generic);
5032 eina_stringshare_del(ic->info.icon);
5033 eina_stringshare_del(ic->info.link);
5034 eina_stringshare_del(ic->info.category);
5035 ic->info.label = NULL;
5036 ic->info.comment = NULL;
5037 ic->info.generic = NULL;
5038 ic->info.icon = NULL;
5039 ic->info.link = NULL;
5040 ic->info.category = NULL;
5042 if (!strncmp(ic->info.file, "|storage_", 9)) ecore_file_unlink(buf);
5046 /**************************/
5047 static E_Fm2_Region *
5048 _e_fm2_region_new(E_Fm2_Smart_Data *sd)
5052 rg = E_NEW(E_Fm2_Region, 1);
5058 _e_fm2_region_free(E_Fm2_Region *rg)
5062 EINA_LIST_FREE(rg->list, ic)
5068 _e_fm2_region_realize(E_Fm2_Region *rg)
5073 if (rg->realized) return;
5074 /* actually create evas objects etc. */
5077 EINA_LIST_FOREACH(rg->list, l, ic) _e_fm2_icon_realize(ic);
5078 EINA_LIST_FOREACH(rg->list, l, ic)
5081 evas_object_stack_below(ic->obj, ic->sd->drop);
5087 _e_fm2_region_unrealize(E_Fm2_Region *rg)
5092 if (!rg->realized) return;
5093 /* delete evas objects */
5096 EINA_LIST_FOREACH(rg->list, l, ic) _e_fm2_icon_unrealize(ic);
5101 _e_fm2_region_visible(E_Fm2_Region *rg)
5103 /* return if the icon is visible */
5105 ((rg->x - rg->sd->pos.x) < (rg->sd->w + OVERCLIP)) &&
5106 ((rg->x + rg->w - rg->sd->pos.x) > (-OVERCLIP)) &&
5107 ((rg->y - rg->sd->pos.y) < (rg->sd->h + OVERCLIP)) &&
5108 ((rg->y + rg->h - rg->sd->pos.y) > (-OVERCLIP))
5115 _e_fm2_icon_make_visible(E_Fm2_Icon *ic)
5117 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
5120 ((ic->y - ic->sd->pos.y) >= 0) &&
5121 ((ic->y + ic->h - ic->sd->pos.y) <= (ic->sd->h))
5124 if ((ic->y - ic->sd->pos.y) < 0)
5125 e_fm2_pan_set(ic->sd->obj, ic->sd->pos.x, ic->y);
5127 e_fm2_pan_set(ic->sd->obj, ic->sd->pos.x, ic->y - ic->sd->h + ic->h);
5134 ((ic->y - ic->sd->pos.y) >= 0) &&
5135 ((ic->y + ic->h/* + ICON_BOTTOM_SPACE*/ - ic->sd->pos.y) <= (ic->sd->h)) &&
5136 ((ic->x - ic->sd->pos.x) >= 0) &&
5137 ((ic->x + ic->w - ic->sd->pos.x) <= (ic->sd->w))
5141 if ((ic->x - ic->sd->pos.x) < 0)
5143 else if ((ic->x + ic->w - ic->sd->pos.x) > (ic->sd->w))
5144 x = ic->x + ic->w - ic->sd->w;
5146 if ((ic->y - ic->sd->pos.y) < 0)
5148 else if ((ic->y + ic->h/* + ICON_BOTTOM_SPACE*/ - ic->sd->pos.y) > (ic->sd->h))
5149 y = ic->y + ic->h/* + ICON_BOTTOM_SPACE*/ - ic->sd->h;
5150 e_fm2_pan_set(ic->sd->obj, x, y);
5152 evas_object_smart_callback_call(ic->sd->obj, "pan_changed", NULL);
5156 _e_fm2_icon_desel_any(Evas_Object *obj)
5158 E_Fm2_Smart_Data *sd;
5162 sd = evas_object_smart_data_get(obj);
5164 EINA_LIST_FOREACH(sd->icons, l, ic)
5166 if (ic->selected) _e_fm2_icon_deselect(ic);
5171 _e_fm2_icon_first_selected_find(Evas_Object *obj)
5173 E_Fm2_Smart_Data *sd;
5177 sd = evas_object_smart_data_get(obj);
5178 if (!sd) return NULL;
5179 EINA_LIST_FOREACH(sd->icons, l, ic)
5181 if (ic->selected) return ic;
5187 _e_fm2_icon_sel_first(Evas_Object *obj)
5189 E_Fm2_Smart_Data *sd;
5192 sd = evas_object_smart_data_get(obj);
5194 if (!sd->icons) return;
5195 _e_fm2_icon_desel_any(obj);
5196 ic = eina_list_data_get(sd->icons);
5197 _e_fm2_icon_select(ic);
5198 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5199 _e_fm2_icon_make_visible(ic);
5203 _e_fm2_icon_sel_last(Evas_Object *obj)
5205 E_Fm2_Smart_Data *sd;
5208 sd = evas_object_smart_data_get(obj);
5210 if (!sd->icons) return;
5211 _e_fm2_icon_desel_any(obj);
5212 ic = eina_list_data_get(eina_list_last(sd->icons));
5213 _e_fm2_icon_select(ic);
5214 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5215 _e_fm2_icon_make_visible(ic);
5219 _e_fm2_icon_sel_any(Evas_Object *obj)
5221 E_Fm2_Smart_Data *sd;
5225 sd = evas_object_smart_data_get(obj);
5227 if (!sd->icons) return;
5228 EINA_LIST_FOREACH(sd->icons, l, ic)
5229 if (!ic->selected) _e_fm2_icon_select(ic);
5233 _e_fm2_icon_next_find(Evas_Object *obj, int next, int (*match_func)(E_Fm2_Icon *ic, void *data), void *data)
5235 E_Fm2_Smart_Data *sd;
5237 E_Fm2_Icon *ic, *ic_next;
5239 int x = 0, y = 0, custom = 0;
5240 int dist, min = 65535;
5242 sd = evas_object_smart_data_get(obj);
5243 if (!sd) return NULL;
5244 if (!sd->icons) return NULL;
5246 view_mode = _e_fm2_view_mode_get(sd);
5247 if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
5248 (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
5249 (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
5253 /* find selected item / current position */
5254 EINA_LIST_FOREACH(sd->icons, l, ic)
5258 if (!custom && !match_func)
5270 if (next && (custom || match_func))
5272 /* find next item in custom grid, or list/grid when match
5276 EINA_LIST_FOREACH(sd->icons, l, ic)
5279 (custom ? (ic->y >= y) : (ic->y == y)) &&
5280 (!match_func || match_func(ic, data)))
5282 dist = 2 * (ic->y - y) + (ic->x - x);
5290 /* no next item was found in row go down and begin */
5293 EINA_LIST_FOREACH(sd->icons, l, ic)
5295 if ((ic->y > y) && (!match_func || match_func(ic, data)))
5297 dist = 2 * (abs(ic->y - y)) + ic->x;
5307 /* find previous item */
5308 else if (next == -1)
5310 EINA_LIST_FOREACH(sd->icons, l, ic)
5313 (custom ? (ic->y <= y) : (ic->y == y)) &&
5314 (!match_func || match_func(ic, data)))
5316 dist = 2 * (y - ic->y) + (x - ic->x);
5324 /* no prev item was found in row go to end and up */
5327 EINA_LIST_FOREACH(sd->icons, l, ic)
5329 if ((ic->y < y) && (!match_func || match_func(ic, data)))
5331 dist = 2 * (abs(ic->y - y)) - ic->x;
5342 /* not custom, items are arranged in list order */
5347 if (!eina_list_next(l)) return NULL;
5348 ic_next = eina_list_data_get(eina_list_next(l));
5352 if (!eina_list_prev(l)) return NULL;
5353 ic_next = eina_list_data_get(eina_list_prev(l));
5361 _e_fm2_icon_sel_prev(Evas_Object *obj)
5363 E_Fm2_Icon *ic_prev;
5365 ic_prev = _e_fm2_icon_next_find(obj, -1, NULL, NULL);
5369 /* FIXME this is not the bottomright item for custom grid */
5370 _e_fm2_icon_sel_last(obj);
5373 _e_fm2_icon_desel_any(obj);
5374 _e_fm2_icon_select(ic_prev);
5375 evas_object_smart_callback_call(obj, "selection_change", NULL); /*XXX sd->obj*/
5376 _e_fm2_icon_make_visible(ic_prev);
5380 _e_fm2_icon_sel_next(Evas_Object *obj)
5382 E_Fm2_Icon *ic_next;
5384 ic_next = _e_fm2_icon_next_find(obj, 1, NULL, NULL);
5387 /* FIXME this is not the topleft item for custom grid */
5388 _e_fm2_icon_sel_first(obj);
5391 _e_fm2_icon_desel_any(obj);
5392 _e_fm2_icon_select(ic_next);
5393 evas_object_smart_callback_call(obj, "selection_change", NULL);
5394 _e_fm2_icon_make_visible(ic_next);
5398 _e_fm2_icon_sel_down(Evas_Object *obj)
5400 E_Fm2_Smart_Data *sd;
5402 E_Fm2_Icon *ic, *ic_down;
5403 int found, x = -1, y = -1, custom = 0;
5404 int dist, min = 65535;
5407 sd = evas_object_smart_data_get(obj);
5409 if (!sd->icons) return;
5411 view_mode = _e_fm2_view_mode_get(sd);
5412 if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
5413 (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
5414 (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
5420 EINA_LIST_FOREACH(sd->icons, l, ic)
5434 dist = (abs(ic->x - x)) + (ic->y - y) * 2;
5446 EINA_LIST_FOREACH(sd->icons, l, ic)
5450 dist = (abs(ic->x - x)) + (ic->y - y) * 2;
5462 if (!custom) _e_fm2_icon_sel_next(obj);
5465 _e_fm2_icon_desel_any(obj);
5466 _e_fm2_icon_select(ic_down);
5467 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5468 _e_fm2_icon_make_visible(ic_down);
5472 _e_fm2_icon_sel_up(Evas_Object *obj)
5474 E_Fm2_Smart_Data *sd;
5476 E_Fm2_Icon *ic, *ic_up;
5477 int found = 0, x = 0, y = 0, custom = 0;
5478 int dist, min = 65535;
5481 sd = evas_object_smart_data_get(obj);
5483 if (!sd->icons) return;
5485 view_mode = _e_fm2_view_mode_get(sd);
5487 if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
5488 (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
5489 (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
5494 EINA_LIST_REVERSE_FOREACH(sd->icons, l, ic)
5508 dist = (abs(ic->x - x)) + (y - ic->y) * 2;
5518 if (custom && found)
5520 EINA_LIST_FOREACH(sd->icons, l, ic)
5522 if (!ic->selected && ic->y < y)
5524 dist = (abs(ic->x - x)) + (y - ic->y) * 2;
5536 if (!custom) _e_fm2_icon_sel_prev(obj);
5539 _e_fm2_icon_desel_any(obj);
5540 _e_fm2_icon_select(ic_up);
5541 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5542 _e_fm2_icon_make_visible(ic_up);
5545 /* FIXME: prototype */
5547 _e_fm2_typebuf_show(Evas_Object *obj)
5549 E_Fm2_Smart_Data *sd;
5551 sd = evas_object_smart_data_get(obj);
5553 E_FREE(sd->typebuf.buf);
5554 sd->typebuf.buf = strdup("");
5555 edje_object_part_text_set(sd->overlay, "e.text.typebuf_label", sd->typebuf.buf);
5556 edje_object_signal_emit(sd->overlay, "e,state,typebuf,start", "e");
5557 sd->typebuf_visible = EINA_TRUE;
5561 _e_fm2_typebuf_hide(Evas_Object *obj)
5563 E_Fm2_Smart_Data *sd;
5565 sd = evas_object_smart_data_get(obj);
5567 E_FREE(sd->typebuf.buf);
5568 edje_object_signal_emit(sd->overlay, "e,state,typebuf,stop", "e");
5569 sd->typebuf_visible = EINA_FALSE;
5574 _e_fm2_typebuf_history_prev(Evas_Object *obj)
5576 E_Fm2_Smart_Data *sd;
5578 sd = evas_object_smart_data_get(obj);
5584 _e_fm2_typebuf_history_next(Evas_Object *obj)
5586 E_Fm2_Smart_Data *sd;
5588 sd = evas_object_smart_data_get(obj);
5596 _e_fm2_inplace_open(const E_Fm2_Icon *ic)
5600 if (!((S_ISDIR(ic->info.statinfo.st_mode)) &&
5601 (ic->sd->config->view.open_dirs_in_place) &&
5602 (!ic->sd->config->view.no_subdir_jump)))
5605 if (!_e_fm2_icon_path(ic, buf, sizeof(buf)))
5608 e_fm2_path_set(ic->sd->obj, ic->sd->dev, buf);
5613 _e_fm2_typebuf_run(Evas_Object *obj)
5617 _e_fm2_typebuf_hide(obj);
5618 ic = _e_fm2_icon_first_selected_find(obj);
5621 if (_e_fm2_inplace_open(ic) == 0)
5622 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
5627 _e_fm2_typebuf_match_func(E_Fm2_Icon *ic, void *data)
5630 return ((ic->info.label) &&
5631 (e_util_glob_case_match(ic->info.label, tb))) ||
5633 (e_util_glob_case_match(ic->info.file, tb)));
5637 _e_fm_typebuf_timer_cb(void *data)
5639 Evas_Object *obj = data;
5640 E_Fm2_Smart_Data *sd;
5642 if (!data) return ECORE_CALLBACK_CANCEL;
5643 sd = evas_object_smart_data_get(obj);
5644 if (!sd) return ECORE_CALLBACK_CANCEL;
5646 if (!sd->typebuf_visible) return ECORE_CALLBACK_CANCEL;
5648 _e_fm2_typebuf_hide(obj);
5649 sd->typebuf.timer = NULL;
5651 return ECORE_CALLBACK_CANCEL;
5655 _e_fm2_typebuf_match(Evas_Object *obj, int next)
5657 E_Fm2_Smart_Data *sd;
5658 E_Fm2_Icon *ic, *ic_match = NULL;
5663 sd = evas_object_smart_data_get(obj);
5665 if (!sd->typebuf.buf) return;
5666 if (!sd->icons) return;
5668 tblen = strlen(sd->typebuf.buf);
5669 tb = malloc(tblen + 2);
5671 memcpy(tb, sd->typebuf.buf, tblen);
5673 tb[tblen + 1] = '\0';
5677 EINA_LIST_FOREACH(sd->icons, l, ic)
5679 if (_e_fm2_typebuf_match_func(ic, tb))
5688 ic_match = _e_fm2_icon_next_find(obj, next, &_e_fm2_typebuf_match_func, tb);
5693 _e_fm2_icon_desel_any(obj);
5694 _e_fm2_icon_select(ic_match);
5695 evas_object_smart_callback_call(obj, "selection_change", NULL);
5696 _e_fm2_icon_make_visible(ic_match);
5701 if (sd->typebuf.timer)
5703 ecore_timer_del(sd->typebuf.timer);
5706 sd->typebuf.timer = ecore_timer_add(5.0, _e_fm_typebuf_timer_cb, obj);
5710 _e_fm2_typebuf_complete(Evas_Object *obj)
5712 E_Fm2_Smart_Data *sd;
5714 sd = evas_object_smart_data_get(obj);
5717 _e_fm2_typebuf_match(obj, 0);
5721 _e_fm2_typebuf_char_append(Evas_Object *obj, const char *ch)
5723 E_Fm2_Smart_Data *sd;
5726 sd = evas_object_smart_data_get(obj);
5728 if (!sd->typebuf.buf) return;
5729 ts = malloc(strlen(sd->typebuf.buf) + strlen(ch) + 1);
5731 strcpy(ts, sd->typebuf.buf);
5733 free(sd->typebuf.buf);
5734 sd->typebuf.buf = ts;
5735 _e_fm2_typebuf_match(obj, 0);
5736 edje_object_part_text_set(sd->overlay, "e.text.typebuf_label", sd->typebuf.buf);
5740 _e_fm2_typebuf_char_backspace(Evas_Object *obj)
5742 E_Fm2_Smart_Data *sd;
5746 sd = evas_object_smart_data_get(obj);
5748 if (!sd->typebuf.buf) return;
5749 len = strlen(sd->typebuf.buf);
5752 _e_fm2_typebuf_hide(obj);
5755 p = evas_string_char_prev_get(sd->typebuf.buf, len, &dec);
5756 if (p >= 0) sd->typebuf.buf[p] = EINA_FALSE;
5757 ts = strdup(sd->typebuf.buf);
5759 free(sd->typebuf.buf);
5760 sd->typebuf.buf = ts;
5761 _e_fm2_typebuf_match(obj, 0);
5762 edje_object_part_text_set(sd->overlay, "e.text.typebuf_label", sd->typebuf.buf);
5765 /**************************/
5767 /* FIXME: prototype + reposition + implement */
5769 _e_fm2_dnd_drop_configure(Evas_Object *obj)
5771 E_Fm2_Smart_Data *sd;
5773 sd = evas_object_smart_data_get(obj);
5775 if (!sd->drop_icon) return;
5776 if (sd->drop_after == -1)
5778 evas_object_move(sd->drop_in,
5779 sd->x + sd->drop_icon->x - sd->pos.x,
5780 sd->y + sd->drop_icon->y - sd->pos.y);
5781 evas_object_resize(sd->drop_in, sd->drop_icon->w, sd->drop_icon->h);
5783 else if (sd->drop_after)
5785 evas_object_move(sd->drop,
5786 sd->x + sd->drop_icon->x - sd->pos.x,
5787 sd->y + sd->drop_icon->y - sd->pos.y + sd->drop_icon->h - 1);
5788 evas_object_resize(sd->drop, sd->drop_icon->w, 2);
5792 evas_object_move(sd->drop,
5793 sd->x + sd->drop_icon->x - sd->pos.x,
5794 sd->y + sd->drop_icon->y - sd->pos.y - 1);
5795 evas_object_resize(sd->drop, sd->drop_icon->w, 2);
5799 /* FIXME: prototype + reposition + implement */
5801 _e_fm2_dnd_drop_all_show(Evas_Object *obj)
5803 E_Fm2_Smart_Data *sd;
5805 sd = evas_object_smart_data_get(obj);
5809 edje_object_signal_emit(sd->drop, "e,state,unselected", "e");
5810 sd->drop_show = EINA_FALSE;
5812 if (sd->drop_in_show)
5814 edje_object_signal_emit(sd->drop_in, "e,state,unselected", "e");
5815 sd->drop_in_show = EINA_FALSE;
5819 edje_object_signal_emit(sd->overlay, "e,state,drop,start", "e");
5820 sd->drop_all = EINA_TRUE;
5822 sd->drop_icon = NULL;
5823 sd->drop_after = EINA_FALSE;
5826 /* FIXME: prototype + reposition + implement */
5828 _e_fm2_dnd_drop_all_hide(Evas_Object *obj)
5830 E_Fm2_Smart_Data *sd;
5832 sd = evas_object_smart_data_get(obj);
5836 edje_object_signal_emit(sd->overlay, "e,state,drop,stop", "e");
5837 sd->drop_all = EINA_FALSE;
5841 /* FIXME: prototype + reposition + implement */
5843 _e_fm2_dnd_drop_show(E_Fm2_Icon *ic, int after)
5847 if ((ic->sd->drop_icon == ic) &&
5848 (ic->sd->drop_after == after)) return;
5849 if (((ic->sd->drop_icon) && (!ic)) ||
5850 ((!ic->sd->drop_icon) && (ic)) ||
5851 ((after < 0) && (ic->sd->drop_after >= 0)) ||
5852 ((after >= 0) && (ic->sd->drop_after < 0)))
5854 ic->sd->drop_icon = ic;
5855 ic->sd->drop_after = after;
5858 if (ic->sd->drop_after != -1)
5860 edje_object_signal_emit(ic->sd->drop_in, "e,state,unselected", "e");
5861 edje_object_signal_emit(ic->sd->drop, "e,state,selected", "e");
5862 ic->sd->drop_in_show = EINA_FALSE;
5863 ic->sd->drop_show = EINA_TRUE;
5867 edje_object_signal_emit(ic->sd->drop, "e,state,unselected", "e");
5868 edje_object_signal_emit(ic->sd->drop_in, "e,state,selected", "e");
5869 ic->sd->drop_in_show = EINA_TRUE;
5870 ic->sd->drop_show = EINA_FALSE;
5873 _e_fm2_dnd_drop_all_hide(ic->sd->obj);
5874 _e_fm2_dnd_drop_configure(ic->sd->obj);
5877 /* FIXME: prototype + reposition + implement */
5879 _e_fm2_dnd_drop_hide(Evas_Object *obj)
5881 E_Fm2_Smart_Data *sd;
5883 sd = evas_object_smart_data_get(obj);
5887 edje_object_signal_emit(sd->drop, "e,state,unselected", "e");
5888 sd->drop_show = EINA_FALSE;
5890 if (sd->drop_in_show)
5892 edje_object_signal_emit(sd->drop_in, "e,state,unselected", "e");
5893 sd->drop_in_show = EINA_FALSE;
5895 sd->drop_icon = NULL;
5896 sd->drop_after = EINA_FALSE;
5899 /* FIXME: prototype + reposition + implement */
5901 _e_fm2_dnd_finish(Evas_Object *obj, int refresh)
5903 E_Fm2_Smart_Data *sd;
5907 sd = evas_object_smart_data_get(obj);
5909 if (!sd->drag) return;
5910 sd->drag = EINA_FALSE;
5911 EINA_LIST_FOREACH(sd->icons, l, ic)
5913 ic->drag.dnd = EINA_FALSE;
5914 ic->drag.src = EINA_FALSE;
5915 if (ic->obj) evas_object_show(ic->obj);
5916 if (ic->obj_icon) evas_object_show(ic->obj_icon);
5918 if (refresh) e_fm2_refresh(obj);
5922 _e_fm2_cb_dnd_enter(void *data __UNUSED__, const char *type, void *event)
5924 E_Event_Dnd_Enter *ev;
5926 if (type != _e_fm2_mime_text_uri_list) return;
5927 ev = (E_Event_Dnd_Enter *)event;
5928 e_drop_handler_action_set(ev->action);
5932 _e_fm2_cb_dnd_move(void *data, const char *type, void *event)
5934 E_Fm2_Smart_Data *sd;
5935 E_Event_Dnd_Move *ev;
5940 if (type != _e_fm2_mime_text_uri_list) return;
5941 ev = (E_Event_Dnd_Move *)event;
5942 e_drop_handler_action_set(ev->action);
5943 EINA_LIST_FOREACH(sd->icons, l, ic)
5945 if (E_INSIDE(ev->x, ev->y, ic->x - ic->sd->pos.x, ic->y - ic->sd->pos.y, ic->w, ic->h))
5947 if (ic->drag.dnd) continue;
5949 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
5951 /* if there is a .order file - we can re-order files */
5952 if (ic->sd->order_file)
5955 if ((S_ISDIR(ic->info.statinfo.st_mode)) &&
5956 (!ic->sd->config->view.no_subdir_drop))
5958 /* if bottom 25% or top 25% then insert between prev or next */
5959 /* if in middle 50% then put in dir */
5960 if (ev->y <= (ic->y - ic->sd->pos.y + (ic->h / 4)))
5962 _e_fm2_dnd_drop_show(ic, 0);
5964 else if (ev->y > (ic->y - ic->sd->pos.y + ((ic->h * 3) / 4)))
5966 _e_fm2_dnd_drop_show(ic, 1);
5970 _e_fm2_dnd_drop_show(ic, -1);
5975 /* if top 50% or bottom 50% then insert between prev or next */
5976 if (ev->y <= (ic->y - ic->sd->pos.y + (ic->h / 2)))
5977 _e_fm2_dnd_drop_show(ic, 0);
5979 _e_fm2_dnd_drop_show(ic, 1);
5982 /* if we are over subdirs or files */
5986 * if it's over a dir - hilight as it will be dropped info
5987 * FIXME: should there be a separate highlighting function for files?
5989 if (!(S_ISDIR(ic->info.statinfo.st_mode)) ||
5990 (!ic->sd->config->view.no_subdir_drop))
5991 _e_fm2_dnd_drop_show(ic, -1);
5996 /* if it's over a dir - hilight as it will be dropped in */
5997 if (!(S_ISDIR(ic->info.statinfo.st_mode)) ||
5998 (!ic->sd->config->view.no_subdir_drop))
5999 _e_fm2_dnd_drop_show(ic, -1);
6004 /* FIXME: not over icon - is it within the fm view? if so drop there */
6005 if (E_INSIDE(ev->x, ev->y, 0, 0, sd->w, sd->h))
6007 /* if listview - it is now after last file */
6008 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
6010 /* if there is a .order file - we can re-order files */
6013 ic = eina_list_data_get(eina_list_last(sd->icons));
6017 _e_fm2_dnd_drop_show(ic, 1);
6019 _e_fm2_dnd_drop_all_show(sd->obj);
6022 _e_fm2_dnd_drop_all_show(sd->obj);
6025 _e_fm2_dnd_drop_all_show(sd->obj);
6028 _e_fm2_dnd_drop_all_show(sd->obj);
6031 /* outside fm view */
6032 _e_fm2_dnd_drop_hide(sd->obj);
6036 _e_fm2_cb_dnd_leave(void *data, const char *type, void *event __UNUSED__)
6038 E_Fm2_Smart_Data *sd;
6041 if (type != _e_fm2_mime_text_uri_list) return;
6042 _e_fm2_dnd_drop_hide(sd->obj);
6043 _e_fm2_dnd_drop_all_hide(sd->obj);
6047 _e_fm_file_reorder(const char *file, const char *dst, const char *relative, int after)
6049 unsigned int length = strlen(file) + 1 + strlen(dst) + 1 + strlen(relative) + 1 + sizeof(after);
6052 data = alloca(length);
6057 #define P(s) memcpy(p, s, strlen(s) + 1); p += strlen(s) + 1
6063 memcpy(p, &after, sizeof(int));
6065 _e_fm_client_send_new(E_FM_OP_REORDER, data, length);
6069 _e_fm_icon_save_position(const char *file, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
6071 E_Fm2_Custom_File *cf, new;
6075 cf = e_fm2_custom_file_get(file);
6078 memset(&new, 0, sizeof(E_Fm2_Custom_File));
6088 e_fm2_custom_file_set(file, cf);
6089 e_fm2_custom_file_flush();
6092 struct e_fm_drop_menu_data
6099 _e_fm_drop_menu_copy_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6101 struct e_fm_drop_menu_data *d = data;
6103 _e_fm_client_file_copy(d->args, d->e_fm);
6107 _e_fm_drop_menu_move_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6109 struct e_fm_drop_menu_data *d = data;
6111 _e_fm_client_file_move(d->args, d->e_fm);
6115 _e_fm_drop_menu_symlink_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6117 struct e_fm_drop_menu_data *d = data;
6119 _e_fm_client_file_symlink(d->args, d->e_fm);
6123 _e_fm_drop_menu_abort_cb(void *data __UNUSED__, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6128 _e_fm_drop_menu_free(void *data)
6130 struct e_fm_drop_menu_data *d = e_object_data_get(data);
6137 _e_fm_drop_menu(char *args, Evas_Object *e_fm)
6139 struct e_fm_drop_menu_data *d;
6140 E_Menu *menu = e_menu_new();
6141 E_Menu_Item *item = NULL;
6142 E_Manager *man = NULL;
6143 E_Container *con = NULL;
6144 E_Zone *zone = NULL;
6149 d = malloc(sizeof(*d));
6152 e_object_del(E_OBJECT(menu));
6159 e_object_data_set(E_OBJECT(menu), d);
6160 e_object_free_attach_func_set(E_OBJECT(menu), _e_fm_drop_menu_free);
6162 item = e_menu_item_new(menu);
6163 e_menu_item_label_set(item, _("Copy"));
6164 e_menu_item_callback_set(item, _e_fm_drop_menu_copy_cb, d);
6165 e_util_menu_item_theme_icon_set(item, "edit-copy");
6167 item = e_menu_item_new(menu);
6168 e_menu_item_label_set(item, _("Move"));
6169 e_menu_item_callback_set(item, _e_fm_drop_menu_move_cb, d);
6170 e_menu_item_icon_edje_set(item,
6171 e_theme_edje_file_get("base/theme/fileman",
6172 "e/fileman/default/button/move"),
6173 "e/fileman/default/button/move");
6175 item = e_menu_item_new(menu);
6176 e_menu_item_label_set(item, _("Link"));
6177 e_menu_item_callback_set(item, _e_fm_drop_menu_symlink_cb, d);
6178 e_util_menu_item_theme_icon_set(item, "emblem-symbolic-link");
6180 item = e_menu_item_new(menu);
6181 e_menu_item_separator_set(item, 1);
6183 item = e_menu_item_new(menu);
6184 e_menu_item_label_set(item, _("Abort"));
6185 e_menu_item_callback_set(item, _e_fm_drop_menu_abort_cb, d);
6186 e_menu_item_icon_edje_set(item,
6187 e_theme_edje_file_get("base/theme/fileman",
6188 "e/fileman/default/button/abort"),
6189 "e/fileman/default/button/abort");
6191 man = e_manager_current_get();
6192 if (!man) goto error;
6193 con = e_container_current_get(man);
6194 if (!con) goto error;
6195 ecore_x_pointer_xy_get(con->win, &x, &y);
6196 zone = e_util_zone_current_get(man);
6197 if (!zone) goto error;
6198 e_menu_activate_mouse(menu, zone, x, y, 1, 1, E_MENU_POP_DIRECTION_DOWN, 0);
6201 e_object_del(E_OBJECT(menu));
6205 _e_fm2_cb_dnd_drop(void *data, const char *type, void *event)
6207 E_Fm2_Smart_Data *sd;
6208 E_Event_Dnd_Drop *ev;
6210 Eina_List *fsel, *l, *ll, *il, *isel;
6213 Evas_Coord ox, oy, x, y;
6214 int adjust_icons = 0;
6216 char dirpath[PATH_MAX];
6222 if (type != _e_fm2_mime_text_uri_list) return;
6223 ev = (E_Event_Dnd_Drop *)event;
6225 fsel = _e_fm2_uri_path_list_get(ev->data);
6226 isel = _e_fm2_uri_icon_list_get(fsel);
6229 EINA_LIST_FOREACH(isel, l, ic)
6231 if (ic && ic->drag.src)
6240 * if drop file prefix path matches extra_file_source then it can be
6241 * and indirect link - dont MOVE the file just add filename to list.
6242 * if not literally move the file in. if move can't work - try a copy.
6243 * on a literal move find any fm views for the dir of the dropped file
6244 * and refresh those, as well as refresh current target fm dir
6246 if (sd->drop_all) /* drop arbitrarily into the dir */
6248 /* move file into this fm dir */
6249 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6251 ic = eina_list_data_get(il);
6252 fp = eina_list_data_get(ll);
6255 if ((ic) && (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS))
6257 /* dnd doesn't tell me all the co-ords of the icons being dragged so i can't place them accurately.
6258 * need to fix this. ev->data probably needs to become more compelx than a list of url's
6261 x = ev->x + (ic->x - ox) - ic->drag.x + sd->pos.x - sd->x;
6262 y = ev->y + (ic->y - oy) - ic->drag.y + sd->pos.y - sd->y;
6267 if (sd->config->view.fit_custom_pos)
6269 if ((x + ic->w) > sd->w) x = (sd->w - ic->w);
6270 if ((y + ic->h) > sd->h) y = (sd->h - ic->h);
6277 ic->saved_pos = EINA_TRUE;
6281 snprintf(buf, sizeof(buf), "%s/%s",
6282 sd->realpath, ecore_file_file_get(fp));
6283 _e_fm_icon_save_position(buf, x, y, sd->w, sd->h);
6286 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6287 args = _e_fm_string_append_char(args, &size, &length, ' ');
6289 eina_stringshare_del(fp);
6295 EINA_LIST_FOREACH(sd->icons, l, ic)
6297 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
6298 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
6300 _e_fm2_obj_icons_place(sd);
6301 evas_object_smart_callback_call(sd->obj, "changed", NULL);
6304 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
6306 else if (sd->drop_icon) /* into or before/after an icon */
6308 if (sd->drop_after == -1) /* put into subdir/file in icon */
6310 /* move file into dir that this icon is for */
6311 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6313 fp = eina_list_data_get(ll);
6316 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6317 args = _e_fm_string_append_char(args, &size, &length, ' ');
6319 eina_stringshare_del(fp);
6322 if (S_ISDIR(sd->drop_icon->info.statinfo.st_mode))
6323 snprintf(dirpath, sizeof(dirpath), "%s/%s", sd->realpath, sd->drop_icon->info.file);
6325 snprintf(dirpath, sizeof(dirpath), "%s", sd->realpath);
6327 args = _e_fm_string_append_quoted(args, &size, &length, dirpath);
6331 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST && sd->order_file) /* list */
6333 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6335 fp = eina_list_data_get(ll);
6337 snprintf(buf, sizeof(buf), "%s/%s",
6338 sd->realpath, ecore_file_file_get(fp));
6339 if (sd->config->view.link_drop)
6341 _e_fm2_client_file_symlink(buf, fp, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->h, sd->h, sd->obj);
6345 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6346 args = _e_fm_string_append_char(args, &size, &length, ' ');
6349 _e_fm_file_reorder(ecore_file_file_get(fp), sd->realpath, sd->drop_icon->info.file, sd->drop_after);
6351 eina_stringshare_del(fp);
6354 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
6358 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6360 fp = eina_list_data_get(ll);
6363 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6364 args = _e_fm_string_append_char(args, &size, &length, ' ');
6366 eina_stringshare_del(fp);
6368 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
6375 if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_COPY)
6377 _e_fm_client_file_copy(args, sd->obj);
6380 else if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_MOVE)
6382 _e_fm_client_file_move(args, sd->obj);
6385 else if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_ASK)
6387 _e_fm_drop_menu(args, sd->obj);
6391 _e_fm2_dnd_drop_hide(sd->obj);
6392 _e_fm2_dnd_drop_all_hide(sd->obj);
6393 _e_fm2_list_walking++;
6395 EINA_LIST_FOREACH(_e_fm2_list, l, obj)
6397 if ((_e_fm2_list_walking > 0) &&
6398 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
6399 _e_fm2_dnd_finish(obj, 0);
6401 _e_fm2_list_walking--;
6402 if (_e_fm2_list_walking == 0)
6404 EINA_LIST_FREE(_e_fm2_list_remove, obj)
6406 _e_fm2_list = eina_list_remove(_e_fm2_list, obj);
6409 eina_list_free(fsel);
6410 eina_list_free(isel);
6413 /* FIXME: prototype */
6415 _e_fm2_mouse_1_handler(E_Fm2_Icon *ic, int up, void *evas_event)
6417 Evas_Event_Mouse_Down *ed = NULL;
6418 Evas_Event_Mouse_Up *eu = NULL;
6419 Evas_Modifier *modifiers;
6420 int multi_sel = 0, range_sel = 0, sel_change = 0;
6421 static unsigned int down_timestamp = 0;
6423 if (!evas_event) return;
6428 modifiers = ed->modifiers;
6433 modifiers = eu->modifiers;
6435 if (ed && ic->sd->config->view.single_click_delay)
6436 down_timestamp = ed->timestamp;
6438 if (ic->sd->config->selection.windows_modifiers)
6440 if (evas_key_modifier_is_set(modifiers, "Shift"))
6442 else if (evas_key_modifier_is_set(modifiers, "Control"))
6447 if (evas_key_modifier_is_set(modifiers, "Control"))
6449 else if (evas_key_modifier_is_set(modifiers, "Shift"))
6452 if (ic->sd->config->selection.single)
6459 * On mouse up, check if we want to do inplace open
6464 (ic->sd->config->view.single_click) &&
6465 ((eu->timestamp - down_timestamp) > ic->sd->config->view.single_click_delay))
6467 if (_e_fm2_inplace_open(ic) == 1) return;
6475 /* find last selected - if any, and select all icons between */
6476 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
6478 if (ic2 == ic) seen = 1;
6479 if (ic2->last_selected)
6481 ic2->last_selected = 0;
6484 EINA_LIST_REVERSE_FOREACH(l, l, ic2)
6486 if (ic == ic2) break;
6487 if (!ic2->selected) sel_change = 1;
6488 _e_fm2_icon_select(ic2);
6489 ic2->last_selected = 0;
6494 EINA_LIST_FOREACH(l, l, ic2)
6496 if (ic == ic2) break;
6497 if (!ic2->selected) sel_change = 1;
6498 _e_fm2_icon_select(ic2);
6499 ic2->last_selected = 0;
6506 else if ((!multi_sel) && ((up) || ((!up) && (!ic->selected))))
6511 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
6517 _e_fm2_icon_deselect(ic2);
6529 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
6530 ic2->last_selected = 0;
6533 if ((multi_sel) && (ic->selected))
6535 if ((up) && (!ic->drag.dnd) && (!ic->down_sel))
6538 _e_fm2_icon_deselect(ic);
6545 if (!ic->selected) sel_change = EINA_TRUE;
6546 _e_fm2_icon_select(ic);
6547 _e_fm2_icon_make_visible(ic);
6548 ic->down_sel = EINA_TRUE;
6549 ic->last_selected = EINA_TRUE;
6553 evas_object_smart_callback_call(ic->sd->obj, "selection_change", NULL);
6554 if (ic->sd->config->view.single_click)
6556 if (eu && (eu->timestamp - down_timestamp) > ic->sd->config->view.single_click_delay)
6558 int icon_pos_x = ic->x + ic->sd->x - ic->sd->pos.x;
6559 int icon_pos_y = ic->y + ic->sd->y - ic->sd->pos.y;
6561 if (eu->output.x >= icon_pos_x && eu->output.x <= (icon_pos_x + ic->w) &&
6562 eu->output.y >= icon_pos_y && eu->output.y <= (icon_pos_y + ic->h))
6563 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
6569 _e_fm2_cb_icon_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
6571 Evas_Event_Mouse_Down *ev;
6577 if (ic->entry_widget)
6580 if ((ev->button == 1) && (ev->flags & EVAS_BUTTON_DOUBLE_CLICK))
6582 /* if its a directory && open dirs in-place is set then change the dir
6583 * to be the dir + file */
6584 if (_e_fm2_inplace_open(ic) == 0)
6585 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
6586 /* if its in file selector mode then signal that a selection has
6587 * taken place and dont do anything more */
6589 /* do the below per selected file */
6590 /* if its a directory and open dirs in-place is not set, then
6591 * signal owner that a new dir should be opened */
6592 /* if its a normal file - do what the mime type says to do with
6595 else if (ev->button == 1)
6599 ic->drag.x = ev->output.x - ic->x - ic->sd->x + ic->sd->pos.x;
6600 ic->drag.y = ev->output.y - ic->y - ic->sd->y + ic->sd->pos.y;
6601 ic->drag.start = EINA_TRUE;
6602 ic->drag.dnd = EINA_FALSE;
6603 ic->drag.src = EINA_TRUE;
6605 _e_fm2_mouse_1_handler(ic, 0, ev);
6607 else if (ev->button == 3)
6609 if (!ic->selected) _e_fm2_mouse_1_handler(ic, 0, ev);
6610 _e_fm2_icon_menu(ic, ic->sd->obj, ev->timestamp);
6615 _e_fm2_cb_icon_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
6617 Evas_Event_Mouse_Up *ev;
6623 if (ic->entry_widget) return;
6625 if ((ev->button == 1) && (!ic->drag.dnd))
6627 if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
6628 _e_fm2_mouse_1_handler(ic, 1, ev);
6629 ic->drag.start = EINA_FALSE;
6630 ic->drag.dnd = EINA_FALSE;
6631 ic->drag.src = EINA_FALSE;
6632 ic->down_sel = EINA_FALSE;
6637 _e_fm2_cb_drag_finished(E_Drag *drag, int dropped __UNUSED__)
6641 char buf[PATH_MAX * 3 + 7];
6645 memset(buf, 0, sizeof(buf));
6646 for (p = drag->data, i = 0; p && *p != '\0'; p++, i++)
6652 uri = _e_fm2_uri_parse(buf);
6653 memset(buf, 0, sizeof(buf));
6656 fm = _e_fm2_file_fm2_find(uri->path);
6662 file = ecore_file_file_get(uri->path);
6663 ic = _e_fm2_icon_find(fm, file);
6664 ic->drag.dnd = EINA_FALSE;
6665 if (ic->obj) evas_object_show(ic->obj);
6666 if (ic->obj_icon) evas_object_show(ic->obj_icon);
6669 if (uri->hostname) eina_stringshare_del(uri->hostname);
6670 eina_stringshare_del(uri->path);
6680 _e_fm_drag_key_down_cb(E_Drag *drag, Ecore_Event_Key *e)
6682 if (!strncmp(e->keyname, "Alt", 3))
6684 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_ASK);
6685 edje_object_signal_emit(drag->object, "e,state,ask", "e");
6687 else if (!strncmp(e->keyname, "Shift", 5))
6689 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6690 edje_object_signal_emit(drag->object, "e,state,move", "e");
6692 else if (!strncmp(e->keyname, "Control", 7))
6694 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_COPY);
6695 edje_object_signal_emit(drag->object, "e,state,copy", "e");
6700 _e_fm_drag_key_up_cb(E_Drag *drag, Ecore_Event_Key *e)
6702 /* Default action would be move. ;) */
6704 if (!strncmp(e->keyname, "Alt", 3))
6705 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6706 else if (!strncmp(e->keyname, "Shift", 5))
6707 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6708 else if (!strncmp(e->keyname, "Control", 7))
6709 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6711 edje_object_signal_emit(drag->object, "e,state,move", "e");
6715 _e_fm2_cb_icon_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
6717 Evas_Event_Mouse_Move *ev;
6719 E_Fm2_Icon_Info *ici;
6724 if (ic->entry_widget) return;
6726 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
6727 if ((ic->drag.start) && (ic->sd->eobj))
6731 dx = ev->cur.output.x - (ic->drag.x + ic->x + ic->sd->x - ic->sd->pos.x);
6732 dy = ev->cur.output.y - (ic->drag.y + ic->y + ic->sd->y - ic->sd->pos.y);
6733 if (((dx * dx) + (dy * dy)) >
6734 (e_config->drag_resist * e_config->drag_resist))
6737 Evas_Object *o, *o2;
6738 Evas_Coord x, y, w, h;
6739 const char *drag_types[] = { "text/uri-list" }, *realpath;
6740 char buf[PATH_MAX + 8], *p, *sel = NULL;
6741 E_Container *con = NULL;
6743 int sel_length = 0, p_offset, p_length;
6745 switch (ic->sd->eobj->type)
6748 con = ((E_Gadcon *)(ic->sd->eobj))->zone->container;
6752 con = ((E_Win *)(ic->sd->eobj))->container;
6756 con = ((E_Zone *)(ic->sd->eobj))->container;
6760 con = ((E_Border *)(ic->sd->eobj))->zone->container;
6764 con = ((E_Popup *)(ic->sd->eobj))->zone->container;
6767 /* FIXME: add more types as needed */
6772 ic->sd->drag = EINA_TRUE;
6773 ic->drag.dnd = EINA_TRUE;
6774 if (ic->obj) evas_object_hide(ic->obj);
6775 if (ic->obj_icon) evas_object_hide(ic->obj_icon);
6776 ic->drag.start = EINA_FALSE;
6777 evas_object_geometry_get(ic->obj, &x, &y, &w, &h);
6778 realpath = e_fm2_real_path_get(ic->sd->obj);
6779 p_offset = eina_strlcpy(buf, realpath, sizeof(buf));
6780 if ((p_offset < 1) || (p_offset >= (int)sizeof(buf) - 2)) return;
6781 if (buf[p_offset - 1] != '/')
6783 buf[p_offset] = '/';
6787 p_length = sizeof(buf) - p_offset - 1;
6789 sl = e_fm2_selected_list_get(ic->sd->obj);
6790 EINA_LIST_FREE(sl, ici)
6796 if ((int)eina_strlcpy(p, ici->file, p_length) >= p_length)
6798 s = _e_fm2_uri_escape(buf);
6801 tmp = realloc(sel, sel_length + s_len + 2 + 1);
6809 memcpy(sel + sel_length, s, s_len);
6810 memcpy(sel + sel_length + s_len, "\r\n", 2);
6811 sel_length += s_len + 2;
6812 eina_stringshare_del(s);
6814 ici->ic->drag.dnd = EINA_TRUE;
6815 if (ici->ic->obj) evas_object_hide(ici->ic->obj);
6816 if (ici->ic->obj_icon) evas_object_hide(ici->ic->obj_icon);
6819 sel[sel_length] = '\0';
6821 d = e_drag_new(con, x, y, drag_types, 1,
6822 sel, sel_length, NULL, _e_fm2_cb_drag_finished);
6823 o = edje_object_add(e_drag_evas_get(d));
6824 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
6826 if (ic->sd->config->icon.fixed.w)
6829 _e_fm2_theme_edje_object_set(ic->sd, o,
6830 "base/theme/widgets",
6833 _e_fm2_theme_edje_object_set(ic->sd, o,
6834 "base/theme/widgets",
6840 _e_fm2_theme_edje_object_set(ic->sd, o,
6841 "base/theme/widgets",
6842 "list_odd/variable");
6844 _e_fm2_theme_edje_object_set(ic->sd, o,
6845 "base/theme/widgets",
6851 if (ic->sd->config->icon.fixed.w)
6852 _e_fm2_theme_edje_object_set(ic->sd, o,
6853 "base/theme/fileman",
6856 _e_fm2_theme_edje_object_set(ic->sd, o,
6857 "base/theme/fileman",
6860 _e_fm2_icon_label_set(ic, o);
6861 o2 = _e_fm2_icon_icon_direct_set(ic, o,
6862 _e_fm2_cb_icon_thumb_dnd_gen, o,
6864 edje_object_signal_emit(o, "e,state,selected", "e");
6865 edje_object_signal_emit(o2, "e,state,selected", "e");
6866 e_drag_object_set(d, o);
6867 edje_object_signal_emit(o, "e,state,move", "e");
6868 e_drag_resize(d, w, h);
6870 e_drag_key_down_cb_set(d, _e_fm_drag_key_down_cb);
6871 e_drag_key_up_cb_set(d, _e_fm_drag_key_up_cb);
6873 e_drag_xdnd_start(d,
6874 ic->drag.x + ic->x + ic->sd->x - ic->sd->pos.x,
6875 ic->drag.y + ic->y + ic->sd->y - ic->sd->pos.y);
6881 _e_fm2_cb_icon_thumb_dnd_gen(void *data, Evas_Object *obj, void *event_info __UNUSED__)
6884 Evas_Coord w = 0, h = 0;
6888 e_icon_size_get(obj, &w, &h);
6889 have_alpha = e_icon_alpha_get(obj);
6890 // if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
6892 edje_extern_object_aspect_set(obj, EDJE_ASPECT_CONTROL_BOTH, w, h);
6894 edje_object_part_swallow(o, "e.swallow.icon", obj);
6896 edje_object_signal_emit(o, "e,action,thumb,gen,alpha", "e");
6898 edje_object_signal_emit(o, "e,action,thumb,gen", "e");
6902 _e_fm2_cb_icon_thumb_gen(void *data, Evas_Object *obj, void *event_info __UNUSED__)
6908 if (e_icon_file_get(obj))
6910 Evas_Coord w = 0, h = 0;
6916 e_icon_size_get(obj, &w, &h);
6917 have_alpha = e_icon_alpha_get(obj);
6918 // if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
6920 edje_extern_object_aspect_set(obj,
6921 EDJE_ASPECT_CONTROL_BOTH, w, h);
6923 edje_object_part_swallow(ic->obj, "e.swallow.icon", obj);
6925 edje_object_signal_emit(ic->obj, "e,action,thumb,gen,alpha", "e");
6927 edje_object_signal_emit(ic->obj, "e,action,thumb,gen", "e");
6931 ic->thumb_failed = EINA_TRUE;
6932 evas_object_del(obj);
6935 _e_fm2_icon_icon_set(ic);
6940 _e_fm2_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
6942 Evas_Event_Key_Down *ev;
6943 E_Fm2_Smart_Data *sd;
6949 if (sd->iop_icon) return;
6951 if (evas_key_modifier_is_set(ev->modifiers, "Control"))
6953 if (!strcmp(ev->key, "x"))
6955 _e_fm2_file_cut(obj);
6958 else if (!strcmp(ev->key, "c"))
6960 _e_fm2_file_copy(obj);
6963 else if (!strcmp(ev->key, "v"))
6965 _e_fm2_file_paste(obj);
6968 else if (!strcmp(ev->key, "h"))
6970 if (sd->show_hidden_files)
6971 sd->show_hidden_files = EINA_FALSE;
6973 sd->show_hidden_files = EINA_TRUE;
6974 sd->inherited_dir_props = EINA_FALSE;
6975 _e_fm2_refresh(data, NULL, NULL);
6978 else if (!strcmp(ev->key, "1"))
6980 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_GRID_ICONS)
6982 sd->view_mode = E_FM2_VIEW_MODE_GRID_ICONS;
6983 sd->inherited_dir_props = EINA_FALSE;
6984 _e_fm2_refresh(sd, NULL, NULL);
6987 else if (!strcmp(ev->key, "2"))
6989 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
6991 sd->view_mode = E_FM2_VIEW_MODE_LIST;
6992 sd->inherited_dir_props = EINA_FALSE;
6993 _e_fm2_refresh(sd, NULL, NULL);
6996 else if (!strcmp(ev->key, "3"))
6998 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS)
7000 sd->view_mode = E_FM2_VIEW_MODE_CUSTOM_ICONS;
7001 sd->inherited_dir_props = EINA_FALSE;
7002 _e_fm2_refresh(sd, NULL, NULL);
7007 if (!strcmp(ev->key, "Left"))
7009 /* FIXME: icon mode, typebuf extras */
7010 /* list mode: scroll left n pix
7011 * icon mode: prev icon
7012 * typebuf mode: cursor left
7014 _e_fm2_icon_sel_prev(obj);
7016 else if (!strcmp(ev->key, "Right"))
7018 /* FIXME: icon mode, typebuf extras */
7019 /* list mode: scroll right n pix
7020 * icon mode: next icon
7021 * typebuf mode: cursor right
7023 _e_fm2_icon_sel_next(obj);
7025 else if (!strcmp(ev->key, "Up"))
7027 if (sd->typebuf_visible)
7028 /* FIXME: icon mode, typebuf extras */
7029 /* is there a way to use this atm? */
7030 // _e_fm2_typebuf_history_prev(obj);
7031 _e_fm2_typebuf_match(obj, -1);
7032 else if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
7033 _e_fm2_icon_sel_prev(obj);
7035 _e_fm2_icon_sel_up(obj);
7037 else if (!strcmp(ev->key, "Down"))
7039 if (sd->typebuf_visible)
7040 /* FIXME: icon mode, typebuf extras */
7041 /* is there a way to use this? */
7042 //_e_fm2_typebuf_history_next(obj);
7043 _e_fm2_typebuf_match(obj, 1);
7044 else if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
7045 _e_fm2_icon_sel_next(obj);
7047 _e_fm2_icon_sel_down(obj);
7049 else if (!strcmp(ev->key, "Home"))
7051 /* FIXME: typebuf extras */
7053 * typebuf mode: cursor to start
7055 _e_fm2_icon_sel_first(obj);
7057 else if (!strcmp(ev->key, "End"))
7059 /* FIXME: typebuf extras */
7061 * typebuf mode: cursor to end
7063 _e_fm2_icon_sel_last(obj);
7065 else if (!strcmp(ev->key, "Prior"))
7067 /* up h * n pixels */
7068 e_fm2_pan_set(obj, sd->pos.x, sd->pos.y - sd->h);
7069 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7071 else if (!strcmp(ev->keyname, "Next"))
7073 /* down h * n pixels */
7074 e_fm2_pan_set(obj, sd->pos.x, sd->pos.y + sd->h);
7075 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7077 else if (!strcmp(ev->key, "Escape"))
7079 /* typebuf mode: end typebuf mode */
7080 if (sd->typebuf_visible)
7081 _e_fm2_typebuf_hide(obj);
7084 ic = _e_fm2_icon_first_selected_find(obj);
7086 _e_fm2_icon_desel_any(obj);
7089 if (e_fm2_has_parent_get(obj))
7090 e_fm2_parent_go(obj);
7094 else if (!strcmp(ev->key, "Return"))
7096 /* if selected - select callback.
7097 * typebuf mode: if nothing selected - run cmd
7099 if (sd->typebuf_visible)
7100 _e_fm2_typebuf_run(obj);
7103 ic = _e_fm2_icon_first_selected_find(obj);
7106 if (_e_fm2_inplace_open(ic) == 0)
7107 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
7111 else if (!strcmp(ev->key, "Insert"))
7113 /* dunno what to do with this yet */
7115 else if (!strcmp(ev->key, "Tab"))
7117 /* typebuf mode: tab complete */
7118 if (sd->typebuf_visible)
7119 _e_fm2_typebuf_complete(obj);
7121 else if (!strcmp(ev->key, "BackSpace"))
7123 /* typebuf mode: backspace */
7124 if (sd->typebuf_visible)
7125 _e_fm2_typebuf_char_backspace(obj);
7128 if (e_fm2_has_parent_get(obj))
7129 e_fm2_parent_go(obj);
7132 else if (!strcmp(ev->key, "Delete"))
7134 /* FIXME: typebuf extras */
7135 if (sd->typebuf_visible)
7136 { /* typebuf mode: delete */ }else
7137 _e_fm2_file_delete(obj);
7139 else if (!evas_key_modifier_is_set(ev->modifiers, "Control") &&
7140 !evas_key_modifier_is_set(ev->modifiers, "Alt"))
7144 if (!sd->typebuf_visible) _e_fm2_typebuf_show(obj);
7145 _e_fm2_typebuf_char_append(obj, ev->string);
7151 _e_fm2_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
7153 Evas_Event_Mouse_Down *ev;
7154 E_Fm2_Smart_Data *sd;
7158 if (ev->button == 1)
7161 int multi_sel = 0, range_sel = 0, sel_change = 0;
7163 if (sd->config->selection.windows_modifiers)
7165 if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
7167 else if (evas_key_modifier_is_set(ev->modifiers, "Control"))
7172 if (evas_key_modifier_is_set(ev->modifiers, "Control"))
7174 else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
7177 if (sd->config->selection.single)
7182 if ((!multi_sel) && (!range_sel))
7185 EINA_LIST_FOREACH(sd->icons, l, ic)
7189 _e_fm2_icon_deselect(ic);
7195 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
7197 if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
7199 if (!sd->config->selection.single)
7201 sd->selrect.ox = ev->canvas.x;
7202 sd->selrect.oy = ev->canvas.y;
7203 sd->selecting = EINA_TRUE;
7207 else if (ev->button == 3)
7209 _e_fm2_menu(sd->obj, ev->timestamp);
7214 _e_fm2_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
7216 E_Fm2_Smart_Data *sd;
7219 sd->selecting = EINA_FALSE;
7222 evas_object_hide(sd->sel_rect);
7226 _e_fm2_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
7228 Evas_Event_Mouse_Move *ev;
7229 E_Fm2_Smart_Data *sd;
7230 Eina_List *l = NULL;
7236 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
7240 sd->selecting = EINA_FALSE;
7243 evas_object_hide(sd->sel_rect);
7247 if (!sd->selecting) return;
7249 if (ev->cur.canvas.x < sd->selrect.ox)
7251 sd->selrect.x = ev->cur.canvas.x;
7252 sd->selrect.w = (sd->selrect.ox - sd->selrect.x);
7256 sd->selrect.x = MIN(sd->selrect.ox, ev->cur.canvas.x);
7257 sd->selrect.w = abs(sd->selrect.x - ev->cur.canvas.x);
7259 if (ev->cur.canvas.y < sd->selrect.oy)
7261 sd->selrect.y = ev->cur.canvas.y;
7262 sd->selrect.h = (sd->selrect.oy - sd->selrect.y);
7266 sd->selrect.y = MIN(sd->selrect.oy, ev->cur.canvas.y);
7267 sd->selrect.h = abs(sd->selrect.y - ev->cur.canvas.y);
7269 _e_fm2_sel_rect_update(sd);
7271 evas_object_geometry_get(sd->sel_rect, &x, &y, &w, &h);
7274 * Leave commented for now. Start of scrolling the sel_rect
7279 if ((x - sd->pos.x) < 0)
7281 else if ((x + w - sd->pos.x) > (sd->w))
7284 if ((y - sd->pos.y) < 0)
7286 else if ((y + h - sd->pos.y) > (sd->h))
7288 e_fm2_pan_set(sd->obj, nx, ny);
7289 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7293 EINA_LIST_FOREACH(sd->icons, l, ic)
7296 int ix_t, iy_t, iw_t, ih_t;
7299 evas_object_geometry_get(ic->obj_icon, &ix, &iy, &iw, &ih);
7300 evas_object_geometry_get(edje_object_part_object_get(ic->obj,
7302 &ix_t, &iy_t, &iw_t, &ih_t);
7303 if (E_INTERSECTS(x, y, w, h, ix, iy, iw, ih) ||
7304 E_INTERSECTS(x, y, w, h, ix_t, iy_t, iw_t, ih_t))
7308 _e_fm2_icon_select(ic);
7316 _e_fm2_icon_deselect(ic);
7322 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
7326 _e_fm2_sel_rect_update(void *data)
7328 E_Fm2_Smart_Data *sd;
7331 evas_object_move(sd->sel_rect, sd->selrect.x, sd->selrect.y);
7332 evas_object_resize(sd->sel_rect, sd->selrect.w, sd->selrect.h);
7333 evas_object_show(sd->sel_rect);
7337 _e_fm2_cb_scroll_job(void *data)
7339 E_Fm2_Smart_Data *sd;
7341 sd = evas_object_smart_data_get(data);
7343 sd->scroll_job = NULL;
7344 evas_event_freeze(evas_object_evas_get(sd->obj));
7346 _e_fm2_regions_eval(sd->obj);
7347 _e_fm2_obj_icons_place(sd);
7349 evas_event_thaw(evas_object_evas_get(sd->obj));
7350 _e_fm2_dir_save_props(sd);
7354 _e_fm2_cb_resize_job(void *data)
7356 E_Fm2_Smart_Data *sd;
7359 sd = evas_object_smart_data_get(data);
7361 sd->resize_job = NULL;
7362 evas_event_freeze(evas_object_evas_get(sd->obj));
7364 switch (_e_fm2_view_mode_get(sd))
7366 case E_FM2_VIEW_MODE_ICONS:
7367 _e_fm2_regions_free(sd->obj);
7368 _e_fm2_icons_place(sd->obj);
7369 _e_fm2_regions_populate(sd->obj);
7372 case E_FM2_VIEW_MODE_GRID_ICONS:
7373 _e_fm2_regions_free(sd->obj);
7374 _e_fm2_icons_place(sd->obj);
7375 _e_fm2_regions_populate(sd->obj);
7378 case E_FM2_VIEW_MODE_CUSTOM_ICONS:
7379 if (sd->config->view.fit_custom_pos)
7382 EINA_LIST_FOREACH(sd->icons, l, ic)
7385 _e_fm2_icon_geom_adjust(ic, ic->x, ic->y, ic->w, ic->h, sd->pw, sd->ph);
7388 _e_fm2_regions_free(sd->obj);
7389 // _e_fm2_regions_eval(sd->obj);
7390 _e_fm2_icons_place(sd->obj);
7391 _e_fm2_regions_populate(sd->obj);
7394 case E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS:
7395 /* FIXME: not going to implement this at this stage */
7396 _e_fm2_regions_free(sd->obj);
7397 // _e_fm2_regions_eval(sd->obj);
7398 _e_fm2_icons_place(sd->obj);
7399 _e_fm2_regions_populate(sd->obj);
7402 case E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS:
7403 /* FIXME: not going to implement this at this stage */
7404 _e_fm2_regions_free(sd->obj);
7405 // _e_fm2_regions_eval(sd->obj);
7406 _e_fm2_icons_place(sd->obj);
7407 _e_fm2_regions_populate(sd->obj);
7410 case E_FM2_VIEW_MODE_LIST:
7411 if (sd->iconlist_changed)
7414 EINA_LIST_FOREACH(sd->icons, l, ic)
7417 // _e_fm2_icon_unrealize(ic);
7420 _e_fm2_regions_free(sd->obj);
7421 _e_fm2_icons_place(sd->obj);
7422 _e_fm2_regions_populate(sd->obj);
7429 evas_event_thaw(evas_object_evas_get(sd->obj));
7430 sd->iconlist_changed = EINA_FALSE;
7434 if ((sd->max.w > 0) && (sd->max.h > 0) && (sd->w > 0) && (sd->h > 0))
7436 E_Fm2_Custom_File *cf = e_fm2_custom_file_get(sd->realpath);
7437 if ((cf) && (cf->dir))
7439 sd->pos.x = cf->dir->pos.x * (sd->max.w - sd->w);
7440 sd->pos.y = cf->dir->pos.y * (sd->max.h - sd->h);
7441 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7447 _e_fm2_cb_icon_sort(const void *data1, const void *data2)
7449 const E_Fm2_Icon *ic1, *ic2;
7454 l1 = (char *)ic1->info.file;
7455 if (ic1->info.label) l1 = (char *)ic1->info.label;
7456 l2 = (char *)ic2->info.file;
7457 if (ic2->info.label) l2 = (char *)ic2->info.label;
7458 if (ic1->sd->config->list.sort.dirs.first)
7460 if ((S_ISDIR(ic1->info.statinfo.st_mode)) !=
7461 (S_ISDIR(ic2->info.statinfo.st_mode)))
7463 if (S_ISDIR(ic1->info.statinfo.st_mode)) return -1;
7467 else if (ic1->sd->config->list.sort.dirs.last)
7469 if ((S_ISDIR(ic1->info.statinfo.st_mode)) !=
7470 (S_ISDIR(ic2->info.statinfo.st_mode)))
7472 if (S_ISDIR(ic1->info.statinfo.st_mode)) return 1;
7476 if (ic1->sd->config->list.sort.no_case)
7478 char buf1[4096], buf2[4096], *p;
7480 /* if (ic1->sd->config->list.sort.category)
7482 * FIXME: implement category sorting
7486 eina_strlcpy(buf1, l1, sizeof(buf1));
7487 eina_strlcpy(buf2, l2, sizeof(buf2));
7501 return strcmp(buf1, buf2);
7503 return strcmp(l1, l2);
7507 _e_fm2_cb_scan_timer(void *data)
7509 E_Fm2_Smart_Data *sd;
7511 sd = evas_object_smart_data_get(data);
7512 if (!sd) return ECORE_CALLBACK_CANCEL;
7513 _e_fm2_queue_process(data);
7514 sd->scan_timer = NULL;
7517 _e_fm2_client_monitor_list_end(data);
7518 return ECORE_CALLBACK_CANCEL;
7520 if (sd->busy_count > 0)
7521 sd->scan_timer = ecore_timer_add(0.2, _e_fm2_cb_scan_timer, sd->obj);
7524 if (!sd->sort_idler)
7525 sd->sort_idler = ecore_idler_add(_e_fm2_cb_sort_idler, data);
7527 return ECORE_CALLBACK_CANCEL;
7531 _e_fm2_cb_sort_idler(void *data)
7533 E_Fm2_Smart_Data *sd;
7535 sd = evas_object_smart_data_get(data);
7536 if (!sd) return ECORE_CALLBACK_CANCEL;
7537 _e_fm2_queue_process(data);
7540 sd->sort_idler = NULL;
7541 _e_fm2_client_monitor_list_end(data);
7542 return ECORE_CALLBACK_CANCEL;
7544 return ECORE_CALLBACK_RENEW;
7548 _e_fm2_cb_theme(void *data, int type __UNUSED__, void *event __UNUSED__)
7550 e_fm2_refresh(data);
7551 return ECORE_CALLBACK_RENEW;
7554 /**************************/
7556 _e_fm2_obj_icons_place(E_Fm2_Smart_Data *sd)
7561 evas_event_freeze(evas_object_evas_get(sd->obj));
7563 EINA_LIST_FOREACH(sd->regions.list, l, rg)
7567 const Eina_List *ll;
7570 EINA_LIST_FOREACH(rg->list, ll, ic)
7574 if (!_e_fm2_icon_visible(ic))
7576 e_thumb_icon_end(ic->obj_icon);
7578 evas_object_move(ic->obj,
7579 sd->x + ic->x - sd->pos.x,
7580 sd->y + ic->y - sd->pos.y);
7581 evas_object_resize(ic->obj, ic->w, ic->h);
7582 _e_fm2_icon_thumb(ic, ic->obj_icon, 0);
7588 evas_event_thaw(evas_object_evas_get(sd->obj));
7591 /**************************/
7594 _e_fm2_smart_add(Evas_Object *obj)
7596 E_Fm2_Smart_Data *sd;
7598 sd = E_NEW(E_Fm2_Smart_Data, 1);
7601 sd->view_mode = -1; /* unset */
7602 sd->icon_size = -1; /* unset */
7605 sd->clip = evas_object_rectangle_add(evas_object_evas_get(obj));
7606 evas_object_smart_member_add(sd->clip, obj);
7607 evas_object_color_set(sd->clip, 255, 255, 255, 255);
7609 sd->underlay = evas_object_rectangle_add(evas_object_evas_get(obj));
7610 evas_object_clip_set(sd->underlay, sd->clip);
7611 evas_object_smart_member_add(sd->underlay, obj);
7612 evas_object_color_set(sd->underlay, 0, 0, 0, 0);
7613 evas_object_show(sd->underlay);
7615 evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _e_fm2_cb_key_down, sd);
7616 evas_object_event_callback_add(sd->underlay, EVAS_CALLBACK_MOUSE_DOWN, _e_fm2_cb_mouse_down, sd);
7617 evas_object_event_callback_add(sd->underlay, EVAS_CALLBACK_MOUSE_UP, _e_fm2_cb_mouse_up, sd);
7618 evas_object_event_callback_add(sd->underlay, EVAS_CALLBACK_MOUSE_MOVE, _e_fm2_cb_mouse_move, sd);
7620 sd->drop = edje_object_add(evas_object_evas_get(obj));
7621 evas_object_clip_set(sd->drop, sd->clip);
7622 _e_fm2_theme_edje_object_set(sd, sd->drop,
7623 "base/theme/fileman",
7624 "list/drop_between");
7625 evas_object_smart_member_add(sd->drop, obj);
7626 evas_object_show(sd->drop);
7628 sd->drop_in = edje_object_add(evas_object_evas_get(obj));
7629 evas_object_clip_set(sd->drop_in, sd->clip);
7630 _e_fm2_theme_edje_object_set(sd, sd->drop_in,
7631 "base/theme/fileman",
7633 evas_object_smart_member_add(sd->drop_in, obj);
7634 evas_object_show(sd->drop_in);
7636 sd->overlay = edje_object_add(evas_object_evas_get(obj));
7637 evas_object_clip_set(sd->overlay, sd->clip);
7638 _e_fm2_theme_edje_object_set(sd, sd->overlay,
7639 "base/theme/fileman",
7641 evas_object_smart_member_add(sd->overlay, obj);
7642 evas_object_show(sd->overlay);
7644 sd->sel_rect = edje_object_add(evas_object_evas_get(obj));
7645 evas_object_clip_set(sd->sel_rect, sd->clip);
7646 _e_fm2_theme_edje_object_set(sd, sd->sel_rect, "base/theme/fileman",
7648 evas_object_smart_member_add(sd->sel_rect, obj);
7650 evas_object_smart_data_set(obj, sd);
7651 evas_object_move(obj, 0, 0);
7652 evas_object_resize(obj, 0, 0);
7654 sd->event_handlers = eina_list_append(sd->event_handlers,
7655 ecore_event_handler_add(E_EVENT_CONFIG_ICON_THEME,
7660 _e_fm2_list = eina_list_append(_e_fm2_list, sd->obj);
7664 _e_fm2_smart_del(Evas_Object *obj)
7666 E_Fm2_Smart_Data *sd;
7667 Ecore_Event_Handler *hdl;
7669 sd = evas_object_smart_data_get(obj);
7672 EINA_LIST_FREE(sd->event_handlers, hdl)
7673 ecore_event_handler_del(hdl);
7675 _e_fm2_client_monitor_list_end(obj);
7676 if (sd->realpath) _e_fm2_client_monitor_del(sd->id, sd->realpath);
7677 _e_fm2_live_process_end(obj);
7678 _e_fm2_queue_free(obj);
7679 _e_fm2_regions_free(obj);
7680 _e_fm2_icons_free(obj);
7683 e_menu_post_deactivate_callback_set(sd->menu, NULL, NULL);
7684 e_object_del(E_OBJECT(sd->menu));
7687 if (sd->entry_dialog)
7689 e_object_del(E_OBJECT(sd->entry_dialog));
7690 sd->entry_dialog = NULL;
7692 if (sd->image_dialog)
7694 e_object_del(E_OBJECT(sd->image_dialog));
7695 sd->image_dialog = NULL;
7697 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
7698 if (sd->resize_job) ecore_job_del(sd->resize_job);
7699 if (sd->refresh_job) ecore_job_del(sd->refresh_job);
7700 eina_stringshare_del(sd->custom_theme);
7701 eina_stringshare_del(sd->custom_theme_content);
7702 sd->custom_theme = sd->custom_theme_content = NULL;
7703 eina_stringshare_del(sd->dev);
7704 eina_stringshare_del(sd->path);
7705 eina_stringshare_del(sd->realpath);
7706 sd->dev = sd->path = sd->realpath = NULL;
7709 e_fm2_device_unmount(sd->mount);
7712 if (sd->config) _e_fm2_config_free(sd->config);
7714 E_FREE(sd->typebuf.buf);
7716 evas_object_del(sd->underlay);
7717 evas_object_del(sd->overlay);
7718 evas_object_del(sd->drop);
7719 evas_object_del(sd->drop_in);
7720 evas_object_del(sd->sel_rect);
7721 evas_object_del(sd->clip);
7722 if (sd->drop_handler) e_drop_handler_del(sd->drop_handler);
7723 if (_e_fm2_list_walking == 0)
7724 _e_fm2_list = eina_list_remove(_e_fm2_list, sd->obj);
7726 _e_fm2_list_remove = eina_list_append(_e_fm2_list_remove, sd->obj);
7728 e_fm2_custom_file_flush();
7732 _e_fm2_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
7734 E_Fm2_Smart_Data *sd;
7736 sd = evas_object_smart_data_get(obj);
7738 if ((sd->x == x) && (sd->y == y)) return;
7741 evas_object_move(sd->underlay, sd->x, sd->y);
7742 evas_object_move(sd->overlay, sd->x, sd->y);
7743 _e_fm2_dnd_drop_configure(sd->obj);
7744 evas_object_move(sd->clip, sd->x - OVERCLIP, sd->y - OVERCLIP);
7745 _e_fm2_obj_icons_place(sd);
7746 if (sd->drop_handler)
7747 e_drop_handler_geometry_set(sd->drop_handler, sd->x, sd->y, sd->w, sd->h);
7751 _e_fm2_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
7753 E_Fm2_Smart_Data *sd;
7754 Eina_Bool wch = EINA_FALSE;
7756 sd = evas_object_smart_data_get(obj);
7758 if ((sd->w == w) && (sd->h == h)) return;
7759 if (w != sd->w) wch = EINA_TRUE;
7762 evas_object_resize(sd->underlay, sd->w, sd->h);
7763 evas_object_resize(sd->overlay, sd->w, sd->h);
7764 _e_fm2_dnd_drop_configure(sd->obj);
7765 evas_object_resize(sd->clip, sd->w + (OVERCLIP * 2), sd->h + (OVERCLIP * 2));
7767 /* for automatic layout - do this - NB; we could put this on a timer delay */
7768 if ((_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST) ||
7769 (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_GRID_ICONS))
7773 if (sd->resize_job) ecore_job_del(sd->resize_job);
7774 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
7778 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
7779 sd->scroll_job = ecore_job_add(_e_fm2_cb_scroll_job, obj);
7782 else if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS)
7784 if (sd->config->view.fit_custom_pos)
7786 if (sd->resize_job) ecore_job_del(sd->resize_job);
7787 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
7791 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
7792 sd->scroll_job = ecore_job_add(_e_fm2_cb_scroll_job, obj);
7795 if (sd->drop_handler)
7796 e_drop_handler_geometry_set(sd->drop_handler, sd->x, sd->y, sd->w, sd->h);
7800 _e_fm2_smart_show(Evas_Object *obj)
7802 E_Fm2_Smart_Data *sd;
7804 sd = evas_object_smart_data_get(obj);
7806 evas_object_show(sd->clip);
7810 _e_fm2_smart_hide(Evas_Object *obj)
7812 E_Fm2_Smart_Data *sd;
7814 sd = evas_object_smart_data_get(obj);
7816 evas_object_hide(sd->clip);
7820 _e_fm2_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
7822 E_Fm2_Smart_Data *sd;
7824 sd = evas_object_smart_data_get(obj);
7826 evas_object_color_set(sd->clip, r, g, b, a);
7830 _e_fm2_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
7832 E_Fm2_Smart_Data *sd;
7834 sd = evas_object_smart_data_get(obj);
7836 evas_object_clip_set(sd->clip, clip);
7840 _e_fm2_smart_clip_unset(Evas_Object *obj)
7842 E_Fm2_Smart_Data *sd;
7844 sd = evas_object_smart_data_get(obj);
7846 evas_object_clip_unset(sd->clip);
7850 _e_fm2_menu(Evas_Object *obj, unsigned int timestamp)
7852 E_Fm2_Smart_Data *sd;
7860 sd = evas_object_smart_data_get(obj);
7864 e_object_data_set(E_OBJECT(mn), obj);
7865 e_menu_category_set(mn, "e/fileman/action");
7867 if (sd->icon_menu.replace.func)
7868 sd->icon_menu.replace.func(sd->icon_menu.replace.data, sd->obj, mn, NULL);
7871 if (sd->icon_menu.start.func)
7873 sd->icon_menu.start.func(sd->icon_menu.start.data, sd->obj, mn, NULL);
7874 mi = e_menu_item_new(mn);
7875 e_menu_item_separator_set(mi, 1);
7877 if ((!(sd->icon_menu.flags & E_FM2_MENU_NO_INHERIT_PARENT)) &&
7878 (sd->view_flags & E_FM2_VIEW_INHERIT_DIR_CUSTOM))
7880 mi = e_menu_item_new(mn);
7881 e_menu_item_label_set(mi, _("Inherit parent settings"));
7882 e_util_menu_item_theme_icon_set(mi, "view-inherit");
7883 e_menu_item_check_set(mi, 1);
7884 e_menu_item_toggle_set(mi, sd->inherited_dir_props);
7885 e_menu_item_callback_set(mi, _e_fm2_toggle_inherit_dir_props, sd);
7887 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_VIEW_MENU))
7889 mi = e_menu_item_new(mn);
7890 e_menu_item_label_set(mi, _("View Mode"));
7891 e_util_menu_item_theme_icon_set(mi, "preferences-look");
7892 e_menu_item_submenu_pre_callback_set(mi, _e_fm2_view_menu_pre, sd);
7894 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REFRESH))
7896 mi = e_menu_item_new(mn);
7897 e_menu_item_label_set(mi, _("Refresh View"));
7898 e_util_menu_item_theme_icon_set(mi, "view-refresh");
7899 e_menu_item_callback_set(mi, _e_fm2_refresh, sd);
7902 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SHOW_HIDDEN))
7904 mi = e_menu_item_new(mn);
7905 e_menu_item_label_set(mi, _("Show Hidden Files"));
7906 e_util_menu_item_theme_icon_set(mi, "view-refresh");
7907 e_menu_item_check_set(mi, 1);
7908 e_menu_item_toggle_set(mi, sd->show_hidden_files);
7909 e_menu_item_callback_set(mi, _e_fm2_toggle_hidden_files, sd);
7912 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REMEMBER_ORDERING))
7914 if (!sd->config->view.always_order)
7916 mi = e_menu_item_new(mn);
7917 e_menu_item_label_set(mi, _("Remember Ordering"));
7918 e_util_menu_item_theme_icon_set(mi, "view-order");
7919 e_menu_item_check_set(mi, 1);
7920 e_menu_item_toggle_set(mi, sd->order_file);
7921 e_menu_item_callback_set(mi, _e_fm2_toggle_ordering, sd);
7923 if ((sd->order_file) || (sd->config->view.always_order))
7925 mi = e_menu_item_new(mn);
7926 e_menu_item_label_set(mi, _("Sort Now"));
7927 e_util_menu_item_theme_icon_set(mi, "view-sort");
7928 e_menu_item_callback_set(mi, _e_fm2_sort, sd);
7932 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_NEW_DIRECTORY))
7934 mi = e_menu_item_new(mn);
7935 e_menu_item_separator_set(mi, 1);
7937 mi = e_menu_item_new(mn);
7938 e_menu_item_label_set(mi, _("New Directory"));
7939 e_util_menu_item_theme_icon_set(mi, "folder-new");
7940 e_menu_item_callback_set(mi, _e_fm2_new_directory, sd);
7943 if (((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) ||
7944 (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))) &&
7945 (eina_list_count(_e_fm_file_buffer) > 0) &&
7946 ecore_file_can_write(sd->realpath))
7948 mi = e_menu_item_new(mn);
7949 e_menu_item_separator_set(mi, 1);
7951 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE))
7953 mi = e_menu_item_new(mn);
7954 e_menu_item_label_set(mi, _("Paste"));
7955 e_util_menu_item_theme_icon_set(mi, "edit-paste");
7956 e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd);
7959 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))
7961 mi = e_menu_item_new(mn);
7962 e_menu_item_label_set(mi, _("Link"));
7963 e_util_menu_item_theme_icon_set(mi, "emblem-symbolic-link");
7964 e_menu_item_callback_set(mi, _e_fm2_file_symlink_menu, sd);
7968 if (sd->icon_menu.end.func)
7969 sd->icon_menu.end.func(sd->icon_menu.end.data, sd->obj, mn, NULL);
7972 man = e_manager_current_get();
7975 e_object_del(E_OBJECT(mn));
7978 con = e_container_current_get(man);
7981 e_object_del(E_OBJECT(mn));
7984 ecore_x_pointer_xy_get(con->win, &x, &y);
7985 zone = e_util_zone_current_get(man);
7988 e_object_del(E_OBJECT(mn));
7992 e_menu_post_deactivate_callback_set(mn, _e_fm2_menu_post_cb, sd);
7993 e_menu_activate_mouse(mn, zone,
7995 E_MENU_POP_DIRECTION_DOWN, timestamp);
7999 _e_fm2_menu_post_cb(void *data, E_Menu *m __UNUSED__)
8001 E_Fm2_Smart_Data *sd;
8008 _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp)
8010 E_Fm2_Smart_Data *sd;
8016 Eina_List *sel, *l = NULL;
8017 int x, y, can_w, can_w2, protect;
8018 char buf[PATH_MAX], *ext;
8023 e_object_data_set(E_OBJECT(mn), obj);
8024 e_menu_category_set(mn, "e/fileman/action");
8026 if (sd->icon_menu.replace.func)
8027 sd->icon_menu.replace.func(sd->icon_menu.replace.data, sd->obj, mn, NULL);
8030 if (sd->icon_menu.start.func)
8032 sd->icon_menu.start.func(sd->icon_menu.start.data, sd->obj, mn, NULL);
8033 mi = e_menu_item_new(mn);
8034 e_menu_item_separator_set(mi, 1);
8037 if ((!(sd->icon_menu.flags & E_FM2_MENU_NO_INHERIT_PARENT)) &&
8038 (sd->view_flags & E_FM2_VIEW_INHERIT_DIR_CUSTOM))
8040 mi = e_menu_item_new(mn);
8041 e_menu_item_label_set(mi, _("Inherit parent settings"));
8042 e_util_menu_item_theme_icon_set(mi, "view-inherit");
8043 e_menu_item_check_set(mi, 1);
8044 e_menu_item_toggle_set(mi, sd->inherited_dir_props);
8045 e_menu_item_callback_set(mi, _e_fm2_toggle_inherit_dir_props, sd);
8047 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_VIEW_MENU))
8049 mi = e_menu_item_new(mn);
8050 e_menu_item_label_set(mi, _("View Mode"));
8051 e_util_menu_item_theme_icon_set(mi, "preferences-look");
8052 e_menu_item_submenu_pre_callback_set(mi, _e_fm2_icon_view_menu_pre, sd);
8054 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REFRESH))
8056 mi = e_menu_item_new(mn);
8057 e_menu_item_label_set(mi, _("Refresh View"));
8058 e_util_menu_item_theme_icon_set(mi, "view-refresh");
8059 e_menu_item_callback_set(mi, _e_fm2_refresh, sd);
8062 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SHOW_HIDDEN))
8064 mi = e_menu_item_new(mn);
8065 e_menu_item_label_set(mi, _("Show Hidden Files"));
8066 e_util_menu_item_theme_icon_set(mi, "view-hidden-files");
8067 e_menu_item_check_set(mi, 1);
8068 e_menu_item_toggle_set(mi, sd->show_hidden_files);
8069 e_menu_item_callback_set(mi, _e_fm2_toggle_hidden_files, sd);
8072 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REMEMBER_ORDERING))
8074 if (!sd->config->view.always_order)
8076 mi = e_menu_item_new(mn);
8077 e_menu_item_label_set(mi, _("Remember Ordering"));
8078 e_util_menu_item_theme_icon_set(mi, "view-order");
8079 e_menu_item_check_set(mi, 1);
8080 e_menu_item_toggle_set(mi, sd->order_file);
8081 e_menu_item_callback_set(mi, _e_fm2_toggle_ordering, sd);
8083 if ((sd->order_file) || (sd->config->view.always_order))
8085 mi = e_menu_item_new(mn);
8086 e_menu_item_label_set(mi, _("Sort Now"));
8087 e_util_menu_item_theme_icon_set(mi, "view-sort");
8088 e_menu_item_callback_set(mi, _e_fm2_sort, sd);
8092 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_NEW_DIRECTORY))
8094 /* FIXME: stat the dir itself - move to e_fm_main */
8095 if (ecore_file_can_write(sd->realpath))
8097 mi = e_menu_item_new(mn);
8098 e_menu_item_separator_set(mi, 1);
8100 mi = e_menu_item_new(mn);
8101 e_menu_item_label_set(mi, _("New Directory"));
8102 e_util_menu_item_theme_icon_set(mi, "folder-new");
8103 e_menu_item_callback_set(mi, _e_fm2_new_directory, sd);
8106 if (!ic->info.removable)
8108 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_CUT))
8110 if (ecore_file_can_write(sd->realpath))
8112 mi = e_menu_item_new(mn);
8113 e_menu_item_separator_set(mi, 1);
8115 mi = e_menu_item_new(mn);
8116 e_menu_item_label_set(mi, _("Cut"));
8117 e_util_menu_item_theme_icon_set(mi, "edit-cut");
8118 e_menu_item_callback_set(mi, _e_fm2_file_cut_menu, sd);
8121 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_COPY))
8123 if (!ecore_file_can_write(sd->realpath))
8125 mi = e_menu_item_new(mn);
8126 e_menu_item_separator_set(mi, 1);
8129 mi = e_menu_item_new(mn);
8130 e_menu_item_label_set(mi, _("Copy"));
8131 e_util_menu_item_theme_icon_set(mi, "edit-copy");
8132 e_menu_item_callback_set(mi, _e_fm2_file_copy_menu, sd);
8135 if (((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) ||
8136 (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))) &&
8137 (eina_list_count(_e_fm_file_buffer) > 0) &&
8138 ecore_file_can_write(sd->realpath))
8140 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE))
8142 mi = e_menu_item_new(mn);
8143 e_menu_item_label_set(mi, _("Paste"));
8144 e_util_menu_item_theme_icon_set(mi, "edit-paste");
8145 e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd);
8148 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))
8150 mi = e_menu_item_new(mn);
8151 e_menu_item_label_set(mi, _("Link"));
8152 e_util_menu_item_theme_icon_set(mi, "emblem-symbolic-link");
8153 e_menu_item_callback_set(mi, _e_fm2_file_symlink_menu, sd);
8159 if (ic->sd->order_file)
8161 snprintf(buf, sizeof(buf), "%s/.order", sd->realpath);
8162 /* FIXME: stat the .order itself - move to e_fm_main */
8163 // can_w2 = ecore_file_can_write(buf);
8170 if (_e_fm2_icon_realpath(ic, buf, sizeof(buf)) &&
8171 (lstat(buf, &st) == 0))
8173 if (st.st_uid == getuid())
8175 if (st.st_mode & S_IWUSR) can_w = 1;
8177 else if (st.st_gid == getgid())
8179 if (st.st_mode & S_IWGRP) can_w = 1;
8183 if (st.st_mode & S_IWOTH) can_w = 1;
8190 sel = e_fm2_selected_list_get(ic->sd->obj);
8191 if ((!sel) || eina_list_count(sel) == 1)
8193 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
8194 protect = e_filereg_file_protected(buf);
8198 eina_list_free(sel);
8200 if ((can_w) && (can_w2) && !(protect) && !ic->info.removable)
8202 mi = e_menu_item_new(mn);
8203 e_menu_item_separator_set(mi, 1);
8205 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_DELETE))
8207 mi = e_menu_item_new(mn);
8208 e_menu_item_label_set(mi, _("Delete"));
8209 e_util_menu_item_theme_icon_set(mi, "edit-delete");
8210 e_menu_item_callback_set(mi, _e_fm2_file_delete_menu, ic);
8213 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_RENAME))
8215 mi = e_menu_item_new(mn);
8216 e_menu_item_label_set(mi, _("Rename"));
8217 e_util_menu_item_theme_icon_set(mi, "edit-rename");
8218 e_menu_item_callback_set(mi, _e_fm2_file_rename, ic);
8222 if (ic->info.removable)
8226 v = e_fm2_device_volume_find(ic->info.link);
8229 mi = e_menu_item_new(mn);
8230 e_menu_item_separator_set(mi, 1);
8232 mi = e_menu_item_new(mn);
8235 e_menu_item_label_set(mi, _("Unmount"));
8236 e_menu_item_callback_set(mi, _e_fm2_volume_unmount, v);
8240 e_menu_item_label_set(mi, _("Mount"));
8241 e_menu_item_callback_set(mi, _e_fm2_volume_mount, v);
8244 mi = e_menu_item_new(mn);
8245 e_menu_item_label_set(mi, _("Eject"));
8246 e_util_menu_item_theme_icon_set(mi, "media-eject");
8247 e_menu_item_callback_set(mi, _e_fm2_volume_eject, v);
8249 mi = e_menu_item_new(mn);
8250 e_menu_item_separator_set(mi, 1);
8254 if (ic->info.mime && !strcmp(ic->info.mime, "application/x-desktop"))
8256 mi = e_menu_item_new(mn);
8257 e_menu_item_label_set(mi, _("Application Properties"));
8258 e_util_menu_item_theme_icon_set(mi, "configure");
8259 e_menu_item_callback_set(mi, _e_fm2_file_application_properties, ic);
8262 mi = e_menu_item_new(mn);
8263 e_menu_item_label_set(mi, _("File Properties"));
8264 e_util_menu_item_theme_icon_set(mi, "document-properties");
8265 e_menu_item_callback_set(mi, _e_fm2_file_properties, ic);
8269 /* see if we have any mime handlers registered for this file */
8270 l = e_fm2_mime_handler_mime_handlers_get(ic->info.mime);
8273 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
8274 _e_fm2_context_menu_append(obj, buf, l, mn, ic);
8278 /* see if we have any glob handlers registered for this file */
8279 ext = strrchr(ic->info.file, '.');
8282 snprintf(buf, sizeof(buf), "*%s", ext);
8283 l = e_fm2_mime_handler_glob_handlers_get(buf);
8286 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
8287 _e_fm2_context_menu_append(obj, buf, l, mn, ic);
8292 if (sd->icon_menu.end.func)
8293 sd->icon_menu.end.func(sd->icon_menu.end.data, sd->obj, mn, &(ic->info));
8296 man = e_manager_current_get();
8299 e_object_del(E_OBJECT(mn));
8302 con = e_container_current_get(man);
8305 e_object_del(E_OBJECT(mn));
8308 ecore_x_pointer_xy_get(con->win, &x, &y);
8309 zone = e_util_zone_current_get(man);
8312 e_object_del(E_OBJECT(mn));
8316 e_menu_post_deactivate_callback_set(mn, _e_fm2_icon_menu_post_cb, ic);
8317 e_menu_activate_mouse(mn, zone,
8319 E_MENU_POP_DIRECTION_DOWN, timestamp);
8323 _e_fm2_context_menu_append(Evas_Object *obj, const char *path, Eina_List *l, E_Menu *mn, E_Fm2_Icon *ic)
8325 E_Fm2_Mime_Handler *handler;
8326 const Eina_List *ll;
8330 l = eina_list_sort(l, -1, _e_fm2_context_list_sort);
8332 EINA_LIST_FOREACH(l, ll, handler)
8334 E_Fm2_Context_Menu_Data *md = NULL;
8337 if ((!handler) || (!e_fm2_mime_handler_test(handler, obj, path)) ||
8338 (!handler->label)) continue;
8341 /* only append the separator if this is the first item */
8342 /* we do this in here because we dont want to add a separator
8343 * when we have no context entries */
8344 mi = e_menu_item_new(mn);
8345 e_menu_item_separator_set(mi, 1);
8348 md = E_NEW(E_Fm2_Context_Menu_Data, 1);
8351 md->handler = handler;
8352 _e_fm2_menu_contexts = eina_list_append(_e_fm2_menu_contexts, md);
8354 mi = e_menu_item_new(mn);
8355 e_menu_item_label_set(mi, handler->label);
8356 if (handler->icon_group)
8357 e_util_menu_item_theme_icon_set(mi, handler->icon_group);
8358 e_menu_item_callback_set(mi, _e_fm2_icon_menu_item_cb, md);
8363 _e_fm2_context_list_sort(const void *data1, const void *data2)
8365 const E_Fm2_Mime_Handler *d1, *d2;
8367 if (!data1) return 1;
8368 if (!data2) return -1;
8370 if (!d1->label) return 1;
8372 if (!d2->label) return -1;
8373 return strcmp(d1->label, d2->label);
8377 _e_fm2_icon_menu_post_cb(void *data, E_Menu *m __UNUSED__)
8379 E_Fm2_Context_Menu_Data *md;
8384 EINA_LIST_FREE(_e_fm2_menu_contexts, md)
8389 _e_fm2_icon_menu_item_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8391 E_Fm2_Context_Menu_Data *md = NULL;
8392 Evas_Object *obj = NULL;
8397 obj = md->icon->info.fm;
8399 snprintf(buf, sizeof(buf), "%s/%s",
8400 e_fm2_real_path_get(obj), md->icon->info.file);
8401 e_fm2_mime_handler_call(md->handler, obj, buf);
8404 struct e_fm2_view_menu_icon_size_data
8406 E_Fm2_Smart_Data *sd;
8411 _e_fm2_view_menu_icon_size_data_free(void *obj)
8413 struct e_fm2_view_menu_icon_size_data *d = e_object_data_get(obj);
8418 _e_fm2_view_menu_icon_size_change(void *data, E_Menu *m, E_Menu_Item *mi)
8420 struct e_fm2_view_menu_icon_size_data *d = data;
8421 short current_size = _e_fm2_icon_w_get(d->sd);
8422 d->sd->icon_size = d->size;
8423 d->sd->inherited_dir_props = EINA_FALSE;
8424 if (current_size == d->size)
8426 _e_fm2_refresh(d->sd, m, mi);
8430 _e_fm2_view_menu_icon_size_use_default(void *data, E_Menu *m, E_Menu_Item *mi)
8432 E_Fm2_Smart_Data *sd = data;
8435 old = _e_fm2_icon_w_get(sd);
8437 if (sd->icon_size == -1)
8438 sd->icon_size = sd->config->icon.icon.w;
8442 new = _e_fm2_icon_w_get(sd);
8443 sd->inherited_dir_props = EINA_FALSE;
8448 _e_fm2_refresh(sd, m, mi);
8452 _e_fm2_view_menu_icon_size_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
8454 E_Fm2_Smart_Data *sd = data;
8456 const short *itr, sizes[] =
8458 22, 32, 48, 64, 96, 128, 256, -1
8460 short current_size = _e_fm2_icon_w_get(sd);
8463 current_size /= e_scale;
8465 subm = e_menu_new();
8466 e_menu_item_submenu_set(mi, subm);
8468 for (itr = sizes; *itr > -1; itr++)
8471 struct e_fm2_view_menu_icon_size_data *d;
8473 d = malloc(sizeof(*d));
8479 snprintf(buf, sizeof(buf), "%hd", *itr);
8481 mi = e_menu_item_new(subm);
8482 e_object_data_set(E_OBJECT(mi), d);
8483 e_object_del_attach_func_set
8484 (E_OBJECT(mi), _e_fm2_view_menu_icon_size_data_free);
8486 e_menu_item_label_set(mi, buf);
8487 e_menu_item_radio_group_set(mi, 1);
8488 e_menu_item_radio_set(mi, 1);
8490 if (current_size == *itr)
8491 e_menu_item_toggle_set(mi, 1);
8493 e_menu_item_callback_set(mi, _e_fm2_view_menu_icon_size_change, d);
8496 mi = e_menu_item_new(subm);
8497 e_menu_item_separator_set(mi, 1);
8499 mi = e_menu_item_new(subm);
8500 e_menu_item_label_set(mi, _("Use default"));
8501 e_menu_item_check_set(mi, 1);
8502 e_menu_item_toggle_set(mi, sd->icon_size == -1);
8503 e_menu_item_callback_set(mi, _e_fm2_view_menu_icon_size_use_default, sd);
8507 _e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m, E_Menu_Item *mi)
8509 E_Fm2_Smart_Data *sd = data;
8511 sd->inherited_dir_props = !sd->inherited_dir_props;
8512 _e_fm2_dir_save_props(sd);
8513 _e_fm2_dir_load_props(sd);
8514 _e_fm2_refresh(sd, m, mi);
8518 _e_fm2_view_menu_common(E_Menu *subm, E_Fm2_Smart_Data *sd)
8523 view_mode = _e_fm2_view_mode_get(sd);
8525 mi = e_menu_item_new(subm);
8526 e_menu_item_label_set(mi, _("Grid Icons"));
8527 e_menu_item_radio_group_set(mi, 1);
8528 e_menu_item_radio_set(mi, 1);
8529 if (view_mode == E_FM2_VIEW_MODE_GRID_ICONS)
8530 e_menu_item_toggle_set(mi, 1);
8531 e_menu_item_callback_set(mi, _e_fm2_view_menu_grid_icons_cb, sd);
8533 mi = e_menu_item_new(subm);
8534 e_menu_item_label_set(mi, _("Custom Icons"));
8535 e_menu_item_radio_group_set(mi, 1);
8536 e_menu_item_radio_set(mi, 1);
8537 if (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS)
8538 e_menu_item_toggle_set(mi, 1);
8539 e_menu_item_callback_set(mi, _e_fm2_view_menu_custom_icons_cb, sd);
8541 mi = e_menu_item_new(subm);
8542 e_menu_item_label_set(mi, _("List"));
8543 e_menu_item_radio_group_set(mi, 1);
8544 e_menu_item_radio_set(mi, 1);
8545 if (view_mode == E_FM2_VIEW_MODE_LIST)
8546 e_menu_item_toggle_set(mi, 1);
8547 e_menu_item_callback_set(mi, _e_fm2_view_menu_list_cb, sd);
8549 mi = e_menu_item_new(subm);
8550 e_menu_item_separator_set(mi, 1);
8552 mi = e_menu_item_new(subm);
8553 e_menu_item_label_set(mi, _("Use default"));
8554 e_menu_item_check_set(mi, 1);
8555 e_menu_item_toggle_set(mi, sd->view_mode == -1);
8556 e_menu_item_callback_set(mi, _e_fm2_view_menu_use_default_cb, sd);
8558 if (view_mode == E_FM2_VIEW_MODE_LIST)
8562 int icon_size = _e_fm2_icon_w_get(sd);
8564 // show the icon size as selected (even if it might be influnced by e_scale)
8565 /* if (e_scale > 0.0)
8566 * icon_size /= e_scale; */
8568 snprintf(buf, sizeof(buf), _("Icon Size (%d)"), icon_size);
8570 mi = e_menu_item_new(subm);
8571 e_menu_item_label_set(mi, buf);
8572 e_menu_item_submenu_pre_callback_set(mi, _e_fm2_view_menu_icon_size_pre, sd);
8576 _e_fm2_icon_view_menu_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
8579 E_Fm2_Smart_Data *sd;
8583 subm = e_menu_new();
8584 e_object_data_set(E_OBJECT(subm), sd);
8585 e_menu_item_submenu_set(mi, subm);
8587 _e_fm2_view_menu_common(subm, sd);
8591 _e_fm2_view_menu_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
8594 E_Fm2_Smart_Data *sd;
8599 subm = e_menu_new();
8600 e_object_data_set(E_OBJECT(subm), sd);
8601 e_menu_item_submenu_set(mi, subm);
8603 _e_fm2_view_menu_common(subm, sd);
8605 snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
8606 access_ok = ecore_file_exists(buf) ? ecore_file_can_write(buf)
8607 : ecore_file_can_write(sd->realpath);
8610 mi = e_menu_item_new(subm);
8611 e_menu_item_separator_set(mi, 1);
8613 mi = e_menu_item_new(subm);
8614 e_menu_item_label_set(mi, _("Set background..."));
8615 e_util_menu_item_theme_icon_set(mi, "preferences-desktop-wallpaper");
8616 e_menu_item_callback_set(mi, _e_fm2_view_menu_set_background_cb, sd);
8618 mi = e_menu_item_new(subm);
8619 e_menu_item_label_set(mi, _("Set overlay..."));
8620 e_menu_item_callback_set(mi, _e_fm2_view_menu_set_overlay_cb, sd);
8625 _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8627 E_Fm2_Smart_Data *sd = data;
8630 old = _e_fm2_view_mode_get(sd);
8631 sd->view_mode = E_FM2_VIEW_MODE_GRID_ICONS;
8632 sd->inherited_dir_props = EINA_FALSE;
8633 if (old == E_FM2_VIEW_MODE_GRID_ICONS)
8636 _e_fm2_refresh(sd, m, mi);
8640 _e_fm2_view_menu_custom_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8642 E_Fm2_Smart_Data *sd = data;
8645 old = _e_fm2_view_mode_get(sd);
8646 sd->view_mode = E_FM2_VIEW_MODE_CUSTOM_ICONS;
8647 sd->inherited_dir_props = EINA_FALSE;
8648 if (old == E_FM2_VIEW_MODE_CUSTOM_ICONS)
8651 _e_fm2_refresh(sd, m, mi);
8655 _e_fm2_view_menu_list_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8657 E_Fm2_Smart_Data *sd = data;
8660 old = _e_fm2_view_mode_get(sd);
8661 sd->view_mode = E_FM2_VIEW_MODE_LIST;
8662 sd->inherited_dir_props = EINA_FALSE;
8663 if (old == E_FM2_VIEW_MODE_LIST)
8666 _e_fm2_refresh(sd, m, mi);
8670 _e_fm2_view_menu_use_default_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8672 E_Fm2_Smart_Data *sd = data;
8675 old = _e_fm2_view_mode_get(sd);
8677 if (sd->view_mode == -1)
8678 sd->view_mode = sd->config->view.mode;
8682 new = _e_fm2_view_mode_get(sd);
8683 sd->inherited_dir_props = EINA_FALSE;
8688 _e_fm2_refresh(sd, m, mi);
8692 _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title,
8693 void (*ok_cb)(void *data, E_Dialog *dia),
8694 void (*clear_cb)(void *data, E_Dialog *dia))
8702 man = e_manager_current_get();
8704 con = e_container_current_get(man);
8707 dia = e_dialog_new(con, "E", "_fm2_view_image_select_dialog");
8709 e_dialog_title_set(dia, title);
8711 o = e_widget_fsel_add(dia->win->evas, "/", sd->realpath, NULL, NULL, NULL, sd, NULL, sd, 1);
8712 evas_object_show(o);
8713 e_widget_size_min_get(o, &w, &h);
8714 e_dialog_content_set(dia, o, w, h);
8717 e_dialog_button_add(dia, _("OK"), NULL, ok_cb, sd);
8718 e_dialog_button_add(dia, _("Clear"), NULL, clear_cb, sd);
8719 e_dialog_button_add(dia, _("Cancel"), NULL, _e_fm2_view_image_sel_close, sd);
8720 e_dialog_resizable_set(dia, 1);
8721 e_win_centered_set(dia->win, 1);
8724 sd->image_dialog = dia;
8728 _e_fm2_view_image_sel_close(void *data, E_Dialog *dia)
8730 E_Fm2_Smart_Data *sd;
8733 e_object_del(E_OBJECT(dia));
8734 sd->image_dialog = NULL;
8738 _custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char *value)
8744 snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
8745 ef = efreet_desktop_new(buf);
8748 ef = efreet_desktop_empty_new(buf);
8750 ef->type = EFREET_DESKTOP_TYPE_DIRECTORY;
8751 ef->name = strdup("Directory look and feel");
8754 len = strlen(sd->realpath);
8755 if (!strncmp(value, sd->realpath, len))
8756 efreet_desktop_x_field_set(ef, key, value + len + 1);
8758 efreet_desktop_x_field_set(ef, key, value);
8760 efreet_desktop_save(ef);
8761 efreet_desktop_free(ef);
8765 _custom_file_key_del(E_Fm2_Smart_Data *sd, const char *key)
8770 snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
8771 ef = efreet_desktop_new(buf);
8774 if (efreet_desktop_x_field_del(ef, key))
8775 efreet_desktop_save(ef);
8777 efreet_desktop_free(ef);
8781 _set_background_cb(void *data, E_Dialog *dia)
8783 E_Fm2_Smart_Data *sd;
8789 file = e_widget_fsel_selection_path_get(dia->data);
8792 _custom_file_key_set(sd, "X-Enlightenment-Directory-Wallpaper", file);
8794 _e_fm2_view_image_sel_close(data, dia);
8795 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8799 _clear_background_cb(void *data, E_Dialog *dia)
8801 E_Fm2_Smart_Data *sd;
8806 _e_fm2_view_image_sel_close(data, dia);
8808 _custom_file_key_del(sd, "X-Enlightenment-Directory-Wallpaper");
8809 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8813 _e_fm2_view_menu_set_background_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8815 E_Fm2_Smart_Data *sd;
8818 if (sd->image_dialog) return;
8820 _e_fm2_view_image_sel(sd, _("Set background..."), _set_background_cb,
8821 _clear_background_cb);
8825 _set_overlay_cb(void *data, E_Dialog *dia)
8827 E_Fm2_Smart_Data *sd;
8833 file = e_widget_fsel_selection_path_get(dia->data);
8836 _custom_file_key_set(sd, "X-Enlightenment-Directory-Overlay", file);
8838 _e_fm2_view_image_sel_close(data, dia);
8839 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8843 _clear_overlay_cb(void *data, E_Dialog *dia)
8845 E_Fm2_Smart_Data *sd;
8850 _e_fm2_view_image_sel_close(data, dia);
8852 _custom_file_key_del(sd, "X-Enlightenment-Directory-Overlay");
8853 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8857 _e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8859 E_Fm2_Smart_Data *sd;
8862 if (sd->image_dialog) return;
8864 _e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb,
8869 _e_fm2_refresh(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8871 E_Fm2_Smart_Data *sd;
8874 if (sd->refresh_job) ecore_job_del(sd->refresh_job);
8875 sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, sd->obj);
8879 _e_fm2_toggle_hidden_files(void *data, E_Menu *m, E_Menu_Item *mi)
8881 E_Fm2_Smart_Data *sd;
8884 if (sd->show_hidden_files)
8885 sd->show_hidden_files = EINA_FALSE;
8887 sd->show_hidden_files = EINA_TRUE;
8889 sd->inherited_dir_props = EINA_FALSE;
8890 _e_fm2_refresh(data, m, mi);
8894 _e_fm2_toggle_ordering(void *data, E_Menu *m, E_Menu_Item *mi)
8896 E_Fm2_Smart_Data *sd;
8902 snprintf(buf, sizeof(buf), "%s/.order", sd->realpath);
8903 /* FIXME: move to e_fm_main */
8904 ecore_file_unlink(buf);
8910 snprintf(buf, sizeof(buf), "%s/.order", sd->realpath);
8911 f = fopen(buf, "w");
8914 sd->inherited_dir_props = EINA_FALSE;
8915 _e_fm2_refresh(data, m, mi);
8919 _e_fm2_sort(void *data, E_Menu *m, E_Menu_Item *mi)
8921 E_Fm2_Smart_Data *sd;
8924 sd->icons = eina_list_sort(sd->icons, eina_list_count(sd->icons),
8925 _e_fm2_cb_icon_sort);
8926 _e_fm2_refresh(data, m, mi);
8930 _e_fm2_new_directory(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8932 E_Fm2_Smart_Data *sd;
8937 if (sd->entry_dialog) return;
8939 man = e_manager_current_get();
8941 con = e_container_current_get(man);
8944 sd->entry_dialog = e_entry_dialog_show(_("Create a new Directory"), "folder",
8945 _("New Directory Name:"),
8947 _e_fm2_new_directory_yes_cb,
8948 _e_fm2_new_directory_no_cb, sd);
8949 E_OBJECT(sd->entry_dialog)->data = sd;
8950 e_object_del_attach_func_set(E_OBJECT(sd->entry_dialog), _e_fm2_new_directory_delete_cb);
8954 _e_fm2_new_directory_delete_cb(void *obj)
8956 E_Fm2_Smart_Data *sd;
8958 sd = E_OBJECT(obj)->data;
8959 sd->entry_dialog = NULL;
8963 _e_fm2_new_directory_yes_cb(char *text, void *data)
8965 E_Fm2_Smart_Data *sd;
8969 sd->entry_dialog = NULL;
8970 if ((text) && (text[0]))
8972 snprintf(buf, sizeof(buf), "%s/%s", sd->realpath, text);
8974 _e_fm2_client_file_mkdir(buf, "", 0, 0, 0, sd->w, sd->h, sd->obj);
8979 _e_fm2_new_directory_no_cb(void *data)
8981 E_Fm2_Smart_Data *sd;
8984 sd->entry_dialog = NULL;
8988 _e_fm2_file_rename(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8991 char text[PATH_MAX + 256];
8994 if ((ic->entry_dialog) || (ic->entry_widget)) return;
8996 if (!_e_fm2_icon_entry_widget_add(ic))
8998 snprintf(text, PATH_MAX + 256,
9001 ic->entry_dialog = e_entry_dialog_show(_("Rename File"), "edit-rename",
9002 text, ic->info.file, NULL, NULL,
9003 _e_fm2_file_rename_yes_cb,
9004 _e_fm2_file_rename_no_cb, ic);
9005 E_OBJECT(ic->entry_dialog)->data = ic;
9006 e_object_del_attach_func_set(E_OBJECT(ic->entry_dialog),
9007 _e_fm2_file_rename_delete_cb);
9011 static Evas_Object *
9012 _e_fm2_icon_entry_widget_add(E_Fm2_Icon *ic)
9016 if (ic->sd->iop_icon)
9017 _e_fm2_icon_entry_widget_accept(ic->sd->iop_icon);
9019 if (!edje_object_part_exists(ic->obj, "e.swallow.entry"))
9022 ic->entry_widget = e_widget_entry_add(evas_object_evas_get(ic->obj),
9023 NULL, NULL, NULL, NULL);
9024 evas_object_event_callback_add(ic->entry_widget, EVAS_CALLBACK_KEY_DOWN,
9025 _e_fm2_icon_entry_widget_cb_key_down, ic);
9026 edje_object_part_swallow(ic->obj, "e.swallow.entry", ic->entry_widget);
9027 evas_object_show(ic->entry_widget);
9028 e_widget_entry_text_set(ic->entry_widget, ic->info.file);
9029 e_widget_focus_set(ic->entry_widget, 0);
9030 eo = e_widget_entry_editable_object_get(ic->entry_widget);
9031 e_editable_cursor_move_to_start(eo);
9032 e_editable_selection_move_to_end(eo);
9033 ic->sd->iop_icon = ic;
9035 return ic->entry_widget;
9039 _e_fm2_icon_entry_widget_del(E_Fm2_Icon *ic)
9041 ic->sd->iop_icon = NULL;
9042 evas_object_focus_set(ic->sd->obj, 1);
9043 evas_object_del(ic->entry_widget);
9044 ic->entry_widget = NULL;
9048 _e_fm2_icon_entry_widget_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
9050 Evas_Event_Key_Down *ev;
9056 if (!strcmp(ev->key, "Escape"))
9057 _e_fm2_icon_entry_widget_del(ic);
9058 else if (!strcmp(ev->key, "Return"))
9059 _e_fm2_icon_entry_widget_accept(ic);
9063 _e_fm2_icon_entry_widget_accept(E_Fm2_Icon *ic)
9065 _e_fm2_file_do_rename(e_widget_entry_text_get(ic->entry_widget), ic);
9066 _e_fm2_icon_entry_widget_del(ic);
9070 _e_fm2_file_rename_delete_cb(void *obj)
9074 ic = E_OBJECT(obj)->data;
9075 ic->entry_dialog = NULL;
9079 _e_fm2_file_rename_yes_cb(char *text, void *data)
9084 ic->entry_dialog = NULL;
9086 _e_fm2_file_do_rename(text, ic);
9090 _e_fm2_file_rename_no_cb(void *data)
9095 ic->entry_dialog = NULL;
9099 _e_fm2_file_do_rename(const char *text, E_Fm2_Icon *ic)
9101 char oldpath[PATH_MAX];
9102 char newpath[PATH_MAX];
9107 if ((text) && (strcmp(text, ic->info.file)))
9109 _e_fm2_icon_realpath(ic, oldpath, sizeof(oldpath));
9110 snprintf(newpath, sizeof(newpath), "%s/%s", ic->sd->realpath, text);
9111 if (e_filereg_file_protected(oldpath)) return;
9113 args = _e_fm_string_append_quoted(args, &size, &length, oldpath);
9114 args = _e_fm_string_append_char(args, &size, &length, ' ');
9115 args = _e_fm_string_append_quoted(args, &size, &length, newpath);
9117 _e_fm_client_file_move(args, ic->sd->obj);
9123 _e_fm_retry_abort_dialog(int pid, const char *str)
9129 char text[4096 + PATH_MAX];
9131 man = e_manager_current_get();
9132 if (!man) return NULL;
9133 con = e_container_current_get(man);
9134 if (!con) return NULL;
9136 id = malloc(sizeof(int));
9139 dialog = e_dialog_new(con, "E", "_fm_overwrite_dialog");
9140 E_OBJECT(dialog)->data = id;
9141 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm_retry_abort_delete_cb);
9142 e_dialog_button_add(dialog, _("Retry"), NULL, _e_fm_retry_abort_retry_cb, NULL);
9143 e_dialog_button_add(dialog, _("Abort"), NULL, _e_fm_retry_abort_abort_cb, NULL);
9145 e_dialog_button_focus_num(dialog, 0);
9146 e_dialog_title_set(dialog, _("Error"));
9147 e_dialog_icon_set(dialog, "dialog-error", 64);
9148 snprintf(text, sizeof(text),
9152 e_dialog_text_set(dialog, text);
9153 e_win_centered_set(dialog->win, 1);
9154 e_dialog_show(dialog);
9159 _e_fm_retry_abort_delete_cb(void *obj)
9161 int *id = E_OBJECT(obj)->data;
9166 _e_fm_retry_abort_retry_cb(void *data __UNUSED__, E_Dialog *dialog)
9168 int *id = E_OBJECT(dialog)->data;
9169 _e_fm2_op_registry_go_on(*id);
9170 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_RETRY, *id, NULL, 0);
9171 e_object_del(E_OBJECT(dialog));
9175 _e_fm_retry_abort_abort_cb(void *data __UNUSED__, E_Dialog *dialog)
9177 int *id = E_OBJECT(dialog)->data;
9178 _e_fm2_op_registry_aborted(*id);
9179 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_ABORT, *id, NULL, 0);
9180 e_object_del(E_OBJECT(dialog));
9184 _e_fm_overwrite_dialog(int pid, const char *str)
9190 char text[4096 + PATH_MAX];
9192 man = e_manager_current_get();
9193 if (!man) return NULL;
9194 con = e_container_current_get(man);
9195 if (!con) return NULL;
9197 id = malloc(sizeof(int));
9200 dialog = e_dialog_new(con, "E", "_fm_overwrite_dialog");
9201 E_OBJECT(dialog)->data = id;
9202 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm_overwrite_delete_cb);
9203 e_dialog_button_add(dialog, _("No"), NULL, _e_fm_overwrite_no_cb, NULL);
9204 e_dialog_button_add(dialog, _("No to all"), NULL, _e_fm_overwrite_no_all_cb, NULL);
9205 e_dialog_button_add(dialog, _("Yes"), NULL, _e_fm_overwrite_yes_cb, NULL);
9206 e_dialog_button_add(dialog, _("Yes to all"), NULL, _e_fm_overwrite_yes_all_cb, NULL);
9208 e_dialog_button_focus_num(dialog, 0);
9209 e_dialog_title_set(dialog, _("Warning"));
9210 e_dialog_icon_set(dialog, "dialog-warning", 64);
9211 snprintf(text, sizeof(text),
9212 _("File already exists, overwrite?<br><hilight>%s</hilight>"), str);
9214 e_dialog_text_set(dialog, text);
9215 e_win_centered_set(dialog->win, 1);
9216 e_dialog_show(dialog);
9221 _e_fm_overwrite_delete_cb(void *obj)
9223 int *id = E_OBJECT(obj)->data;
9228 _e_fm_overwrite_no_cb(void *data __UNUSED__, E_Dialog *dialog)
9230 int *id = E_OBJECT(dialog)->data;
9231 _e_fm2_op_registry_go_on(*id);
9232 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_NO, *id, NULL, 0);
9233 e_object_del(E_OBJECT(dialog));
9237 _e_fm_overwrite_no_all_cb(void *data __UNUSED__, E_Dialog *dialog)
9239 int *id = E_OBJECT(dialog)->data;
9240 _e_fm2_op_registry_go_on(*id);
9241 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_NO_ALL, *id, NULL, 0);
9242 e_object_del(E_OBJECT(dialog));
9246 _e_fm_overwrite_yes_cb(void *data __UNUSED__, E_Dialog *dialog)
9248 int *id = E_OBJECT(dialog)->data;
9249 _e_fm2_op_registry_go_on(*id);
9250 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_YES, *id, NULL, 0);
9251 e_object_del(E_OBJECT(dialog));
9255 _e_fm_overwrite_yes_all_cb(void *data __UNUSED__, E_Dialog *dialog)
9257 int *id = E_OBJECT(dialog)->data;
9258 _e_fm2_op_registry_go_on(*id);
9259 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_YES_ALL, *id, NULL, 0);
9260 e_object_del(E_OBJECT(dialog));
9264 _e_fm_error_dialog(int pid, const char *str)
9270 char text[4096 + PATH_MAX];
9272 man = e_manager_current_get();
9273 if (!man) return NULL;
9274 con = e_container_current_get(man);
9275 if (!con) return NULL;
9277 id = malloc(sizeof(int));
9280 dialog = e_dialog_new(con, "E", "_fm_error_dialog");
9281 E_OBJECT(dialog)->data = id;
9282 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm_error_delete_cb);
9283 e_dialog_button_add(dialog, _("Retry"), NULL, _e_fm_error_retry_cb, NULL);
9284 e_dialog_button_add(dialog, _("Abort"), NULL, _e_fm_error_abort_cb, NULL);
9285 e_dialog_button_add(dialog, _("Ignore this"), NULL, _e_fm_error_ignore_this_cb, NULL);
9286 e_dialog_button_add(dialog, _("Ignore all"), NULL, _e_fm_error_ignore_all_cb, NULL);
9288 e_dialog_button_focus_num(dialog, 0);
9289 e_dialog_title_set(dialog, _("Error"));
9290 snprintf(text, sizeof(text),
9291 _("An error occurred while performing an operation.<br>"
9295 e_dialog_text_set(dialog, text);
9296 e_win_centered_set(dialog->win, 1);
9297 e_dialog_show(dialog);
9302 _e_fm_error_delete_cb(void *obj)
9304 int *id = E_OBJECT(obj)->data;
9309 _e_fm_error_retry_cb(void *data __UNUSED__, E_Dialog *dialog)
9311 int *id = E_OBJECT(dialog)->data;
9312 _e_fm2_op_registry_go_on(*id);
9313 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_RETRY, *id, NULL, 0);
9314 e_object_del(E_OBJECT(dialog));
9318 _e_fm_error_abort_cb(void *data __UNUSED__, E_Dialog *dialog)
9320 int *id = E_OBJECT(dialog)->data;
9321 _e_fm2_op_registry_aborted(*id);
9322 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_ABORT, *id, NULL, 0);
9323 e_object_del(E_OBJECT(dialog));
9327 _e_fm_error_ignore_this_cb(void *data __UNUSED__, E_Dialog *dialog)
9329 int *id = E_OBJECT(dialog)->data;
9330 _e_fm2_op_registry_go_on(*id);
9331 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_IGNORE_THIS, *id, NULL, 0);
9332 e_object_del(E_OBJECT(dialog));
9336 _e_fm_error_ignore_all_cb(void *data __UNUSED__, E_Dialog *dialog)
9338 int *id = E_OBJECT(dialog)->data;
9339 _e_fm2_op_registry_go_on(*id);
9340 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_IGNORE_ALL, *id, NULL, 0);
9341 e_object_del(E_OBJECT(dialog));
9345 _e_fm_device_error_dialog(const char *title, const char *msg, const char *pstr)
9350 char text[PATH_MAX];
9351 const char *u, *d, *n, *m;
9353 man = e_manager_current_get();
9355 con = e_container_current_get(man);
9358 dialog = e_dialog_new(con, "E", "_fm_device_error_dialog");
9359 e_dialog_title_set(dialog, title);
9360 e_dialog_icon_set(dialog, "drive-harddisk", 64);
9361 e_dialog_button_add(dialog, _("OK"), NULL, NULL, NULL);
9364 pstr += strlen(pstr) + 1;
9366 pstr += strlen(pstr) + 1;
9368 pstr += strlen(pstr) + 1;
9370 snprintf(text, sizeof(text), "%s<br>%s<br>%s<br>%s<br>%s", msg, u, d, n, m);
9371 e_dialog_text_set(dialog, text);
9373 e_win_centered_set(dialog->win, 1);
9374 e_dialog_button_focus_num(dialog, 0);
9375 e_dialog_show(dialog);
9379 _e_fm2_file_application_properties(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9381 Efreet_Desktop *desktop;
9388 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
9390 desktop = efreet_desktop_get(buf);
9392 man = e_manager_current_get();
9394 con = e_container_current_get(man);
9397 e_desktop_edit(con, desktop);
9401 _e_fm2_file_properties(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9408 if ((ic->entry_dialog) || (ic->entry_widget)) return;
9410 man = e_manager_current_get();
9412 con = e_container_current_get(man);
9415 if (ic->prop_dialog) e_object_del(E_OBJECT(ic->prop_dialog));
9416 ic->prop_dialog = e_fm_prop_file(con, ic);
9417 E_OBJECT(ic->prop_dialog)->data = ic;
9418 e_object_del_attach_func_set(E_OBJECT(ic->prop_dialog), _e_fm2_file_properties_delete_cb);
9422 _e_fm2_file_properties_delete_cb(void *obj)
9426 ic = E_OBJECT(obj)->data;
9427 ic->prop_dialog = NULL;
9431 _e_fm2_file_delete_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9433 E_Fm2_Icon *ic = data;
9434 if ((!ic) || (!ic->sd)) return;
9435 _e_fm2_file_delete(ic->sd->obj);
9439 _e_fm2_file_delete(Evas_Object *obj)
9445 char text[4096 + 256];
9448 man = e_manager_current_get();
9450 con = e_container_current_get(man);
9452 ic = _e_fm2_icon_first_selected_find(obj);
9454 if (ic->dialog) return;
9455 dialog = e_dialog_new(con, "E", "_fm_file_delete_dialog");
9456 ic->dialog = dialog;
9457 E_OBJECT(dialog)->data = ic;
9458 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm2_file_delete_delete_cb);
9459 e_dialog_button_add(dialog, _("Yes"), NULL, _e_fm2_file_delete_yes_cb, ic);
9460 e_dialog_button_add(dialog, _("No"), NULL, _e_fm2_file_delete_no_cb, ic);
9461 e_dialog_button_focus_num(dialog, 1);
9462 e_dialog_title_set(dialog, _("Confirm Delete"));
9463 e_dialog_icon_set(dialog, "dialog-warning", 64);
9464 sel = e_fm2_selected_list_get(obj);
9465 if ((!sel) || (eina_list_count(sel) == 1))
9466 snprintf(text, sizeof(text),
9467 _("Are you sure you want to delete<br>"
9468 "<hilight>%s</hilight> ?"),
9472 snprintf(text, sizeof(text),
9473 _("Are you sure you want to delete<br>"
9474 "the %d selected files in:<br>"
9475 "<hilight>%s</hilight> ?"),
9476 eina_list_count(sel),
9479 if (sel) eina_list_free(sel);
9480 e_dialog_text_set(dialog, text);
9481 e_win_centered_set(dialog->win, 1);
9482 e_dialog_show(dialog);
9486 _e_fm2_file_delete_delete_cb(void *obj)
9490 ic = E_OBJECT(obj)->data;
9495 _e_fm_string_append_char(char *str, size_t *size, size_t *len, char c)
9505 if (*len >= *size - 1)
9508 str = realloc(str, *size);
9518 _e_fm_string_append_quoted(char *str, size_t *size, size_t *len, const char *src)
9520 str = _e_fm_string_append_char(str, size, len, '\'');
9526 str = _e_fm_string_append_char(str, size, len, '\'');
9527 str = _e_fm_string_append_char(str, size, len, '\\');
9528 str = _e_fm_string_append_char(str, size, len, '\'');
9529 str = _e_fm_string_append_char(str, size, len, '\'');
9532 str = _e_fm_string_append_char(str, size, len, *src);
9537 str = _e_fm_string_append_char(str, size, len, '\'');
9543 _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog)
9545 E_Fm2_Icon *ic, *ic_next;
9551 E_Fm2_Icon_Info *ici;
9556 e_object_del(E_OBJECT(dialog));
9557 ic_next = _e_fm2_icon_next_find(ic->sd->obj, 1, NULL, NULL);
9558 sel = e_fm2_selected_list_get(ic->sd->obj);
9559 if (sel && (eina_list_count(sel) != 1))
9561 EINA_LIST_FOREACH(sel, l, ici)
9563 if (ic_next && (&(ic_next->info) == ici))
9566 snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ici->file);
9567 if (e_filereg_file_protected(buf)) continue;
9569 files = _e_fm_string_append_quoted(files, &size, &len, buf);
9570 if (eina_list_next(l))
9571 files = _e_fm_string_append_char(files, &size, &len, ' ');
9574 eina_list_free(sel);
9578 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
9579 if (e_filereg_file_protected(buf)) return;
9580 files = _e_fm_string_append_quoted(files, &size, &len, buf);
9583 _e_fm_client_file_del(files, ic->sd->obj);
9589 _e_fm2_icon_select(ic_next);
9590 evas_object_smart_callback_call(ic_next->sd->obj, "selection_change", NULL);
9591 _e_fm2_icon_make_visible(ic_next);
9594 evas_object_smart_callback_call(ic->sd->obj, "files_deleted", NULL);
9598 _e_fm2_file_delete_no_cb(void *data, E_Dialog *dialog)
9604 e_object_del(E_OBJECT(dialog));
9608 _e_fm2_refresh_job_cb(void *data)
9610 E_Fm2_Smart_Data *sd;
9612 sd = evas_object_smart_data_get(data);
9614 e_fm2_refresh(data);
9615 sd->refresh_job = NULL;
9619 _e_fm2_live_file_add(Evas_Object *obj, const char *file, const char *file_rel, int after, E_Fm2_Finfo *finf)
9621 E_Fm2_Smart_Data *sd;
9624 sd = evas_object_smart_data_get(obj);
9626 a = E_NEW(E_Fm2_Action, 1);
9628 sd->live.actions = eina_list_append(sd->live.actions, a);
9630 a->file = eina_stringshare_add(file);
9631 a->file2 = eina_stringshare_add(file_rel);
9633 if (finf) memcpy(&(a->finf), finf, sizeof(E_Fm2_Finfo));
9634 a->finf.lnk = eina_stringshare_add(a->finf.lnk);
9635 a->finf.rlnk = eina_stringshare_add(a->finf.rlnk);
9636 _e_fm2_live_process_begin(obj);
9640 _e_fm2_live_file_del(Evas_Object *obj, const char *file)
9642 E_Fm2_Smart_Data *sd;
9645 sd = evas_object_smart_data_get(obj);
9647 a = E_NEW(E_Fm2_Action, 1);
9649 sd->live.actions = eina_list_append(sd->live.actions, a);
9651 a->file = eina_stringshare_add(file);
9652 _e_fm2_live_process_begin(obj);
9656 _e_fm2_live_file_changed(Evas_Object *obj, const char *file, E_Fm2_Finfo *finf)
9658 E_Fm2_Smart_Data *sd;
9661 sd = evas_object_smart_data_get(obj);
9663 a = E_NEW(E_Fm2_Action, 1);
9665 sd->live.actions = eina_list_append(sd->live.actions, a);
9666 a->type = FILE_CHANGE;
9667 a->file = eina_stringshare_add(file);
9668 if (finf) memcpy(&(a->finf), finf, sizeof(E_Fm2_Finfo));
9669 a->finf.lnk = eina_stringshare_add(a->finf.lnk);
9670 a->finf.rlnk = eina_stringshare_add(a->finf.rlnk);
9671 _e_fm2_live_process_begin(obj);
9675 _e_fm2_live_process_begin(Evas_Object *obj)
9677 E_Fm2_Smart_Data *sd;
9679 sd = evas_object_smart_data_get(obj);
9680 if (!sd->live.actions) return;
9681 if ((sd->live.idler) || (sd->live.timer) ||
9682 (sd->listing) || (sd->scan_timer)) return;
9683 sd->live.idler = ecore_idler_add(_e_fm2_cb_live_idler, obj);
9684 sd->live.timer = ecore_timer_add(0.2, _e_fm2_cb_live_timer, obj);
9685 sd->tmp.last_insert = NULL;
9689 _e_fm2_live_process_end(Evas_Object *obj)
9691 E_Fm2_Smart_Data *sd;
9694 sd = evas_object_smart_data_get(obj);
9695 EINA_LIST_FREE(sd->live.actions, a)
9697 eina_stringshare_del(a->file);
9698 eina_stringshare_del(a->file2);
9699 eina_stringshare_del(a->finf.lnk);
9700 eina_stringshare_del(a->finf.rlnk);
9705 ecore_idler_del(sd->live.idler);
9706 sd->live.idler = NULL;
9710 ecore_timer_del(sd->live.timer);
9711 sd->live.timer = NULL;
9713 sd->tmp.last_insert = NULL;
9717 _e_fm2_live_process(Evas_Object *obj)
9719 E_Fm2_Smart_Data *sd;
9724 sd = evas_object_smart_data_get(obj);
9725 if (!sd->live.actions) return;
9726 a = eina_list_data_get(sd->live.actions);
9727 sd->live.actions = eina_list_remove_list(sd->live.actions, sd->live.actions);
9731 /* new file to sort in place */
9732 if (!strcmp(a->file, ".order"))
9734 sd->order_file = EINA_TRUE;
9735 /* FIXME: reload fm view */
9739 if (!((a->file[0] == '.') && (!sd->show_hidden_files)))
9740 _e_fm2_file_add(obj, a->file, 1, a->file2, a->flags, &(a->finf));
9745 if (!strcmp(a->file, ".order"))
9747 sd->order_file = EINA_FALSE;
9748 /* FIXME: reload fm view */
9752 if (!((a->file[0] == '.') && (!sd->show_hidden_files)))
9753 _e_fm2_file_del(obj, a->file);
9754 sd->live.deletions = EINA_TRUE;
9759 if (!strcmp(a->file, ".order"))
9761 /* FIXME: reload fm view - ignore for now */
9765 if (!((a->file[0] == '.') && (!sd->show_hidden_files)))
9767 EINA_LIST_FOREACH(sd->icons, l, ic)
9769 if (!strcmp(ic->info.file, a->file))
9771 if (ic->removable_state_change)
9773 _e_fm2_icon_unfill(ic);
9774 _e_fm2_icon_fill(ic, &(a->finf));
9775 ic->removable_state_change = EINA_FALSE;
9776 if ((ic->realized) && (ic->obj_icon))
9778 _e_fm2_icon_removable_update(ic);
9779 _e_fm2_icon_label_set(ic, ic->obj);
9786 realized = ic->realized;
9787 if (realized) _e_fm2_icon_unrealize(ic);
9788 _e_fm2_icon_unfill(ic);
9789 _e_fm2_icon_fill(ic, &(a->finf));
9790 if (realized) _e_fm2_icon_realize(ic);
9802 eina_stringshare_del(a->file);
9803 eina_stringshare_del(a->file2);
9804 eina_stringshare_del(a->finf.lnk);
9805 eina_stringshare_del(a->finf.rlnk);
9810 _e_fm2_cb_live_idler(void *data)
9812 E_Fm2_Smart_Data *sd;
9815 sd = evas_object_smart_data_get(data);
9816 if (!sd) return ECORE_CALLBACK_CANCEL;
9817 t = ecore_time_get();
9820 if (!sd->live.actions) break;
9821 _e_fm2_live_process(data);
9823 while ((ecore_time_get() - t) > 0.02);
9824 if (sd->live.actions) return ECORE_CALLBACK_RENEW;
9825 _e_fm2_live_process_end(data);
9826 _e_fm2_cb_live_timer(data);
9827 if ((sd->order_file) || (sd->config->view.always_order))
9829 e_fm2_refresh(data);
9831 sd->live.idler = NULL;
9832 return ECORE_CALLBACK_CANCEL;
9836 _e_fm2_cb_live_timer(void *data)
9838 E_Fm2_Smart_Data *sd;
9840 sd = evas_object_smart_data_get(data);
9841 if (!sd) return ECORE_CALLBACK_CANCEL;
9842 if (sd->queue) _e_fm2_queue_process(data);
9843 else if (sd->iconlist_changed)
9845 if (sd->resize_job) ecore_job_del(sd->resize_job);
9846 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, sd->obj);
9850 if (sd->live.deletions)
9852 sd->iconlist_changed = EINA_TRUE;
9853 if (sd->resize_job) ecore_job_del(sd->resize_job);
9854 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, sd->obj);
9857 sd->live.deletions = EINA_FALSE;
9858 sd->live.timer = NULL;
9859 if ((!sd->queue) && (!sd->live.idler)) return ECORE_CALLBACK_CANCEL;
9860 sd->live.timer = ecore_timer_add(0.2, _e_fm2_cb_live_timer, data);
9861 return ECORE_CALLBACK_CANCEL;
9865 _e_fm2_theme_edje_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group)
9870 if (sd->custom_theme_content)
9871 snprintf(buf, sizeof(buf), "e/fileman/%s/%s", sd->custom_theme_content, group);
9873 snprintf(buf, sizeof(buf), "e/fileman/default/%s", group);
9875 if (sd->custom_theme)
9877 if (edje_object_file_set(o, sd->custom_theme, buf)) return 1;
9879 if (sd->custom_theme)
9881 if (!ecore_file_exists(sd->custom_theme))
9883 eina_stringshare_del(sd->custom_theme);
9884 sd->custom_theme = NULL;
9887 ret = e_theme_edje_object_set(o, category, buf);
9892 _e_fm2_theme_edje_icon_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group)
9897 // if (sd->custom_theme_content)
9898 // snprintf(buf, sizeof(buf), "e/icons/fileman/%s/%s", sd->custom_theme_content, group);
9900 snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", group);
9902 if (sd->custom_theme)
9904 if (edje_object_file_set(o, sd->custom_theme, buf)) return 1;
9906 if (sd->custom_theme)
9908 if (!ecore_file_exists(sd->custom_theme))
9910 eina_stringshare_del(sd->custom_theme);
9911 sd->custom_theme = NULL;
9914 ret = e_theme_edje_object_set(o, category, buf);
9919 _e_fm2_volume_mount(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9927 mp = e_fm2_device_volume_mountpoint_get(v);
9928 _e_fm2_client_mount(v->udi, mp);
9929 eina_stringshare_del(mp);
9933 _e_fm2_volume_unmount(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9940 v->auto_unmount = EINA_FALSE;
9941 _e_fm2_client_unmount(v->udi);
9945 _e_fm2_volume_eject(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9952 v->auto_unmount = EINA_FALSE;
9953 _e_fm2_client_eject(v->udi);
9957 _update_volume_icon(E_Volume *v, E_Fm2_Icon *ic)
9959 if (ic->info.removable_full)
9960 edje_object_signal_emit(ic->obj_icon, "e,state,removable,full", "e");
9962 edje_object_signal_emit(ic->obj_icon, "e,state,removable,empty", "e");
9967 edje_object_signal_emit(ic->obj, "e,state,volume,mounted", "e");
9969 edje_object_signal_emit(ic->obj, "e,state,volume,unmounted", "e");
9972 edje_object_signal_emit(ic->obj, "e,state,volume,off", "e");
9976 _e_fm2_volume_icon_update(E_Volume *v)
9979 char file[PATH_MAX], fav[PATH_MAX], desk[PATH_MAX];
9983 if (!v || !v->storage) return;
9985 e_user_dir_snprintf(fav, sizeof(fav), "fileman/favorites");
9986 e_user_homedir_concat(desk, sizeof(desk), _("Desktop"));
9987 snprintf(file, sizeof(file), "|%s_%d.desktop",
9988 ecore_file_file_get(v->storage->udi), v->partition_number);
9990 EINA_LIST_FOREACH(_e_fm2_list, l, o)
9994 if ((_e_fm2_list_walking > 0) &&
9995 (eina_list_data_find(_e_fm2_list_remove, o))) continue;
9997 rp = e_fm2_real_path_get(o);
9998 if ((rp) && (strcmp(rp, fav)) && (strcmp(rp, desk))) continue;
10000 ic = _e_fm2_icon_find(o, file);
10002 _update_volume_icon(v, ic);
10007 _e_fm2_icon_removable_update(E_Fm2_Icon *ic)
10012 v = e_fm2_device_volume_find(ic->info.link);
10013 _update_volume_icon(v, ic);
10017 _e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere)
10019 ere->status = E_FM2_OP_STATUS_ABORTED;
10021 ere->needs_attention = 0;
10022 ere->dialog = NULL;
10023 e_fm2_op_registry_entry_changed(ere);
10024 _e_fm_client_send(E_FM_OP_ABORT, ere->id, NULL, 0);
10028 e_fm2_operation_abort(int id)
10030 E_Fm2_Op_Registry_Entry *ere;
10032 ere = e_fm2_op_registry_entry_get(id);
10035 e_fm2_op_registry_entry_ref(ere);
10036 e_fm2_op_registry_entry_abort(ere);
10037 e_fm2_op_registry_entry_unref(ere);