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;
195 E_Fm2_Action_Type type;
204 Ecore_Ipc_Client *cl;
210 const char *hostname;
214 struct _E_Fm2_Context_Menu_Data
217 E_Fm2_Mime_Handler *handler;
220 static const char *_e_fm2_dev_path_map(const char *dev, const char *path);
221 static void _e_fm2_file_add(Evas_Object *obj, const char *file, int unique, const char *file_rel, int after, E_Fm2_Finfo *finf);
222 static void _e_fm2_file_del(Evas_Object *obj, const char *file);
223 static void _e_fm2_queue_process(Evas_Object *obj);
224 static void _e_fm2_queue_free(Evas_Object *obj);
225 static void _e_fm2_regions_free(Evas_Object *obj);
226 static void _e_fm2_regions_populate(Evas_Object *obj);
227 static void _e_fm2_icons_place(Evas_Object *obj);
228 static void _e_fm2_icons_free(Evas_Object *obj);
229 static void _e_fm2_regions_eval(Evas_Object *obj);
230 static void _e_fm2_config_free(E_Fm2_Config *cfg);
232 static void _e_fm2_dir_load_props(E_Fm2_Smart_Data *sd);
233 static void _e_fm2_dir_save_props(E_Fm2_Smart_Data *sd);
235 static Evas_Object *_e_fm2_file_fm2_find(const char *file);
236 static E_Fm2_Icon *_e_fm2_icon_find(Evas_Object *obj, const char *file);
237 static const char *_e_fm2_uri_escape(const char *path);
238 static Eina_List *_e_fm2_uri_path_list_get(Eina_List *uri_list);
239 static Eina_List *_e_fm2_uri_icon_list_get(Eina_List *uri);
241 static E_Fm2_Icon *_e_fm2_icon_new(E_Fm2_Smart_Data *sd, const char *file, E_Fm2_Finfo *finf);
242 static void _e_fm2_icon_unfill(E_Fm2_Icon *ic);
243 static int _e_fm2_icon_fill(E_Fm2_Icon *ic, E_Fm2_Finfo *finf);
244 static void _e_fm2_icon_free(E_Fm2_Icon *ic);
245 static void _e_fm2_icon_realize(E_Fm2_Icon *ic);
246 static void _e_fm2_icon_unrealize(E_Fm2_Icon *ic);
247 static Eina_Bool _e_fm2_icon_visible(const E_Fm2_Icon *ic);
248 static void _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj);
249 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);
250 static void _e_fm2_icon_icon_set(E_Fm2_Icon *ic);
251 static void _e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force);
252 static void _e_fm2_icon_select(E_Fm2_Icon *ic);
253 static void _e_fm2_icon_deselect(E_Fm2_Icon *ic);
254 static int _e_fm2_icon_desktop_load(E_Fm2_Icon *ic);
256 static E_Fm2_Region *_e_fm2_region_new(E_Fm2_Smart_Data *sd);
257 static void _e_fm2_region_free(E_Fm2_Region *rg);
258 static void _e_fm2_region_realize(E_Fm2_Region *rg);
259 static void _e_fm2_region_unrealize(E_Fm2_Region *rg);
260 static int _e_fm2_region_visible(E_Fm2_Region *rg);
262 static void _e_fm2_icon_make_visible(E_Fm2_Icon *ic);
263 static void _e_fm2_icon_desel_any(Evas_Object *obj);
264 static E_Fm2_Icon *_e_fm2_icon_first_selected_find(Evas_Object *obj);
265 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);
267 static void _e_fm2_icon_sel_first(Evas_Object *obj);
268 static void _e_fm2_icon_sel_last(Evas_Object *obj);
269 static void _e_fm2_icon_sel_any(Evas_Object *obj);
270 static void _e_fm2_icon_sel_prev(Evas_Object *obj);
271 static void _e_fm2_icon_sel_next(Evas_Object *obj);
272 static void _e_fm2_icon_sel_down(Evas_Object *obj);
273 static void _e_fm2_icon_sel_up(Evas_Object *obj);
275 static void _e_fm2_typebuf_show(Evas_Object *obj);
276 static void _e_fm2_typebuf_hide(Evas_Object *obj);
277 //static void _e_fm2_typebuf_history_prev(Evas_Object *obj);
278 //static void _e_fm2_typebuf_history_next(Evas_Object *obj);
279 static void _e_fm2_typebuf_run(Evas_Object *obj);
280 static void _e_fm2_typebuf_match(Evas_Object *obj, int next);
281 static void _e_fm2_typebuf_complete(Evas_Object *obj);
282 static void _e_fm2_typebuf_char_append(Evas_Object *obj, const char *ch);
283 static void _e_fm2_typebuf_char_backspace(Evas_Object *obj);
285 static void _e_fm2_cb_dnd_enter(void *data, const char *type, void *event);
286 static void _e_fm2_cb_dnd_move(void *data, const char *type, void *event);
287 static void _e_fm2_cb_dnd_leave(void *data, const char *type, void *event);
288 static void _e_fm2_cb_dnd_drop(void *data, const char *type, void *event);
289 static void _e_fm2_cb_icon_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
290 static void _e_fm2_cb_icon_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
291 static void _e_fm2_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
292 static void _e_fm2_cb_icon_thumb_dnd_gen(void *data, Evas_Object *obj, void *event_info);
293 static void _e_fm2_cb_icon_thumb_gen(void *data, Evas_Object *obj, void *event_info);
294 static void _e_fm2_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
295 static void _e_fm2_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
296 static void _e_fm2_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
297 static void _e_fm2_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
298 static void _e_fm2_cb_scroll_job(void *data);
299 static void _e_fm2_cb_resize_job(void *data);
300 static int _e_fm2_cb_icon_sort(const void *data1, const void *data2);
301 static Eina_Bool _e_fm2_cb_scan_timer(void *data);
302 static Eina_Bool _e_fm2_cb_sort_idler(void *data);
303 static Eina_Bool _e_fm2_cb_theme(void *data, int type __UNUSED__, void *event __UNUSED__);
305 static void _e_fm2_obj_icons_place(E_Fm2_Smart_Data *sd);
307 static void _e_fm2_smart_add(Evas_Object *object);
308 static void _e_fm2_smart_del(Evas_Object *object);
309 static void _e_fm2_smart_move(Evas_Object *object, Evas_Coord x, Evas_Coord y);
310 static void _e_fm2_smart_resize(Evas_Object *object, Evas_Coord w, Evas_Coord h);
311 static void _e_fm2_smart_show(Evas_Object *object);
312 static void _e_fm2_smart_hide(Evas_Object *object);
313 static void _e_fm2_smart_color_set(Evas_Object *obj, int r, int g, int b, int a);
314 static void _e_fm2_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
315 static void _e_fm2_smart_clip_unset(Evas_Object *obj);
317 static void _e_fm2_menu(Evas_Object *obj, unsigned int timestamp);
318 static void _e_fm2_menu_post_cb(void *data, E_Menu *m);
319 static void _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp);
320 static void _e_fm2_icon_menu_post_cb(void *data, E_Menu *m);
321 static void _e_fm2_icon_menu_item_cb(void *data, E_Menu *m, E_Menu_Item *mi);
322 static void _e_fm2_icon_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi);
323 static void _e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m, E_Menu_Item *mi);
324 static void _e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi);
325 static void _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi);
326 static void _e_fm2_view_menu_custom_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi);
327 static void _e_fm2_view_menu_list_cb(void *data, E_Menu *m, E_Menu_Item *mi);
328 static void _e_fm2_view_menu_use_default_cb(void *data, E_Menu *m, E_Menu_Item *mi);
329 static void _e_fm2_view_menu_set_background_cb(void *data, E_Menu *m, E_Menu_Item *mi);
330 static void _e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m, E_Menu_Item *mi);
331 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));
332 static void _e_fm2_view_image_sel_close(void *data, E_Dialog *dia);
333 static void _e_fm2_refresh(void *data, E_Menu *m, E_Menu_Item *mi);
334 static void _e_fm2_toggle_hidden_files(void *data, E_Menu *m, E_Menu_Item *mi);
335 static void _e_fm2_toggle_ordering(void *data, E_Menu *m, E_Menu_Item *mi);
336 static void _e_fm2_sort(void *data, E_Menu *m, E_Menu_Item *mi);
337 static void _e_fm2_new_directory(void *data, E_Menu *m, E_Menu_Item *mi);
338 static void _e_fm2_new_directory_delete_cb(void *obj);
339 static void _e_fm2_new_directory_yes_cb(char *text, void *data);
340 static void _e_fm2_new_directory_no_cb(void *data);
341 static void _e_fm2_file_rename(void *data, E_Menu *m, E_Menu_Item *mi);
342 static void _e_fm2_file_rename_delete_cb(void *obj);
343 static void _e_fm2_file_rename_yes_cb(char *text, void *data);
344 static void _e_fm2_file_rename_no_cb(void *data);
345 static void _e_fm2_file_application_properties(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__);
346 static void _e_fm2_file_properties(void *data, E_Menu *m, E_Menu_Item *mi);
347 static void _e_fm2_file_properties_delete_cb(void *obj);
348 static void _e_fm2_file_do_rename(const char *text, E_Fm2_Icon *ic);
350 static Evas_Object *_e_fm2_icon_entry_widget_add(E_Fm2_Icon *ic);
351 static void _e_fm2_icon_entry_widget_del(E_Fm2_Icon *ic);
352 static void _e_fm2_icon_entry_widget_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
353 static void _e_fm2_icon_entry_widget_accept(E_Fm2_Icon *ic);
355 static E_Dialog *_e_fm_retry_abort_dialog(int pid, const char *str);
356 static void _e_fm_retry_abort_delete_cb(void *obj);
357 static void _e_fm_retry_abort_retry_cb(void *data, E_Dialog *dialog);
358 static void _e_fm_retry_abort_abort_cb(void *data, E_Dialog *dialog);
360 static E_Dialog *_e_fm_overwrite_dialog(int pid, const char *str);
361 static void _e_fm_overwrite_delete_cb(void *obj);
362 static void _e_fm_overwrite_no_cb(void *data, E_Dialog *dialog);
363 static void _e_fm_overwrite_no_all_cb(void *data, E_Dialog *dialog);
364 static void _e_fm_overwrite_yes_cb(void *data, E_Dialog *dialog);
365 static void _e_fm_overwrite_yes_all_cb(void *data, E_Dialog *dialog);
367 static E_Dialog *_e_fm_error_dialog(int pid, const char *str);
368 static void _e_fm_error_delete_cb(void *obj);
369 static void _e_fm_error_retry_cb(void *data, E_Dialog *dialog);
370 static void _e_fm_error_abort_cb(void *data, E_Dialog *dialog);
371 static void _e_fm_error_ignore_this_cb(void *data, E_Dialog *dialog);
372 static void _e_fm_error_ignore_all_cb(void *data, E_Dialog *dialog);
374 static void _e_fm_device_error_dialog(const char *title, const char *msg, const char *pstr);
376 static void _e_fm2_file_delete(Evas_Object *obj);
377 static void _e_fm2_file_delete_menu(void *data, E_Menu *m, E_Menu_Item *mi);
378 static void _e_fm2_file_delete_delete_cb(void *obj);
379 static void _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog);
380 static void _e_fm2_file_delete_no_cb(void *data, E_Dialog *dialog);
381 static void _e_fm2_refresh_job_cb(void *data);
382 static void _e_fm_file_buffer_clear(void);
383 static void _e_fm2_file_cut(Evas_Object *obj);
384 static void _e_fm2_file_copy(Evas_Object *obj);
385 static void _e_fm2_file_paste(Evas_Object *obj);
386 static void _e_fm2_file_symlink(Evas_Object *obj);
387 static void _e_fm2_file_cut_menu(void *data, E_Menu *m, E_Menu_Item *mi);
388 static void _e_fm2_file_copy_menu(void *data, E_Menu *m, E_Menu_Item *mi);
389 static void _e_fm2_file_paste_menu(void *data, E_Menu *m, E_Menu_Item *mi);
390 static void _e_fm2_file_symlink_menu(void *data, E_Menu *m, E_Menu_Item *mi);
392 static void _e_fm2_live_file_add(Evas_Object *obj, const char *file, const char *file_rel, int after, E_Fm2_Finfo *finf);
393 static void _e_fm2_live_file_del(Evas_Object *obj, const char *file);
394 static void _e_fm2_live_file_changed(Evas_Object *obj, const char *file, E_Fm2_Finfo *finf);
395 static void _e_fm2_live_process_begin(Evas_Object *obj);
396 static void _e_fm2_live_process_end(Evas_Object *obj);
397 static void _e_fm2_live_process(Evas_Object *obj);
398 static Eina_Bool _e_fm2_cb_live_idler(void *data);
399 static Eina_Bool _e_fm2_cb_live_timer(void *data);
401 static int _e_fm2_theme_edje_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group);
402 static int _e_fm2_theme_edje_icon_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group);
404 static void _e_fm2_mouse_1_handler(E_Fm2_Icon *ic, int up, void *evas_event);
406 static void _e_fm2_client_spawn(void);
407 static E_Fm2_Client *_e_fm2_client_get(void);
408 static int _e_fm2_client_monitor_add(const char *path);
409 static void _e_fm2_client_monitor_del(int id, const char *path);
410 static int _e_fm_client_file_del(const char *args, Evas_Object *e_fm);
411 //static int _e_fm2_client_file_trash(const char *path, Evas_Object *e_fm);
412 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);
413 static int _e_fm_client_file_move(const char *args, Evas_Object *e_fm);
414 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);
415 static int _e_fm_client_file_copy(const char *args, Evas_Object *e_fm);
416 static int _e_fm_client_file_symlink(const char *args, Evas_Object *e_fm);
418 static void _e_fm2_sel_rect_update(void *data);
419 static inline void _e_fm2_context_menu_append(Evas_Object *obj, const char *path, Eina_List *l, E_Menu *mn, E_Fm2_Icon *ic);
420 static int _e_fm2_context_list_sort(const void *data1, const void *data2);
422 static char *_e_fm_string_append_char(char *str, size_t *size, size_t *len, char c);
423 static char *_e_fm_string_append_quoted(char *str, size_t *size, size_t *len, const char *src);
425 void _e_fm2_path_parent_set(Evas_Object *obj, const char *path);
427 static void _e_fm2_volume_mount(void *data, E_Menu *m, E_Menu_Item *mi);
428 static void _e_fm2_volume_unmount(void *data, E_Menu *m, E_Menu_Item *mi);
429 static void _e_fm2_volume_eject(void *data, E_Menu *m, E_Menu_Item *mi);
431 static void _e_fm2_icon_removable_update(E_Fm2_Icon *ic);
432 static void _e_fm2_volume_icon_update(E_Volume *v);
434 static void _e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere);
436 static char *_e_fm2_meta_path = NULL;
437 static Evas_Smart *_e_fm2_smart = NULL;
438 static Eina_List *_e_fm2_list = NULL;
439 static Eina_List *_e_fm2_list_remove = NULL;
440 static int _e_fm2_list_walking = 0;
441 static Eina_List *_e_fm2_client_list = NULL;
442 static Eina_List *_e_fm2_menu_contexts = NULL;
443 static Eina_List *_e_fm_file_buffer = NULL; /* Files for copy&paste are saved here. */
444 static int _e_fm_file_buffer_cutting = 0;
445 static int _e_fm_file_buffer_copying = 0;
446 static const char *_e_fm2_icon_desktop_str = NULL;
447 static const char *_e_fm2_icon_thumb_str = NULL;
448 static const char *_e_fm2_mime_inode_directory = NULL;
449 static const char *_e_fm2_mime_app_desktop = NULL;
450 static const char *_e_fm2_mime_app_edje = NULL;
451 static const char *_e_fm2_mime_text_uri_list = NULL;
453 static Ecore_Timer *_e_fm2_mime_flush = NULL;
454 static Ecore_Timer *_e_fm2_mime_clear = NULL;
461 * _e_volume_edd_new()
462 * _e_storage_edd_new()
463 * _e_storage_volume_edd_init()
464 * _e_storage_volume_edd_shutdown()
467 #include "e_fm_shared_codec.h"
469 static inline Eina_Bool
470 _e_fm2_icon_realpath(const E_Fm2_Icon *ic, char *buf, int buflen)
472 int r = snprintf(buf, buflen, "%s/%s", ic->sd->realpath, ic->info.file);
476 static inline Eina_Bool
477 _e_fm2_icon_path(const E_Fm2_Icon *ic, char *buf, int buflen)
479 int r = snprintf(buf, buflen, "%s/%s", ic->sd->path, ic->info.file);
483 static inline Eina_Bool
484 _e_fm2_ext_is_edje(const char *ext)
486 #if E_FM2_SIMPLE_STRCASE_FILES
487 if ((ext[0] == 'e') && (ext[1] == 'd') && (ext[2] == 'j'))
489 else if ((ext[0] == 'E') && (ext[1] == 'D') && (ext[2] == 'J'))
494 return strcasecmp(ext, "edj") == 0;
498 static inline Eina_Bool
499 _e_fm2_ext_is_desktop(const char *ext)
501 #if E_FM2_SIMPLE_STRCASE_FILES
502 if ((ext[0] == 'd') &&
503 ((strcmp(ext + 1, "esktop") == 0) ||
504 (strcmp(ext + 1, "irectory") == 0)))
506 else if ((ext[0] == 'D') &&
507 ((strcmp(ext + 1, "ESKTOP") == 0) ||
508 (strcmp(ext + 1, "IRECTORY") == 0)))
513 if ((ext[0] != 'd') && (ext[0] != 'D'))
517 return (strcasecmp(ext, "esktop") == 0) ||
518 (strcasecmp(ext, "irectory") == 0);
522 static inline Eina_Bool
523 _e_fm2_ext_is_imc(const char *ext)
525 #if E_FM2_SIMPLE_STRCASE_FILES
526 if ((ext[0] == 'i') && (ext[1] == 'm') && (ext[2] == 'c'))
528 else if ((ext[0] == 'I') && (ext[1] == 'M') && (ext[2] == 'C'))
533 return strcasecmp(ext, "imc") == 0;
537 static inline Eina_Bool
538 _e_fm2_file_is_edje(const char *file)
540 const char *p = strrchr(file, '.');
541 return (p) && (_e_fm2_ext_is_edje(p + 1));
544 static inline Eina_Bool
545 _e_fm2_file_is_desktop(const char *file)
547 const char *p = strrchr(file, '.');
548 return (p) && (_e_fm2_ext_is_desktop(p + 1));
552 _e_fm2_view_mode_get(const E_Fm2_Smart_Data *sd)
554 if (sd->view_mode > -1)
555 return sd->view_mode;
556 return sd->config->view.mode;
559 static inline Evas_Coord
560 _e_fm2_icon_w_get(const E_Fm2_Smart_Data *sd)
562 if (sd->icon_size > -1)
563 return sd->icon_size * e_scale;
564 if (sd->config->icon.icon.w)
565 return sd->config->icon.icon.w;
566 return sd->config->icon.list.w;
569 static inline Evas_Coord
570 _e_fm2_icon_h_get(const E_Fm2_Smart_Data *sd)
572 if (sd->icon_size > -1)
573 return sd->icon_size * e_scale;
574 if (sd->config->icon.icon.h)
575 return sd->config->icon.icon.h;
576 return sd->config->icon.list.h;
580 _e_fm2_mime_flush_cb(void *data __UNUSED__)
582 efreet_mime_type_cache_flush();
583 return ECORE_CALLBACK_RENEW;
587 _e_fm2_mime_clear_cb(void *data __UNUSED__)
589 efreet_mime_type_cache_clear();
590 return ECORE_CALLBACK_RENEW;
594 _e_fm2_op_registry_go_on(int id)
596 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
598 ere->status = E_FM2_OP_STATUS_IN_PROGRESS;
599 ere->needs_attention = 0;
601 e_fm2_op_registry_entry_changed(ere);
605 _e_fm2_op_registry_aborted(int id)
607 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
609 ere->status = E_FM2_OP_STATUS_ABORTED;
610 ere->needs_attention = 0;
613 e_fm2_op_registry_entry_changed(ere);
614 // XXX e_fm2_op_registry_entry_del(id);
618 _e_fm2_op_registry_error(int id, E_Dialog *dlg)
620 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
622 ere->status = E_FM2_OP_STATUS_ERROR;
623 ere->needs_attention = 1;
625 e_fm2_op_registry_entry_changed(ere);
629 _e_fm2_op_registry_needs_attention(int id, E_Dialog *dlg)
631 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id);
633 ere->needs_attention = 1;
635 e_fm2_op_registry_entry_changed(ere);
640 _e_fm2_op_registry_entry_print(const E_Fm2_Op_Registry_Entry *ere)
642 const char *status_strings[] =
644 "UNKNOWN", "IN_PROGRESS", "SUCCESSFUL", "ABORTED", "ERROR"
648 if (ere->status <= E_FM2_OP_STATUS_ERROR)
649 status = status_strings[ere->status];
651 status = status_strings[0];
653 printf("id: %8d, op: %2d [%s] finished: %hhu, needs_attention: %hhu\n"
654 " %3d%% (%" PRIi64 "/%" PRIi64 "), start_time: %10.0f, eta: %5ds, xwin: %#x\n"
657 ere->id, ere->op, status, ere->finished, ere->needs_attention,
658 ere->percent, ere->done, ere->total, ere->start_time, ere->eta,
659 e_fm2_op_registry_entry_xwin_get(ere),
664 _e_fm2_op_registry_entry_add_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
666 const E_Fm2_Op_Registry_Entry *ere = event;
667 printf("E FM OPERATION STARTED: id=%d, op=%d\n", ere->id, ere->op);
668 return ECORE_CALLBACK_RENEW;
672 _e_fm2_op_registry_entry_del_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
674 const E_Fm2_Op_Registry_Entry *ere = event;
675 puts("E FM OPERATION FINISHED:");
676 _e_fm2_op_registry_entry_print(ere);
678 return ECORE_CALLBACK_RENEW;
682 _e_fm2_op_registry_entry_changed_cb(void *data __UNUSED__, int type __UNUSED__, void *event)
684 const E_Fm2_Op_Registry_Entry *ere = event;
685 puts("E FM OPERATION CHANGED:");
686 _e_fm2_op_registry_entry_print(ere);
688 return ECORE_CALLBACK_RENEW;
691 static Ecore_Event_Handler *_e_fm2_op_registry_entry_add_handler = NULL;
692 static Ecore_Event_Handler *_e_fm2_op_registry_entry_del_handler = NULL;
693 static Ecore_Event_Handler *_e_fm2_op_registry_entry_changed_handler = NULL;
705 _e_storage_volume_edd_init();
706 e_user_dir_concat_static(path, "fileman/metadata");
707 ecore_file_mkpath(path);
708 _e_fm2_meta_path = strdup(path);
711 static const Evas_Smart_Class sc =
714 EVAS_SMART_CLASS_VERSION,
715 _e_fm2_smart_add, /* add */
716 _e_fm2_smart_del, /* del */
717 _e_fm2_smart_move, /* move */
718 _e_fm2_smart_resize, /* resize */
719 _e_fm2_smart_show, /* show */
720 _e_fm2_smart_hide, /* hide */
721 _e_fm2_smart_color_set, /* color_set */
722 _e_fm2_smart_clip_set, /* clip_set */
723 _e_fm2_smart_clip_unset, /* clip_unset */
732 _e_fm2_smart = evas_smart_class_new(&sc);
734 // _e_fm2_client_spawn();
735 e_fm2_custom_file_init();
736 e_fm2_op_registry_init();
739 /* XXX: move this to a central/global place? */
740 _e_fm2_mime_flush = ecore_timer_add(60.0, _e_fm2_mime_flush_cb, NULL);
741 _e_fm2_mime_clear = ecore_timer_add(600.0, _e_fm2_mime_clear_cb, NULL);
743 _e_fm2_icon_desktop_str = eina_stringshare_add("DESKTOP");
744 _e_fm2_icon_thumb_str = eina_stringshare_add("THUMB");
745 _e_fm2_mime_inode_directory = eina_stringshare_add("inode/directory");
746 _e_fm2_mime_app_desktop = eina_stringshare_add("application/x-desktop");
747 _e_fm2_mime_app_edje = eina_stringshare_add("application/x-extension-edj");
748 _e_fm2_mime_text_uri_list = eina_stringshare_add("text/uri-list");
751 if (!_e_fm2_op_registry_entry_add_handler)
752 _e_fm2_op_registry_entry_add_handler =
753 ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_ADD,
754 _e_fm2_op_registry_entry_add_cb, NULL);
755 if (!_e_fm2_op_registry_entry_del_handler)
756 _e_fm2_op_registry_entry_del_handler =
757 ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_DEL,
758 _e_fm2_op_registry_entry_del_cb, NULL);
759 if (!_e_fm2_op_registry_entry_changed_handler)
760 _e_fm2_op_registry_entry_changed_handler =
761 ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_CHANGED,
762 _e_fm2_op_registry_entry_changed_cb, NULL);
771 eina_stringshare_replace(&_e_fm2_icon_desktop_str, NULL);
772 eina_stringshare_replace(&_e_fm2_icon_thumb_str, NULL);
773 eina_stringshare_replace(&_e_fm2_mime_inode_directory, NULL);
774 eina_stringshare_replace(&_e_fm2_mime_app_desktop, NULL);
775 eina_stringshare_replace(&_e_fm2_mime_app_edje, NULL);
776 eina_stringshare_replace(&_e_fm2_mime_text_uri_list, NULL);
779 if (_e_fm2_op_registry_entry_add_handler)
781 ecore_event_handler_del(_e_fm2_op_registry_entry_add_handler);
782 _e_fm2_op_registry_entry_add_handler = NULL;
784 if (_e_fm2_op_registry_entry_del_handler)
786 ecore_event_handler_del(_e_fm2_op_registry_entry_del_handler);
787 _e_fm2_op_registry_entry_del_handler = NULL;
789 if (_e_fm2_op_registry_entry_changed_handler)
791 ecore_event_handler_del(_e_fm2_op_registry_entry_changed_handler);
792 _e_fm2_op_registry_entry_changed_handler = NULL;
796 ecore_timer_del(_e_fm2_mime_flush);
797 _e_fm2_mime_flush = NULL;
798 ecore_timer_del(_e_fm2_mime_clear);
799 _e_fm2_mime_clear = NULL;
801 evas_smart_free(_e_fm2_smart);
803 E_FREE(_e_fm2_meta_path);
804 e_fm2_custom_file_shutdown();
805 _e_storage_volume_edd_shutdown();
806 e_fm2_op_registry_shutdown();
807 efreet_mime_shutdown();
814 e_fm2_add(Evas *evas)
816 return evas_object_smart_add(evas, _e_fm2_smart);
820 _e_fm2_cb_mount_ok(void *data)
822 E_Fm2_Smart_Data *sd;
824 sd = evas_object_smart_data_get(data);
825 if (!sd) return; // safety
827 if (sd->mount->volume->efm_mode != EFM_MODE_USING_HAL_MOUNT)
829 /* Clean up typebuf. */
830 _e_fm2_typebuf_hide(data);
831 /* we only just now have the mount point so we should do stuff we couldn't do before */
832 eina_stringshare_replace(&sd->realpath, sd->mount->volume->mount_point);
833 eina_stringshare_replace(&sd->mount->mount_point, sd->mount->volume->mount_point);
834 _e_fm2_dir_load_props(sd);
837 if ((sd->realpath) && (strcmp(sd->mount->mount_point, sd->realpath)))
839 e_fm2_path_set(sd->obj, "/", sd->mount->mount_point);
843 sd->id = _e_fm2_client_monitor_add(sd->mount->mount_point);
844 sd->listing = EINA_TRUE;
845 evas_object_smart_callback_call(data, "dir_changed", NULL);
846 sd->tmp.iter = EINA_FALSE;
851 _e_fm2_cb_mount_fail(void *data)
853 E_Fm2_Smart_Data *sd;
855 sd = evas_object_smart_data_get(data);
856 if (!sd) return; // safety
859 // At this moment E_Fm2_Mount object already deleted in e_fm_device.c
861 if (sd->config->view.open_dirs_in_place)
862 e_fm2_path_set(data, "favorites", "/");
864 evas_object_smart_callback_call(data, "dir_deleted", NULL);
869 _e_fm2_cb_unmount_ok(void *data)
871 E_Fm2_Smart_Data *sd;
873 sd = evas_object_smart_data_get(data);
878 if (sd->config->view.open_dirs_in_place)
879 _e_fm2_path_parent_set(data, sd->realpath);
881 evas_object_smart_callback_call(data, "dir_deleted", NULL);
886 _e_fm2_path_parent_set(Evas_Object *obj, const char *path)
888 char buf[PATH_MAX], *p;
891 p = strrchr(path, '/');
892 if (!p || (p == path))
893 e_fm2_path_set(obj, "/", "/");
899 strncpy(buf, path, idx);
901 e_fm2_path_set(obj, "/", buf);
904 e_fm2_path_set(obj, "/", "/");
909 e_fm2_path_set(Evas_Object *obj, const char *dev, const char *path)
911 E_Fm2_Smart_Data *sd;
912 const char *realpath;
914 sd = evas_object_smart_data_get(obj);
915 if (!sd || !path) return; // safety
916 if (!evas_object_type_get(obj)) return; // safety
917 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
919 /* internal config for now - don't see a pont making this configurable */
920 sd->regions.member_max = 64;
924 sd->config = E_NEW(E_Fm2_Config, 1);
925 if (!sd->config) return;
926 // sd->config->view.mode = E_FM2_VIEW_MODE_ICONS;
927 sd->config->view.mode = E_FM2_VIEW_MODE_LIST;
928 sd->config->view.open_dirs_in_place = EINA_TRUE;
929 sd->config->view.selector = EINA_TRUE;
930 sd->config->view.single_click = EINA_FALSE;
931 sd->config->view.single_click_delay = EINA_FALSE;
932 sd->config->view.no_subdir_jump = EINA_FALSE;
933 sd->config->icon.icon.w = 128;
934 sd->config->icon.icon.h = 128;
935 sd->config->icon.list.w = 24;
936 sd->config->icon.list.h = 24;
937 sd->config->icon.fixed.w = EINA_TRUE;
938 sd->config->icon.fixed.h = EINA_TRUE;
939 sd->config->icon.extension.show = EINA_FALSE;
940 sd->config->list.sort.no_case = EINA_TRUE;
941 sd->config->list.sort.dirs.first = EINA_TRUE;
942 sd->config->list.sort.dirs.last = EINA_FALSE;
943 sd->config->selection.single = EINA_FALSE;
944 sd->config->selection.windows_modifiers = EINA_FALSE;
945 sd->config->theme.background = NULL;
946 sd->config->theme.frame = NULL;
947 sd->config->theme.icons = NULL;
948 sd->config->theme.fixed = EINA_FALSE;
951 realpath = _e_fm2_dev_path_map(dev, path);
952 /* If the path doesn't exist, popup a dialog */
953 if (dev && strncmp(dev, "removable:", 10)
954 && !ecore_file_exists(realpath))
959 char text[4096 + 256];
961 man = e_manager_current_get();
963 con = e_container_current_get(man);
966 dialog = e_dialog_new(con, "E", "_fm_file_unexisting_path_dialog");
967 e_dialog_button_add(dialog, _("Close"), NULL, NULL, dialog);
968 e_dialog_button_focus_num(dialog, 0);
969 e_dialog_title_set(dialog, _("Nonexistent path"));
970 e_dialog_icon_set(dialog, "dialog-error", 64);
972 snprintf(text, sizeof(text), _("%s doesn't exist."), realpath);
974 e_dialog_text_set(dialog, text);
975 e_win_centered_set(dialog->win, 1);
976 e_dialog_show(dialog);
980 if (sd->realpath) _e_fm2_client_monitor_del(sd->id, sd->realpath);
981 sd->listing = EINA_FALSE;
983 eina_stringshare_replace(&sd->dev, dev);
984 eina_stringshare_replace(&sd->path, path);
985 eina_stringshare_del(sd->realpath);
986 sd->realpath = realpath;
987 _e_fm2_queue_free(obj);
988 _e_fm2_regions_free(obj);
989 _e_fm2_icons_free(obj);
990 edje_object_part_text_set(sd->overlay, "e.text.busy_label", "");
992 _e_fm2_dir_load_props(sd);
994 /* If the path change from a mountpoint to something else, we fake-unmount */
995 if (sd->mount && sd->mount->mount_point
996 && strncmp(sd->mount->mount_point, sd->realpath,
997 strlen(sd->mount->mount_point)))
999 e_fm2_device_unmount(sd->mount);
1003 /* If the path is of type removable: we add a new mountpoint */
1004 if (sd->dev && !sd->mount && !strncmp(sd->dev, "removable:", 10))
1008 v = e_fm2_device_volume_find(sd->dev + sizeof("removable:") - 1);
1011 sd->mount = e_fm2_device_mount(v,
1012 _e_fm2_cb_mount_ok, _e_fm2_cb_mount_fail,
1013 _e_fm2_cb_unmount_ok, NULL, obj);
1014 if (v->efm_mode != EFM_MODE_USING_HAL_MOUNT) return;
1017 else if (sd->config->view.open_dirs_in_place == 0)
1020 m = e_fm2_device_mount_find(sd->realpath);
1022 sd->mount = e_fm2_device_mount(m->volume,
1023 _e_fm2_cb_mount_ok, _e_fm2_cb_mount_fail,
1024 _e_fm2_cb_unmount_ok, NULL, obj);
1027 if (!sd->mount || sd->mount->mounted)
1029 sd->id = _e_fm2_client_monitor_add(sd->realpath);
1030 sd->listing = EINA_TRUE;
1033 /* Clean up typebuf. */
1034 _e_fm2_typebuf_hide(obj);
1036 evas_object_smart_callback_call(obj, "dir_changed", NULL);
1037 sd->tmp.iter = EINA_FALSE;
1041 e_fm2_underlay_show(Evas_Object *obj)
1043 E_Fm2_Smart_Data *sd;
1045 sd = evas_object_smart_data_get(obj);
1046 if (!sd) return; // safety
1047 if (!evas_object_type_get(obj)) return; // safety
1048 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1049 evas_object_show(sd->underlay);
1053 e_fm2_underlay_hide(Evas_Object *obj)
1055 E_Fm2_Smart_Data *sd;
1057 sd = evas_object_smart_data_get(obj);
1058 if (!sd) return; // safety
1059 if (!evas_object_type_get(obj)) return; // safety
1060 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1061 evas_object_hide(sd->underlay);
1065 e_fm2_all_unsel(Evas_Object *obj)
1067 E_Fm2_Smart_Data *sd;
1069 sd = evas_object_smart_data_get(obj);
1070 if (!sd) return; // safety
1071 if (!evas_object_type_get(obj)) return; // safety
1072 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1073 _e_fm2_icon_desel_any(obj);
1077 e_fm2_all_sel(Evas_Object *obj)
1079 E_Fm2_Smart_Data *sd;
1081 sd = evas_object_smart_data_get(obj);
1082 if (!sd) return; // safety
1083 if (!evas_object_type_get(obj)) return; // safety
1084 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1085 _e_fm2_icon_sel_any(obj);
1089 e_fm2_custom_theme_set(Evas_Object *obj, const char *path)
1091 E_Fm2_Smart_Data *sd;
1093 sd = evas_object_smart_data_get(obj);
1094 if (!sd) return; // safety
1095 if (!evas_object_type_get(obj)) return; // safety
1096 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1097 eina_stringshare_replace(&sd->custom_theme, path);
1098 _e_fm2_theme_edje_object_set(sd, sd->drop, "base/theme/fileman",
1099 "list/drop_between");
1100 _e_fm2_theme_edje_object_set(sd, sd->drop_in, "base/theme/fileman",
1102 _e_fm2_theme_edje_object_set(sd, sd->overlay, "base/theme/fileman",
1104 _e_fm2_theme_edje_object_set(sd, sd->sel_rect, "base/theme/fileman",
1109 e_fm2_custom_theme_content_set(Evas_Object *obj, const char *content)
1111 E_Fm2_Smart_Data *sd;
1113 sd = evas_object_smart_data_get(obj);
1114 if (!sd) return; // safety
1115 if (!evas_object_type_get(obj)) return; // safety
1116 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1117 eina_stringshare_replace(&sd->custom_theme_content, content);
1118 _e_fm2_theme_edje_object_set(sd, sd->drop, "base/theme/fileman",
1119 "list/drop_between");
1120 _e_fm2_theme_edje_object_set(sd, sd->drop_in, "base/theme/fileman",
1122 _e_fm2_theme_edje_object_set(sd, sd->overlay, "base/theme/fileman",
1127 e_fm2_path_get(Evas_Object *obj, const char **dev, const char **path)
1129 E_Fm2_Smart_Data *sd;
1131 if (dev) *dev = NULL;
1132 if (path) *path = NULL;
1133 sd = evas_object_smart_data_get(obj);
1134 if (!sd) return; // safety
1135 if (!evas_object_type_get(obj)) return; // safety
1136 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1137 if (dev) *dev = sd->dev;
1138 if (path) *path = sd->path;
1141 static E_Fm2_Custom_File *
1142 _e_fm2_dir_load_props_from_parent(const char *path)
1144 E_Fm2_Custom_File *cf;
1147 if ((!path) || (path[0] == '\0') || (strcmp(path, "/") == 0))
1150 parent = ecore_file_dir_get(path);
1151 cf = e_fm2_custom_file_get(parent);
1152 if ((cf) && (cf->dir) && (cf->dir->prop.in_use))
1158 cf = _e_fm2_dir_load_props_from_parent(parent);
1164 _e_fm2_dir_load_props(E_Fm2_Smart_Data *sd)
1166 E_Fm2_Custom_File *cf;
1169 if (!sd->realpath) return; /* come back later */
1170 if (!(sd->view_flags & E_FM2_VIEW_LOAD_DIR_CUSTOM)) return;
1172 cf = e_fm2_custom_file_get(sd->realpath);
1173 if ((cf) && (cf->dir))
1177 if (sd->max.w - sd->w > 0)
1178 x = (sd->max.w - sd->w) * cf->dir->pos.x;
1182 if (sd->max.h - sd->h > 0)
1183 y = (sd->max.h - sd->h) * cf->dir->pos.y;
1187 e_fm2_pan_set(sd->obj, x, y);
1189 if (cf->dir->prop.in_use)
1191 sd->view_mode = cf->dir->prop.view_mode;
1192 sd->icon_size = cf->dir->prop.icon_size;
1193 sd->order_file = !!cf->dir->prop.order_file;
1194 sd->show_hidden_files = !!cf->dir->prop.show_hidden_files;
1195 sd->inherited_dir_props = EINA_FALSE;
1205 if (!(sd->view_flags & E_FM2_VIEW_INHERIT_DIR_CUSTOM))
1209 sd->order_file = EINA_FALSE;
1210 sd->show_hidden_files = EINA_FALSE;
1211 sd->inherited_dir_props = EINA_FALSE;
1215 sd->inherited_dir_props = EINA_TRUE;
1217 cf = _e_fm2_dir_load_props_from_parent(sd->realpath);
1218 if ((cf) && (cf->dir) && (cf->dir->prop.in_use))
1220 sd->view_mode = cf->dir->prop.view_mode;
1221 sd->icon_size = cf->dir->prop.icon_size;
1222 sd->order_file = !!cf->dir->prop.order_file;
1223 sd->show_hidden_files = !!cf->dir->prop.show_hidden_files;
1229 sd->order_file = EINA_FALSE;
1230 sd->show_hidden_files = EINA_FALSE;
1235 _e_fm2_dir_save_props(E_Fm2_Smart_Data *sd)
1237 E_Fm2_Custom_File *cf, cf0;
1238 E_Fm2_Custom_Dir dir0;
1240 if (!(sd->view_flags & E_FM2_VIEW_SAVE_DIR_CUSTOM)) return;
1242 cf = e_fm2_custom_file_get(sd->realpath);
1246 memset(cf, 0, sizeof(*cf));
1251 E_Fm2_Custom_File *cf2 = cf;
1253 memcpy(cf, cf2, sizeof(*cf2));
1257 if (sd->max.w - sd->w > 0)
1258 cf->dir->pos.x = sd->pos.x / (double)(sd->max.w - sd->w);
1260 cf->dir->pos.x = 0.0;
1262 if (sd->max.h - sd->h)
1263 cf->dir->pos.y = sd->pos.y / (double)(sd->max.h - sd->h);
1265 cf->dir->pos.y = 0.0;
1267 cf->dir->prop.icon_size = sd->icon_size;
1268 cf->dir->prop.view_mode = sd->view_mode;
1269 cf->dir->prop.order_file = sd->order_file;
1270 cf->dir->prop.show_hidden_files = sd->show_hidden_files;
1271 cf->dir->prop.in_use = !sd->inherited_dir_props;
1273 e_fm2_custom_file_set(sd->realpath, cf);
1274 e_fm2_custom_file_flush();
1278 e_fm2_refresh(Evas_Object *obj)
1280 E_Fm2_Smart_Data *sd;
1282 sd = evas_object_smart_data_get(obj);
1283 if (!sd) return; // safety
1284 if (!evas_object_type_get(obj)) return; // safety
1285 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1287 _e_fm2_dir_save_props(sd);
1289 _e_fm2_queue_free(obj);
1290 _e_fm2_regions_free(obj);
1291 _e_fm2_icons_free(obj);
1293 sd->order_file = EINA_FALSE;
1297 sd->listing = EINA_FALSE;
1298 _e_fm2_client_monitor_del(sd->id, sd->realpath);
1299 sd->id = _e_fm2_client_monitor_add(sd->realpath);
1300 sd->listing = EINA_TRUE;
1303 sd->tmp.iter = EINA_FALSE;
1307 e_fm2_has_parent_get(Evas_Object *obj)
1309 E_Fm2_Smart_Data *sd;
1311 sd = evas_object_smart_data_get(obj);
1312 if (!sd) return 0; // safety
1313 if (!evas_object_type_get(obj)) return 0; // safety
1314 if (strcmp(evas_object_type_get(obj), "e_fm")) return 0; // safety
1315 if (!sd->path) return 0;
1316 if ((sd->path[0] == 0) || (!strcmp(sd->path, "/"))) return 0;
1321 e_fm2_real_path_get(Evas_Object *obj)
1323 E_Fm2_Smart_Data *sd;
1325 sd = evas_object_smart_data_get(obj);
1326 if (!sd) return NULL; // safety
1327 if (!evas_object_type_get(obj)) return NULL; // safety
1328 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1329 return sd->realpath;
1333 e_fm2_parent_go(Evas_Object *obj)
1335 E_Fm2_Smart_Data *sd;
1338 sd = evas_object_smart_data_get(obj);
1339 if (!sd) return; // safety
1340 if (!evas_object_type_get(obj)) return; // safety
1341 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1342 if (!sd->path) return;
1343 path = strdup(sd->path);
1345 if ((p = strrchr(path, '/'))) *p = 0;
1347 e_fm2_path_set(obj, sd->dev, "/");
1349 e_fm2_path_set(obj, sd->dev, path);
1355 e_fm2_config_set(Evas_Object *obj, E_Fm2_Config *cfg)
1357 E_Fm2_Smart_Data *sd;
1359 sd = evas_object_smart_data_get(obj);
1360 if (!sd) return; // safety
1361 if (!evas_object_type_get(obj)) return; // safety
1362 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1363 if (sd->config) _e_fm2_config_free(sd->config);
1366 sd->config = E_NEW(E_Fm2_Config, 1);
1367 if (!sd->config) return;
1368 memcpy(sd->config, cfg, sizeof(E_Fm2_Config));
1369 sd->config->icon.key_hint = eina_stringshare_add(cfg->icon.key_hint);
1370 sd->config->theme.background = eina_stringshare_add(cfg->theme.background);
1371 sd->config->theme.frame = eina_stringshare_add(cfg->theme.frame);
1372 sd->config->theme.icons = eina_stringshare_add(cfg->theme.icons);
1376 e_fm2_config_get(Evas_Object *obj)
1378 E_Fm2_Smart_Data *sd;
1380 sd = evas_object_smart_data_get(obj);
1381 if (!sd) return NULL; // safety
1382 if (!evas_object_type_get(obj)) return NULL; // safety
1383 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1388 e_fm2_selected_list_get(Evas_Object *obj)
1390 E_Fm2_Smart_Data *sd;
1391 Eina_List *list = NULL, *l;
1394 sd = evas_object_smart_data_get(obj);
1395 if (!sd) return NULL; // safety
1396 if (!evas_object_type_get(obj)) return NULL; // safety
1397 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1398 EINA_LIST_FOREACH(sd->icons, l, ic)
1401 list = eina_list_append(list, &(ic->info));
1407 e_fm2_all_list_get(Evas_Object *obj)
1409 E_Fm2_Smart_Data *sd;
1410 Eina_List *list = NULL, *l;
1413 sd = evas_object_smart_data_get(obj);
1414 if (!sd) return NULL; // safety
1415 if (!evas_object_type_get(obj)) return NULL; // safety
1416 if (strcmp(evas_object_type_get(obj), "e_fm")) return NULL; // safety
1417 EINA_LIST_FOREACH(sd->icons, l, ic)
1419 list = eina_list_append(list, &(ic->info));
1425 e_fm2_select_set(Evas_Object *obj, const char *file, int select)
1427 E_Fm2_Smart_Data *sd;
1431 sd = evas_object_smart_data_get(obj);
1432 if (!sd) return; // safety
1433 if (!evas_object_type_get(obj)) return; // safety
1434 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1435 EINA_LIST_FOREACH(sd->icons, l, ic)
1437 if ((file) && (!strcmp(ic->info.file, file)))
1439 if (select) _e_fm2_icon_select(ic);
1440 else _e_fm2_icon_deselect(ic);
1444 if (ic->sd->config->selection.single)
1445 _e_fm2_icon_deselect(ic);
1446 ic->last_selected = EINA_FALSE;
1452 e_fm2_file_show(Evas_Object *obj, const char *file)
1454 E_Fm2_Smart_Data *sd;
1458 sd = evas_object_smart_data_get(obj);
1459 if (!sd) return; // safety
1460 if (!evas_object_type_get(obj)) return; // safety
1461 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1462 EINA_LIST_FOREACH(sd->icons, l, ic)
1464 if (!strcmp(ic->info.file, file))
1466 _e_fm2_icon_make_visible(ic);
1473 e_fm2_icon_menu_replace_callback_set(Evas_Object *obj, E_Fm_Cb func, void *data)
1475 E_Fm2_Smart_Data *sd;
1477 sd = evas_object_smart_data_get(obj);
1478 if (!sd) return; // safety
1479 if (!evas_object_type_get(obj)) return; // safety
1480 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1481 sd->icon_menu.replace.func = func;
1482 sd->icon_menu.replace.data = data;
1486 e_fm2_icon_menu_start_extend_callback_set(Evas_Object *obj, E_Fm_Cb func, void *data)
1488 E_Fm2_Smart_Data *sd;
1490 sd = evas_object_smart_data_get(obj);
1491 if (!sd) return; // safety
1492 if (!evas_object_type_get(obj)) return; // safety
1493 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1494 sd->icon_menu.start.func = func;
1495 sd->icon_menu.start.data = data;
1499 e_fm2_icon_menu_end_extend_callback_set(Evas_Object *obj, E_Fm_Cb func, void *data)
1501 E_Fm2_Smart_Data *sd;
1503 sd = evas_object_smart_data_get(obj);
1504 if (!sd) return; // safety
1505 if (!evas_object_type_get(obj)) return; // safety
1506 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1507 sd->icon_menu.end.func = func;
1508 sd->icon_menu.end.data = data;
1512 e_fm2_icon_menu_flags_set(Evas_Object *obj, E_Fm2_Menu_Flags flags)
1514 E_Fm2_Smart_Data *sd;
1516 sd = evas_object_smart_data_get(obj);
1517 if (!sd) return; // safety
1518 if (!evas_object_type_get(obj)) return; // safety
1519 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1520 sd->icon_menu.flags = flags;
1523 EAPI E_Fm2_Menu_Flags
1524 e_fm2_icon_menu_flags_get(Evas_Object *obj)
1526 E_Fm2_Smart_Data *sd;
1528 sd = evas_object_smart_data_get(obj);
1529 if (!sd) return 0; // safety
1530 if (!evas_object_type_get(obj)) return 0; // safety
1531 if (strcmp(evas_object_type_get(obj), "e_fm")) return 0; // safety
1532 return sd->icon_menu.flags;
1536 e_fm2_view_flags_set(Evas_Object *obj, E_Fm2_View_Flags flags)
1538 E_Fm2_Smart_Data *sd = evas_object_smart_data_get(obj);
1539 if (!sd) return; // safety
1540 if (!evas_object_type_get(obj)) return; // safety
1541 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1542 sd->view_flags = flags;
1545 EAPI E_Fm2_View_Flags
1546 e_fm2_view_flags_get(Evas_Object *obj)
1548 E_Fm2_Smart_Data *sd = evas_object_smart_data_get(obj);
1549 if (!sd) return 0; // safety
1550 if (!evas_object_type_get(obj)) return 0; // safety
1551 if (strcmp(evas_object_type_get(obj), "e_fm")) return 0; // safety
1552 return sd->view_flags;
1556 e_fm2_window_object_set(Evas_Object *obj, E_Object *eobj)
1558 E_Fm2_Smart_Data *sd;
1559 const char *drop[] = { "enlightenment/desktop", "enlightenment/border", "text/uri-list" };
1561 sd = evas_object_smart_data_get(obj);
1562 if (!sd) return; // safety
1563 if (!evas_object_type_get(obj)) return; // safety
1564 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1566 if (sd->drop_handler) e_drop_handler_del(sd->drop_handler);
1567 sd->drop_handler = e_drop_handler_add(sd->eobj,
1569 _e_fm2_cb_dnd_enter,
1571 _e_fm2_cb_dnd_leave,
1574 sd->x, sd->y, sd->w, sd->h);
1575 e_drop_handler_responsive_set(sd->drop_handler);
1579 e_fm2_icons_update(Evas_Object *obj)
1581 E_Fm2_Smart_Data *sd;
1584 char buf[PATH_MAX], *pfile;
1585 int bufused, buffree;
1587 sd = evas_object_smart_data_get(obj);
1588 if (!sd) return; // safety
1589 if (!evas_object_type_get(obj)) return; // safety
1590 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1592 bufused = eina_strlcpy(buf, sd->realpath, sizeof(buf));
1593 if (bufused >= (int)(sizeof(buf) - 2))
1596 if ((bufused > 0) && (buf[bufused - 1] != '/'))
1602 pfile = buf + bufused;
1603 buffree = sizeof(buf) - bufused;
1605 EINA_LIST_FOREACH(sd->icons, l, ic)
1607 E_Fm2_Custom_File *cf;
1609 eina_stringshare_del(ic->info.icon);
1610 ic->info.icon = NULL;
1611 ic->info.icon_type = EINA_FALSE;
1613 if (_e_fm2_file_is_desktop(ic->info.file))
1614 _e_fm2_icon_desktop_load(ic);
1616 if ((int)eina_strlcpy(pfile, ic->info.file, buffree) >= buffree)
1619 cf = e_fm2_custom_file_get(buf);
1624 eina_stringshare_replace(&ic->info.icon, cf->icon.icon);
1625 ic->info.icon_type = cf->icon.type;
1631 _e_fm2_icon_unrealize(ic);
1632 _e_fm2_icon_realize(ic);
1635 e_fm2_custom_file_flush();
1639 e_fm2_pan_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
1641 E_Fm2_Smart_Data *sd;
1643 sd = evas_object_smart_data_get(obj);
1644 if (!sd) return; // safety
1645 if (!evas_object_type_get(obj)) return; // safety
1646 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1647 if (x > (sd->max.w - sd->w)) x = sd->max.w - sd->w;
1649 if (y > (sd->max.h - sd->h)) y = sd->max.h - sd->h;
1651 if ((sd->pos.x == x) && (sd->pos.y == y)) return;
1654 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
1655 sd->scroll_job = ecore_job_add(_e_fm2_cb_scroll_job, obj);
1659 e_fm2_pan_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
1661 E_Fm2_Smart_Data *sd;
1663 sd = evas_object_smart_data_get(obj);
1664 if (!sd) return; // safety
1665 if (!evas_object_type_get(obj)) return; // safety
1666 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1667 if (x) *x = sd->pos.x;
1668 if (y) *y = sd->pos.y;
1672 e_fm2_pan_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
1674 E_Fm2_Smart_Data *sd;
1677 sd = evas_object_smart_data_get(obj);
1678 if (!sd) return; // safety
1679 if (!evas_object_type_get(obj)) return; // safety
1680 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1681 mx = sd->max.w - sd->w;
1683 my = sd->max.h - sd->h;
1690 e_fm2_pan_child_size_get(Evas_Object *obj, Evas_Coord *w, Evas_Coord *h)
1692 E_Fm2_Smart_Data *sd;
1694 sd = evas_object_smart_data_get(obj);
1695 if (!sd) return; // safety
1696 if (!evas_object_type_get(obj)) return; // safety
1697 if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety
1698 if (w) *w = sd->max.w;
1699 if (h) *h = sd->max.h;
1703 e_fm2_all_icons_update(void)
1708 _e_fm2_list_walking++;
1709 EINA_LIST_FOREACH(_e_fm2_list, l, o)
1711 if ((_e_fm2_list_walking > 0) &&
1712 (eina_list_data_find(_e_fm2_list_remove, o))) continue;
1713 e_fm2_icons_update(o);
1715 _e_fm2_list_walking--;
1716 if (_e_fm2_list_walking == 0)
1718 EINA_LIST_FREE(_e_fm2_list_remove, o)
1720 _e_fm2_list = eina_list_remove(_e_fm2_list, o);
1726 _e_fm2_path_join(char *buf, int buflen, const char *base, const char *component)
1728 if ((!buf) || (!component))
1731 if (component[0] == '/')
1733 else if (component[0] == '\0')
1735 else if (component[0] == '.')
1737 if (component[1] == '/')
1744 if (snprintf(buf, buflen, "%s/%s", base, component) < buflen)
1749 else if ((component[1] == '.') && (component[2] == '/'))
1759 p = strrchr(base, '/');
1764 if (snprintf(buf, buflen, "%.*s/%s", len, base, component) < buflen)
1771 if (snprintf(buf, buflen, "%s/%s", base, component) < buflen)
1778 * Explicitly set an Edje icon from the given icon path.
1780 * @param iconpath path to edje file that contains 'icon' group.
1782 * @see _e_fm2_icon_explicit_get()
1784 static Evas_Object *
1785 _e_fm2_icon_explicit_edje_get(Evas *evas, const E_Fm2_Icon *ic __UNUSED__, const char *iconpath, const char **type_ret)
1787 Evas_Object *o = edje_object_add(evas);
1791 if (!edje_object_file_set(o, iconpath, "icon"))
1797 if (type_ret) *type_ret = "CUSTOM";
1802 * Explicitly set icon from theme using its name.
1804 * @param name will be prefixed by 'e/icons/' to form the group name in theme.
1806 * @see e_util_edje_icon_set()
1807 * @see _e_fm2_icon_explicit_get()
1809 static Evas_Object *
1810 _e_fm2_icon_explicit_theme_icon_get(Evas *evas, const E_Fm2_Icon *ic __UNUSED__, const char *name, const char **type_ret)
1812 Evas_Object *o = e_icon_add(evas);
1814 if (!o) return NULL;
1816 if (!e_util_icon_theme_set(o, name))
1822 if (type_ret) *type_ret = "THEME_ICON";
1827 * Explicitly set icon from file manager theem using its name.
1829 * @param name will be prefixed with 'base/theme/fileman' to form the
1830 * group name in theme.
1832 * @see _e_fm2_theme_edje_icon_object_set()
1833 * @see _e_fm2_icon_explicit_get()
1835 static Evas_Object *
1836 _e_fm2_icon_explicit_theme_get(Evas *evas, const E_Fm2_Icon *ic, const char *name, const char **type_ret)
1838 Evas_Object *o = edje_object_add(evas);
1842 if (!_e_fm2_theme_edje_icon_object_set(ic->sd, o, "base/theme/fileman", name))
1848 if (type_ret) *type_ret = "THEME";
1853 * Explicitly set icon to given value.
1855 * This will try to identify if icon is an edje or regular file or even
1856 * an icon name to get from icon set.
1858 * @param icon might be an absolute or relative path, or icon name or edje path.
1860 static Evas_Object *
1861 _e_fm2_icon_explicit_get(Evas *evas, const E_Fm2_Icon *ic, const char *icon, const char **type_ret)
1864 const char *iconpath;
1866 iconpath = _e_fm2_path_join(buf, sizeof(buf), ic->sd->realpath, icon);
1869 fprintf(stderr, "ERROR: could not create icon \"%s\".\n", icon);
1873 if (_e_fm2_file_is_edje(iconpath))
1874 return _e_fm2_icon_explicit_edje_get(evas, ic, iconpath, type_ret);
1877 Evas_Object *o = e_icon_add(evas);
1881 e_icon_file_set(o, iconpath);
1882 e_icon_fill_inside_set(o, 1);
1883 if (type_ret) *type_ret = "CUSTOM";
1891 * Creates an icon that generates a thumbnail if required.
1893 * @param group if given, will be used in e_thumb_icon_file_set()
1894 * @param cb function to callback when thumbnail generation is over.
1895 * @param data extra data to give to @p cb
1896 * @param force_gen whenever to force generation of thumbnails, even it exists.
1898 static Evas_Object *
1899 _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)
1904 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
1907 o = e_thumb_icon_add(evas);
1911 e_thumb_icon_file_set(o, buf, group);
1912 e_thumb_icon_size_set(o, 128, 128);
1914 if (cb) evas_object_smart_callback_add(o, "e_thumb_gen", cb, data);
1916 _e_fm2_icon_thumb(ic, o, force_gen);
1917 if (type_ret) *type_ret = "THUMB";
1922 * Generates the thumbnail of the given edje file.
1924 * It will use 'icon.key_hint' from config if set and then try some well
1925 * known groups like 'icon', 'e/desktop/background' and 'e/init/splash'.
1927 static Evas_Object *
1928 _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)
1931 const char **itr, *group;
1932 const char *known_groups[] = {
1935 "e/desktop/background",
1937 /* XXX TODO: add more? example 'screenshot', 'preview' */
1941 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
1944 known_groups[0] = ic->sd->config->icon.key_hint;
1945 if (known_groups[0])
1948 itr = known_groups + 1;
1951 if (edje_file_group_exists(buf, *itr))
1958 Eina_List *l = edje_file_collection_list(buf);
1961 group = eina_list_data_get(l);
1962 edje_file_collection_list_free(l);
1965 return _e_fm2_icon_thumb_get(evas, ic, group, cb, data, force_gen, type_ret);
1969 * Machinery for _e_fm2_icon_desktop_get() and others with instances of desktop.
1971 static Evas_Object *
1972 _e_fm2_icon_desktop_get_internal(Evas *evas, const E_Fm2_Icon *ic, Efreet_Desktop *desktop, const char **type_ret)
1979 if (_e_fm2_file_is_edje(desktop->icon))
1980 return _e_fm2_icon_explicit_edje_get(evas, ic, desktop->icon, type_ret);
1982 o = _e_fm2_icon_explicit_theme_icon_get(evas, ic, desktop->icon, type_ret);
1985 o = e_util_desktop_icon_add(desktop, 48, evas);
1986 // o = e_util_icon_theme_icon_add(desktop->icon, 48, evas);
1987 if (o && type_ret) *type_ret = "DESKTOP";
1992 * Use freedesktop.org '.desktop' files to set icon.
1994 static Evas_Object *
1995 _e_fm2_icon_desktop_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
2001 if (!ic->info.file) return NULL;
2003 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
2006 ef = efreet_desktop_new(buf);
2007 if (!ef) return NULL;
2009 o = _e_fm2_icon_desktop_get_internal(evas, ic, ef, type_ret);
2010 efreet_desktop_free(ef);
2014 static inline const char *
2015 _e_fm2_icon_mime_type_special_match(const E_Fm2_Icon *ic)
2018 const E_Config_Mime_Icon *mi;
2019 const char *mime = ic->info.mime;
2021 EINA_LIST_FOREACH(e_config->mime_icons, l, mi)
2022 if (mi->mime == mime) /* both in the same stringshare pool */
2028 static inline unsigned int
2029 _e_fm2_icon_mime_size_normalize(const E_Fm2_Icon *ic)
2031 return e_util_icon_size_normalize(_e_fm2_icon_w_get(ic->sd));
2034 static Evas_Object *
2035 _e_fm2_icon_mime_fdo_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
2040 size = _e_fm2_icon_mime_size_normalize(ic);
2041 icon = efreet_mime_type_icon_get(ic->info.mime, e_config->icon_theme, size);
2045 o = _e_fm2_icon_explicit_get(evas, ic, icon, type_ret);
2051 static Evas_Object *
2052 _e_fm2_icon_mime_theme_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret __UNUSED__)
2057 if (snprintf(buf, sizeof(buf), "e/icons/fileman/mime/%s", ic->info.mime) >=
2061 file = e_theme_edje_file_get("base/theme/icons", buf);
2062 if (file && file[0])
2064 Evas_Object *obj = edje_object_add(evas);
2065 if (!obj) return NULL;
2066 if (!edje_object_file_set(obj, file, buf))
2068 evas_object_del(obj);
2078 * Use mime type information to set icon.
2080 static Evas_Object *
2081 _e_fm2_icon_mime_get(Evas *evas, const E_Fm2_Icon *ic, Evas_Smart_Cb gen_func, void *data, int force_gen, const char **type_ret)
2086 /* create thumbnails for edje files */
2087 if (_e_fm2_file_is_edje(ic->info.file))
2089 o = _e_fm2_icon_thumb_edje_get
2090 (evas, ic, gen_func, data, force_gen, type_ret);
2094 /* disabled until everyone has edje in mime.types:
2095 * use mimetype to identify edje.
2096 * if (ic->info.mime == _e_fm2_mime_app_edje)
2097 * return _e_fm2_icon_thumb_edje_get
2098 * (evas, ic, gen_func, data, force_gen, type_ret); */
2100 /* check user preferences */
2101 icon = _e_fm2_icon_mime_type_special_match(ic);
2104 if (icon == _e_fm2_icon_desktop_str)
2105 return _e_fm2_icon_desktop_get(evas, ic, type_ret);
2106 else if (icon == _e_fm2_icon_thumb_str)
2108 return _e_fm2_icon_thumb_get
2109 (evas, ic, NULL, gen_func, data, force_gen, type_ret);
2111 else if (strncmp(icon, "e/icons/fileman/", 16) == 0)
2112 return _e_fm2_icon_explicit_theme_get(evas, ic, icon + 16, type_ret);
2114 return _e_fm2_icon_explicit_get(evas, ic, icon, type_ret);
2117 if (e_config->icon_theme_overrides)
2118 o = _e_fm2_icon_mime_fdo_get(evas, ic, type_ret);
2120 o = _e_fm2_icon_mime_theme_get(evas, ic, type_ret);
2124 if (!e_config->icon_theme_overrides)
2125 o = _e_fm2_icon_mime_fdo_get(evas, ic, type_ret);
2127 o = _e_fm2_icon_mime_theme_get(evas, ic, type_ret);
2133 /* XXX REMOVE/DEPRECATED below here */
2134 /* icon = e_fm_mime_icon_get(ic->info.mime);
2135 * if (!icon) return NULL;
2137 * if (icon == _e_fm2_icon_desktop_str)
2138 * return _e_fm2_icon_desktop_get(evas, ic, type_ret);
2139 * else if (icon == _e_fm2_icon_thumb_str)
2140 * return _e_fm2_icon_thumb_get(evas, ic, NULL,
2141 * gen_func, data, force_gen, type_ret);
2142 * else if (strncmp(icon, "e/icons/fileman/", 16) == 0)
2143 * return _e_fm2_icon_explicit_theme_get(evas, ic, icon + 16, type_ret);
2145 * return _e_fm2_icon_explicit_get(evas, ic, icon, type_ret); */
2149 * Discovers the executable of Input Method Config file and set icon.
2151 static Evas_Object *
2152 _e_fm2_icon_imc_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret)
2154 E_Input_Method_Config *imc;
2155 Efreet_Desktop *desktop;
2157 Evas_Object *o = NULL;
2163 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
2166 imc_ef = eet_open(buf, EET_FILE_MODE_READ);
2170 imc = e_intl_input_method_config_read(imc_ef);
2173 if (!imc->e_im_setup_exec)
2175 e_intl_input_method_config_free(imc);
2179 desktop = efreet_util_desktop_exec_find(imc->e_im_setup_exec);
2182 o = _e_fm2_icon_desktop_get_internal(evas, ic, desktop, type_ret);
2183 efreet_desktop_free(desktop);
2185 e_intl_input_method_config_free(imc);
2187 if ((o) && (type_ret)) *type_ret = "IMC";
2192 * Use heuristics to discover and set icon.
2194 static Evas_Object *
2195 _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)
2199 p = strrchr(ic->info.file, '.');
2204 if (_e_fm2_ext_is_edje(p))
2205 return _e_fm2_icon_thumb_edje_get(evas, ic, gen_func,
2206 data, force_gen, type_ret);
2207 else if (_e_fm2_ext_is_desktop(p))
2208 return _e_fm2_icon_desktop_get(evas, ic, type_ret);
2209 else if (_e_fm2_ext_is_imc(p))
2210 return _e_fm2_icon_imc_get(evas, ic, type_ret);
2216 * Get the object representing the icon.
2218 * @param evas canvas instance to use to store the icon.
2219 * @param ic icon to get information in order to find the icon.
2220 * @param gen_func if thumbnails need to be generated, call this function
2222 * @param data extra data to give to @p gen_func.
2223 * @param force_gen force thumbnail generation.
2224 * @param type_ret string that identifies type of icon.
2227 e_fm2_icon_get(Evas *evas, E_Fm2_Icon *ic,
2228 Evas_Smart_Cb gen_func,
2229 void *data, int force_gen, const char **type_ret)
2235 if ((ic->info.icon[0] == '/') ||
2236 ((ic->info.icon[0] == '.') &&
2237 ((ic->info.icon[1] == '/') ||
2238 ((ic->info.icon[1] == '.') && (ic->info.icon[2] == '/')))))
2240 o = _e_fm2_icon_explicit_get(evas, ic, ic->info.icon, type_ret);
2246 o = _e_fm2_icon_mime_get(evas, ic, gen_func, data,
2247 force_gen, type_ret);
2251 o = _e_fm2_icon_explicit_theme_icon_get(evas, ic, ic->info.icon, type_ret);
2252 if (!o) goto fallback;
2257 if (ic->info.icon_type == 1)
2261 o = _e_fm2_icon_thumb_get(evas, ic, NULL,
2262 gen_func, data, force_gen, type_ret);
2270 o = _e_fm2_icon_mime_get(evas, ic, gen_func, data, force_gen, type_ret);
2273 else if (ic->info.file)
2277 o = _e_fm2_icon_discover_get(evas, ic, gen_func, data,
2278 force_gen, type_ret);
2283 return _e_fm2_icon_explicit_theme_get(evas, ic, "text/plain", type_ret);
2286 EAPI E_Fm2_Icon_Info *
2287 e_fm2_icon_file_info_get(E_Fm2_Icon *ic)
2289 if (!ic) return NULL;
2294 e_fm2_icon_geometry_get(E_Fm2_Icon *ic, int *x, int *y, int *w, int *h)
2298 if (x) *x = 0; if (y) *y = 0; if (w) *w = 0; if (h) *h = 0;
2301 evas_object_geometry_get(ic->obj, &xx, &yy, &ww, &hh);
2309 /* FIXME: track real exe with exe del events etc. */
2310 static int _e_fm2_client_spawning = 0;
2313 _e_fm2_client_spawn(void)
2317 if (_e_fm2_client_spawning) return;
2318 snprintf(buf, sizeof(buf), "%s/enlightenment/utils/enlightenment_fm", e_prefix_lib_get());
2319 ecore_exe_run(buf, NULL);
2320 _e_fm2_client_spawning = 1;
2323 static E_Fm2_Client *
2324 _e_fm2_client_get(void)
2327 E_Fm2_Client *cl, *cl_chosen = NULL;
2328 int min_req = 0x7fffffff;
2330 /* if we don't have a slave - spane one */
2331 if (!_e_fm2_client_list)
2333 _e_fm2_client_spawn();
2336 EINA_LIST_FOREACH(_e_fm2_client_list, l, cl)
2338 if (cl->req < min_req)
2347 typedef struct _E_Fm2_Message E_Fm2_Message;
2349 struct _E_Fm2_Message
2351 int major, minor, ref, ref_to, response;
2356 static Eina_List *_e_fm2_messages = NULL;
2359 _e_fm2_client_message_queue(int major, int minor, int ref, int ref_to, int response, const void *data, int size)
2363 msg = E_NEW(E_Fm2_Message, 1);
2368 msg->ref_to = ref_to;
2369 msg->response = response;
2373 msg->data = malloc(size);
2375 memcpy(msg->data, data, size);
2382 _e_fm2_messages = eina_list_append(_e_fm2_messages, msg);
2386 _e_fm2_client_message_flush(E_Fm2_Client *cl, E_Fm2_Message *msg)
2388 _e_fm2_messages = eina_list_remove(_e_fm2_messages, msg);
2389 ecore_ipc_client_send(cl->cl, msg->major, msg->minor,
2390 msg->ref, msg->ref_to, msg->response,
2391 msg->data, msg->size);
2398 _e_fm2_client_messages_flush(void)
2400 while (_e_fm2_messages)
2404 cl = _e_fm2_client_get();
2406 _e_fm2_client_message_flush(cl, eina_list_data_get(_e_fm2_messages));
2411 _e_fm_client_send_new(int minor, void *data, int size)
2417 cl = _e_fm2_client_get();
2420 _e_fm2_client_message_queue(E_IPC_DOMAIN_FM, minor,
2426 ecore_ipc_client_send(cl->cl, E_IPC_DOMAIN_FM, minor,
2436 _e_fm_client_send(int minor, int id, void *data, int size)
2440 cl = _e_fm2_client_get();
2443 _e_fm2_client_message_queue(E_IPC_DOMAIN_FM, minor,
2449 ecore_ipc_client_send(cl->cl, E_IPC_DOMAIN_FM, minor,
2459 _e_fm2_client_monitor_add(const char *path)
2461 return _e_fm_client_send_new(E_FM_OP_MONITOR_START, (void *)path, strlen(path) + 1);
2465 _e_fm2_client_monitor_del(int id, const char *path)
2467 _e_fm_client_send(E_FM_OP_MONITOR_END, id, (void *)path, strlen(path) + 1);
2471 _e_fm_client_file_del(const char *files, Evas_Object *e_fm)
2473 int id = _e_fm_client_send_new(E_FM_OP_REMOVE, (void *)files, strlen(files) + 1);
2474 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_REMOVE, _e_fm2_operation_abort_internal);
2480 _e_fm2_client_file_trash(const char *path, Evas_Object *e_fm)
2482 int id = _e_fm_client_send_new(E_FM_OP_TRASH, (void *)path, strlen(path) + 1);
2483 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_TRASH, _e_fm2_operation_abort_internal);
2490 _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)
2497 l = l1 + 1 + l2 + 1 + (sizeof(int) * 3);
2500 strcpy(d + l1 + 1, rel);
2501 memcpy(d + l1 + 1 + l2 + 1, &rel_to, sizeof(int));
2502 memcpy(d + l1 + 1 + l2 + 1 + sizeof(int), &x, sizeof(int));
2503 memcpy(d + l1 + 1 + l2 + 1 + (2 * sizeof(int)), &y, sizeof(int));
2505 id = _e_fm_client_send_new(E_FM_OP_MKDIR, (void *)d, l);
2506 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MKDIR, _e_fm2_operation_abort_internal);
2511 _e_fm_client_file_move(const char *args, Evas_Object *e_fm)
2513 int id = _e_fm_client_send_new(E_FM_OP_MOVE, (void *)args, strlen(args) + 1);
2514 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MOVE, _e_fm2_operation_abort_internal);
2519 _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)
2523 int l1, l2, l3, l, id;
2528 l = l1 + 1 + l2 + 1 + l3 + 1 + (sizeof(int) * 3);
2531 strcpy(d + l1 + 1, dest);
2532 strcpy(d + l1 + 1 + l2 + 1, rel);
2533 memcpy(d + l1 + 1 + l2 + 1 + l3 + 1, &rel_to, sizeof(int));
2534 memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + sizeof(int), &x, sizeof(int));
2535 memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + (2 * sizeof(int)), &y, sizeof(int));
2537 if ((x != -9999) && (y != -9999))
2539 E_Fm2_Custom_File *cf, cf0;
2541 cf = e_fm2_custom_file_get(dest);
2544 memset(&cf0, 0, sizeof(E_Fm2_Custom_File));
2549 cf->geom.res_w = res_w;
2550 cf->geom.res_h = res_h;
2552 e_fm2_custom_file_set(dest, cf);
2553 e_fm2_custom_file_flush();
2556 id = _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)d, l);
2557 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK, _e_fm2_operation_abort_internal);
2561 size_t size = 0, length = 0;
2563 args = _e_fm_string_append_quoted(args, &size, &length, path);
2564 args = _e_fm_string_append_char(args, &size, &length, ' ');
2565 args = _e_fm_string_append_quoted(args, &size, &length, dest);
2567 fputs("WARNING: using new E_FM_OP_SYMLINK, remove deprecated ASAP\n", stderr);
2568 int r = _e_fm_client_file_symlink(args, e_fm);
2581 _e_fm_client_file_copy(const char *args, Evas_Object *e_fm)
2583 int id = _e_fm_client_send_new(E_FM_OP_COPY, (void *)args, strlen(args) + 1);
2584 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_COPY, _e_fm2_operation_abort_internal);
2589 _e_fm_client_file_symlink(const char *args, Evas_Object *e_fm)
2591 int id = _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)args, strlen(args) + 1);
2592 e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK, _e_fm2_operation_abort_internal);
2597 _e_fm2_client_mount(const char *udi, const char *mountpoint)
2608 l2 = strlen(mountpoint);
2609 l = l1 + 1 + l2 + 1;
2616 strcpy(d + l1 + 1, mountpoint);
2618 return _e_fm_client_send_new(E_FM_OP_MOUNT, (void *)d, l);
2622 _e_fm2_client_unmount(const char *udi)
2635 _e_fm2_client_get();
2637 return _e_fm_client_send_new(E_FM_OP_UNMOUNT, (void *)d, l);
2641 _e_fm2_client_eject(const char *udi)
2649 size = strlen(udi) + 1;
2650 data = alloca(size);
2653 return _e_fm_client_send_new(E_FM_OP_EJECT, data, size);
2657 _e_fm2_client_monitor_list_end(Evas_Object *obj)
2659 E_Fm2_Smart_Data *sd;
2661 sd = evas_object_smart_data_get(obj);
2663 if (sd->busy_count == 0)
2665 edje_object_signal_emit(sd->overlay, "e,state,busy,stop", "e");
2666 e_fm2_custom_file_flush();
2670 evas_object_del(sd->tmp.obj);
2675 evas_object_del(sd->tmp.obj2);
2676 sd->tmp.obj2 = NULL;
2680 ecore_timer_del(sd->scan_timer);
2681 sd->scan_timer = NULL;
2685 ecore_idler_del(sd->sort_idler);
2686 sd->sort_idler = NULL;
2688 E_FREE(sd->tmp.list_index);
2689 _e_fm2_queue_free(obj);
2690 _e_fm2_obj_icons_place(sd);
2691 _e_fm2_live_process_begin(obj);
2695 _e_fm2_file_force_update(const char *path)
2701 dir = ecore_file_dir_get(path);
2703 EINA_LIST_FOREACH(_e_fm2_list, l, o)
2705 if ((_e_fm2_list_walking > 0) &&
2706 (eina_list_data_find(_e_fm2_list_remove, o))) continue;
2707 if (!strcmp(e_fm2_real_path_get(o), dir))
2711 ic = _e_fm2_icon_find(o, ecore_file_file_get(path));
2716 memset(&finf, 0, sizeof(E_Fm2_Finfo));
2717 memcpy(&(finf.st), &(ic->info.statinfo),
2718 sizeof(struct stat));
2719 finf.broken_link = ic->info.broken_link;
2720 finf.lnk = ic->info.link;
2721 finf.rlnk = ic->info.real_link;
2722 ic->removable_state_change = EINA_TRUE;
2723 _e_fm2_live_file_changed(o, ecore_file_file_get(path),
2732 e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e)
2735 Eina_List *l, *dels = NULL;
2738 if (e->major != 6 /*E_IPC_DOMAIN_FM*/) return;
2739 EINA_LIST_FOREACH(_e_fm2_client_list, l, cl)
2741 if (cl->cl == e->client) break;
2745 cl = E_NEW(E_Fm2_Client, 1);
2747 _e_fm2_client_list = eina_list_prepend(_e_fm2_client_list, cl);
2748 /* FIXME: new client - send queued msgs */
2749 _e_fm2_client_spawning = 0;
2750 _e_fm2_client_messages_flush();
2753 _e_fm2_list_walking++;
2754 EINA_LIST_FOREACH(_e_fm2_list, l, obj)
2758 const char *dir, *path, *lnk, *rlnk, *file;
2761 E_Fm2_Smart_Data *sd;
2763 if ((_e_fm2_list_walking > 0) &&
2764 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
2765 dir = e_fm2_real_path_get(obj);
2766 sd = evas_object_smart_data_get(obj);
2769 case E_FM_OP_HELLO: /*hello*/
2770 // printf("E_FM_OP_HELLO\n");
2773 case E_FM_OP_OK: /*req ok*/
2774 // printf("E_FM_OP_OK\n");
2778 case E_FM_OP_FILE_ADD: /*file add*/
2779 // printf("E_FM_OP_FILE_ADD\n");
2780 case E_FM_OP_FILE_CHANGE: /*file change*/
2781 // printf("E_FM_OP_FILE_CHANGE\n");
2786 /* NOTE: i am NOT converting this data to portable arch/os independent
2787 * format. i am ASSUMING e_fm_main and e are local and built together
2788 * and thus this will work. if this ever changes this here needs to
2790 memcpy(&st, p, sizeof(struct stat));
2791 p += sizeof(struct stat);
2797 p += strlen(path) + 1;
2800 p += strlen(lnk) + 1;
2804 memcpy(&(finf.st), &st, sizeof(struct stat));
2805 finf.broken_link = broken_link;
2809 evdir = ecore_file_dir_get(path);
2810 if ((evdir) && (sd->id == e->ref_to) &&
2811 ((!strcmp(evdir, "") || ((dir) && (!strcmp(dir, evdir))))))
2813 // printf(" ch/add response = %i\n", e->response);
2814 if (e->response == 0) /*live changes*/
2816 if (e->minor == E_FM_OP_FILE_ADD) /*file add*/
2818 _e_fm2_live_file_add
2819 (obj, ecore_file_file_get(path),
2822 else if (e->minor == E_FM_OP_FILE_CHANGE) /*file change*/
2824 _e_fm2_live_file_changed
2825 (obj, (char *)ecore_file_file_get(path),
2829 else /*file add - listing*/
2831 if (e->minor == E_FM_OP_FILE_ADD) /*file add*/
2833 if (!sd->scan_timer)
2836 ecore_timer_add(0.5,
2837 _e_fm2_cb_scan_timer,
2840 if (sd->busy_count == 1)
2841 edje_object_signal_emit(sd->overlay, "e,state,busy,start", "e");
2845 file = ecore_file_file_get(path);
2846 if ((!strcmp(file, ".order")))
2847 sd->order_file = EINA_TRUE;
2850 if (!((file[0] == '.') &&
2851 (!sd->show_hidden_files)))
2852 _e_fm2_file_add(obj, file,
2857 if (e->response == 2) /* end of scan */
2859 sd->listing = EINA_FALSE;
2862 ecore_timer_del(sd->scan_timer);
2864 ecore_timer_add(0.0001,
2865 _e_fm2_cb_scan_timer,
2870 _e_fm2_client_monitor_list_end(obj);
2878 // printf(" ...\n");
2879 if ((sd->id == e->ref_to) && (path[0] == 0))
2881 // printf(" end response = %i\n", e->response);
2882 if (e->response == 2) /* end of scan */
2884 sd->listing = EINA_FALSE;
2887 ecore_timer_del(sd->scan_timer);
2889 ecore_timer_add(0.0001,
2890 _e_fm2_cb_scan_timer,
2895 _e_fm2_client_monitor_list_end(obj);
2900 if (evdir) free(evdir);
2904 case E_FM_OP_FILE_DEL: /*file del*/
2905 // printf("E_FM_OP_FILE_DEL\n");
2907 evdir = ecore_file_dir_get(path);
2908 if ((sd->id == e->ref_to) && (!strcmp(dir, evdir)))
2910 _e_fm2_live_file_del
2911 (obj, ecore_file_file_get(path));
2916 case E_FM_OP_MONITOR_END: /*mon dir del*/
2917 // printf("E_FM_OP_MONITOR_END\n");
2919 if ((sd->id == e->ref_to) && (!strcmp(dir, path)))
2921 dels = eina_list_append(dels, obj);
2929 EINA_LIST_FREE(dels, obj)
2931 E_Fm2_Smart_Data *sd;
2933 sd = evas_object_smart_data_get(obj);
2934 if ((_e_fm2_list_walking > 0) &&
2935 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
2936 if (sd->config->view.open_dirs_in_place)
2937 _e_fm2_path_parent_set(obj, sd->realpath);
2939 evas_object_smart_callback_call(obj, "dir_deleted", NULL);
2941 _e_fm2_list_walking--;
2942 if (_e_fm2_list_walking == 0)
2944 EINA_LIST_FREE(_e_fm2_list_remove, obj)
2946 _e_fm2_list = eina_list_remove(_e_fm2_list, obj);
2951 case E_FM_OP_MONITOR_SYNC: /*mon list sync*/
2952 ecore_ipc_client_send(cl->cl, E_IPC_DOMAIN_FM, E_FM_OP_MONITOR_SYNC,
2957 case E_FM_OP_STORAGE_ADD: /*storage add*/
2958 if ((e->data) && (e->size > 0))
2962 s = _e_fm_shared_codec_storage_decode(e->data, e->size);
2963 if (s) e_fm2_device_storage_add(s);
2967 case E_FM_OP_STORAGE_DEL: /*storage del*/
2968 if ((e->data) && (e->size > 0))
2974 s = e_fm2_device_storage_find(udi);
2975 if (s) e_fm2_device_storage_del(s);
2979 case E_FM_OP_VOLUME_ADD: /*volume add*/
2980 if ((e->data) && (e->size > 0))
2984 v = _e_fm_shared_codec_volume_decode(e->data, e->size);
2987 e_fm2_device_volume_add(v);
2988 if (e_config->device_auto_mount && !v->mounted && !v->first_time)
2989 _e_fm2_client_mount(v->udi, v->mount_point);
2995 case E_FM_OP_VOLUME_DEL: /*volume del*/
2996 if ((e->data) && (e->size > 0))
3002 v = e_fm2_device_volume_find(udi);
3003 if (v) e_fm2_device_volume_del(v);
3007 case E_FM_OP_MOUNT_DONE: /*mount done*/
3008 if ((e->data) && (e->size > 1))
3011 char *udi, *mountpoint = NULL;
3014 if ((unsigned int)e->size != (strlen(udi) + 1))
3015 mountpoint = udi + strlen(udi) + 1;
3016 v = e_fm2_device_volume_find(udi);
3019 e_fm2_device_mount_add(v, mountpoint);
3020 _e_fm2_volume_icon_update(v);
3021 if (e_config->device_auto_open && !eina_list_count(v->mounts))
3026 a = e_action_find("fileman");
3027 m = e_manager_list();
3028 if (a && a->func.go && m && eina_list_data_get(m) && mountpoint)
3029 a->func.go(E_OBJECT(eina_list_data_get(m)), mountpoint);
3035 case E_FM_OP_UNMOUNT_DONE: /*unmount done*/
3036 if ((e->data) && (e->size > 1))
3042 v = e_fm2_device_volume_find(udi);
3045 e_fm2_device_mount_del(v);
3046 _e_fm2_volume_icon_update(v);
3051 case E_FM_OP_EJECT_DONE:
3054 case E_FM_OP_MOUNT_ERROR: /*mount error*/
3055 if (e->data && (e->size > 1))
3061 v = e_fm2_device_volume_find(udi);
3064 _e_fm_device_error_dialog(_("Mount Error"), _("Can't mount device"), e->data);
3065 e_fm2_device_mount_fail(v);
3070 case E_FM_OP_UNMOUNT_ERROR: /*unmount error*/
3071 if (e->data && (e->size > 1))
3077 v = e_fm2_device_volume_find(udi);
3080 _e_fm_device_error_dialog(_("Unmount Error"), _("Can't unmount device"), e->data);
3081 e_fm2_device_unmount_fail(v);
3086 case E_FM_OP_EJECT_ERROR:
3087 if (e->data && (e->size > 1))
3093 v = e_fm2_device_volume_find(udi);
3095 _e_fm_device_error_dialog(_("Eject Error"), _("Can't eject device"), e->data);
3099 case E_FM_OP_ERROR: /*error*/
3102 printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data);
3103 dlg = _e_fm_error_dialog(e->ref, e->data);
3104 _e_fm2_op_registry_error(e->ref, dlg);
3108 case E_FM_OP_ERROR_RETRY_ABORT: /*error*/
3111 printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data);
3112 dlg = _e_fm_retry_abort_dialog(e->ref, (char *)e->data);
3113 _e_fm2_op_registry_error(e->ref, dlg);
3117 case E_FM_OP_OVERWRITE: /*overwrite*/
3120 printf("%s:%s(%d) Overwrite from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data);
3121 dlg = _e_fm_overwrite_dialog(e->ref, (char *)e->data);
3122 _e_fm2_op_registry_needs_attention(e->ref, dlg);
3126 case E_FM_OP_PROGRESS: /*progress*/
3128 int percent, seconds;
3134 if (!e->data) return;
3136 #define UP(value, type) (value) = *(type *)p; p += sizeof(type)
3143 dst = p + strlen(src) + 1;
3144 // 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);
3146 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(e->ref);
3148 ere->percent = percent;
3152 e_fm2_op_registry_entry_files_set(ere, src, dst);
3153 if (ere->percent == 100)
3155 ere->status = E_FM2_OP_STATUS_SUCCESSFUL;
3158 e_fm2_op_registry_entry_changed(ere);
3162 case E_FM_OP_QUIT: /*finished*/
3164 E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(e->ref);
3169 e_fm2_op_registry_entry_changed(ere);
3171 e_fm2_op_registry_entry_del(e->ref);
3181 e_fm2_client_del(Ecore_Ipc_Event_Client_Del *e)
3186 EINA_LIST_FOREACH(_e_fm2_client_list, l, cl)
3188 if (cl->cl == e->client)
3190 _e_fm2_client_list = eina_list_remove_list(_e_fm2_client_list, l);
3197 /* local subsystem functions */
3199 _e_fm2_dev_path_map(const char *dev, const char *path)
3201 char buf[PATH_MAX] = "", *s, *ss;
3204 /* map a device name to a mount point/path on the os (and append path) */
3206 /* FIXME: load mappings from config and use them first - maybe device
3207 * discovery should be done through config and not the below (except
3208 * maybe for home directory and root fs and other simple thngs */
3209 /* FIXME: also add other virtualized dirs like "backgrounds", "themes",
3211 #define CMP(x) ((dev) && (e_util_glob_case_match(dev, x)))
3212 #define PRT(args ...) snprintf(buf, sizeof(buf), ##args)
3220 if (eina_strlcpy(buf, path, sizeof(buf)) >=
3226 if (PRT("%s/%s", dev, path) >= (int)sizeof(buf))
3230 else if ((dev[0] == '~') && (dev[1] == '/') && (dev[2] == '\0'))
3232 s = (char *)e_user_homedir_get();
3233 if (PRT("%s/%s", s, path) >= (int)sizeof(buf))
3236 else if (strcmp(dev, "favorites") == 0)
3238 /* this is a virtual device - it's where your favorites list is
3239 * stored - a dir with
3240 .desktop files or symlinks (in fact anything
3243 if (e_user_dir_concat_static(buf, "fileman/favorites") >= sizeof(buf))
3246 else if (strcmp(dev, "desktop") == 0)
3248 /* this is a virtual device - it's where your favorites list is
3249 * stored - a dir with
3250 .desktop files or symlinks (in fact anything
3253 if (strcmp(path, "/") == 0)
3255 if (e_user_homedir_concat(buf, sizeof(buf), _("Desktop")) >= sizeof(buf))
3260 if (e_user_homedir_snprintf(buf, sizeof(buf), "%s-%s", _("Desktop"), path) >= sizeof(buf))
3263 ecore_file_mkpath(buf);
3265 else if (strcmp(dev, "temp") == 0)
3267 /* FIXME: replace all this removable, dvd and like with hal */
3268 else if (!strncmp(dev, "removable:", sizeof("removable:") - 1))
3272 v = e_fm2_device_volume_find(dev + strlen("removable:"));
3275 if ((!v->mount_point) && (v->efm_mode == EFM_MODE_USING_HAL_MOUNT))
3276 v->mount_point = e_fm2_device_volume_mountpoint_get(v);
3277 else if (!v->mount_point) return NULL;
3279 if (PRT("%s/%s", v->mount_point, path) >= (int)sizeof(buf))
3283 /* else if (CMP("dvd") || CMP("dvd-*")) */
3285 /* /\* FIXME: find dvd mountpoint optionally for dvd no. X *\/ */
3286 /* /\* maybe make part of the device mappings config? *\/ */
3288 /* else if (CMP("cd") || CMP("cd-*") || CMP("cdrom") || CMP("cdrom-*") || */
3289 /* CMP("dvd") || CMP("dvd-*")) */
3291 /* /\* FIXME: find cdrom or dvd mountpoint optionally for cd/dvd no. X *\/ */
3292 /* /\* maybe make part of the device mappings config? *\/ */
3295 /* FIXME: add code to find USB devices (multi-card readers or single,
3296 * usb thumb drives, other usb storage devices (usb hd's etc.)
3298 /* maybe make part of the device mappings config? */
3299 /* FIXME: add code for finding nfs shares, smb shares etc. */
3300 /* maybe make part of the device mappings config? */
3304 if (eina_strlcpy(buf, path, sizeof(buf)) >= sizeof(buf))
3308 /* strip out excess multiple slashes */
3312 if ((s[0] == '/') && (s[1] == '/'))
3324 /* strip out slashes at the end - unless its just "/" */
3326 while ((len > 1) && (buf[len - 1] == '/'))
3331 return eina_stringshare_add(buf);
3335 _e_fm2_file_add(Evas_Object *obj, const char *file, int unique, const char *file_rel, int after, E_Fm2_Finfo *finf)
3337 E_Fm2_Smart_Data *sd;
3338 E_Fm2_Icon *ic, *ic2;
3341 sd = evas_object_smart_data_get(obj);
3343 /* if we only want unique icon names - if it's there - ignore */
3346 EINA_LIST_FOREACH(sd->icons, l, ic)
3348 if (!strcmp(ic->info.file, file))
3350 sd->tmp.last_insert = NULL;
3354 EINA_LIST_FOREACH(sd->queue, l, ic)
3356 if (!strcmp(ic->info.file, file))
3358 sd->tmp.last_insert = NULL;
3363 /* create icon obj and append to unsorted list */
3364 ic = _e_fm2_icon_new(sd, file, finf);
3369 /* respekt da ordah! */
3371 sd->queue = eina_list_append(sd->queue, ic);
3374 /* insertion sort it here to spread the sort load into idle time */
3375 EINA_LIST_FOREACH(sd->queue, l, ic2)
3377 if (_e_fm2_cb_icon_sort(ic, ic2) < 0)
3379 sd->queue = eina_list_prepend_relative_list(sd->queue, ic, l);
3383 if (!l) sd->queue = eina_list_append(sd->queue, ic);
3388 EINA_LIST_FOREACH(sd->icons, l, ic2)
3390 if (!strcmp(ic2->info.file, file_rel))
3393 sd->icons = eina_list_append_relative(sd->icons, ic, ic2);
3395 sd->icons = eina_list_prepend_relative(sd->icons, ic, ic2);
3400 sd->icons = eina_list_append(sd->icons, ic);
3401 sd->icons_place = eina_list_append(sd->icons_place, ic);
3403 sd->tmp.last_insert = NULL;
3404 sd->iconlist_changed = EINA_TRUE;
3409 _e_fm2_file_del(Evas_Object *obj, const char *file)
3411 E_Fm2_Smart_Data *sd;
3415 sd = evas_object_smart_data_get(obj);
3417 EINA_LIST_FOREACH(sd->icons, l, ic)
3419 if (!strcmp(ic->info.file, file))
3421 sd->icons = eina_list_remove_list(sd->icons, l);
3422 sd->icons_place = eina_list_remove(sd->icons_place, ic);
3425 ic->region->list = eina_list_remove(ic->region->list, ic);
3428 _e_fm2_icon_free(ic);
3435 _e_fm_file_buffer_clear(void)
3438 EINA_LIST_FREE(_e_fm_file_buffer, s)
3439 eina_stringshare_del(s);
3441 _e_fm_file_buffer_cutting = 0;
3442 _e_fm_file_buffer_copying = 0;
3446 _e_fm2_buffer_fill(Evas_Object *obj)
3449 char buf[PATH_MAX], *pfile;
3450 int bufused, buffree;
3451 const char *realpath;
3452 const E_Fm2_Icon_Info *ici;
3454 sel = e_fm2_selected_list_get(obj);
3455 if (!sel) return EINA_FALSE;
3457 realpath = e_fm2_real_path_get(obj);
3458 if (!realpath) return EINA_FALSE;
3460 bufused = eina_strlcpy(buf, realpath, sizeof(buf));
3461 if (bufused >= (int)sizeof(buf) - 2) return EINA_FALSE;
3463 if ((bufused > 0) && (buf[bufused - 1] != '/'))
3469 pfile = buf + bufused;
3470 buffree = sizeof(buf) - bufused;
3472 EINA_LIST_FREE(sel, ici)
3475 if ((int)eina_strlcpy(pfile, ici->file, buffree) >= buffree) continue;
3476 _e_fm_file_buffer = eina_list_append(_e_fm_file_buffer, _e_fm2_uri_escape(buf));
3483 _e_fm2_file_cut(Evas_Object *obj)
3485 _e_fm_file_buffer_clear();
3486 _e_fm_file_buffer_cutting = _e_fm2_buffer_fill(obj);
3490 _e_fm2_file_copy(Evas_Object *obj)
3492 _e_fm_file_buffer_clear();
3493 _e_fm_file_buffer_copying = _e_fm2_buffer_fill(obj);
3497 _e_fm2_file_paste(Evas_Object *obj)
3499 E_Fm2_Smart_Data *sd;
3501 const char *filepath;
3506 sd = evas_object_smart_data_get(obj);
3509 /* Convert URI list to a list of real paths. */
3510 paths = _e_fm2_uri_path_list_get(_e_fm_file_buffer);
3511 EINA_LIST_FREE(paths, filepath)
3513 /* Get file's full path. */
3517 /* Check if file is protected. */
3518 if (e_filereg_file_protected(filepath))
3520 eina_stringshare_del(filepath);
3524 /* Put filepath into a string of args.
3525 * If there are more files, put an additional space.
3527 args = _e_fm_string_append_quoted(args, &size, &length, filepath);
3528 args = _e_fm_string_append_char(args, &size, &length, ' ');
3530 eina_stringshare_del(filepath);
3533 /* Add destination to the arguments. */
3534 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
3536 /* Roll the operation! */
3537 if (_e_fm_file_buffer_copying)
3539 _e_fm_client_file_copy(args, sd->obj);
3543 _e_fm_client_file_move(args, sd->obj);
3550 _e_fm2_file_symlink(Evas_Object *obj)
3552 E_Fm2_Smart_Data *sd;
3554 const char *filepath;
3559 sd = evas_object_smart_data_get(obj);
3562 /* Convert URI list to a list of real paths. */
3563 paths = _e_fm2_uri_path_list_get(_e_fm_file_buffer);
3564 EINA_LIST_FREE(paths, filepath)
3566 /* Get file's full path. */
3570 /* Check if file is protected. */
3571 if (e_filereg_file_protected(filepath))
3573 eina_stringshare_del(filepath);
3577 /* Put filepath into a string of args.
3578 * If there are more files, put an additional space.
3580 args = _e_fm_string_append_quoted(args, &size, &length, filepath);
3581 args = _e_fm_string_append_char(args, &size, &length, ' ');
3583 eina_stringshare_del(filepath);
3586 /* Add destination to the arguments. */
3587 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
3589 /* Roll the operation! */
3590 if (_e_fm_file_buffer_copying)
3591 _e_fm_client_file_symlink(args, sd->obj);
3597 _e_fm2_file_cut_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3599 E_Fm2_Smart_Data *sd = data;
3601 _e_fm2_file_cut(sd->obj);
3605 _e_fm2_file_copy_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3607 E_Fm2_Smart_Data *sd = data;
3609 _e_fm2_file_copy(sd->obj);
3613 _e_fm2_file_paste_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3615 E_Fm2_Smart_Data *sd = data;
3617 _e_fm2_file_paste(sd->obj);
3621 _e_fm2_file_symlink_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
3623 E_Fm2_Smart_Data *sd = data;
3625 _e_fm2_file_symlink(sd->obj);
3629 _e_fm2_queue_process(Evas_Object *obj)
3631 E_Fm2_Smart_Data *sd;
3632 E_Fm2_Icon *ic, *ic2;
3634 int added = 0, i, p0, p1, n, v;
3638 sd = evas_object_smart_data_get(obj);
3642 if (sd->resize_job) ecore_job_del(sd->resize_job);
3643 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
3644 evas_object_smart_callback_call(sd->obj, "changed", NULL);
3645 sd->tmp.last_insert = NULL;
3648 // double tt = ecore_time_get();
3649 // int queued = eina_list_count(sd->queue);
3650 /* take unsorted and insert into the icon list - reprocess regions */
3651 t = ecore_time_get();
3652 if (!sd->tmp.last_insert)
3655 n = eina_list_count(sd->icons);
3656 E_FREE(sd->tmp.list_index);
3658 sd->tmp.list_index = calloc(n, sizeof(Eina_List *));
3659 if (sd->tmp.list_index)
3661 ll = sd->tmp.list_index;
3662 for (l = sd->icons; l; l = eina_list_next(l))
3667 /* binary search first queue */
3668 ic = eina_list_data_get(sd->queue);
3671 ll = sd->tmp.list_index;
3672 if (ll[i]) do /* avoid garbage deref */
3674 ic2 = eina_list_data_get(ll[i]);
3675 v = _e_fm2_cb_icon_sort(ic, ic2);
3676 if (v < 0) /* ic should go before ic2 */
3678 else /* ic should go at or after ic2 */
3683 while ((p1 - p0) > 1);
3690 l = sd->tmp.last_insert;
3691 EINA_LIST_FREE(sd->queue, ic)
3693 /* insertion sort - better than qsort for the way we are doing
3694 * things - incrimentally scan and sort as we go as we now know
3695 * that the queue files are in order, we speed up insertions to
3696 * a worst case of O(n) where n is the # of files in the list
3705 EINA_LIST_FOREACH(l, l, ic2)
3707 if (_e_fm2_cb_icon_sort(ic, ic2) < 0)
3710 sd->icons = eina_list_prepend(sd->icons, ic);
3712 sd->icons = eina_list_prepend_relative_list(sd->icons,
3714 sd->tmp.last_insert = l;
3721 sd->icons = eina_list_append(sd->icons, ic);
3722 sd->tmp.last_insert = eina_list_last(sd->icons);
3724 sd->icons_place = eina_list_append(sd->icons_place, ic);
3726 /* if we spent more than 1/20th of a second inserting - give up
3728 if ((ecore_time_get() - t) > 0.05) break;
3730 // printf("FM: SORT %1.3f (%i files) (%i queued, %i added) [%i iter]\n",
3731 // ecore_time_get() - tt, eina_list_count(sd->icons), queued,
3732 // added, sd->tmp.iter);
3733 snprintf(buf, sizeof(buf), _("%i Files"), eina_list_count(sd->icons));
3734 edje_object_part_text_set(sd->overlay, "e.text.busy_label", buf);
3735 if (sd->resize_job) ecore_job_del(sd->resize_job);
3736 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
3737 evas_object_smart_callback_call(sd->obj, "changed", NULL);
3742 _e_fm2_queue_free(Evas_Object *obj)
3744 E_Fm2_Smart_Data *sd;
3747 sd = evas_object_smart_data_get(obj);
3749 /* just free the icons in the queue and the queue itself */
3750 EINA_LIST_FREE(sd->queue, ic)
3751 _e_fm2_icon_free(ic);
3755 _e_fm2_regions_free(Evas_Object *obj)
3757 E_Fm2_Smart_Data *sd;
3760 sd = evas_object_smart_data_get(obj);
3762 /* free up all regions */
3763 EINA_LIST_FREE(sd->regions.list, rg)
3764 _e_fm2_region_free(rg);
3768 _e_fm2_regions_populate(Evas_Object *obj)
3770 E_Fm2_Smart_Data *sd;
3775 sd = evas_object_smart_data_get(obj);
3777 /* take the icon list and split into regions */
3779 evas_event_freeze(evas_object_evas_get(obj));
3781 EINA_LIST_FOREACH(sd->icons, l, ic)
3785 rg = _e_fm2_region_new(sd);
3786 sd->regions.list = eina_list_append(sd->regions.list, rg);
3789 rg->list = eina_list_append(rg->list, ic);
3801 rg->w += rg->x - ic->x;
3804 if ((ic->x + ic->w) > (rg->x + rg->w))
3806 rg->w += (ic->x + ic->w) - (rg->x + rg->w);
3810 rg->h += rg->y - ic->y;
3813 if ((ic->y + ic->h) > (rg->y + rg->h))
3815 rg->h += (ic->y + ic->h) - (rg->y + rg->h);
3818 if ((int)eina_list_count(rg->list) > sd->regions.member_max)
3821 _e_fm2_regions_eval(obj);
3822 EINA_LIST_FOREACH(sd->icons, l, ic)
3824 if ((!ic->region->realized) && (ic->realized))
3825 _e_fm2_icon_unrealize(ic);
3827 _e_fm2_obj_icons_place(sd);
3829 evas_event_thaw(evas_object_evas_get(obj));
3833 _e_fm2_icons_place_icons(E_Fm2_Smart_Data *sd)
3837 Evas_Coord x, y, rh;
3841 EINA_LIST_FOREACH(sd->icons, l, ic)
3843 if ((x > 0) && ((x + ic->w) > sd->w))
3852 if (ic->h > rh) rh = ic->h;
3853 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
3854 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
3859 _e_fm2_icons_place_grid_icons(E_Fm2_Smart_Data *sd)
3863 Evas_Coord x, y, gw, gh;
3867 EINA_LIST_FOREACH(sd->icons, l, ic)
3869 if (ic->w > gw) gw = ic->w;
3870 if (ic->h > gh) gh = ic->h;
3872 if (gw > 0) cols = sd->w / gw;
3873 if (cols < 1) cols = 1;
3874 x = 0; y = 0; col = 0;
3875 EINA_LIST_FOREACH(sd->icons, l, ic)
3877 ic->x = x + ((gw - ic->w) / 2);
3878 ic->y = y + (gh - ic->h);
3887 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
3888 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
3893 _e_fm2_icons_icon_overlaps(E_Fm2_Icon *ic)
3898 /* this is really slow... when we have a lot of icons */
3899 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
3901 if ((ic2 != ic) && (ic2->saved_pos))
3903 if (E_INTERSECTS(ic2->x, ic2->y, ic2->w, ic2->h,
3904 ic->x, ic->y, ic->w, ic->h))
3912 _e_fm2_icons_icon_row_ok(E_Fm2_Icon *ic)
3914 if (ic->x + ic->w > ic->sd->w) return 0;
3915 if (ic->x < 0) return 0;
3916 if (ic->y < 0) return 0;
3921 _e_fm2_icon_place_relative(E_Fm2_Icon *ic, E_Fm2_Icon *icr, int xrel, int yrel, int xa, int ya)
3926 if (xrel > 0) ic->x += icr->w;
3930 ic->x += (icr->w - ic->w) / 2;
3932 ic->x += icr->w - ic->w;
3934 if (yrel > 0) ic->y += icr->h;
3938 ic->y += (icr->h - ic->h) / 2;
3940 ic->y += icr->h - ic->h;
3944 _e_fm2_icons_place_icon(E_Fm2_Icon *ic)
3951 ic->saved_pos = EINA_TRUE;
3953 // if (!_e_fm2_icons_icon_overlaps(ic)) return;
3955 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 2);
3956 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3957 _e_fm2_icon_place_relative(ic, ic2, 0, -1, 0, 0);
3958 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3959 _e_fm2_icon_place_relative(ic, ic2, 0, -1, 1, 0);
3960 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3961 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 0);
3962 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3963 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 1);
3964 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3965 _e_fm2_icon_place_relative(ic, ic2, 0, 1, 0, 0);
3966 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3967 _e_fm2_icon_place_relative(ic, ic2, 0, 1, 1, 0);
3968 if (_e_fm2_icons_icon_row_ok(ic) && !_e_fm2_icons_icon_overlaps(ic)) return;
3970 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
3972 if ((ic2 != ic) && (ic2->saved_pos))
3975 _e_fm2_icon_place_relative(ic, ic2, 1, 0, 0, 2);
3976 if (_e_fm2_icons_icon_row_ok(ic) &&
3977 !_e_fm2_icons_icon_overlaps(ic)) goto done;
3979 _e_fm2_icon_place_relative(ic, ic2, -1, 0, 0, 2);
3980 if (_e_fm2_icons_icon_row_ok(ic) &&
3981 !_e_fm2_icons_icon_overlaps(ic)) goto done;
3985 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
3987 if ((ic2 != ic) && (ic2->saved_pos))
3991 _e_fm2_icon_place_relative(ic, ic2, 0, 1, 1, 0);
3992 if (_e_fm2_icons_icon_row_ok(ic) &&
3993 !_e_fm2_icons_icon_overlaps(ic)) goto done;
3996 _e_fm2_icon_place_relative(ic, ic2, 0, -1, 1, 0);
3997 if (_e_fm2_icons_icon_row_ok(ic) &&
3998 !_e_fm2_icons_icon_overlaps(ic)) goto done;
4000 if ((ic2 != ic) && (ic2->saved_pos))
4002 // TODO: if uncomment this, change EINA_LIST_FOREACH to EINA_LIST_FOREACH_SAFE!
4003 // ic->sd->icons_place = eina_list_remove_list(ic->sd->icons_place, pl);
4011 _e_fm2_icons_place_custom_icons(E_Fm2_Smart_Data *sd)
4016 EINA_LIST_FOREACH(sd->icons, l, ic)
4020 /* FIXME: place using smart place fn */
4021 _e_fm2_icons_place_icon(ic);
4024 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4025 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4030 _e_fm2_icons_place_custom_grid_icons(E_Fm2_Smart_Data *sd)
4032 /* FIXME: not going to implement this at this stage */
4036 EINA_LIST_FOREACH(sd->icons, l, ic)
4040 /* FIXME: place using grid fn */
4043 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4044 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4049 _e_fm2_icons_place_custom_smart_grid_icons(E_Fm2_Smart_Data *sd)
4051 /* FIXME: not going to implement this at this stage */
4055 EINA_LIST_FOREACH(sd->icons, l, ic)
4059 /* FIXME: place using smart grid fn */
4062 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4063 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4068 _e_fm2_icons_place_list(E_Fm2_Smart_Data *sd)
4076 EINA_LIST_FOREACH(sd->icons, l, ic)
4080 if (sd->w > ic->min_w)
4085 ic->odd = (i & 0x01);
4086 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
4087 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
4090 EINA_LIST_FOREACH(sd->icons, l, ic)
4097 _e_fm2_icons_place(Evas_Object *obj)
4099 E_Fm2_Smart_Data *sd;
4101 sd = evas_object_smart_data_get(obj);
4103 /* take the icon list and find a location for them */
4106 switch (_e_fm2_view_mode_get(sd))
4108 case E_FM2_VIEW_MODE_ICONS:
4109 _e_fm2_icons_place_icons(sd);
4110 sd->max.h += ICON_BOTTOM_SPACE;
4113 case E_FM2_VIEW_MODE_GRID_ICONS:
4114 _e_fm2_icons_place_grid_icons(sd);
4115 sd->max.h += ICON_BOTTOM_SPACE;
4118 case E_FM2_VIEW_MODE_CUSTOM_ICONS:
4119 _e_fm2_icons_place_custom_icons(sd);
4120 sd->max.h += ICON_BOTTOM_SPACE;
4123 case E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS:
4124 /* FIXME: not going to implement this at this stage */
4125 _e_fm2_icons_place_custom_grid_icons(sd);
4126 sd->max.h += ICON_BOTTOM_SPACE;
4129 case E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS:
4130 /* FIXME: not going to implement this at this stage */
4131 _e_fm2_icons_place_custom_smart_grid_icons(sd);
4132 sd->max.h += ICON_BOTTOM_SPACE;
4135 case E_FM2_VIEW_MODE_LIST:
4136 _e_fm2_icons_place_list(sd);
4142 /* tell our parent scrollview - if any, that we have changed */
4143 evas_object_smart_callback_call(sd->obj, "changed", NULL);
4147 _e_fm2_icons_free(Evas_Object *obj)
4149 E_Fm2_Smart_Data *sd;
4151 sd = evas_object_smart_data_get(obj);
4153 _e_fm2_queue_free(obj);
4154 /* free all icons */
4155 E_FREE_LIST(sd->icons, _e_fm2_icon_free);
4156 eina_list_free(sd->icons_place);
4157 sd->icons_place = NULL;
4158 sd->tmp.last_insert = NULL;
4159 E_FREE(sd->tmp.list_index);
4163 _e_fm2_regions_eval(Evas_Object *obj)
4165 E_Fm2_Smart_Data *sd;
4169 sd = evas_object_smart_data_get(obj);
4171 evas_event_freeze(evas_object_evas_get(obj));
4173 EINA_LIST_FOREACH(sd->regions.list, l, rg)
4175 if (_e_fm2_region_visible(rg))
4176 _e_fm2_region_realize(rg);
4178 _e_fm2_region_unrealize(rg);
4181 evas_event_thaw(evas_object_evas_get(obj));
4185 _e_fm2_config_free(E_Fm2_Config *cfg)
4187 if (cfg->icon.key_hint) eina_stringshare_del(cfg->icon.key_hint);
4188 if (cfg->theme.background) eina_stringshare_del(cfg->theme.background);
4189 if (cfg->theme.frame) eina_stringshare_del(cfg->theme.frame);
4190 if (cfg->theme.icons) eina_stringshare_del(cfg->theme.icons);
4194 static Evas_Object *
4195 _e_fm2_file_fm2_find(const char *file)
4201 dir = ecore_file_dir_get(file);
4202 if (!dir) return NULL;
4203 EINA_LIST_FOREACH(_e_fm2_list, l, obj)
4205 if ((_e_fm2_list_walking > 0) &&
4206 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
4207 if (!strcmp(e_fm2_real_path_get(obj), dir))
4218 _e_fm2_icon_find(Evas_Object *obj, const char *file)
4220 E_Fm2_Smart_Data *sd;
4224 sd = evas_object_smart_data_get(obj);
4225 if (!sd) return NULL;
4226 EINA_LIST_FOREACH(sd->icons, l, ic)
4228 if (!strcmp(ic->info.file, file)) return ic;
4233 /* Escape illegal caracters within an uri and return an eina_stringshare */
4235 _e_fm2_uri_escape(const char *path)
4237 char dest[PATH_MAX * 3 + 7];
4241 if (!path) return NULL;
4242 memset(dest, 0, PATH_MAX * 3 + 7);
4244 snprintf(dest, 8, "file://");
4246 /* Most app doesn't handle the hostname in the uri so it's put to NULL */
4247 for (i = 7, p = path; *p != '\0'; p++, i++)
4249 if (isalnum(*p) || strchr("/$-_.+!*'()", *p))
4253 snprintf(&(dest[i]), 4, "%%%02X", (unsigned char)*p);
4258 return eina_stringshare_add(dest);
4261 /* Parse a single uri and return an E_Fm2_Uri struct.
4262 * If the parsing have failed it return NULL.
4263 * The E_Fm2_Uri may have hostname parameter and always a path.
4264 * If there's no hostname in the uri then the hostname parameter is NULL
4267 _e_fm2_uri_parse(const char *val)
4271 char hostname[PATH_MAX], path[PATH_MAX];
4274 /* if value is a raw path: /path/to/blah just return it */
4277 uri = E_NEW(E_Fm2_Uri, 1);
4278 uri->hostname = NULL;
4279 uri->path = eina_stringshare_add(val);
4282 /* The shortest possible path is file:///
4283 * anything smaller than that can't be a valid uri
4285 if (strlen(val) <= 7 && strncmp(val, "file://", 7)) return NULL;
4286 memset(path, 0, PATH_MAX);
4288 /* An uri should be in a form file://<hostname>/<path> */
4292 for (i = 0; *p != '/' && *p != '\0' && i < _POSIX_HOST_NAME_MAX; p++, i++)
4297 /* See http://www.faqs.org/rfcs/rfc1738.html for the escaped chars */
4298 for (i = 0; *p != '\0' && i < PATH_MAX; i++, p++)
4303 path[i + 1] = *(++p);
4304 path[i] = (char)strtol(&(path[i]), NULL, 16);
4311 uri = E_NEW(E_Fm2_Uri, 1);
4312 if (hostname[0]) uri->hostname = eina_stringshare_add(hostname);
4313 else uri->hostname = NULL;
4314 uri->path = eina_stringshare_add(path);
4319 /* Takes an Eina_List of uri and return an Eina_List of real paths */
4321 _e_fm2_uri_path_list_get(Eina_List *uri_list)
4324 Eina_List *l, *path_list = NULL;
4325 char current_hostname[_POSIX_HOST_NAME_MAX];
4326 const char *uri_str;
4328 if (gethostname(current_hostname, _POSIX_HOST_NAME_MAX) == -1)
4329 current_hostname[0] = '\0';
4331 EINA_LIST_FOREACH(uri_list, l, uri_str)
4333 if (!(uri = _e_fm2_uri_parse(uri_str)))
4336 if (!uri->hostname || !strcmp(uri->hostname, "localhost")
4337 || !strcmp(uri->hostname, current_hostname))
4339 path_list = eina_list_append(path_list, uri->path);
4342 eina_stringshare_del(uri->path);
4344 if (uri->hostname) eina_stringshare_del(uri->hostname);
4352 _e_fm2_uri_icon_list_get(Eina_List *uri)
4354 Eina_List *icons = NULL;
4358 EINA_LIST_FOREACH(uri, l, path)
4364 fm = _e_fm2_file_fm2_find(path);
4367 const char *file = ecore_file_file_get(path);
4368 ic = _e_fm2_icon_find(fm, file);
4370 icons = eina_list_append(icons, ic);
4375 /**************************/
4378 _e_fm2_icon_new(E_Fm2_Smart_Data *sd, const char *file, E_Fm2_Finfo *finf)
4383 ic = E_NEW(E_Fm2_Icon, 1);
4384 ic->info.fm = sd->obj;
4386 ic->info.file = eina_stringshare_add(file);
4388 if (!_e_fm2_icon_fill(ic, finf))
4390 eina_stringshare_del(ic->info.file);
4398 _e_fm2_icon_unfill(E_Fm2_Icon *ic)
4400 eina_stringshare_del(ic->info.mime);
4401 eina_stringshare_del(ic->info.label);
4402 eina_stringshare_del(ic->info.comment);
4403 eina_stringshare_del(ic->info.generic);
4404 eina_stringshare_del(ic->info.icon);
4405 eina_stringshare_del(ic->info.link);
4406 eina_stringshare_del(ic->info.real_link);
4407 eina_stringshare_del(ic->info.category);
4408 ic->info.mime = NULL;
4409 ic->info.label = NULL;
4410 ic->info.comment = NULL;
4411 ic->info.generic = NULL;
4412 ic->info.icon = NULL;
4413 ic->info.link = NULL;
4414 ic->info.real_link = NULL;
4415 ic->info.mount = EINA_FALSE;
4416 ic->info.removable = EINA_FALSE;
4417 ic->info.removable_full = EINA_FALSE;
4418 ic->info.deleted = EINA_FALSE;
4419 ic->info.broken_link = EINA_FALSE;
4423 _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)
4425 int qx, qy, rx, ry, x, y;
4427 if (!((_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS) &&
4428 (ic->sd->config->view.fit_custom_pos) &&
4429 (saved_res_w > 0) &&
4432 if (saved_res_w >= 3) qx = saved_x / (saved_res_w / 3);
4434 rx = saved_x - ((saved_res_w / 2) * qx);
4435 x = ((ic->sd->w / 2) * qx) + rx;
4438 if (saved_res_h >= 3) qy = saved_y / (saved_res_h / 3);
4440 ry = saved_y - ((saved_res_h / 2) * qy);
4441 y = ((ic->sd->h / 2) * qy) + ry;
4446 _e_fm2_icon_fill(E_Fm2_Icon *ic, E_Fm2_Finfo *finf)
4448 Evas_Coord mw = 0, mh = 0;
4449 Evas_Object *obj, *obj2;
4450 char buf[PATH_MAX], *lnk;
4452 E_Fm2_Custom_File *cf;
4454 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
4456 cf = e_fm2_custom_file_get(buf);
4459 memcpy(&(ic->info.statinfo), &(finf->st), sizeof(struct stat));
4460 if ((finf->lnk) && (finf->lnk[0]))
4461 ic->info.link = eina_stringshare_add(finf->lnk);
4463 ic->info.link = NULL;
4464 if ((finf->rlnk) && (finf->rlnk[0]))
4465 ic->info.real_link = eina_stringshare_add(finf->rlnk);
4467 ic->info.real_link = NULL;
4468 ic->info.broken_link = finf->broken_link;
4472 printf("FIXME: remove old non finf icon fill code\n");
4473 /* FIXME: this should go away... get this from the fm slave proc above */
4474 lnk = ecore_file_readlink(buf);
4475 if (stat(buf, &(ic->info.statinfo)) == -1)
4478 ic->info.broken_link = EINA_TRUE;
4488 ic->info.link = eina_stringshare_add(lnk);
4489 ic->info.real_link = eina_stringshare_add(lnk);
4495 snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, lnk);
4496 rp = ecore_file_realpath(buf);
4499 ic->info.link = eina_stringshare_add(rp);
4502 ic->info.real_link = eina_stringshare_add(lnk);
4506 /* FIXME: end go away chunk */
4509 if (S_ISDIR(ic->info.statinfo.st_mode))
4511 ic->info.mime = eina_stringshare_ref(_e_fm2_mime_inode_directory);
4513 else if (ic->info.real_link)
4515 mime = efreet_mime_type_get(ic->info.real_link);
4517 /* XXX REMOVE/DEPRECATE ME LATER */
4518 mime = e_fm_mime_filename_get(ic->info.file);
4519 if (mime) ic->info.mime = eina_stringshare_add(mime);
4524 mime = efreet_mime_type_get(buf);
4526 /* XXX REMOVE/DEPRECATE ME LATER */
4527 mime = e_fm_mime_filename_get(ic->info.file);
4528 if (mime) ic->info.mime = eina_stringshare_add(mime);
4531 if (_e_fm2_file_is_desktop(ic->info.file))
4532 _e_fm2_icon_desktop_load(ic);
4540 eina_stringshare_replace(&ic->info.icon, cf->icon.icon);
4542 ic->info.icon_type = cf->icon.type;
4546 ic->saved_pos = EINA_TRUE;
4549 if (cf->geom.w > 0) ic->w = cf->geom.w;
4550 if (cf->geom.h > 0) ic->h = cf->geom.h;
4551 _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);
4555 evas_event_freeze(evas_object_evas_get(ic->sd->obj));
4558 switch (_e_fm2_view_mode_get(ic->sd))
4560 case E_FM2_VIEW_MODE_ICONS:
4561 case E_FM2_VIEW_MODE_GRID_ICONS:
4562 case E_FM2_VIEW_MODE_CUSTOM_ICONS:
4563 case E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS:
4564 case E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS:
4565 /* FIXME: need to define icon edjes. here goes:
4567 * fileman/icon/fixed
4568 * fileman/icon/variable
4569 * fileman/list/fixed
4570 * fileman/list/variable
4571 * fileman/list_odd/fixed
4572 * fileman/list_odd/variable
4575 if ((!ic->sd->config->icon.fixed.w) || (!ic->sd->config->icon.fixed.h))
4577 obj = ic->sd->tmp.obj;
4580 obj = edje_object_add(evas_object_evas_get(ic->sd->obj));
4581 if ((ic->sd->config->icon.fixed.w) && (ic->sd->config->icon.fixed.h))
4582 _e_fm2_theme_edje_object_set(ic->sd, obj,
4583 "base/theme/fileman",
4586 _e_fm2_theme_edje_object_set(ic->sd, obj,
4587 "base/theme/fileman",
4589 ic->sd->tmp.obj = obj;
4591 _e_fm2_icon_label_set(ic, obj);
4592 obj2 = ic->sd->tmp.obj2;
4595 obj2 = evas_object_rectangle_add(evas_object_evas_get(ic->sd->obj));
4596 ic->sd->tmp.obj2 = obj2;
4598 /* FIXME: if icons are allowed to have their own size - use it */
4599 edje_extern_object_min_size_set(obj2, _e_fm2_icon_w_get(ic->sd), _e_fm2_icon_h_get(ic->sd));
4600 edje_extern_object_max_size_set(obj2, _e_fm2_icon_w_get(ic->sd), _e_fm2_icon_h_get(ic->sd));
4601 edje_object_part_swallow(obj, "e.swallow.icon", obj2);
4602 edje_object_size_min_calc(obj, &mw, &mh);
4606 if (ic->sd->config->icon.fixed.w) ic->w = _e_fm2_icon_w_get(ic->sd);
4607 if (ic->sd->config->icon.fixed.h) ic->h = _e_fm2_icon_h_get(ic->sd);
4612 case E_FM2_VIEW_MODE_LIST:
4614 obj = ic->sd->tmp.obj;
4617 obj = edje_object_add(evas_object_evas_get(ic->sd->obj));
4618 // vairable sized list items are pretty usless - ignore.
4619 // if (ic->sd->config->icon.fixed.w)
4620 _e_fm2_theme_edje_object_set(ic->sd, obj,
4621 "base/theme/fileman",
4624 // _e_fm2_theme_edje_object_set(ic->sd, obj, "base/theme/fileman",
4625 // "list/variable");
4626 ic->sd->tmp.obj = obj;
4628 _e_fm2_icon_label_set(ic, obj);
4629 obj2 = ic->sd->tmp.obj2;
4632 obj2 = evas_object_rectangle_add(evas_object_evas_get(ic->sd->obj));
4633 ic->sd->tmp.obj2 = obj2;
4635 edje_extern_object_min_size_set(obj2, ic->sd->config->icon.list.w, ic->sd->config->icon.list.h);
4636 edje_extern_object_max_size_set(obj2, ic->sd->config->icon.list.w, ic->sd->config->icon.list.h);
4637 edje_object_part_swallow(obj, "e.swallow.icon", obj2);
4638 edje_object_size_min_calc(obj, &mw, &mh);
4640 if (mw < ic->sd->w) ic->w = ic->sd->w;
4651 evas_event_thaw(evas_object_evas_get(ic->sd->obj));
4656 _e_fm2_icon_free(E_Fm2_Icon *ic)
4658 /* free icon, object data etc. etc. */
4659 if (ic->sd->drop_icon == ic)
4661 /* FIXME: call hide call */
4662 ic->sd->drop_icon = NULL;
4664 _e_fm2_icon_unrealize(ic);
4667 e_menu_post_deactivate_callback_set(ic->menu, NULL, NULL);
4668 e_object_del(E_OBJECT(ic->menu));
4673 e_object_del(E_OBJECT(ic->dialog));
4676 if (ic->entry_dialog)
4678 e_object_del(E_OBJECT(ic->entry_dialog));
4679 ic->entry_dialog = NULL;
4681 if (ic->entry_widget)
4682 _e_fm2_icon_entry_widget_del(ic);
4683 if (ic->prop_dialog)
4685 e_object_del(E_OBJECT(ic->prop_dialog));
4686 ic->prop_dialog = NULL;
4688 eina_stringshare_del(ic->info.file);
4689 eina_stringshare_del(ic->info.mime);
4690 eina_stringshare_del(ic->info.label);
4691 eina_stringshare_del(ic->info.comment);
4692 eina_stringshare_del(ic->info.generic);
4693 eina_stringshare_del(ic->info.icon);
4694 eina_stringshare_del(ic->info.link);
4695 eina_stringshare_del(ic->info.real_link);
4696 eina_stringshare_del(ic->info.category);
4701 _e_fm2_icon_realize(E_Fm2_Icon *ic)
4703 if (ic->realized) return;
4704 /* actually create evas objects etc. */
4705 ic->realized = EINA_TRUE;
4706 evas_event_freeze(evas_object_evas_get(ic->sd->obj));
4707 ic->obj = edje_object_add(evas_object_evas_get(ic->sd->obj));
4708 edje_object_freeze(ic->obj);
4709 evas_object_smart_member_add(ic->obj, ic->sd->obj);
4710 evas_object_stack_below(ic->obj, ic->sd->drop);
4711 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
4713 const char *stacking;
4715 // if (ic->sd->config->icon.fixed.w)
4718 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4719 "base/theme/widgets",
4722 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4723 "base/theme/widgets",
4725 stacking = edje_object_data_get(ic->obj, "stacking");
4728 if (!strcmp(stacking, "below"))
4729 evas_object_stack_above(ic->obj, ic->sd->underlay);
4730 else if (!strcmp(stacking, "above"))
4731 evas_object_stack_below(ic->obj, ic->sd->drop);
4738 // _e_fm2_theme_edje_object_set(ic->sd, ic->obj, "base/theme/widgets",
4739 // "list_odd/variable");
4741 // _e_fm2_theme_edje_object_set(ic->sd, ic->obj, "base/theme/widgets",
4742 // "list/variable");
4747 if (ic->sd->config->icon.fixed.w)
4748 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4749 "base/theme/fileman",
4752 _e_fm2_theme_edje_object_set(ic->sd, ic->obj,
4753 "base/theme/fileman",
4756 _e_fm2_icon_label_set(ic, ic->obj);
4757 evas_object_clip_set(ic->obj, ic->sd->clip);
4758 evas_object_move(ic->obj,
4759 ic->sd->x + ic->x - ic->sd->pos.x,
4760 ic->sd->y + ic->y - ic->sd->pos.y);
4761 evas_object_resize(ic->obj, ic->w, ic->h);
4763 evas_object_event_callback_add(ic->obj, EVAS_CALLBACK_MOUSE_DOWN, _e_fm2_cb_icon_mouse_down, ic);
4764 evas_object_event_callback_add(ic->obj, EVAS_CALLBACK_MOUSE_UP, _e_fm2_cb_icon_mouse_up, ic);
4765 evas_object_event_callback_add(ic->obj, EVAS_CALLBACK_MOUSE_MOVE, _e_fm2_cb_icon_mouse_move, ic);
4767 _e_fm2_icon_icon_set(ic);
4769 edje_object_thaw(ic->obj);
4770 evas_event_thaw(evas_object_evas_get(ic->sd->obj));
4771 evas_object_show(ic->obj);
4775 const char *selectraise;
4777 /* FIXME: need new signal to INSTANTLY activate - no anim */
4778 /* FIXME: while listing dirs need to use icons in-place and not
4779 * unrealize and re-realize */
4780 edje_object_signal_emit(ic->obj, "e,state,selected", "e");
4781 edje_object_signal_emit(ic->obj_icon, "e,state,selected", "e");
4782 selectraise = edje_object_data_get(ic->obj, "selectraise");
4783 if ((selectraise) && (!strcmp(selectraise, "on")))
4784 evas_object_stack_below(ic->obj, ic->sd->drop);
4787 if (ic->info.removable)
4788 _e_fm2_icon_removable_update(ic);
4792 _e_fm2_icon_unrealize(E_Fm2_Icon *ic)
4794 if (!ic->realized) return;
4795 /* delete evas objects */
4796 ic->realized = EINA_FALSE;
4797 evas_object_del(ic->obj);
4799 evas_object_del(ic->obj_icon);
4800 ic->obj_icon = NULL;
4804 _e_fm2_icon_visible(const E_Fm2_Icon *ic)
4806 /* return if the icon is visible */
4808 ((ic->x - ic->sd->pos.x) < (ic->sd->w + OVERCLIP)) &&
4809 ((ic->x + ic->w - ic->sd->pos.x) > (-OVERCLIP)) &&
4810 ((ic->y - ic->sd->pos.y) < (ic->sd->h + OVERCLIP)) &&
4811 ((ic->y + ic->h - ic->sd->pos.y) > (-OVERCLIP))
4818 _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj)
4825 edje_object_part_text_set(obj, "e.text.label", ic->info.label);
4828 if ((ic->sd->config->icon.extension.show) ||
4829 (S_ISDIR(ic->info.statinfo.st_mode)))
4830 edje_object_part_text_set(obj, "e.text.label", ic->info.file);
4833 /* remove extension. handle double extensions like .tar.gz too
4834 * also be fuzzy - up to 4 chars of extn is ok - eg .html but 5 or
4835 * more is considered part of the name
4837 eina_strlcpy(buf, ic->info.file, sizeof(buf));
4840 p = strrchr(buf, '.');
4841 if ((p) && ((len - (p - buf)) < 6))
4846 p = strrchr(buf, '.');
4847 if ((p) && ((len - (p - buf)) < 6)) *p = 0;
4849 edje_object_part_text_set(obj, "e.text.label", buf);
4853 static Evas_Object *
4854 _e_fm2_icon_icon_direct_set(E_Fm2_Icon *ic, Evas_Object *o, Evas_Smart_Cb gen_func, void *data, int force_gen)
4858 oic = e_fm2_icon_get(evas_object_evas_get(o), ic,
4859 gen_func, data, force_gen, NULL);
4862 edje_object_part_swallow(o, "e.swallow.icon", oic);
4863 evas_object_show(oic);
4869 _e_fm2_icon_icon_set(E_Fm2_Icon *ic)
4871 if (!ic->realized) return;
4872 ic->obj_icon = _e_fm2_icon_icon_direct_set(ic, ic->obj,
4873 _e_fm2_cb_icon_thumb_gen,
4878 _e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force)
4881 ((_e_fm2_icon_visible(ic)) &&
4883 (!ic->sd->sort_idler) &&
4884 (!ic->sd->listing)))
4885 e_thumb_icon_begin(oic);
4889 _e_fm2_icon_select(E_Fm2_Icon *ic)
4891 if (ic->selected) return;
4892 ic->selected = EINA_TRUE;
4893 ic->last_selected = EINA_TRUE;
4896 const char *selectraise;
4898 if (ic->sd->iop_icon)
4899 _e_fm2_icon_entry_widget_accept(ic->sd->iop_icon);
4901 edje_object_signal_emit(ic->obj, "e,state,selected", "e");
4902 edje_object_signal_emit(ic->obj_icon, "e,state,selected", "e");
4903 evas_object_stack_below(ic->obj, ic->sd->drop);
4904 selectraise = edje_object_data_get(ic->obj, "selectraise");
4905 if ((selectraise) && (!strcmp(selectraise, "on")))
4906 evas_object_stack_below(ic->obj, ic->sd->drop);
4911 _e_fm2_icon_deselect(E_Fm2_Icon *ic)
4913 if (!ic->selected) return;
4914 ic->selected = EINA_FALSE;
4915 ic->last_selected = EINA_FALSE;
4918 const char *stacking, *selectraise;
4920 if (ic->entry_widget)
4921 _e_fm2_icon_entry_widget_accept(ic);
4923 edje_object_signal_emit(ic->obj, "e,state,unselected", "e");
4924 edje_object_signal_emit(ic->obj_icon, "e,state,unselected", "e");
4925 stacking = edje_object_data_get(ic->obj, "stacking");
4926 selectraise = edje_object_data_get(ic->obj, "selectraise");
4927 if ((selectraise) && (!strcmp(selectraise, "on")))
4929 if ((stacking) && (!strcmp(stacking, "below")))
4930 evas_object_stack_above(ic->obj, ic->sd->underlay);
4936 _e_fm2_icon_desktop_url_eval(const char *val)
4941 if (strlen(val) < 6) return NULL;
4942 if (strncmp(val, "file:", 5)) return NULL;
4943 path = (char *)val + 5;
4944 p = e_util_shell_env_path_eval(path);
4945 if (!p) return NULL;
4947 while (*path == '/') path++;
4949 s = eina_stringshare_add(path);
4955 _e_fm2_icon_desktop_load(E_Fm2_Icon *ic)
4958 Efreet_Desktop *desktop;
4960 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
4963 desktop = efreet_desktop_new(buf);
4964 // printf("efreet_desktop_new(%s) = %p\n", buf, desktop);
4965 if (!desktop) goto error;
4966 // if (desktop->type != EFREET_DESKTOP_TYPE_LINK) goto error;
4968 ic->info.removable = EINA_FALSE;
4969 ic->info.removable_full = EINA_FALSE;
4970 ic->info.label = eina_stringshare_add(desktop->name);
4971 ic->info.generic = eina_stringshare_add(desktop->generic_name);
4972 ic->info.comment = eina_stringshare_add(desktop->comment);
4973 ic->info.icon = eina_stringshare_add(desktop->icon);
4975 ic->info.link = _e_fm2_icon_desktop_url_eval(desktop->url);
4980 type = eina_hash_find(desktop->x, "X-Enlightenment-Type");
4983 if (!strcmp(type, "Mount")) ic->info.mount = EINA_TRUE;
4984 else if (!strcmp(type, "Removable"))
4986 ic->info.removable = EINA_TRUE;
4987 if ((!e_fm2_device_storage_find(ic->info.link)) &&
4988 (!e_fm2_device_volume_find(ic->info.link)))
4990 /* delete .desktop for non existing device */
4991 if (ecore_file_remove(buf))
4992 _e_fm2_live_file_del(ic->sd->obj, ic->info.file);
4994 _e_fm2_file_del(ic->sd->obj, ic->info.file);
4996 efreet_desktop_free(desktop);
5000 type = eina_hash_find(desktop->x, "X-Enlightenment-Removable-State");
5003 if (!strcmp(type, "Full"))
5004 ic->info.removable_full = EINA_TRUE;
5008 /* FIXME: get category */
5009 ic->info.category = NULL;
5010 efreet_desktop_free(desktop);
5014 eina_stringshare_del(ic->info.label);
5015 eina_stringshare_del(ic->info.comment);
5016 eina_stringshare_del(ic->info.generic);
5017 eina_stringshare_del(ic->info.icon);
5018 eina_stringshare_del(ic->info.link);
5019 eina_stringshare_del(ic->info.category);
5020 ic->info.label = NULL;
5021 ic->info.comment = NULL;
5022 ic->info.generic = NULL;
5023 ic->info.icon = NULL;
5024 ic->info.link = NULL;
5025 ic->info.category = NULL;
5027 if (!strncmp(ic->info.file, "|storage_", 9)) ecore_file_unlink(buf);
5031 /**************************/
5032 static E_Fm2_Region *
5033 _e_fm2_region_new(E_Fm2_Smart_Data *sd)
5037 rg = E_NEW(E_Fm2_Region, 1);
5043 _e_fm2_region_free(E_Fm2_Region *rg)
5047 EINA_LIST_FREE(rg->list, ic)
5053 _e_fm2_region_realize(E_Fm2_Region *rg)
5058 if (rg->realized) return;
5059 /* actually create evas objects etc. */
5062 EINA_LIST_FOREACH(rg->list, l, ic) _e_fm2_icon_realize(ic);
5063 EINA_LIST_FOREACH(rg->list, l, ic)
5066 evas_object_stack_below(ic->obj, ic->sd->drop);
5072 _e_fm2_region_unrealize(E_Fm2_Region *rg)
5077 if (!rg->realized) return;
5078 /* delete evas objects */
5081 EINA_LIST_FOREACH(rg->list, l, ic) _e_fm2_icon_unrealize(ic);
5086 _e_fm2_region_visible(E_Fm2_Region *rg)
5088 /* return if the icon is visible */
5090 ((rg->x - rg->sd->pos.x) < (rg->sd->w + OVERCLIP)) &&
5091 ((rg->x + rg->w - rg->sd->pos.x) > (-OVERCLIP)) &&
5092 ((rg->y - rg->sd->pos.y) < (rg->sd->h + OVERCLIP)) &&
5093 ((rg->y + rg->h - rg->sd->pos.y) > (-OVERCLIP))
5100 _e_fm2_icon_make_visible(E_Fm2_Icon *ic)
5102 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
5105 ((ic->y - ic->sd->pos.y) >= 0) &&
5106 ((ic->y + ic->h - ic->sd->pos.y) <= (ic->sd->h))
5109 if ((ic->y - ic->sd->pos.y) < 0)
5110 e_fm2_pan_set(ic->sd->obj, ic->sd->pos.x, ic->y);
5112 e_fm2_pan_set(ic->sd->obj, ic->sd->pos.x, ic->y - ic->sd->h + ic->h);
5119 ((ic->y - ic->sd->pos.y) >= 0) &&
5120 ((ic->y + ic->h + ICON_BOTTOM_SPACE - ic->sd->pos.y) <= (ic->sd->h)) &&
5121 ((ic->x - ic->sd->pos.x) >= 0) &&
5122 ((ic->x + ic->w - ic->sd->pos.x) <= (ic->sd->w))
5126 if ((ic->x - ic->sd->pos.x) < 0)
5128 else if ((ic->x + ic->w - ic->sd->pos.x) > (ic->sd->w))
5129 x = ic->x + ic->w - ic->sd->w;
5131 if ((ic->y - ic->sd->pos.y) < 0)
5133 else if ((ic->y + ic->h + ICON_BOTTOM_SPACE - ic->sd->pos.y) > (ic->sd->h))
5134 y = ic->y + ic->h + ICON_BOTTOM_SPACE - ic->sd->h;
5135 e_fm2_pan_set(ic->sd->obj, x, y);
5137 evas_object_smart_callback_call(ic->sd->obj, "pan_changed", NULL);
5141 _e_fm2_icon_desel_any(Evas_Object *obj)
5143 E_Fm2_Smart_Data *sd;
5147 sd = evas_object_smart_data_get(obj);
5149 EINA_LIST_FOREACH(sd->icons, l, ic)
5151 if (ic->selected) _e_fm2_icon_deselect(ic);
5156 _e_fm2_icon_first_selected_find(Evas_Object *obj)
5158 E_Fm2_Smart_Data *sd;
5162 sd = evas_object_smart_data_get(obj);
5163 if (!sd) return NULL;
5164 EINA_LIST_FOREACH(sd->icons, l, ic)
5166 if (ic->selected) return ic;
5172 _e_fm2_icon_sel_first(Evas_Object *obj)
5174 E_Fm2_Smart_Data *sd;
5177 sd = evas_object_smart_data_get(obj);
5179 if (!sd->icons) return;
5180 _e_fm2_icon_desel_any(obj);
5181 ic = eina_list_data_get(sd->icons);
5182 _e_fm2_icon_select(ic);
5183 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5184 _e_fm2_icon_make_visible(ic);
5188 _e_fm2_icon_sel_last(Evas_Object *obj)
5190 E_Fm2_Smart_Data *sd;
5193 sd = evas_object_smart_data_get(obj);
5195 if (!sd->icons) return;
5196 _e_fm2_icon_desel_any(obj);
5197 ic = eina_list_data_get(eina_list_last(sd->icons));
5198 _e_fm2_icon_select(ic);
5199 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5200 _e_fm2_icon_make_visible(ic);
5204 _e_fm2_icon_sel_any(Evas_Object *obj)
5206 E_Fm2_Smart_Data *sd;
5210 sd = evas_object_smart_data_get(obj);
5212 if (!sd->icons) return;
5213 EINA_LIST_FOREACH(sd->icons, l, ic)
5214 if (!ic->selected) _e_fm2_icon_select(ic);
5218 _e_fm2_icon_next_find(Evas_Object *obj, int next, int (*match_func)(E_Fm2_Icon *ic, void *data), void *data)
5220 E_Fm2_Smart_Data *sd;
5222 E_Fm2_Icon *ic, *ic_next;
5224 int x = 0, y = 0, custom = 0;
5225 int dist, min = 65535;
5227 sd = evas_object_smart_data_get(obj);
5228 if (!sd) return NULL;
5229 if (!sd->icons) return NULL;
5231 view_mode = _e_fm2_view_mode_get(sd);
5232 if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
5233 (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
5234 (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
5238 /* find selected item / current position */
5239 EINA_LIST_FOREACH(sd->icons, l, ic)
5243 if (!custom && !match_func)
5255 if (next && (custom || match_func))
5257 /* find next item in custom grid, or list/grid when match
5261 EINA_LIST_FOREACH(sd->icons, l, ic)
5264 (custom ? (ic->y >= y) : (ic->y == y)) &&
5265 (!match_func || match_func(ic, data)))
5267 dist = 2 * (ic->y - y) + (ic->x - x);
5275 /* no next item was found in row go down and begin */
5278 EINA_LIST_FOREACH(sd->icons, l, ic)
5280 if ((ic->y > y) && (!match_func || match_func(ic, data)))
5282 dist = 2 * (abs(ic->y - y)) + ic->x;
5292 /* find previous item */
5293 else if (next == -1)
5295 EINA_LIST_FOREACH(sd->icons, l, ic)
5298 (custom ? (ic->y <= y) : (ic->y == y)) &&
5299 (!match_func || match_func(ic, data)))
5301 dist = 2 * (y - ic->y) + (x - ic->x);
5309 /* no prev item was found in row go to end and up */
5312 EINA_LIST_FOREACH(sd->icons, l, ic)
5314 if ((ic->y < y) && (!match_func || match_func(ic, data)))
5316 dist = 2 * (abs(ic->y - y)) - ic->x;
5327 /* not custom, items are arranged in list order */
5332 if (!eina_list_next(l)) return NULL;
5333 ic_next = eina_list_data_get(eina_list_next(l));
5337 if (!eina_list_prev(l)) return NULL;
5338 ic_next = eina_list_data_get(eina_list_prev(l));
5346 _e_fm2_icon_sel_prev(Evas_Object *obj)
5348 E_Fm2_Icon *ic_prev;
5350 ic_prev = _e_fm2_icon_next_find(obj, -1, NULL, NULL);
5354 /* FIXME this is not the bottomright item for custom grid */
5355 _e_fm2_icon_sel_last(obj);
5358 _e_fm2_icon_desel_any(obj);
5359 _e_fm2_icon_select(ic_prev);
5360 evas_object_smart_callback_call(obj, "selection_change", NULL); /*XXX sd->obj*/
5361 _e_fm2_icon_make_visible(ic_prev);
5365 _e_fm2_icon_sel_next(Evas_Object *obj)
5367 E_Fm2_Icon *ic_next;
5369 ic_next = _e_fm2_icon_next_find(obj, 1, NULL, NULL);
5372 /* FIXME this is not the topleft item for custom grid */
5373 _e_fm2_icon_sel_first(obj);
5376 _e_fm2_icon_desel_any(obj);
5377 _e_fm2_icon_select(ic_next);
5378 evas_object_smart_callback_call(obj, "selection_change", NULL);
5379 _e_fm2_icon_make_visible(ic_next);
5383 _e_fm2_icon_sel_down(Evas_Object *obj)
5385 E_Fm2_Smart_Data *sd;
5387 E_Fm2_Icon *ic, *ic_down;
5388 int found, x = -1, y = -1, custom = 0;
5389 int dist, min = 65535;
5392 sd = evas_object_smart_data_get(obj);
5394 if (!sd->icons) return;
5396 view_mode = _e_fm2_view_mode_get(sd);
5397 if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
5398 (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
5399 (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
5405 EINA_LIST_FOREACH(sd->icons, l, ic)
5419 dist = (abs(ic->x - x)) + (ic->y - y) * 2;
5431 EINA_LIST_FOREACH(sd->icons, l, ic)
5435 dist = (abs(ic->x - x)) + (ic->y - y) * 2;
5447 if (!custom) _e_fm2_icon_sel_next(obj);
5450 _e_fm2_icon_desel_any(obj);
5451 _e_fm2_icon_select(ic_down);
5452 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5453 _e_fm2_icon_make_visible(ic_down);
5457 _e_fm2_icon_sel_up(Evas_Object *obj)
5459 E_Fm2_Smart_Data *sd;
5461 E_Fm2_Icon *ic, *ic_up;
5462 int found = 0, x = 0, y = 0, custom = 0;
5463 int dist, min = 65535;
5466 sd = evas_object_smart_data_get(obj);
5468 if (!sd->icons) return;
5470 view_mode = _e_fm2_view_mode_get(sd);
5472 if ((view_mode == E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS) ||
5473 (view_mode == E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS) ||
5474 (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS))
5479 EINA_LIST_REVERSE_FOREACH(sd->icons, l, ic)
5493 dist = (abs(ic->x - x)) + (y - ic->y) * 2;
5503 if (custom && found)
5505 EINA_LIST_FOREACH(sd->icons, l, ic)
5507 if (!ic->selected && ic->y < y)
5509 dist = (abs(ic->x - x)) + (y - ic->y) * 2;
5521 if (!custom) _e_fm2_icon_sel_prev(obj);
5524 _e_fm2_icon_desel_any(obj);
5525 _e_fm2_icon_select(ic_up);
5526 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
5527 _e_fm2_icon_make_visible(ic_up);
5530 /* FIXME: prototype */
5532 _e_fm2_typebuf_show(Evas_Object *obj)
5534 E_Fm2_Smart_Data *sd;
5536 sd = evas_object_smart_data_get(obj);
5538 E_FREE(sd->typebuf.buf);
5539 sd->typebuf.buf = strdup("");
5540 edje_object_part_text_set(sd->overlay, "e.text.typebuf_label", sd->typebuf.buf);
5541 edje_object_signal_emit(sd->overlay, "e,state,typebuf,start", "e");
5542 sd->typebuf_visible = EINA_TRUE;
5546 _e_fm2_typebuf_hide(Evas_Object *obj)
5548 E_Fm2_Smart_Data *sd;
5550 sd = evas_object_smart_data_get(obj);
5552 E_FREE(sd->typebuf.buf);
5553 edje_object_signal_emit(sd->overlay, "e,state,typebuf,stop", "e");
5554 sd->typebuf_visible = EINA_FALSE;
5559 _e_fm2_typebuf_history_prev(Evas_Object *obj)
5561 E_Fm2_Smart_Data *sd;
5563 sd = evas_object_smart_data_get(obj);
5569 _e_fm2_typebuf_history_next(Evas_Object *obj)
5571 E_Fm2_Smart_Data *sd;
5573 sd = evas_object_smart_data_get(obj);
5581 _e_fm2_inplace_open(const E_Fm2_Icon *ic)
5585 if (!((S_ISDIR(ic->info.statinfo.st_mode)) &&
5586 (ic->sd->config->view.open_dirs_in_place) &&
5587 (!ic->sd->config->view.no_subdir_jump)))
5590 if (!_e_fm2_icon_path(ic, buf, sizeof(buf)))
5593 e_fm2_path_set(ic->sd->obj, ic->sd->dev, buf);
5598 _e_fm2_typebuf_run(Evas_Object *obj)
5602 _e_fm2_typebuf_hide(obj);
5603 ic = _e_fm2_icon_first_selected_find(obj);
5606 if (_e_fm2_inplace_open(ic) == 0)
5607 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
5612 _e_fm2_typebuf_match_func(E_Fm2_Icon *ic, void *data)
5615 return ((ic->info.label) &&
5616 (e_util_glob_case_match(ic->info.label, tb))) ||
5618 (e_util_glob_case_match(ic->info.file, tb)));
5622 _e_fm_typebuf_timer_cb(void *data)
5624 Evas_Object *obj = data;
5625 E_Fm2_Smart_Data *sd;
5627 if (!data) return ECORE_CALLBACK_CANCEL;
5628 sd = evas_object_smart_data_get(obj);
5629 if (!sd) return ECORE_CALLBACK_CANCEL;
5631 if (!sd->typebuf_visible) return ECORE_CALLBACK_CANCEL;
5633 _e_fm2_typebuf_hide(obj);
5634 sd->typebuf.timer = NULL;
5636 return ECORE_CALLBACK_CANCEL;
5640 _e_fm2_typebuf_match(Evas_Object *obj, int next)
5642 E_Fm2_Smart_Data *sd;
5643 E_Fm2_Icon *ic, *ic_match = NULL;
5648 sd = evas_object_smart_data_get(obj);
5650 if (!sd->typebuf.buf) return;
5651 if (!sd->icons) return;
5653 tblen = strlen(sd->typebuf.buf);
5654 tb = malloc(tblen + 2);
5656 memcpy(tb, sd->typebuf.buf, tblen);
5658 tb[tblen + 1] = '\0';
5662 EINA_LIST_FOREACH(sd->icons, l, ic)
5664 if (_e_fm2_typebuf_match_func(ic, tb))
5673 ic_match = _e_fm2_icon_next_find(obj, next, &_e_fm2_typebuf_match_func, tb);
5678 _e_fm2_icon_desel_any(obj);
5679 _e_fm2_icon_select(ic_match);
5680 evas_object_smart_callback_call(obj, "selection_change", NULL);
5681 _e_fm2_icon_make_visible(ic_match);
5686 if (sd->typebuf.timer)
5688 ecore_timer_del(sd->typebuf.timer);
5691 sd->typebuf.timer = ecore_timer_add(5.0, _e_fm_typebuf_timer_cb, obj);
5695 _e_fm2_typebuf_complete(Evas_Object *obj)
5697 E_Fm2_Smart_Data *sd;
5699 sd = evas_object_smart_data_get(obj);
5702 _e_fm2_typebuf_match(obj, 0);
5706 _e_fm2_typebuf_char_append(Evas_Object *obj, const char *ch)
5708 E_Fm2_Smart_Data *sd;
5711 sd = evas_object_smart_data_get(obj);
5713 if (!sd->typebuf.buf) return;
5714 ts = malloc(strlen(sd->typebuf.buf) + strlen(ch) + 1);
5716 strcpy(ts, sd->typebuf.buf);
5718 free(sd->typebuf.buf);
5719 sd->typebuf.buf = ts;
5720 _e_fm2_typebuf_match(obj, 0);
5721 edje_object_part_text_set(sd->overlay, "e.text.typebuf_label", sd->typebuf.buf);
5725 _e_fm2_typebuf_char_backspace(Evas_Object *obj)
5727 E_Fm2_Smart_Data *sd;
5731 sd = evas_object_smart_data_get(obj);
5733 if (!sd->typebuf.buf) return;
5734 len = strlen(sd->typebuf.buf);
5737 _e_fm2_typebuf_hide(obj);
5740 p = evas_string_char_prev_get(sd->typebuf.buf, len, &dec);
5741 if (p >= 0) sd->typebuf.buf[p] = EINA_FALSE;
5742 ts = strdup(sd->typebuf.buf);
5744 free(sd->typebuf.buf);
5745 sd->typebuf.buf = ts;
5746 _e_fm2_typebuf_match(obj, 0);
5747 edje_object_part_text_set(sd->overlay, "e.text.typebuf_label", sd->typebuf.buf);
5750 /**************************/
5752 /* FIXME: prototype + reposition + implement */
5754 _e_fm2_dnd_drop_configure(Evas_Object *obj)
5756 E_Fm2_Smart_Data *sd;
5758 sd = evas_object_smart_data_get(obj);
5760 if (!sd->drop_icon) return;
5761 if (sd->drop_after == -1)
5763 evas_object_move(sd->drop_in,
5764 sd->x + sd->drop_icon->x - sd->pos.x,
5765 sd->y + sd->drop_icon->y - sd->pos.y);
5766 evas_object_resize(sd->drop_in, sd->drop_icon->w, sd->drop_icon->h);
5768 else if (sd->drop_after)
5770 evas_object_move(sd->drop,
5771 sd->x + sd->drop_icon->x - sd->pos.x,
5772 sd->y + sd->drop_icon->y - sd->pos.y + sd->drop_icon->h - 1);
5773 evas_object_resize(sd->drop, sd->drop_icon->w, 2);
5777 evas_object_move(sd->drop,
5778 sd->x + sd->drop_icon->x - sd->pos.x,
5779 sd->y + sd->drop_icon->y - sd->pos.y - 1);
5780 evas_object_resize(sd->drop, sd->drop_icon->w, 2);
5784 /* FIXME: prototype + reposition + implement */
5786 _e_fm2_dnd_drop_all_show(Evas_Object *obj)
5788 E_Fm2_Smart_Data *sd;
5790 sd = evas_object_smart_data_get(obj);
5794 edje_object_signal_emit(sd->drop, "e,state,unselected", "e");
5795 sd->drop_show = EINA_FALSE;
5797 if (sd->drop_in_show)
5799 edje_object_signal_emit(sd->drop_in, "e,state,unselected", "e");
5800 sd->drop_in_show = EINA_FALSE;
5804 edje_object_signal_emit(sd->overlay, "e,state,drop,start", "e");
5805 sd->drop_all = EINA_TRUE;
5807 sd->drop_icon = NULL;
5808 sd->drop_after = EINA_FALSE;
5811 /* FIXME: prototype + reposition + implement */
5813 _e_fm2_dnd_drop_all_hide(Evas_Object *obj)
5815 E_Fm2_Smart_Data *sd;
5817 sd = evas_object_smart_data_get(obj);
5821 edje_object_signal_emit(sd->overlay, "e,state,drop,stop", "e");
5822 sd->drop_all = EINA_FALSE;
5826 /* FIXME: prototype + reposition + implement */
5828 _e_fm2_dnd_drop_show(E_Fm2_Icon *ic, int after)
5832 if ((ic->sd->drop_icon == ic) &&
5833 (ic->sd->drop_after == after)) return;
5834 if (((ic->sd->drop_icon) && (!ic)) ||
5835 ((!ic->sd->drop_icon) && (ic)) ||
5836 ((after < 0) && (ic->sd->drop_after >= 0)) ||
5837 ((after >= 0) && (ic->sd->drop_after < 0)))
5839 ic->sd->drop_icon = ic;
5840 ic->sd->drop_after = after;
5843 if (ic->sd->drop_after != -1)
5845 edje_object_signal_emit(ic->sd->drop_in, "e,state,unselected", "e");
5846 edje_object_signal_emit(ic->sd->drop, "e,state,selected", "e");
5847 ic->sd->drop_in_show = EINA_FALSE;
5848 ic->sd->drop_show = EINA_TRUE;
5852 edje_object_signal_emit(ic->sd->drop, "e,state,unselected", "e");
5853 edje_object_signal_emit(ic->sd->drop_in, "e,state,selected", "e");
5854 ic->sd->drop_in_show = EINA_TRUE;
5855 ic->sd->drop_show = EINA_FALSE;
5858 _e_fm2_dnd_drop_all_hide(ic->sd->obj);
5859 _e_fm2_dnd_drop_configure(ic->sd->obj);
5862 /* FIXME: prototype + reposition + implement */
5864 _e_fm2_dnd_drop_hide(Evas_Object *obj)
5866 E_Fm2_Smart_Data *sd;
5868 sd = evas_object_smart_data_get(obj);
5872 edje_object_signal_emit(sd->drop, "e,state,unselected", "e");
5873 sd->drop_show = EINA_FALSE;
5875 if (sd->drop_in_show)
5877 edje_object_signal_emit(sd->drop_in, "e,state,unselected", "e");
5878 sd->drop_in_show = EINA_FALSE;
5880 sd->drop_icon = NULL;
5881 sd->drop_after = EINA_FALSE;
5884 /* FIXME: prototype + reposition + implement */
5886 _e_fm2_dnd_finish(Evas_Object *obj, int refresh)
5888 E_Fm2_Smart_Data *sd;
5892 sd = evas_object_smart_data_get(obj);
5894 if (!sd->drag) return;
5895 sd->drag = EINA_FALSE;
5896 EINA_LIST_FOREACH(sd->icons, l, ic)
5898 ic->drag.dnd = EINA_FALSE;
5899 ic->drag.src = EINA_FALSE;
5900 if (ic->obj) evas_object_show(ic->obj);
5901 if (ic->obj_icon) evas_object_show(ic->obj_icon);
5903 if (refresh) e_fm2_refresh(obj);
5907 _e_fm2_cb_dnd_enter(void *data __UNUSED__, const char *type, void *event)
5909 E_Event_Dnd_Enter *ev;
5911 if (type != _e_fm2_mime_text_uri_list) return;
5912 ev = (E_Event_Dnd_Enter *)event;
5913 e_drop_handler_action_set(ev->action);
5917 _e_fm2_cb_dnd_move(void *data, const char *type, void *event)
5919 E_Fm2_Smart_Data *sd;
5920 E_Event_Dnd_Move *ev;
5925 if (type != _e_fm2_mime_text_uri_list) return;
5926 ev = (E_Event_Dnd_Move *)event;
5927 e_drop_handler_action_set(ev->action);
5928 EINA_LIST_FOREACH(sd->icons, l, ic)
5930 if (E_INSIDE(ev->x, ev->y, ic->x - ic->sd->pos.x, ic->y - ic->sd->pos.y, ic->w, ic->h))
5932 if (ic->drag.dnd) continue;
5934 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
5936 /* if there is a .order file - we can re-order files */
5937 if (ic->sd->order_file)
5940 if ((S_ISDIR(ic->info.statinfo.st_mode)) &&
5941 (!ic->sd->config->view.no_subdir_drop))
5943 /* if bottom 25% or top 25% then insert between prev or next */
5944 /* if in middle 50% then put in dir */
5945 if (ev->y <= (ic->y - ic->sd->pos.y + (ic->h / 4)))
5947 _e_fm2_dnd_drop_show(ic, 0);
5949 else if (ev->y > (ic->y - ic->sd->pos.y + ((ic->h * 3) / 4)))
5951 _e_fm2_dnd_drop_show(ic, 1);
5955 _e_fm2_dnd_drop_show(ic, -1);
5960 /* if top 50% or bottom 50% then insert between prev or next */
5961 if (ev->y <= (ic->y - ic->sd->pos.y + (ic->h / 2)))
5962 _e_fm2_dnd_drop_show(ic, 0);
5964 _e_fm2_dnd_drop_show(ic, 1);
5967 /* if we are over subdirs or files */
5971 * if it's over a dir - hilight as it will be dropped info
5972 * FIXME: should there be a separate highlighting function for files?
5974 if (!(S_ISDIR(ic->info.statinfo.st_mode)) ||
5975 (!ic->sd->config->view.no_subdir_drop))
5976 _e_fm2_dnd_drop_show(ic, -1);
5981 /* if it's over a dir - hilight as it will be dropped in */
5982 if (!(S_ISDIR(ic->info.statinfo.st_mode)) ||
5983 (!ic->sd->config->view.no_subdir_drop))
5984 _e_fm2_dnd_drop_show(ic, -1);
5989 /* FIXME: not over icon - is it within the fm view? if so drop there */
5990 if (E_INSIDE(ev->x, ev->y, 0, 0, sd->w, sd->h))
5992 /* if listview - it is now after last file */
5993 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
5995 /* if there is a .order file - we can re-order files */
5998 ic = eina_list_data_get(eina_list_last(sd->icons));
6002 _e_fm2_dnd_drop_show(ic, 1);
6004 _e_fm2_dnd_drop_all_show(sd->obj);
6007 _e_fm2_dnd_drop_all_show(sd->obj);
6010 _e_fm2_dnd_drop_all_show(sd->obj);
6013 _e_fm2_dnd_drop_all_show(sd->obj);
6016 /* outside fm view */
6017 _e_fm2_dnd_drop_hide(sd->obj);
6021 _e_fm2_cb_dnd_leave(void *data, const char *type, void *event __UNUSED__)
6023 E_Fm2_Smart_Data *sd;
6026 if (type != _e_fm2_mime_text_uri_list) return;
6027 _e_fm2_dnd_drop_hide(sd->obj);
6028 _e_fm2_dnd_drop_all_hide(sd->obj);
6032 _e_fm_file_reorder(const char *file, const char *dst, const char *relative, int after)
6034 unsigned int length = strlen(file) + 1 + strlen(dst) + 1 + strlen(relative) + 1 + sizeof(after);
6037 data = alloca(length);
6042 #define P(s) memcpy(p, s, strlen(s) + 1); p += strlen(s) + 1
6048 memcpy(p, &after, sizeof(int));
6050 _e_fm_client_send_new(E_FM_OP_REORDER, data, length);
6054 _e_fm_icon_save_position(const char *file, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
6056 E_Fm2_Custom_File *cf, new;
6060 cf = e_fm2_custom_file_get(file);
6063 memset(&new, 0, sizeof(E_Fm2_Custom_File));
6073 e_fm2_custom_file_set(file, cf);
6074 e_fm2_custom_file_flush();
6077 struct e_fm_drop_menu_data
6084 _e_fm_drop_menu_copy_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6086 struct e_fm_drop_menu_data *d = data;
6088 _e_fm_client_file_copy(d->args, d->e_fm);
6092 _e_fm_drop_menu_move_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6094 struct e_fm_drop_menu_data *d = data;
6096 _e_fm_client_file_move(d->args, d->e_fm);
6100 _e_fm_drop_menu_symlink_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6102 struct e_fm_drop_menu_data *d = data;
6104 _e_fm_client_file_symlink(d->args, d->e_fm);
6108 _e_fm_drop_menu_abort_cb(void *data __UNUSED__, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
6113 _e_fm_drop_menu_free(void *data)
6115 struct e_fm_drop_menu_data *d = e_object_data_get(data);
6122 _e_fm_drop_menu(char *args, Evas_Object *e_fm)
6124 struct e_fm_drop_menu_data *d;
6125 E_Menu *menu = e_menu_new();
6126 E_Menu_Item *item = NULL;
6127 E_Manager *man = NULL;
6128 E_Container *con = NULL;
6129 E_Zone *zone = NULL;
6134 d = malloc(sizeof(*d));
6137 e_object_del(E_OBJECT(menu));
6144 e_object_data_set(E_OBJECT(menu), d);
6145 e_object_free_attach_func_set(E_OBJECT(menu), _e_fm_drop_menu_free);
6147 item = e_menu_item_new(menu);
6148 e_menu_item_label_set(item, _("Copy"));
6149 e_menu_item_callback_set(item, _e_fm_drop_menu_copy_cb, d);
6150 e_util_menu_item_theme_icon_set(item, "edit-copy");
6152 item = e_menu_item_new(menu);
6153 e_menu_item_label_set(item, _("Move"));
6154 e_menu_item_callback_set(item, _e_fm_drop_menu_move_cb, d);
6155 e_menu_item_icon_edje_set(item,
6156 e_theme_edje_file_get("base/theme/fileman",
6157 "e/fileman/default/button/move"),
6158 "e/fileman/default/button/move");
6160 item = e_menu_item_new(menu);
6161 e_menu_item_label_set(item, _("Link"));
6162 e_menu_item_callback_set(item, _e_fm_drop_menu_symlink_cb, d);
6163 e_util_menu_item_theme_icon_set(item, "emblem-symbolic-link");
6165 item = e_menu_item_new(menu);
6166 e_menu_item_separator_set(item, 1);
6168 item = e_menu_item_new(menu);
6169 e_menu_item_label_set(item, _("Abort"));
6170 e_menu_item_callback_set(item, _e_fm_drop_menu_abort_cb, d);
6171 e_menu_item_icon_edje_set(item,
6172 e_theme_edje_file_get("base/theme/fileman",
6173 "e/fileman/default/button/abort"),
6174 "e/fileman/default/button/abort");
6176 man = e_manager_current_get();
6177 if (!man) goto error;
6178 con = e_container_current_get(man);
6179 if (!con) goto error;
6180 ecore_x_pointer_xy_get(con->win, &x, &y);
6181 zone = e_util_zone_current_get(man);
6182 if (!zone) goto error;
6183 e_menu_activate_mouse(menu, zone, x, y, 1, 1, E_MENU_POP_DIRECTION_DOWN, 0);
6186 e_object_del(E_OBJECT(menu));
6190 _e_fm2_cb_dnd_drop(void *data, const char *type, void *event)
6192 E_Fm2_Smart_Data *sd;
6193 E_Event_Dnd_Drop *ev;
6195 Eina_List *fsel, *l, *ll, *il, *isel;
6198 Evas_Coord ox, oy, x, y;
6199 int adjust_icons = 0;
6201 char dirpath[PATH_MAX];
6207 if (type != _e_fm2_mime_text_uri_list) return;
6208 ev = (E_Event_Dnd_Drop *)event;
6210 fsel = _e_fm2_uri_path_list_get(ev->data);
6211 isel = _e_fm2_uri_icon_list_get(fsel);
6214 EINA_LIST_FOREACH(isel, l, ic)
6216 if (ic && ic->drag.src)
6225 * if drop file prefix path matches extra_file_source then it can be
6226 * and indirect link - dont MOVE the file just add filename to list.
6227 * if not literally move the file in. if move can't work - try a copy.
6228 * on a literal move find any fm views for the dir of the dropped file
6229 * and refresh those, as well as refresh current target fm dir
6231 if (sd->drop_all) /* drop arbitrarily into the dir */
6233 /* move file into this fm dir */
6234 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6236 ic = eina_list_data_get(il);
6237 fp = eina_list_data_get(ll);
6240 if ((ic) && (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS))
6242 /* dnd doesn't tell me all the co-ords of the icons being dragged so i can't place them accurately.
6243 * need to fix this. ev->data probably needs to become more compelx than a list of url's
6245 x = ev->x + (ic->x - ox) - ic->drag.x + sd->pos.x;
6246 y = ev->y + (ic->y - oy) - ic->drag.y + sd->pos.y;
6251 if (sd->config->view.fit_custom_pos)
6253 if ((x + ic->w) > sd->w) x = (sd->w - ic->w);
6254 if ((y + ic->h) > sd->h) y = (sd->h - ic->h);
6261 ic->saved_pos = EINA_TRUE;
6265 snprintf(buf, sizeof(buf), "%s/%s",
6266 sd->realpath, ecore_file_file_get(fp));
6267 _e_fm_icon_save_position(buf, x, y, sd->w, sd->h);
6270 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6271 args = _e_fm_string_append_char(args, &size, &length, ' ');
6273 eina_stringshare_del(fp);
6279 EINA_LIST_FOREACH(sd->icons, l, ic)
6281 if ((ic->x + ic->w) > sd->max.w) sd->max.w = ic->x + ic->w;
6282 if ((ic->y + ic->h) > sd->max.h) sd->max.h = ic->y + ic->h;
6284 _e_fm2_obj_icons_place(sd);
6285 evas_object_smart_callback_call(sd->obj, "changed", NULL);
6288 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
6290 else if (sd->drop_icon) /* into or before/after an icon */
6292 if (sd->drop_after == -1) /* put into subdir/file in icon */
6294 /* move file into dir that this icon is for */
6295 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6297 fp = eina_list_data_get(ll);
6300 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6301 args = _e_fm_string_append_char(args, &size, &length, ' ');
6303 eina_stringshare_del(fp);
6306 if (S_ISDIR(sd->drop_icon->info.statinfo.st_mode))
6307 snprintf(dirpath, sizeof(dirpath), "%s/%s", sd->realpath, sd->drop_icon->info.file);
6309 snprintf(dirpath, sizeof(dirpath), "%s", sd->realpath);
6311 args = _e_fm_string_append_quoted(args, &size, &length, dirpath);
6315 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST && sd->order_file) /* list */
6317 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6319 fp = eina_list_data_get(ll);
6321 snprintf(buf, sizeof(buf), "%s/%s",
6322 sd->realpath, ecore_file_file_get(fp));
6323 if (sd->config->view.link_drop)
6325 _e_fm2_client_file_symlink(buf, fp, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->h, sd->h, sd->obj);
6329 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6330 args = _e_fm_string_append_char(args, &size, &length, ' ');
6333 _e_fm_file_reorder(ecore_file_file_get(fp), sd->realpath, sd->drop_icon->info.file, sd->drop_after);
6335 eina_stringshare_del(fp);
6338 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
6342 for (ll = fsel, il = isel; ll && il; ll = eina_list_next(ll), il = eina_list_next(il))
6344 fp = eina_list_data_get(ll);
6347 args = _e_fm_string_append_quoted(args, &size, &length, fp);
6348 args = _e_fm_string_append_char(args, &size, &length, ' ');
6350 eina_stringshare_del(fp);
6352 args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath);
6359 if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_COPY)
6361 _e_fm_client_file_copy(args, sd->obj);
6364 else if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_MOVE)
6366 _e_fm_client_file_move(args, sd->obj);
6369 else if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_ASK)
6371 _e_fm_drop_menu(args, sd->obj);
6375 _e_fm2_dnd_drop_hide(sd->obj);
6376 _e_fm2_dnd_drop_all_hide(sd->obj);
6377 _e_fm2_list_walking++;
6379 EINA_LIST_FOREACH(_e_fm2_list, l, obj)
6381 if ((_e_fm2_list_walking > 0) &&
6382 (eina_list_data_find(_e_fm2_list_remove, obj))) continue;
6383 _e_fm2_dnd_finish(obj, 0);
6385 _e_fm2_list_walking--;
6386 if (_e_fm2_list_walking == 0)
6388 EINA_LIST_FREE(_e_fm2_list_remove, obj)
6390 _e_fm2_list = eina_list_remove(_e_fm2_list, obj);
6393 eina_list_free(fsel);
6394 eina_list_free(isel);
6397 /* FIXME: prototype */
6399 _e_fm2_mouse_1_handler(E_Fm2_Icon *ic, int up, void *evas_event)
6401 Evas_Event_Mouse_Down *ed = NULL;
6402 Evas_Event_Mouse_Up *eu = NULL;
6403 Evas_Modifier *modifiers;
6404 int multi_sel = 0, range_sel = 0, sel_change = 0;
6405 static unsigned int down_timestamp = 0;
6407 if (!evas_event) return;
6412 modifiers = ed->modifiers;
6417 modifiers = eu->modifiers;
6419 if (ed && ic->sd->config->view.single_click_delay)
6420 down_timestamp = ed->timestamp;
6422 if (ic->sd->config->selection.windows_modifiers)
6424 if (evas_key_modifier_is_set(modifiers, "Shift"))
6426 else if (evas_key_modifier_is_set(modifiers, "Control"))
6431 if (evas_key_modifier_is_set(modifiers, "Control"))
6433 else if (evas_key_modifier_is_set(modifiers, "Shift"))
6436 if (ic->sd->config->selection.single)
6443 * On mouse up, check if we want to do inplace open
6448 (ic->sd->config->view.single_click) &&
6449 ((eu->timestamp - down_timestamp) > ic->sd->config->view.single_click_delay))
6451 if (_e_fm2_inplace_open(ic) == 1) return;
6459 /* find last selected - if any, and select all icons between */
6460 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
6462 if (ic2 == ic) seen = 1;
6463 if (ic2->last_selected)
6465 ic2->last_selected = 0;
6468 EINA_LIST_REVERSE_FOREACH(l, l, ic2)
6470 if (ic == ic2) break;
6471 if (!ic2->selected) sel_change = 1;
6472 _e_fm2_icon_select(ic2);
6473 ic2->last_selected = 0;
6478 EINA_LIST_FOREACH(l, l, ic2)
6480 if (ic == ic2) break;
6481 if (!ic2->selected) sel_change = 1;
6482 _e_fm2_icon_select(ic2);
6483 ic2->last_selected = 0;
6490 else if ((!multi_sel) && ((up) || ((!up) && (!ic->selected))))
6495 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
6501 _e_fm2_icon_deselect(ic2);
6513 EINA_LIST_FOREACH(ic->sd->icons, l, ic2)
6514 ic2->last_selected = 0;
6517 if ((multi_sel) && (ic->selected))
6519 if ((up) && (!ic->drag.dnd) && (!ic->down_sel))
6522 _e_fm2_icon_deselect(ic);
6529 if (!ic->selected) sel_change = EINA_TRUE;
6530 _e_fm2_icon_select(ic);
6531 _e_fm2_icon_make_visible(ic);
6532 ic->down_sel = EINA_TRUE;
6533 ic->last_selected = EINA_TRUE;
6537 evas_object_smart_callback_call(ic->sd->obj, "selection_change", NULL);
6538 if (ic->sd->config->view.single_click)
6540 if (eu && (eu->timestamp - down_timestamp) > ic->sd->config->view.single_click_delay)
6542 int icon_pos_x = ic->x + ic->sd->x - ic->sd->pos.x;
6543 int icon_pos_y = ic->y + ic->sd->y - ic->sd->pos.y;
6545 if (eu->output.x >= icon_pos_x && eu->output.x <= (icon_pos_x + ic->w) &&
6546 eu->output.y >= icon_pos_y && eu->output.y <= (icon_pos_y + ic->h))
6547 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
6553 _e_fm2_cb_icon_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
6555 Evas_Event_Mouse_Down *ev;
6561 if (ic->entry_widget)
6564 if ((ev->button == 1) && (ev->flags & EVAS_BUTTON_DOUBLE_CLICK))
6566 /* if its a directory && open dirs in-place is set then change the dir
6567 * to be the dir + file */
6568 if (_e_fm2_inplace_open(ic) == 0)
6569 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
6570 /* if its in file selector mode then signal that a selection has
6571 * taken place and dont do anything more */
6573 /* do the below per selected file */
6574 /* if its a directory and open dirs in-place is not set, then
6575 * signal owner that a new dir should be opened */
6576 /* if its a normal file - do what the mime type says to do with
6579 else if (ev->button == 1)
6583 ic->drag.x = ev->output.x - ic->x - ic->sd->x + ic->sd->pos.x;
6584 ic->drag.y = ev->output.y - ic->y - ic->sd->y + ic->sd->pos.y;
6585 ic->drag.start = EINA_TRUE;
6586 ic->drag.dnd = EINA_FALSE;
6587 ic->drag.src = EINA_TRUE;
6589 _e_fm2_mouse_1_handler(ic, 0, ev);
6591 else if (ev->button == 3)
6593 if (!ic->selected) _e_fm2_mouse_1_handler(ic, 0, ev);
6594 _e_fm2_icon_menu(ic, ic->sd->obj, ev->timestamp);
6599 _e_fm2_cb_icon_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
6601 Evas_Event_Mouse_Up *ev;
6607 if (ic->entry_widget) return;
6609 if ((ev->button == 1) && (!ic->drag.dnd))
6611 if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
6612 _e_fm2_mouse_1_handler(ic, 1, ev);
6613 ic->drag.start = EINA_FALSE;
6614 ic->drag.dnd = EINA_FALSE;
6615 ic->drag.src = EINA_FALSE;
6616 ic->down_sel = EINA_FALSE;
6621 _e_fm2_cb_drag_finished(E_Drag *drag, int dropped __UNUSED__)
6625 char buf[PATH_MAX * 3 + 7];
6629 memset(buf, 0, sizeof(buf));
6630 for (p = drag->data, i = 0; p && *p != '\0'; p++, i++)
6636 uri = _e_fm2_uri_parse(buf);
6637 memset(buf, 0, sizeof(buf));
6640 fm = _e_fm2_file_fm2_find(uri->path);
6646 file = ecore_file_file_get(uri->path);
6647 ic = _e_fm2_icon_find(fm, file);
6648 ic->drag.dnd = EINA_FALSE;
6649 if (ic->obj) evas_object_show(ic->obj);
6650 if (ic->obj_icon) evas_object_show(ic->obj_icon);
6653 if (uri->hostname) eina_stringshare_del(uri->hostname);
6654 eina_stringshare_del(uri->path);
6664 _e_fm_drag_key_down_cb(E_Drag *drag, Ecore_Event_Key *e)
6666 if (!strncmp(e->keyname, "Alt", 3))
6668 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_ASK);
6669 edje_object_signal_emit(drag->object, "e,state,ask", "e");
6671 else if (!strncmp(e->keyname, "Shift", 5))
6673 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6674 edje_object_signal_emit(drag->object, "e,state,move", "e");
6676 else if (!strncmp(e->keyname, "Control", 7))
6678 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_COPY);
6679 edje_object_signal_emit(drag->object, "e,state,copy", "e");
6684 _e_fm_drag_key_up_cb(E_Drag *drag, Ecore_Event_Key *e)
6686 /* Default action would be move. ;) */
6688 if (!strncmp(e->keyname, "Alt", 3))
6689 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6690 else if (!strncmp(e->keyname, "Shift", 5))
6691 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6692 else if (!strncmp(e->keyname, "Control", 7))
6693 ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
6695 edje_object_signal_emit(drag->object, "e,state,move", "e");
6699 _e_fm2_cb_icon_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
6701 Evas_Event_Mouse_Move *ev;
6703 E_Fm2_Icon_Info *ici;
6708 if (ic->entry_widget) return;
6710 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
6711 if ((ic->drag.start) && (ic->sd->eobj))
6715 dx = ev->cur.output.x - (ic->drag.x + ic->x + ic->sd->x - ic->sd->pos.x);
6716 dy = ev->cur.output.y - (ic->drag.y + ic->y + ic->sd->y - ic->sd->pos.y);
6717 if (((dx * dx) + (dy * dy)) >
6718 (e_config->drag_resist * e_config->drag_resist))
6721 Evas_Object *o, *o2;
6722 Evas_Coord x, y, w, h;
6723 const char *drag_types[] = { "text/uri-list" }, *realpath;
6724 char buf[PATH_MAX + 8], *p, *sel = NULL;
6725 E_Container *con = NULL;
6727 int sel_length = 0, p_offset, p_length;
6729 switch (ic->sd->eobj->type)
6732 con = ((E_Gadcon *)(ic->sd->eobj))->zone->container;
6736 con = ((E_Win *)(ic->sd->eobj))->container;
6740 con = ((E_Zone *)(ic->sd->eobj))->container;
6744 con = ((E_Border *)(ic->sd->eobj))->zone->container;
6748 con = ((E_Popup *)(ic->sd->eobj))->zone->container;
6751 /* FIXME: add more types as needed */
6756 ic->sd->drag = EINA_TRUE;
6757 ic->drag.dnd = EINA_TRUE;
6758 if (ic->obj) evas_object_hide(ic->obj);
6759 if (ic->obj_icon) evas_object_hide(ic->obj_icon);
6760 ic->drag.start = EINA_FALSE;
6761 evas_object_geometry_get(ic->obj, &x, &y, &w, &h);
6762 realpath = e_fm2_real_path_get(ic->sd->obj);
6763 p_offset = eina_strlcpy(buf, realpath, sizeof(buf));
6764 if ((p_offset < 1) || (p_offset >= (int)sizeof(buf) - 2)) return;
6765 if (buf[p_offset - 1] != '/')
6767 buf[p_offset] = '/';
6771 p_length = sizeof(buf) - p_offset - 1;
6773 sl = e_fm2_selected_list_get(ic->sd->obj);
6774 EINA_LIST_FREE(sl, ici)
6780 if ((int)eina_strlcpy(p, ici->file, p_length) >= p_length)
6782 s = _e_fm2_uri_escape(buf);
6785 tmp = realloc(sel, sel_length + s_len + 2 + 1);
6793 memcpy(sel + sel_length, s, s_len);
6794 memcpy(sel + sel_length + s_len, "\r\n", 2);
6795 sel_length += s_len + 2;
6796 eina_stringshare_del(s);
6798 ici->ic->drag.dnd = EINA_TRUE;
6799 if (ici->ic->obj) evas_object_hide(ici->ic->obj);
6800 if (ici->ic->obj_icon) evas_object_hide(ici->ic->obj_icon);
6803 sel[sel_length] = '\0';
6805 d = e_drag_new(con, x, y, drag_types, 1,
6806 sel, sel_length, NULL, _e_fm2_cb_drag_finished);
6807 o = edje_object_add(e_drag_evas_get(d));
6808 if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
6810 if (ic->sd->config->icon.fixed.w)
6813 _e_fm2_theme_edje_object_set(ic->sd, o,
6814 "base/theme/widgets",
6817 _e_fm2_theme_edje_object_set(ic->sd, o,
6818 "base/theme/widgets",
6824 _e_fm2_theme_edje_object_set(ic->sd, o,
6825 "base/theme/widgets",
6826 "list_odd/variable");
6828 _e_fm2_theme_edje_object_set(ic->sd, o,
6829 "base/theme/widgets",
6835 if (ic->sd->config->icon.fixed.w)
6836 _e_fm2_theme_edje_object_set(ic->sd, o,
6837 "base/theme/fileman",
6840 _e_fm2_theme_edje_object_set(ic->sd, o,
6841 "base/theme/fileman",
6844 _e_fm2_icon_label_set(ic, o);
6845 o2 = _e_fm2_icon_icon_direct_set(ic, o,
6846 _e_fm2_cb_icon_thumb_dnd_gen, o,
6848 edje_object_signal_emit(o, "e,state,selected", "e");
6849 edje_object_signal_emit(o2, "e,state,selected", "e");
6850 e_drag_object_set(d, o);
6851 edje_object_signal_emit(o, "e,state,move", "e");
6852 e_drag_resize(d, w, h);
6854 e_drag_key_down_cb_set(d, _e_fm_drag_key_down_cb);
6855 e_drag_key_up_cb_set(d, _e_fm_drag_key_up_cb);
6857 e_drag_xdnd_start(d,
6858 ic->drag.x + ic->x + ic->sd->x - ic->sd->pos.x,
6859 ic->drag.y + ic->y + ic->sd->y - ic->sd->pos.y);
6865 _e_fm2_cb_icon_thumb_dnd_gen(void *data, Evas_Object *obj, void *event_info __UNUSED__)
6868 Evas_Coord w = 0, h = 0;
6872 e_icon_size_get(obj, &w, &h);
6873 have_alpha = e_icon_alpha_get(obj);
6874 // if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
6876 edje_extern_object_aspect_set(obj, EDJE_ASPECT_CONTROL_BOTH, w, h);
6878 edje_object_part_swallow(o, "e.swallow.icon", obj);
6880 edje_object_signal_emit(o, "e,action,thumb,gen,alpha", "e");
6882 edje_object_signal_emit(o, "e,action,thumb,gen", "e");
6886 _e_fm2_cb_icon_thumb_gen(void *data, Evas_Object *obj, void *event_info __UNUSED__)
6893 Evas_Coord w = 0, h = 0;
6896 e_icon_size_get(obj, &w, &h);
6897 have_alpha = e_icon_alpha_get(obj);
6898 // if (_e_fm2_view_mode_get(ic->sd) == E_FM2_VIEW_MODE_LIST)
6900 edje_extern_object_aspect_set(obj,
6901 EDJE_ASPECT_CONTROL_BOTH, w, h);
6903 edje_object_part_swallow(ic->obj, "e.swallow.icon", obj);
6905 edje_object_signal_emit(ic->obj, "e,action,thumb,gen,alpha", "e");
6907 edje_object_signal_emit(ic->obj, "e,action,thumb,gen", "e");
6912 _e_fm2_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info)
6914 Evas_Event_Key_Down *ev;
6915 E_Fm2_Smart_Data *sd;
6921 if (sd->iop_icon) return;
6923 if (evas_key_modifier_is_set(ev->modifiers, "Control"))
6925 if (!strcmp(ev->key, "x"))
6927 _e_fm2_file_cut(obj);
6930 else if (!strcmp(ev->key, "c"))
6932 _e_fm2_file_copy(obj);
6935 else if (!strcmp(ev->key, "v"))
6937 _e_fm2_file_paste(obj);
6940 else if (!strcmp(ev->key, "h"))
6942 if (sd->show_hidden_files)
6943 sd->show_hidden_files = EINA_FALSE;
6945 sd->show_hidden_files = EINA_TRUE;
6946 sd->inherited_dir_props = EINA_FALSE;
6947 _e_fm2_refresh(data, NULL, NULL);
6950 else if (!strcmp(ev->key, "1"))
6952 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_GRID_ICONS)
6954 sd->view_mode = E_FM2_VIEW_MODE_GRID_ICONS;
6955 sd->inherited_dir_props = EINA_FALSE;
6956 _e_fm2_refresh(sd, NULL, NULL);
6959 else if (!strcmp(ev->key, "2"))
6961 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
6963 sd->view_mode = E_FM2_VIEW_MODE_LIST;
6964 sd->inherited_dir_props = EINA_FALSE;
6965 _e_fm2_refresh(sd, NULL, NULL);
6968 else if (!strcmp(ev->key, "3"))
6970 if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS)
6972 sd->view_mode = E_FM2_VIEW_MODE_CUSTOM_ICONS;
6973 sd->inherited_dir_props = EINA_FALSE;
6974 _e_fm2_refresh(sd, NULL, NULL);
6979 if (!strcmp(ev->key, "Left"))
6981 /* FIXME: icon mode, typebuf extras */
6982 /* list mode: scroll left n pix
6983 * icon mode: prev icon
6984 * typebuf mode: cursor left
6986 _e_fm2_icon_sel_prev(obj);
6988 else if (!strcmp(ev->key, "Right"))
6990 /* FIXME: icon mode, typebuf extras */
6991 /* list mode: scroll right n pix
6992 * icon mode: next icon
6993 * typebuf mode: cursor right
6995 _e_fm2_icon_sel_next(obj);
6997 else if (!strcmp(ev->key, "Up"))
6999 if (sd->typebuf_visible)
7000 /* FIXME: icon mode, typebuf extras */
7001 /* is there a way to use this atm? */
7002 // _e_fm2_typebuf_history_prev(obj);
7003 _e_fm2_typebuf_match(obj, -1);
7004 else if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
7005 _e_fm2_icon_sel_prev(obj);
7007 _e_fm2_icon_sel_up(obj);
7009 else if (!strcmp(ev->key, "Down"))
7011 if (sd->typebuf_visible)
7012 /* FIXME: icon mode, typebuf extras */
7013 /* is there a way to use this? */
7014 //_e_fm2_typebuf_history_next(obj);
7015 _e_fm2_typebuf_match(obj, 1);
7016 else if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST)
7017 _e_fm2_icon_sel_next(obj);
7019 _e_fm2_icon_sel_down(obj);
7021 else if (!strcmp(ev->key, "Home"))
7023 /* FIXME: typebuf extras */
7025 * typebuf mode: cursor to start
7027 _e_fm2_icon_sel_first(obj);
7029 else if (!strcmp(ev->key, "End"))
7031 /* FIXME: typebuf extras */
7033 * typebuf mode: cursor to end
7035 _e_fm2_icon_sel_last(obj);
7037 else if (!strcmp(ev->key, "Prior"))
7039 /* up h * n pixels */
7040 e_fm2_pan_set(obj, sd->pos.x, sd->pos.y - sd->h);
7041 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7043 else if (!strcmp(ev->keyname, "Next"))
7045 /* down h * n pixels */
7046 e_fm2_pan_set(obj, sd->pos.x, sd->pos.y + sd->h);
7047 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7049 else if (!strcmp(ev->key, "Escape"))
7051 /* typebuf mode: end typebuf mode */
7052 if (sd->typebuf_visible)
7053 _e_fm2_typebuf_hide(obj);
7056 ic = _e_fm2_icon_first_selected_find(obj);
7058 _e_fm2_icon_desel_any(obj);
7061 if (e_fm2_has_parent_get(obj))
7062 e_fm2_parent_go(obj);
7066 else if (!strcmp(ev->key, "Return"))
7068 /* if selected - select callback.
7069 * typebuf mode: if nothing selected - run cmd
7071 if (sd->typebuf_visible)
7072 _e_fm2_typebuf_run(obj);
7075 ic = _e_fm2_icon_first_selected_find(obj);
7078 if (_e_fm2_inplace_open(ic) == 0)
7079 evas_object_smart_callback_call(ic->sd->obj, "selected", NULL);
7083 else if (!strcmp(ev->key, "Insert"))
7085 /* dunno what to do with this yet */
7087 else if (!strcmp(ev->key, "Tab"))
7089 /* typebuf mode: tab complete */
7090 if (sd->typebuf_visible)
7091 _e_fm2_typebuf_complete(obj);
7093 else if (!strcmp(ev->key, "BackSpace"))
7095 /* typebuf mode: backspace */
7096 if (sd->typebuf_visible)
7097 _e_fm2_typebuf_char_backspace(obj);
7100 if (e_fm2_has_parent_get(obj))
7101 e_fm2_parent_go(obj);
7104 else if (!strcmp(ev->key, "Delete"))
7106 /* FIXME: typebuf extras */
7107 if (sd->typebuf_visible)
7108 { /* typebuf mode: delete */ }else
7109 _e_fm2_file_delete(obj);
7111 else if (!evas_key_modifier_is_set(ev->modifiers, "Control") &&
7112 !evas_key_modifier_is_set(ev->modifiers, "Alt"))
7116 if (!sd->typebuf_visible) _e_fm2_typebuf_show(obj);
7117 _e_fm2_typebuf_char_append(obj, ev->string);
7123 _e_fm2_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
7125 Evas_Event_Mouse_Down *ev;
7126 E_Fm2_Smart_Data *sd;
7130 if (ev->button == 1)
7133 int multi_sel = 0, range_sel = 0, sel_change = 0;
7135 if (sd->config->selection.windows_modifiers)
7137 if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
7139 else if (evas_key_modifier_is_set(ev->modifiers, "Control"))
7144 if (evas_key_modifier_is_set(ev->modifiers, "Control"))
7146 else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
7149 if (sd->config->selection.single)
7154 if ((!multi_sel) && (!range_sel))
7157 EINA_LIST_FOREACH(sd->icons, l, ic)
7161 _e_fm2_icon_deselect(ic);
7167 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
7169 if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
7171 if (!sd->config->selection.single)
7173 sd->selrect.ox = ev->canvas.x;
7174 sd->selrect.oy = ev->canvas.y;
7175 sd->selecting = EINA_TRUE;
7179 else if (ev->button == 3)
7181 _e_fm2_menu(sd->obj, ev->timestamp);
7186 _e_fm2_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
7188 E_Fm2_Smart_Data *sd;
7191 sd->selecting = EINA_FALSE;
7194 evas_object_hide(sd->sel_rect);
7198 _e_fm2_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
7200 Evas_Event_Mouse_Move *ev;
7201 E_Fm2_Smart_Data *sd;
7202 Eina_List *l = NULL;
7208 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
7212 sd->selecting = EINA_FALSE;
7215 evas_object_hide(sd->sel_rect);
7219 if (!sd->selecting) return;
7221 if (ev->cur.canvas.x < sd->selrect.ox)
7223 sd->selrect.x = ev->cur.canvas.x;
7224 sd->selrect.w = (sd->selrect.ox - sd->selrect.x);
7228 sd->selrect.x = MIN(sd->selrect.ox, ev->cur.canvas.x);
7229 sd->selrect.w = abs(sd->selrect.x - ev->cur.canvas.x);
7231 if (ev->cur.canvas.y < sd->selrect.oy)
7233 sd->selrect.y = ev->cur.canvas.y;
7234 sd->selrect.h = (sd->selrect.oy - sd->selrect.y);
7238 sd->selrect.y = MIN(sd->selrect.oy, ev->cur.canvas.y);
7239 sd->selrect.h = abs(sd->selrect.y - ev->cur.canvas.y);
7241 _e_fm2_sel_rect_update(sd);
7243 evas_object_geometry_get(sd->sel_rect, &x, &y, &w, &h);
7246 * Leave commented for now. Start of scrolling the sel_rect
7251 if ((x - sd->pos.x) < 0)
7253 else if ((x + w - sd->pos.x) > (sd->w))
7256 if ((y - sd->pos.y) < 0)
7258 else if ((y + h - sd->pos.y) > (sd->h))
7260 e_fm2_pan_set(sd->obj, nx, ny);
7261 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7265 EINA_LIST_FOREACH(sd->icons, l, ic)
7268 int ix_t, iy_t, iw_t, ih_t;
7271 evas_object_geometry_get(ic->obj_icon, &ix, &iy, &iw, &ih);
7272 evas_object_geometry_get(edje_object_part_object_get(ic->obj,
7274 &ix_t, &iy_t, &iw_t, &ih_t);
7275 if (E_INTERSECTS(x, y, w, h, ix, iy, iw, ih) ||
7276 E_INTERSECTS(x, y, w, h, ix_t, iy_t, iw_t, ih_t))
7280 _e_fm2_icon_select(ic);
7288 _e_fm2_icon_deselect(ic);
7294 evas_object_smart_callback_call(sd->obj, "selection_change", NULL);
7298 _e_fm2_sel_rect_update(void *data)
7300 E_Fm2_Smart_Data *sd;
7303 evas_object_move(sd->sel_rect, sd->selrect.x, sd->selrect.y);
7304 evas_object_resize(sd->sel_rect, sd->selrect.w, sd->selrect.h);
7305 evas_object_show(sd->sel_rect);
7309 _e_fm2_cb_scroll_job(void *data)
7311 E_Fm2_Smart_Data *sd;
7313 sd = evas_object_smart_data_get(data);
7315 sd->scroll_job = NULL;
7316 evas_event_freeze(evas_object_evas_get(sd->obj));
7318 _e_fm2_regions_eval(sd->obj);
7319 _e_fm2_obj_icons_place(sd);
7321 evas_event_thaw(evas_object_evas_get(sd->obj));
7322 _e_fm2_dir_save_props(sd);
7326 _e_fm2_cb_resize_job(void *data)
7328 E_Fm2_Smart_Data *sd;
7331 sd = evas_object_smart_data_get(data);
7333 sd->resize_job = NULL;
7334 evas_event_freeze(evas_object_evas_get(sd->obj));
7336 switch (_e_fm2_view_mode_get(sd))
7338 case E_FM2_VIEW_MODE_ICONS:
7339 _e_fm2_regions_free(sd->obj);
7340 _e_fm2_icons_place(sd->obj);
7341 _e_fm2_regions_populate(sd->obj);
7344 case E_FM2_VIEW_MODE_GRID_ICONS:
7345 _e_fm2_regions_free(sd->obj);
7346 _e_fm2_icons_place(sd->obj);
7347 _e_fm2_regions_populate(sd->obj);
7350 case E_FM2_VIEW_MODE_CUSTOM_ICONS:
7351 if (sd->config->view.fit_custom_pos)
7354 EINA_LIST_FOREACH(sd->icons, l, ic)
7357 _e_fm2_icon_geom_adjust(ic, ic->x, ic->y, ic->w, ic->h, sd->pw, sd->ph);
7360 _e_fm2_regions_free(sd->obj);
7361 // _e_fm2_regions_eval(sd->obj);
7362 _e_fm2_icons_place(sd->obj);
7363 _e_fm2_regions_populate(sd->obj);
7366 case E_FM2_VIEW_MODE_CUSTOM_GRID_ICONS:
7367 /* FIXME: not going to implement this at this stage */
7368 _e_fm2_regions_free(sd->obj);
7369 // _e_fm2_regions_eval(sd->obj);
7370 _e_fm2_icons_place(sd->obj);
7371 _e_fm2_regions_populate(sd->obj);
7374 case E_FM2_VIEW_MODE_CUSTOM_SMART_GRID_ICONS:
7375 /* FIXME: not going to implement this at this stage */
7376 _e_fm2_regions_free(sd->obj);
7377 // _e_fm2_regions_eval(sd->obj);
7378 _e_fm2_icons_place(sd->obj);
7379 _e_fm2_regions_populate(sd->obj);
7382 case E_FM2_VIEW_MODE_LIST:
7383 if (sd->iconlist_changed)
7386 EINA_LIST_FOREACH(sd->icons, l, ic)
7389 // _e_fm2_icon_unrealize(ic);
7392 _e_fm2_regions_free(sd->obj);
7393 _e_fm2_icons_place(sd->obj);
7394 _e_fm2_regions_populate(sd->obj);
7401 evas_event_thaw(evas_object_evas_get(sd->obj));
7402 sd->iconlist_changed = EINA_FALSE;
7406 if ((sd->max.w > 0) && (sd->max.h > 0) && (sd->w > 0) && (sd->h > 0))
7408 E_Fm2_Custom_File *cf = e_fm2_custom_file_get(sd->realpath);
7409 if ((cf) && (cf->dir))
7411 sd->pos.x = cf->dir->pos.x * (sd->max.w - sd->w);
7412 sd->pos.y = cf->dir->pos.y * (sd->max.h - sd->h);
7413 evas_object_smart_callback_call(sd->obj, "pan_changed", NULL);
7419 _e_fm2_cb_icon_sort(const void *data1, const void *data2)
7421 const E_Fm2_Icon *ic1, *ic2;
7426 l1 = (char *)ic1->info.file;
7427 if (ic1->info.label) l1 = (char *)ic1->info.label;
7428 l2 = (char *)ic2->info.file;
7429 if (ic2->info.label) l2 = (char *)ic2->info.label;
7430 if (ic1->sd->config->list.sort.dirs.first)
7432 if ((S_ISDIR(ic1->info.statinfo.st_mode)) !=
7433 (S_ISDIR(ic2->info.statinfo.st_mode)))
7435 if (S_ISDIR(ic1->info.statinfo.st_mode)) return -1;
7439 else if (ic1->sd->config->list.sort.dirs.last)
7441 if ((S_ISDIR(ic1->info.statinfo.st_mode)) !=
7442 (S_ISDIR(ic2->info.statinfo.st_mode)))
7444 if (S_ISDIR(ic1->info.statinfo.st_mode)) return 1;
7448 if (ic1->sd->config->list.sort.no_case)
7450 char buf1[4096], buf2[4096], *p;
7452 /* if (ic1->sd->config->list.sort.category)
7454 * FIXME: implement category sorting
7458 eina_strlcpy(buf1, l1, sizeof(buf1));
7459 eina_strlcpy(buf2, l2, sizeof(buf2));
7473 return strcmp(buf1, buf2);
7475 return strcmp(l1, l2);
7479 _e_fm2_cb_scan_timer(void *data)
7481 E_Fm2_Smart_Data *sd;
7483 sd = evas_object_smart_data_get(data);
7484 if (!sd) return ECORE_CALLBACK_CANCEL;
7485 _e_fm2_queue_process(data);
7486 sd->scan_timer = NULL;
7489 _e_fm2_client_monitor_list_end(data);
7490 return ECORE_CALLBACK_CANCEL;
7492 if (sd->busy_count > 0)
7493 sd->scan_timer = ecore_timer_add(0.2, _e_fm2_cb_scan_timer, sd->obj);
7496 if (!sd->sort_idler)
7497 sd->sort_idler = ecore_idler_add(_e_fm2_cb_sort_idler, data);
7499 return ECORE_CALLBACK_CANCEL;
7503 _e_fm2_cb_sort_idler(void *data)
7505 E_Fm2_Smart_Data *sd;
7507 sd = evas_object_smart_data_get(data);
7508 if (!sd) return ECORE_CALLBACK_CANCEL;
7509 _e_fm2_queue_process(data);
7512 sd->sort_idler = NULL;
7513 _e_fm2_client_monitor_list_end(data);
7514 return ECORE_CALLBACK_CANCEL;
7516 return ECORE_CALLBACK_RENEW;
7520 _e_fm2_cb_theme(void *data, int type __UNUSED__, void *event __UNUSED__)
7522 e_fm2_refresh(data);
7523 return ECORE_CALLBACK_RENEW;
7526 /**************************/
7528 _e_fm2_obj_icons_place(E_Fm2_Smart_Data *sd)
7533 evas_event_freeze(evas_object_evas_get(sd->obj));
7535 EINA_LIST_FOREACH(sd->regions.list, l, rg)
7539 const Eina_List *ll;
7542 EINA_LIST_FOREACH(rg->list, ll, ic)
7546 if (!_e_fm2_icon_visible(ic))
7548 e_thumb_icon_end(ic->obj_icon);
7550 evas_object_move(ic->obj,
7551 sd->x + ic->x - sd->pos.x,
7552 sd->y + ic->y - sd->pos.y);
7553 evas_object_resize(ic->obj, ic->w, ic->h);
7554 _e_fm2_icon_thumb(ic, ic->obj_icon, 0);
7560 evas_event_thaw(evas_object_evas_get(sd->obj));
7563 /**************************/
7566 _e_fm2_smart_add(Evas_Object *obj)
7568 E_Fm2_Smart_Data *sd;
7570 sd = E_NEW(E_Fm2_Smart_Data, 1);
7573 sd->view_mode = -1; /* unset */
7574 sd->icon_size = -1; /* unset */
7577 sd->clip = evas_object_rectangle_add(evas_object_evas_get(obj));
7578 evas_object_smart_member_add(sd->clip, obj);
7579 evas_object_color_set(sd->clip, 255, 255, 255, 255);
7581 sd->underlay = evas_object_rectangle_add(evas_object_evas_get(obj));
7582 evas_object_clip_set(sd->underlay, sd->clip);
7583 evas_object_smart_member_add(sd->underlay, obj);
7584 evas_object_color_set(sd->underlay, 0, 0, 0, 0);
7585 evas_object_show(sd->underlay);
7587 evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _e_fm2_cb_key_down, sd);
7588 evas_object_event_callback_add(sd->underlay, EVAS_CALLBACK_MOUSE_DOWN, _e_fm2_cb_mouse_down, sd);
7589 evas_object_event_callback_add(sd->underlay, EVAS_CALLBACK_MOUSE_UP, _e_fm2_cb_mouse_up, sd);
7590 evas_object_event_callback_add(sd->underlay, EVAS_CALLBACK_MOUSE_MOVE, _e_fm2_cb_mouse_move, sd);
7592 sd->drop = edje_object_add(evas_object_evas_get(obj));
7593 evas_object_clip_set(sd->drop, sd->clip);
7594 _e_fm2_theme_edje_object_set(sd, sd->drop,
7595 "base/theme/fileman",
7596 "list/drop_between");
7597 evas_object_smart_member_add(sd->drop, obj);
7598 evas_object_show(sd->drop);
7600 sd->drop_in = edje_object_add(evas_object_evas_get(obj));
7601 evas_object_clip_set(sd->drop_in, sd->clip);
7602 _e_fm2_theme_edje_object_set(sd, sd->drop_in,
7603 "base/theme/fileman",
7605 evas_object_smart_member_add(sd->drop_in, obj);
7606 evas_object_show(sd->drop_in);
7608 sd->overlay = edje_object_add(evas_object_evas_get(obj));
7609 evas_object_clip_set(sd->overlay, sd->clip);
7610 _e_fm2_theme_edje_object_set(sd, sd->overlay,
7611 "base/theme/fileman",
7613 evas_object_smart_member_add(sd->overlay, obj);
7614 evas_object_show(sd->overlay);
7616 sd->sel_rect = edje_object_add(evas_object_evas_get(obj));
7617 evas_object_clip_set(sd->sel_rect, sd->clip);
7618 _e_fm2_theme_edje_object_set(sd, sd->sel_rect, "base/theme/fileman",
7620 evas_object_smart_member_add(sd->sel_rect, obj);
7622 evas_object_smart_data_set(obj, sd);
7623 evas_object_move(obj, 0, 0);
7624 evas_object_resize(obj, 0, 0);
7626 sd->event_handlers = eina_list_append(sd->event_handlers,
7627 ecore_event_handler_add(E_EVENT_CONFIG_ICON_THEME,
7632 _e_fm2_list = eina_list_append(_e_fm2_list, sd->obj);
7636 _e_fm2_smart_del(Evas_Object *obj)
7638 E_Fm2_Smart_Data *sd;
7639 Ecore_Event_Handler *hdl;
7641 sd = evas_object_smart_data_get(obj);
7644 EINA_LIST_FREE(sd->event_handlers, hdl)
7645 ecore_event_handler_del(hdl);
7647 _e_fm2_client_monitor_list_end(obj);
7648 if (sd->realpath) _e_fm2_client_monitor_del(sd->id, sd->realpath);
7649 _e_fm2_live_process_end(obj);
7650 _e_fm2_queue_free(obj);
7651 _e_fm2_regions_free(obj);
7652 _e_fm2_icons_free(obj);
7655 e_menu_post_deactivate_callback_set(sd->menu, NULL, NULL);
7656 e_object_del(E_OBJECT(sd->menu));
7659 if (sd->entry_dialog)
7661 e_object_del(E_OBJECT(sd->entry_dialog));
7662 sd->entry_dialog = NULL;
7664 if (sd->image_dialog)
7666 e_object_del(E_OBJECT(sd->image_dialog));
7667 sd->image_dialog = NULL;
7669 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
7670 if (sd->resize_job) ecore_job_del(sd->resize_job);
7671 if (sd->refresh_job) ecore_job_del(sd->refresh_job);
7672 eina_stringshare_del(sd->custom_theme);
7673 eina_stringshare_del(sd->custom_theme_content);
7674 sd->custom_theme = sd->custom_theme_content = NULL;
7675 eina_stringshare_del(sd->dev);
7676 eina_stringshare_del(sd->path);
7677 eina_stringshare_del(sd->realpath);
7678 sd->dev = sd->path = sd->realpath = NULL;
7681 e_fm2_device_unmount(sd->mount);
7684 if (sd->config) _e_fm2_config_free(sd->config);
7686 E_FREE(sd->typebuf.buf);
7688 evas_object_del(sd->underlay);
7689 evas_object_del(sd->overlay);
7690 evas_object_del(sd->drop);
7691 evas_object_del(sd->drop_in);
7692 evas_object_del(sd->sel_rect);
7693 evas_object_del(sd->clip);
7694 if (sd->drop_handler) e_drop_handler_del(sd->drop_handler);
7695 if (_e_fm2_list_walking == 0)
7696 _e_fm2_list = eina_list_remove(_e_fm2_list, sd->obj);
7698 _e_fm2_list_remove = eina_list_append(_e_fm2_list_remove, sd->obj);
7700 e_fm2_custom_file_flush();
7704 _e_fm2_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
7706 E_Fm2_Smart_Data *sd;
7708 sd = evas_object_smart_data_get(obj);
7710 if ((sd->x == x) && (sd->y == y)) return;
7713 evas_object_move(sd->underlay, sd->x, sd->y);
7714 evas_object_move(sd->overlay, sd->x, sd->y);
7715 _e_fm2_dnd_drop_configure(sd->obj);
7716 evas_object_move(sd->clip, sd->x - OVERCLIP, sd->y - OVERCLIP);
7717 _e_fm2_obj_icons_place(sd);
7718 if (sd->drop_handler)
7719 e_drop_handler_geometry_set(sd->drop_handler, sd->x, sd->y, sd->w, sd->h);
7723 _e_fm2_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
7725 E_Fm2_Smart_Data *sd;
7726 Eina_Bool wch = EINA_FALSE;
7728 sd = evas_object_smart_data_get(obj);
7730 if ((sd->w == w) && (sd->h == h)) return;
7731 if (w != sd->w) wch = EINA_TRUE;
7734 evas_object_resize(sd->underlay, sd->w, sd->h);
7735 evas_object_resize(sd->overlay, sd->w, sd->h);
7736 _e_fm2_dnd_drop_configure(sd->obj);
7737 evas_object_resize(sd->clip, sd->w + (OVERCLIP * 2), sd->h + (OVERCLIP * 2));
7739 /* for automatic layout - do this - NB; we could put this on a timer delay */
7740 if ((_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_LIST) ||
7741 (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_GRID_ICONS))
7745 if (sd->resize_job) ecore_job_del(sd->resize_job);
7746 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
7750 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
7751 sd->scroll_job = ecore_job_add(_e_fm2_cb_scroll_job, obj);
7754 else if (_e_fm2_view_mode_get(sd) == E_FM2_VIEW_MODE_CUSTOM_ICONS)
7756 if (sd->config->view.fit_custom_pos)
7758 if (sd->resize_job) ecore_job_del(sd->resize_job);
7759 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, obj);
7763 if (sd->scroll_job) ecore_job_del(sd->scroll_job);
7764 sd->scroll_job = ecore_job_add(_e_fm2_cb_scroll_job, obj);
7767 if (sd->drop_handler)
7768 e_drop_handler_geometry_set(sd->drop_handler, sd->x, sd->y, sd->w, sd->h);
7772 _e_fm2_smart_show(Evas_Object *obj)
7774 E_Fm2_Smart_Data *sd;
7776 sd = evas_object_smart_data_get(obj);
7778 evas_object_show(sd->clip);
7782 _e_fm2_smart_hide(Evas_Object *obj)
7784 E_Fm2_Smart_Data *sd;
7786 sd = evas_object_smart_data_get(obj);
7788 evas_object_hide(sd->clip);
7792 _e_fm2_smart_color_set(Evas_Object *obj, int r, int g, int b, int a)
7794 E_Fm2_Smart_Data *sd;
7796 sd = evas_object_smart_data_get(obj);
7798 evas_object_color_set(sd->clip, r, g, b, a);
7802 _e_fm2_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
7804 E_Fm2_Smart_Data *sd;
7806 sd = evas_object_smart_data_get(obj);
7808 evas_object_clip_set(sd->clip, clip);
7812 _e_fm2_smart_clip_unset(Evas_Object *obj)
7814 E_Fm2_Smart_Data *sd;
7816 sd = evas_object_smart_data_get(obj);
7818 evas_object_clip_unset(sd->clip);
7822 _e_fm2_menu(Evas_Object *obj, unsigned int timestamp)
7824 E_Fm2_Smart_Data *sd;
7832 sd = evas_object_smart_data_get(obj);
7836 e_object_data_set(E_OBJECT(mn), obj);
7837 e_menu_category_set(mn, "e/fileman/action");
7839 if (sd->icon_menu.replace.func)
7840 sd->icon_menu.replace.func(sd->icon_menu.replace.data, sd->obj, mn, NULL);
7843 if (sd->icon_menu.start.func)
7845 sd->icon_menu.start.func(sd->icon_menu.start.data, sd->obj, mn, NULL);
7846 mi = e_menu_item_new(mn);
7847 e_menu_item_separator_set(mi, 1);
7849 if ((!(sd->icon_menu.flags & E_FM2_MENU_NO_INHERIT_PARENT)) &&
7850 (sd->view_flags & E_FM2_VIEW_INHERIT_DIR_CUSTOM))
7852 mi = e_menu_item_new(mn);
7853 e_menu_item_label_set(mi, _("Inherit parent settings"));
7854 e_util_menu_item_theme_icon_set(mi, "view-inherit");
7855 e_menu_item_check_set(mi, 1);
7856 e_menu_item_toggle_set(mi, sd->inherited_dir_props);
7857 e_menu_item_callback_set(mi, _e_fm2_toggle_inherit_dir_props, sd);
7859 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_VIEW_MENU))
7861 mi = e_menu_item_new(mn);
7862 e_menu_item_label_set(mi, _("View Mode"));
7863 e_util_menu_item_theme_icon_set(mi, "preferences-look");
7864 e_menu_item_submenu_pre_callback_set(mi, _e_fm2_view_menu_pre, sd);
7866 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REFRESH))
7868 mi = e_menu_item_new(mn);
7869 e_menu_item_label_set(mi, _("Refresh View"));
7870 e_util_menu_item_theme_icon_set(mi, "view-refresh");
7871 e_menu_item_callback_set(mi, _e_fm2_refresh, sd);
7874 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SHOW_HIDDEN))
7876 mi = e_menu_item_new(mn);
7877 e_menu_item_label_set(mi, _("Show Hidden Files"));
7878 e_util_menu_item_theme_icon_set(mi, "view-refresh");
7879 e_menu_item_check_set(mi, 1);
7880 e_menu_item_toggle_set(mi, sd->show_hidden_files);
7881 e_menu_item_callback_set(mi, _e_fm2_toggle_hidden_files, sd);
7884 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REMEMBER_ORDERING))
7886 if (!sd->config->view.always_order)
7888 mi = e_menu_item_new(mn);
7889 e_menu_item_label_set(mi, _("Remember Ordering"));
7890 e_util_menu_item_theme_icon_set(mi, "view-order");
7891 e_menu_item_check_set(mi, 1);
7892 e_menu_item_toggle_set(mi, sd->order_file);
7893 e_menu_item_callback_set(mi, _e_fm2_toggle_ordering, sd);
7895 if ((sd->order_file) || (sd->config->view.always_order))
7897 mi = e_menu_item_new(mn);
7898 e_menu_item_label_set(mi, _("Sort Now"));
7899 e_util_menu_item_theme_icon_set(mi, "view-sort");
7900 e_menu_item_callback_set(mi, _e_fm2_sort, sd);
7904 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_NEW_DIRECTORY))
7906 mi = e_menu_item_new(mn);
7907 e_menu_item_separator_set(mi, 1);
7909 mi = e_menu_item_new(mn);
7910 e_menu_item_label_set(mi, _("New Directory"));
7911 e_util_menu_item_theme_icon_set(mi, "folder-new");
7912 e_menu_item_callback_set(mi, _e_fm2_new_directory, sd);
7915 if (((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) ||
7916 (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))) &&
7917 (eina_list_count(_e_fm_file_buffer) > 0) &&
7918 ecore_file_can_write(sd->realpath))
7920 mi = e_menu_item_new(mn);
7921 e_menu_item_separator_set(mi, 1);
7923 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE))
7925 mi = e_menu_item_new(mn);
7926 e_menu_item_label_set(mi, _("Paste"));
7927 e_util_menu_item_theme_icon_set(mi, "edit-paste");
7928 e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd);
7931 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))
7933 mi = e_menu_item_new(mn);
7934 e_menu_item_label_set(mi, _("Link"));
7935 e_util_menu_item_theme_icon_set(mi, "emblem-symbolic-link");
7936 e_menu_item_callback_set(mi, _e_fm2_file_symlink_menu, sd);
7940 if (sd->icon_menu.end.func)
7941 sd->icon_menu.end.func(sd->icon_menu.end.data, sd->obj, mn, NULL);
7944 man = e_manager_current_get();
7947 e_object_del(E_OBJECT(mn));
7950 con = e_container_current_get(man);
7953 e_object_del(E_OBJECT(mn));
7956 ecore_x_pointer_xy_get(con->win, &x, &y);
7957 zone = e_util_zone_current_get(man);
7960 e_object_del(E_OBJECT(mn));
7964 e_menu_post_deactivate_callback_set(mn, _e_fm2_menu_post_cb, sd);
7965 e_menu_activate_mouse(mn, zone,
7967 E_MENU_POP_DIRECTION_DOWN, timestamp);
7971 _e_fm2_menu_post_cb(void *data, E_Menu *m __UNUSED__)
7973 E_Fm2_Smart_Data *sd;
7980 _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp)
7982 E_Fm2_Smart_Data *sd;
7988 Eina_List *sel, *l = NULL;
7989 int x, y, can_w, can_w2, protect;
7990 char buf[PATH_MAX], *ext;
7995 e_object_data_set(E_OBJECT(mn), obj);
7996 e_menu_category_set(mn, "e/fileman/action");
7998 if (sd->icon_menu.replace.func)
7999 sd->icon_menu.replace.func(sd->icon_menu.replace.data, sd->obj, mn, NULL);
8002 if (sd->icon_menu.start.func)
8004 sd->icon_menu.start.func(sd->icon_menu.start.data, sd->obj, mn, NULL);
8005 mi = e_menu_item_new(mn);
8006 e_menu_item_separator_set(mi, 1);
8009 if ((!(sd->icon_menu.flags & E_FM2_MENU_NO_INHERIT_PARENT)) &&
8010 (sd->view_flags & E_FM2_VIEW_INHERIT_DIR_CUSTOM))
8012 mi = e_menu_item_new(mn);
8013 e_menu_item_label_set(mi, _("Inherit parent settings"));
8014 e_util_menu_item_theme_icon_set(mi, "view-inherit");
8015 e_menu_item_check_set(mi, 1);
8016 e_menu_item_toggle_set(mi, sd->inherited_dir_props);
8017 e_menu_item_callback_set(mi, _e_fm2_toggle_inherit_dir_props, sd);
8019 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_VIEW_MENU))
8021 mi = e_menu_item_new(mn);
8022 e_menu_item_label_set(mi, _("View Mode"));
8023 e_util_menu_item_theme_icon_set(mi, "preferences-look");
8024 e_menu_item_submenu_pre_callback_set(mi, _e_fm2_icon_view_menu_pre, sd);
8026 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REFRESH))
8028 mi = e_menu_item_new(mn);
8029 e_menu_item_label_set(mi, _("Refresh View"));
8030 e_util_menu_item_theme_icon_set(mi, "view-refresh");
8031 e_menu_item_callback_set(mi, _e_fm2_refresh, sd);
8034 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SHOW_HIDDEN))
8036 mi = e_menu_item_new(mn);
8037 e_menu_item_label_set(mi, _("Show Hidden Files"));
8038 e_util_menu_item_theme_icon_set(mi, "view-hidden-files");
8039 e_menu_item_check_set(mi, 1);
8040 e_menu_item_toggle_set(mi, sd->show_hidden_files);
8041 e_menu_item_callback_set(mi, _e_fm2_toggle_hidden_files, sd);
8044 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_REMEMBER_ORDERING))
8046 if (!sd->config->view.always_order)
8048 mi = e_menu_item_new(mn);
8049 e_menu_item_label_set(mi, _("Remember Ordering"));
8050 e_util_menu_item_theme_icon_set(mi, "view-order");
8051 e_menu_item_check_set(mi, 1);
8052 e_menu_item_toggle_set(mi, sd->order_file);
8053 e_menu_item_callback_set(mi, _e_fm2_toggle_ordering, sd);
8055 if ((sd->order_file) || (sd->config->view.always_order))
8057 mi = e_menu_item_new(mn);
8058 e_menu_item_label_set(mi, _("Sort Now"));
8059 e_util_menu_item_theme_icon_set(mi, "view-sort");
8060 e_menu_item_callback_set(mi, _e_fm2_sort, sd);
8064 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_NEW_DIRECTORY))
8066 /* FIXME: stat the dir itself - move to e_fm_main */
8067 if (ecore_file_can_write(sd->realpath))
8069 mi = e_menu_item_new(mn);
8070 e_menu_item_separator_set(mi, 1);
8072 mi = e_menu_item_new(mn);
8073 e_menu_item_label_set(mi, _("New Directory"));
8074 e_util_menu_item_theme_icon_set(mi, "folder-new");
8075 e_menu_item_callback_set(mi, _e_fm2_new_directory, sd);
8078 if (!ic->info.removable)
8080 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_CUT))
8082 if (ecore_file_can_write(sd->realpath))
8084 mi = e_menu_item_new(mn);
8085 e_menu_item_separator_set(mi, 1);
8087 mi = e_menu_item_new(mn);
8088 e_menu_item_label_set(mi, _("Cut"));
8089 e_util_menu_item_theme_icon_set(mi, "edit-cut");
8090 e_menu_item_callback_set(mi, _e_fm2_file_cut_menu, sd);
8093 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_COPY))
8095 if (!ecore_file_can_write(sd->realpath))
8097 mi = e_menu_item_new(mn);
8098 e_menu_item_separator_set(mi, 1);
8101 mi = e_menu_item_new(mn);
8102 e_menu_item_label_set(mi, _("Copy"));
8103 e_util_menu_item_theme_icon_set(mi, "edit-copy");
8104 e_menu_item_callback_set(mi, _e_fm2_file_copy_menu, sd);
8107 if (((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) ||
8108 (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))) &&
8109 (eina_list_count(_e_fm_file_buffer) > 0) &&
8110 ecore_file_can_write(sd->realpath))
8112 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE))
8114 mi = e_menu_item_new(mn);
8115 e_menu_item_label_set(mi, _("Paste"));
8116 e_util_menu_item_theme_icon_set(mi, "edit-paste");
8117 e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd);
8120 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))
8122 mi = e_menu_item_new(mn);
8123 e_menu_item_label_set(mi, _("Link"));
8124 e_util_menu_item_theme_icon_set(mi, "emblem-symbolic-link");
8125 e_menu_item_callback_set(mi, _e_fm2_file_symlink_menu, sd);
8131 if (ic->sd->order_file)
8133 snprintf(buf, sizeof(buf), "%s/.order", sd->realpath);
8134 /* FIXME: stat the .order itself - move to e_fm_main */
8135 // can_w2 = ecore_file_can_write(buf);
8142 if (_e_fm2_icon_realpath(ic, buf, sizeof(buf)) &&
8143 (lstat(buf, &st) == 0))
8145 if (st.st_uid == getuid())
8147 if (st.st_mode & S_IWUSR) can_w = 1;
8149 else if (st.st_gid == getgid())
8151 if (st.st_mode & S_IWGRP) can_w = 1;
8155 if (st.st_mode & S_IWOTH) can_w = 1;
8162 sel = e_fm2_selected_list_get(ic->sd->obj);
8163 if ((!sel) || eina_list_count(sel) == 1)
8165 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
8166 protect = e_filereg_file_protected(buf);
8170 eina_list_free(sel);
8172 if ((can_w) && (can_w2) && !(protect) && !ic->info.removable)
8174 mi = e_menu_item_new(mn);
8175 e_menu_item_separator_set(mi, 1);
8177 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_DELETE))
8179 mi = e_menu_item_new(mn);
8180 e_menu_item_label_set(mi, _("Delete"));
8181 e_util_menu_item_theme_icon_set(mi, "edit-delete");
8182 e_menu_item_callback_set(mi, _e_fm2_file_delete_menu, ic);
8185 if (!(sd->icon_menu.flags & E_FM2_MENU_NO_RENAME))
8187 mi = e_menu_item_new(mn);
8188 e_menu_item_label_set(mi, _("Rename"));
8189 e_util_menu_item_theme_icon_set(mi, "edit-rename");
8190 e_menu_item_callback_set(mi, _e_fm2_file_rename, ic);
8194 if (ic->info.removable)
8198 v = e_fm2_device_volume_find(ic->info.link);
8201 mi = e_menu_item_new(mn);
8202 e_menu_item_separator_set(mi, 1);
8204 mi = e_menu_item_new(mn);
8207 e_menu_item_label_set(mi, _("Unmount"));
8208 e_menu_item_callback_set(mi, _e_fm2_volume_unmount, v);
8212 e_menu_item_label_set(mi, _("Mount"));
8213 e_menu_item_callback_set(mi, _e_fm2_volume_mount, v);
8216 mi = e_menu_item_new(mn);
8217 e_menu_item_label_set(mi, _("Eject"));
8218 e_util_menu_item_theme_icon_set(mi, "media-eject");
8219 e_menu_item_callback_set(mi, _e_fm2_volume_eject, v);
8221 mi = e_menu_item_new(mn);
8222 e_menu_item_separator_set(mi, 1);
8226 if (ic->info.mime && !strcmp(ic->info.mime, "application/x-desktop"))
8228 mi = e_menu_item_new(mn);
8229 e_menu_item_label_set(mi, _("Application Properties"));
8230 e_util_menu_item_theme_icon_set(mi, "configure");
8231 e_menu_item_callback_set(mi, _e_fm2_file_application_properties, ic);
8234 mi = e_menu_item_new(mn);
8235 e_menu_item_label_set(mi, _("File Properties"));
8236 e_util_menu_item_theme_icon_set(mi, "document-properties");
8237 e_menu_item_callback_set(mi, _e_fm2_file_properties, ic);
8241 /* see if we have any mime handlers registered for this file */
8242 l = e_fm2_mime_handler_mime_handlers_get(ic->info.mime);
8245 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
8246 _e_fm2_context_menu_append(obj, buf, l, mn, ic);
8250 /* see if we have any glob handlers registered for this file */
8251 ext = strrchr(ic->info.file, '.');
8254 snprintf(buf, sizeof(buf), "*%s", ext);
8255 l = e_fm2_mime_handler_glob_handlers_get(buf);
8258 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
8259 _e_fm2_context_menu_append(obj, buf, l, mn, ic);
8264 if (sd->icon_menu.end.func)
8265 sd->icon_menu.end.func(sd->icon_menu.end.data, sd->obj, mn, &(ic->info));
8268 man = e_manager_current_get();
8271 e_object_del(E_OBJECT(mn));
8274 con = e_container_current_get(man);
8277 e_object_del(E_OBJECT(mn));
8280 ecore_x_pointer_xy_get(con->win, &x, &y);
8281 zone = e_util_zone_current_get(man);
8284 e_object_del(E_OBJECT(mn));
8288 e_menu_post_deactivate_callback_set(mn, _e_fm2_icon_menu_post_cb, ic);
8289 e_menu_activate_mouse(mn, zone,
8291 E_MENU_POP_DIRECTION_DOWN, timestamp);
8295 _e_fm2_context_menu_append(Evas_Object *obj, const char *path, Eina_List *l, E_Menu *mn, E_Fm2_Icon *ic)
8297 E_Fm2_Mime_Handler *handler;
8298 const Eina_List *ll;
8302 l = eina_list_sort(l, -1, _e_fm2_context_list_sort);
8304 EINA_LIST_FOREACH(l, ll, handler)
8306 E_Fm2_Context_Menu_Data *md = NULL;
8309 if ((!handler) || (!e_fm2_mime_handler_test(handler, obj, path)) ||
8310 (!handler->label)) continue;
8313 /* only append the separator if this is the first item */
8314 /* we do this in here because we dont want to add a separator
8315 * when we have no context entries */
8316 mi = e_menu_item_new(mn);
8317 e_menu_item_separator_set(mi, 1);
8320 md = E_NEW(E_Fm2_Context_Menu_Data, 1);
8323 md->handler = handler;
8324 _e_fm2_menu_contexts = eina_list_append(_e_fm2_menu_contexts, md);
8326 mi = e_menu_item_new(mn);
8327 e_menu_item_label_set(mi, handler->label);
8328 if (handler->icon_group)
8329 e_util_menu_item_theme_icon_set(mi, handler->icon_group);
8330 e_menu_item_callback_set(mi, _e_fm2_icon_menu_item_cb, md);
8335 _e_fm2_context_list_sort(const void *data1, const void *data2)
8337 const E_Fm2_Mime_Handler *d1, *d2;
8339 if (!data1) return 1;
8340 if (!data2) return -1;
8342 if (!d1->label) return 1;
8344 if (!d2->label) return -1;
8345 return strcmp(d1->label, d2->label);
8349 _e_fm2_icon_menu_post_cb(void *data, E_Menu *m __UNUSED__)
8351 E_Fm2_Context_Menu_Data *md;
8356 EINA_LIST_FREE(_e_fm2_menu_contexts, md)
8361 _e_fm2_icon_menu_item_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8363 E_Fm2_Context_Menu_Data *md = NULL;
8364 Evas_Object *obj = NULL;
8369 obj = md->icon->info.fm;
8371 snprintf(buf, sizeof(buf), "%s/%s",
8372 e_fm2_real_path_get(obj), md->icon->info.file);
8373 e_fm2_mime_handler_call(md->handler, obj, buf);
8376 struct e_fm2_view_menu_icon_size_data
8378 E_Fm2_Smart_Data *sd;
8383 _e_fm2_view_menu_icon_size_data_free(void *obj)
8385 struct e_fm2_view_menu_icon_size_data *d = e_object_data_get(obj);
8390 _e_fm2_view_menu_icon_size_change(void *data, E_Menu *m, E_Menu_Item *mi)
8392 struct e_fm2_view_menu_icon_size_data *d = data;
8393 short current_size = _e_fm2_icon_w_get(d->sd);
8394 d->sd->icon_size = d->size;
8395 d->sd->inherited_dir_props = EINA_FALSE;
8396 if (current_size == d->size)
8398 _e_fm2_refresh(d->sd, m, mi);
8402 _e_fm2_view_menu_icon_size_use_default(void *data, E_Menu *m, E_Menu_Item *mi)
8404 E_Fm2_Smart_Data *sd = data;
8407 old = _e_fm2_icon_w_get(sd);
8409 if (sd->icon_size == -1)
8410 sd->icon_size = sd->config->icon.icon.w;
8414 new = _e_fm2_icon_w_get(sd);
8415 sd->inherited_dir_props = EINA_FALSE;
8420 _e_fm2_refresh(sd, m, mi);
8424 _e_fm2_view_menu_icon_size_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
8426 E_Fm2_Smart_Data *sd = data;
8428 const short *itr, sizes[] =
8430 22, 32, 48, 64, 96, 128, 256, -1
8432 short current_size = _e_fm2_icon_w_get(sd);
8435 current_size /= e_scale;
8437 subm = e_menu_new();
8438 e_menu_item_submenu_set(mi, subm);
8440 for (itr = sizes; *itr > -1; itr++)
8443 struct e_fm2_view_menu_icon_size_data *d;
8445 d = malloc(sizeof(*d));
8451 snprintf(buf, sizeof(buf), "%hd", *itr);
8453 mi = e_menu_item_new(subm);
8454 e_object_data_set(E_OBJECT(mi), d);
8455 e_object_del_attach_func_set
8456 (E_OBJECT(mi), _e_fm2_view_menu_icon_size_data_free);
8458 e_menu_item_label_set(mi, buf);
8459 e_menu_item_radio_group_set(mi, 1);
8460 e_menu_item_radio_set(mi, 1);
8462 if (current_size == *itr)
8463 e_menu_item_toggle_set(mi, 1);
8465 e_menu_item_callback_set(mi, _e_fm2_view_menu_icon_size_change, d);
8468 mi = e_menu_item_new(subm);
8469 e_menu_item_separator_set(mi, 1);
8471 mi = e_menu_item_new(subm);
8472 e_menu_item_label_set(mi, _("Use default"));
8473 e_menu_item_check_set(mi, 1);
8474 e_menu_item_toggle_set(mi, sd->icon_size == -1);
8475 e_menu_item_callback_set(mi, _e_fm2_view_menu_icon_size_use_default, sd);
8479 _e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m, E_Menu_Item *mi)
8481 E_Fm2_Smart_Data *sd = data;
8483 sd->inherited_dir_props = !sd->inherited_dir_props;
8484 _e_fm2_dir_save_props(sd);
8485 _e_fm2_dir_load_props(sd);
8486 _e_fm2_refresh(sd, m, mi);
8490 _e_fm2_view_menu_common(E_Menu *subm, E_Fm2_Smart_Data *sd)
8495 view_mode = _e_fm2_view_mode_get(sd);
8497 mi = e_menu_item_new(subm);
8498 e_menu_item_label_set(mi, _("Grid Icons"));
8499 e_menu_item_radio_group_set(mi, 1);
8500 e_menu_item_radio_set(mi, 1);
8501 if (view_mode == E_FM2_VIEW_MODE_GRID_ICONS)
8502 e_menu_item_toggle_set(mi, 1);
8503 e_menu_item_callback_set(mi, _e_fm2_view_menu_grid_icons_cb, sd);
8505 mi = e_menu_item_new(subm);
8506 e_menu_item_label_set(mi, _("Custom Icons"));
8507 e_menu_item_radio_group_set(mi, 1);
8508 e_menu_item_radio_set(mi, 1);
8509 if (view_mode == E_FM2_VIEW_MODE_CUSTOM_ICONS)
8510 e_menu_item_toggle_set(mi, 1);
8511 e_menu_item_callback_set(mi, _e_fm2_view_menu_custom_icons_cb, sd);
8513 mi = e_menu_item_new(subm);
8514 e_menu_item_label_set(mi, _("List"));
8515 e_menu_item_radio_group_set(mi, 1);
8516 e_menu_item_radio_set(mi, 1);
8517 if (view_mode == E_FM2_VIEW_MODE_LIST)
8518 e_menu_item_toggle_set(mi, 1);
8519 e_menu_item_callback_set(mi, _e_fm2_view_menu_list_cb, sd);
8521 mi = e_menu_item_new(subm);
8522 e_menu_item_separator_set(mi, 1);
8524 mi = e_menu_item_new(subm);
8525 e_menu_item_label_set(mi, _("Use default"));
8526 e_menu_item_check_set(mi, 1);
8527 e_menu_item_toggle_set(mi, sd->view_mode == -1);
8528 e_menu_item_callback_set(mi, _e_fm2_view_menu_use_default_cb, sd);
8530 if (view_mode == E_FM2_VIEW_MODE_LIST)
8534 int icon_size = _e_fm2_icon_w_get(sd);
8537 icon_size /= e_scale;
8539 snprintf(buf, sizeof(buf), _("Icon Size (%d)"), icon_size);
8541 mi = e_menu_item_new(subm);
8542 e_menu_item_label_set(mi, buf);
8543 e_menu_item_submenu_pre_callback_set(mi, _e_fm2_view_menu_icon_size_pre, sd);
8547 _e_fm2_icon_view_menu_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
8550 E_Fm2_Smart_Data *sd;
8554 subm = e_menu_new();
8555 e_object_data_set(E_OBJECT(subm), sd);
8556 e_menu_item_submenu_set(mi, subm);
8558 _e_fm2_view_menu_common(subm, sd);
8562 _e_fm2_view_menu_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi)
8565 E_Fm2_Smart_Data *sd;
8570 subm = e_menu_new();
8571 e_object_data_set(E_OBJECT(subm), sd);
8572 e_menu_item_submenu_set(mi, subm);
8574 _e_fm2_view_menu_common(subm, sd);
8576 snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
8577 access_ok = ecore_file_exists(buf) ? ecore_file_can_write(buf)
8578 : ecore_file_can_write(sd->realpath);
8581 mi = e_menu_item_new(subm);
8582 e_menu_item_separator_set(mi, 1);
8584 mi = e_menu_item_new(subm);
8585 e_menu_item_label_set(mi, _("Set background..."));
8586 e_util_menu_item_theme_icon_set(mi, "preferences-desktop-wallpaper");
8587 e_menu_item_callback_set(mi, _e_fm2_view_menu_set_background_cb, sd);
8589 mi = e_menu_item_new(subm);
8590 e_menu_item_label_set(mi, _("Set overlay..."));
8591 e_menu_item_callback_set(mi, _e_fm2_view_menu_set_overlay_cb, sd);
8596 _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8598 E_Fm2_Smart_Data *sd = data;
8601 old = _e_fm2_view_mode_get(sd);
8602 sd->view_mode = E_FM2_VIEW_MODE_GRID_ICONS;
8603 sd->inherited_dir_props = EINA_FALSE;
8604 if (old == E_FM2_VIEW_MODE_GRID_ICONS)
8607 _e_fm2_refresh(sd, m, mi);
8611 _e_fm2_view_menu_custom_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8613 E_Fm2_Smart_Data *sd = data;
8616 old = _e_fm2_view_mode_get(sd);
8617 sd->view_mode = E_FM2_VIEW_MODE_CUSTOM_ICONS;
8618 sd->inherited_dir_props = EINA_FALSE;
8619 if (old == E_FM2_VIEW_MODE_CUSTOM_ICONS)
8622 _e_fm2_refresh(sd, m, mi);
8626 _e_fm2_view_menu_list_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8628 E_Fm2_Smart_Data *sd = data;
8631 old = _e_fm2_view_mode_get(sd);
8632 sd->view_mode = E_FM2_VIEW_MODE_LIST;
8633 sd->inherited_dir_props = EINA_FALSE;
8634 if (old == E_FM2_VIEW_MODE_LIST)
8637 _e_fm2_refresh(sd, m, mi);
8641 _e_fm2_view_menu_use_default_cb(void *data, E_Menu *m, E_Menu_Item *mi)
8643 E_Fm2_Smart_Data *sd = data;
8646 old = _e_fm2_view_mode_get(sd);
8648 if (sd->view_mode == -1)
8649 sd->view_mode = sd->config->view.mode;
8653 new = _e_fm2_view_mode_get(sd);
8654 sd->inherited_dir_props = EINA_FALSE;
8659 _e_fm2_refresh(sd, m, mi);
8663 _e_fm2_view_image_sel(E_Fm2_Smart_Data *sd, const char *title,
8664 void (*ok_cb)(void *data, E_Dialog *dia),
8665 void (*clear_cb)(void *data, E_Dialog *dia))
8673 man = e_manager_current_get();
8675 con = e_container_current_get(man);
8678 dia = e_dialog_new(con, "E", "_fm2_view_image_select_dialog");
8680 e_dialog_title_set(dia, title);
8682 o = e_widget_fsel_add(dia->win->evas, "/", sd->realpath, NULL, NULL, NULL, sd, NULL, sd, 1);
8683 evas_object_show(o);
8684 e_widget_size_min_get(o, &w, &h);
8685 e_dialog_content_set(dia, o, w, h);
8688 e_dialog_button_add(dia, _("OK"), NULL, ok_cb, sd);
8689 e_dialog_button_add(dia, _("Clear"), NULL, clear_cb, sd);
8690 e_dialog_button_add(dia, _("Cancel"), NULL, _e_fm2_view_image_sel_close, sd);
8691 e_dialog_resizable_set(dia, 1);
8692 e_win_centered_set(dia->win, 1);
8695 sd->image_dialog = dia;
8699 _e_fm2_view_image_sel_close(void *data, E_Dialog *dia)
8701 E_Fm2_Smart_Data *sd;
8704 e_object_del(E_OBJECT(dia));
8705 sd->image_dialog = NULL;
8709 _custom_file_key_set(E_Fm2_Smart_Data *sd, const char *key, const char *value)
8715 snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
8716 ef = efreet_desktop_new(buf);
8719 ef = efreet_desktop_empty_new(buf);
8721 ef->type = EFREET_DESKTOP_TYPE_DIRECTORY;
8722 ef->name = strdup("Directory look and feel");
8725 len = strlen(sd->realpath);
8726 if (!strncmp(value, sd->realpath, len))
8727 efreet_desktop_x_field_set(ef, key, value + len + 1);
8729 efreet_desktop_x_field_set(ef, key, value);
8731 efreet_desktop_save(ef);
8732 efreet_desktop_free(ef);
8736 _custom_file_key_del(E_Fm2_Smart_Data *sd, const char *key)
8741 snprintf(buf, sizeof(buf), "%s/.directory.desktop", sd->realpath);
8742 ef = efreet_desktop_new(buf);
8745 if (efreet_desktop_x_field_del(ef, key))
8746 efreet_desktop_save(ef);
8748 efreet_desktop_free(ef);
8752 _set_background_cb(void *data, E_Dialog *dia)
8754 E_Fm2_Smart_Data *sd;
8760 file = e_widget_fsel_selection_path_get(dia->data);
8763 _custom_file_key_set(sd, "X-Enlightenment-Directory-Wallpaper", file);
8765 _e_fm2_view_image_sel_close(data, dia);
8766 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8770 _clear_background_cb(void *data, E_Dialog *dia)
8772 E_Fm2_Smart_Data *sd;
8777 _e_fm2_view_image_sel_close(data, dia);
8779 _custom_file_key_del(sd, "X-Enlightenment-Directory-Wallpaper");
8780 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8784 _e_fm2_view_menu_set_background_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8786 E_Fm2_Smart_Data *sd;
8789 if (sd->image_dialog) return;
8791 _e_fm2_view_image_sel(sd, _("Set background..."), _set_background_cb,
8792 _clear_background_cb);
8796 _set_overlay_cb(void *data, E_Dialog *dia)
8798 E_Fm2_Smart_Data *sd;
8804 file = e_widget_fsel_selection_path_get(dia->data);
8807 _custom_file_key_set(sd, "X-Enlightenment-Directory-Overlay", file);
8809 _e_fm2_view_image_sel_close(data, dia);
8810 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8814 _clear_overlay_cb(void *data, E_Dialog *dia)
8816 E_Fm2_Smart_Data *sd;
8821 _e_fm2_view_image_sel_close(data, dia);
8823 _custom_file_key_del(sd, "X-Enlightenment-Directory-Overlay");
8824 evas_object_smart_callback_call(sd->obj, "dir_changed", NULL);
8828 _e_fm2_view_menu_set_overlay_cb(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8830 E_Fm2_Smart_Data *sd;
8833 if (sd->image_dialog) return;
8835 _e_fm2_view_image_sel(sd, _("Set overlay..."), _set_overlay_cb,
8840 _e_fm2_refresh(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8842 E_Fm2_Smart_Data *sd;
8845 if (sd->refresh_job) ecore_job_del(sd->refresh_job);
8846 sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, sd->obj);
8850 _e_fm2_toggle_hidden_files(void *data, E_Menu *m, E_Menu_Item *mi)
8852 E_Fm2_Smart_Data *sd;
8855 if (sd->show_hidden_files)
8856 sd->show_hidden_files = EINA_FALSE;
8858 sd->show_hidden_files = EINA_TRUE;
8860 sd->inherited_dir_props = EINA_FALSE;
8861 _e_fm2_refresh(data, m, mi);
8865 _e_fm2_toggle_ordering(void *data, E_Menu *m, E_Menu_Item *mi)
8867 E_Fm2_Smart_Data *sd;
8873 snprintf(buf, sizeof(buf), "%s/.order", sd->realpath);
8874 /* FIXME: move to e_fm_main */
8875 ecore_file_unlink(buf);
8881 snprintf(buf, sizeof(buf), "%s/.order", sd->realpath);
8882 f = fopen(buf, "w");
8885 sd->inherited_dir_props = EINA_FALSE;
8886 _e_fm2_refresh(data, m, mi);
8890 _e_fm2_sort(void *data, E_Menu *m, E_Menu_Item *mi)
8892 E_Fm2_Smart_Data *sd;
8895 sd->icons = eina_list_sort(sd->icons, eina_list_count(sd->icons),
8896 _e_fm2_cb_icon_sort);
8897 _e_fm2_refresh(data, m, mi);
8901 _e_fm2_new_directory(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8903 E_Fm2_Smart_Data *sd;
8908 if (sd->entry_dialog) return;
8910 man = e_manager_current_get();
8912 con = e_container_current_get(man);
8915 sd->entry_dialog = e_entry_dialog_show(_("Create a new Directory"), "folder",
8916 _("New Directory Name:"),
8918 _e_fm2_new_directory_yes_cb,
8919 _e_fm2_new_directory_no_cb, sd);
8920 E_OBJECT(sd->entry_dialog)->data = sd;
8921 e_object_del_attach_func_set(E_OBJECT(sd->entry_dialog), _e_fm2_new_directory_delete_cb);
8925 _e_fm2_new_directory_delete_cb(void *obj)
8927 E_Fm2_Smart_Data *sd;
8929 sd = E_OBJECT(obj)->data;
8930 sd->entry_dialog = NULL;
8934 _e_fm2_new_directory_yes_cb(char *text, void *data)
8936 E_Fm2_Smart_Data *sd;
8940 sd->entry_dialog = NULL;
8941 if ((text) && (text[0]))
8943 snprintf(buf, sizeof(buf), "%s/%s", sd->realpath, text);
8945 _e_fm2_client_file_mkdir(buf, "", 0, 0, 0, sd->w, sd->h, sd->obj);
8950 _e_fm2_new_directory_no_cb(void *data)
8952 E_Fm2_Smart_Data *sd;
8955 sd->entry_dialog = NULL;
8959 _e_fm2_file_rename(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
8962 char text[PATH_MAX + 256];
8965 if ((ic->entry_dialog) || (ic->entry_widget)) return;
8967 if (!_e_fm2_icon_entry_widget_add(ic))
8969 snprintf(text, PATH_MAX + 256,
8972 ic->entry_dialog = e_entry_dialog_show(_("Rename File"), "edit-rename",
8973 text, ic->info.file, NULL, NULL,
8974 _e_fm2_file_rename_yes_cb,
8975 _e_fm2_file_rename_no_cb, ic);
8976 E_OBJECT(ic->entry_dialog)->data = ic;
8977 e_object_del_attach_func_set(E_OBJECT(ic->entry_dialog),
8978 _e_fm2_file_rename_delete_cb);
8982 static Evas_Object *
8983 _e_fm2_icon_entry_widget_add(E_Fm2_Icon *ic)
8987 if (ic->sd->iop_icon)
8988 _e_fm2_icon_entry_widget_accept(ic->sd->iop_icon);
8990 if (!edje_object_part_exists(ic->obj, "e.swallow.entry"))
8993 ic->entry_widget = e_widget_entry_add(evas_object_evas_get(ic->obj),
8994 NULL, NULL, NULL, NULL);
8995 evas_object_event_callback_add(ic->entry_widget, EVAS_CALLBACK_KEY_DOWN,
8996 _e_fm2_icon_entry_widget_cb_key_down, ic);
8997 edje_object_part_swallow(ic->obj, "e.swallow.entry", ic->entry_widget);
8998 evas_object_show(ic->entry_widget);
8999 e_widget_entry_text_set(ic->entry_widget, ic->info.file);
9000 e_widget_focus_set(ic->entry_widget, 0);
9001 eo = e_widget_entry_editable_object_get(ic->entry_widget);
9002 e_editable_cursor_move_to_start(eo);
9003 e_editable_selection_move_to_end(eo);
9004 ic->sd->iop_icon = ic;
9006 return ic->entry_widget;
9010 _e_fm2_icon_entry_widget_del(E_Fm2_Icon *ic)
9012 ic->sd->iop_icon = NULL;
9013 evas_object_focus_set(ic->sd->obj, 1);
9014 evas_object_del(ic->entry_widget);
9015 ic->entry_widget = NULL;
9019 _e_fm2_icon_entry_widget_cb_key_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
9021 Evas_Event_Key_Down *ev;
9027 if (!strcmp(ev->key, "Escape"))
9028 _e_fm2_icon_entry_widget_del(ic);
9029 else if (!strcmp(ev->key, "Return"))
9030 _e_fm2_icon_entry_widget_accept(ic);
9034 _e_fm2_icon_entry_widget_accept(E_Fm2_Icon *ic)
9036 _e_fm2_file_do_rename(e_widget_entry_text_get(ic->entry_widget), ic);
9037 _e_fm2_icon_entry_widget_del(ic);
9041 _e_fm2_file_rename_delete_cb(void *obj)
9045 ic = E_OBJECT(obj)->data;
9046 ic->entry_dialog = NULL;
9050 _e_fm2_file_rename_yes_cb(char *text, void *data)
9055 ic->entry_dialog = NULL;
9057 _e_fm2_file_do_rename(text, ic);
9061 _e_fm2_file_rename_no_cb(void *data)
9066 ic->entry_dialog = NULL;
9070 _e_fm2_file_do_rename(const char *text, E_Fm2_Icon *ic)
9072 char oldpath[PATH_MAX];
9073 char newpath[PATH_MAX];
9078 if ((text) && (strcmp(text, ic->info.file)))
9080 _e_fm2_icon_realpath(ic, oldpath, sizeof(oldpath));
9081 snprintf(newpath, sizeof(newpath), "%s/%s", ic->sd->realpath, text);
9082 if (e_filereg_file_protected(oldpath)) return;
9084 args = _e_fm_string_append_quoted(args, &size, &length, oldpath);
9085 args = _e_fm_string_append_char(args, &size, &length, ' ');
9086 args = _e_fm_string_append_quoted(args, &size, &length, newpath);
9088 _e_fm_client_file_move(args, ic->sd->obj);
9094 _e_fm_retry_abort_dialog(int pid, const char *str)
9100 char text[4096 + PATH_MAX];
9102 man = e_manager_current_get();
9103 if (!man) return NULL;
9104 con = e_container_current_get(man);
9105 if (!con) return NULL;
9107 id = malloc(sizeof(int));
9110 dialog = e_dialog_new(con, "E", "_fm_overwrite_dialog");
9111 E_OBJECT(dialog)->data = id;
9112 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm_retry_abort_delete_cb);
9113 e_dialog_button_add(dialog, _("Retry"), NULL, _e_fm_retry_abort_retry_cb, NULL);
9114 e_dialog_button_add(dialog, _("Abort"), NULL, _e_fm_retry_abort_abort_cb, NULL);
9116 e_dialog_button_focus_num(dialog, 0);
9117 e_dialog_title_set(dialog, _("Error"));
9118 e_dialog_icon_set(dialog, "dialog-error", 64);
9119 snprintf(text, sizeof(text),
9123 e_dialog_text_set(dialog, text);
9124 e_win_centered_set(dialog->win, 1);
9125 e_dialog_show(dialog);
9130 _e_fm_retry_abort_delete_cb(void *obj)
9132 int *id = E_OBJECT(obj)->data;
9137 _e_fm_retry_abort_retry_cb(void *data __UNUSED__, E_Dialog *dialog)
9139 int *id = E_OBJECT(dialog)->data;
9140 _e_fm2_op_registry_go_on(*id);
9141 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_RETRY, *id, NULL, 0);
9142 e_object_del(E_OBJECT(dialog));
9146 _e_fm_retry_abort_abort_cb(void *data __UNUSED__, E_Dialog *dialog)
9148 int *id = E_OBJECT(dialog)->data;
9149 _e_fm2_op_registry_aborted(*id);
9150 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_ABORT, *id, NULL, 0);
9151 e_object_del(E_OBJECT(dialog));
9155 _e_fm_overwrite_dialog(int pid, const char *str)
9161 char text[4096 + PATH_MAX];
9163 man = e_manager_current_get();
9164 if (!man) return NULL;
9165 con = e_container_current_get(man);
9166 if (!con) return NULL;
9168 id = malloc(sizeof(int));
9171 dialog = e_dialog_new(con, "E", "_fm_overwrite_dialog");
9172 E_OBJECT(dialog)->data = id;
9173 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm_overwrite_delete_cb);
9174 e_dialog_button_add(dialog, _("No"), NULL, _e_fm_overwrite_no_cb, NULL);
9175 e_dialog_button_add(dialog, _("No to all"), NULL, _e_fm_overwrite_no_all_cb, NULL);
9176 e_dialog_button_add(dialog, _("Yes"), NULL, _e_fm_overwrite_yes_cb, NULL);
9177 e_dialog_button_add(dialog, _("Yes to all"), NULL, _e_fm_overwrite_yes_all_cb, NULL);
9179 e_dialog_button_focus_num(dialog, 0);
9180 e_dialog_title_set(dialog, _("Warning"));
9181 e_dialog_icon_set(dialog, "dialog-warning", 64);
9182 snprintf(text, sizeof(text),
9183 _("File already exists, overwrite?<br><hilight>%s</hilight>"), str);
9185 e_dialog_text_set(dialog, text);
9186 e_win_centered_set(dialog->win, 1);
9187 e_dialog_show(dialog);
9192 _e_fm_overwrite_delete_cb(void *obj)
9194 int *id = E_OBJECT(obj)->data;
9199 _e_fm_overwrite_no_cb(void *data __UNUSED__, E_Dialog *dialog)
9201 int *id = E_OBJECT(dialog)->data;
9202 _e_fm2_op_registry_go_on(*id);
9203 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_NO, *id, NULL, 0);
9204 e_object_del(E_OBJECT(dialog));
9208 _e_fm_overwrite_no_all_cb(void *data __UNUSED__, E_Dialog *dialog)
9210 int *id = E_OBJECT(dialog)->data;
9211 _e_fm2_op_registry_go_on(*id);
9212 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_NO_ALL, *id, NULL, 0);
9213 e_object_del(E_OBJECT(dialog));
9217 _e_fm_overwrite_yes_cb(void *data __UNUSED__, E_Dialog *dialog)
9219 int *id = E_OBJECT(dialog)->data;
9220 _e_fm2_op_registry_go_on(*id);
9221 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_YES, *id, NULL, 0);
9222 e_object_del(E_OBJECT(dialog));
9226 _e_fm_overwrite_yes_all_cb(void *data __UNUSED__, E_Dialog *dialog)
9228 int *id = E_OBJECT(dialog)->data;
9229 _e_fm2_op_registry_go_on(*id);
9230 _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_YES_ALL, *id, NULL, 0);
9231 e_object_del(E_OBJECT(dialog));
9235 _e_fm_error_dialog(int pid, const char *str)
9241 char text[4096 + PATH_MAX];
9243 man = e_manager_current_get();
9244 if (!man) return NULL;
9245 con = e_container_current_get(man);
9246 if (!con) return NULL;
9248 id = malloc(sizeof(int));
9251 dialog = e_dialog_new(con, "E", "_fm_error_dialog");
9252 E_OBJECT(dialog)->data = id;
9253 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm_error_delete_cb);
9254 e_dialog_button_add(dialog, _("Retry"), NULL, _e_fm_error_retry_cb, NULL);
9255 e_dialog_button_add(dialog, _("Abort"), NULL, _e_fm_error_abort_cb, NULL);
9256 e_dialog_button_add(dialog, _("Ignore this"), NULL, _e_fm_error_ignore_this_cb, NULL);
9257 e_dialog_button_add(dialog, _("Ignore all"), NULL, _e_fm_error_ignore_all_cb, NULL);
9259 e_dialog_button_focus_num(dialog, 0);
9260 e_dialog_title_set(dialog, _("Error"));
9261 snprintf(text, sizeof(text),
9262 _("An error occurred while performing an operation.<br>"
9266 e_dialog_text_set(dialog, text);
9267 e_win_centered_set(dialog->win, 1);
9268 e_dialog_show(dialog);
9273 _e_fm_error_delete_cb(void *obj)
9275 int *id = E_OBJECT(obj)->data;
9280 _e_fm_error_retry_cb(void *data __UNUSED__, E_Dialog *dialog)
9282 int *id = E_OBJECT(dialog)->data;
9283 _e_fm2_op_registry_go_on(*id);
9284 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_RETRY, *id, NULL, 0);
9285 e_object_del(E_OBJECT(dialog));
9289 _e_fm_error_abort_cb(void *data __UNUSED__, E_Dialog *dialog)
9291 int *id = E_OBJECT(dialog)->data;
9292 _e_fm2_op_registry_aborted(*id);
9293 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_ABORT, *id, NULL, 0);
9294 e_object_del(E_OBJECT(dialog));
9298 _e_fm_error_ignore_this_cb(void *data __UNUSED__, E_Dialog *dialog)
9300 int *id = E_OBJECT(dialog)->data;
9301 _e_fm2_op_registry_go_on(*id);
9302 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_IGNORE_THIS, *id, NULL, 0);
9303 e_object_del(E_OBJECT(dialog));
9307 _e_fm_error_ignore_all_cb(void *data __UNUSED__, E_Dialog *dialog)
9309 int *id = E_OBJECT(dialog)->data;
9310 _e_fm2_op_registry_go_on(*id);
9311 _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_IGNORE_ALL, *id, NULL, 0);
9312 e_object_del(E_OBJECT(dialog));
9316 _e_fm_device_error_dialog(const char *title, const char *msg, const char *pstr)
9321 char text[PATH_MAX];
9322 const char *u, *d, *n, *m;
9324 man = e_manager_current_get();
9326 con = e_container_current_get(man);
9329 dialog = e_dialog_new(con, "E", "_fm_device_error_dialog");
9330 e_dialog_title_set(dialog, title);
9331 e_dialog_icon_set(dialog, "drive-harddisk", 64);
9332 e_dialog_button_add(dialog, _("OK"), NULL, NULL, NULL);
9335 pstr += strlen(pstr) + 1;
9337 pstr += strlen(pstr) + 1;
9339 pstr += strlen(pstr) + 1;
9341 snprintf(text, sizeof(text), "%s<br>%s<br>%s<br>%s<br>%s", msg, u, d, n, m);
9342 e_dialog_text_set(dialog, text);
9344 e_win_centered_set(dialog->win, 1);
9345 e_dialog_button_focus_num(dialog, 0);
9346 e_dialog_show(dialog);
9350 _e_fm2_file_application_properties(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9352 Efreet_Desktop *desktop;
9359 if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf)))
9361 desktop = efreet_desktop_get(buf);
9363 man = e_manager_current_get();
9365 con = e_container_current_get(man);
9368 e_desktop_edit(con, desktop);
9372 _e_fm2_file_properties(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9379 if ((ic->entry_dialog) || (ic->entry_widget)) return;
9381 man = e_manager_current_get();
9383 con = e_container_current_get(man);
9386 if (ic->prop_dialog) e_object_del(E_OBJECT(ic->prop_dialog));
9387 ic->prop_dialog = e_fm_prop_file(con, ic);
9388 E_OBJECT(ic->prop_dialog)->data = ic;
9389 e_object_del_attach_func_set(E_OBJECT(ic->prop_dialog), _e_fm2_file_properties_delete_cb);
9393 _e_fm2_file_properties_delete_cb(void *obj)
9397 ic = E_OBJECT(obj)->data;
9398 ic->prop_dialog = NULL;
9402 _e_fm2_file_delete_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9404 E_Fm2_Icon *ic = data;
9405 if ((!ic) || (!ic->sd)) return;
9406 _e_fm2_file_delete(ic->sd->obj);
9410 _e_fm2_file_delete(Evas_Object *obj)
9416 char text[4096 + 256];
9419 man = e_manager_current_get();
9421 con = e_container_current_get(man);
9423 ic = _e_fm2_icon_first_selected_find(obj);
9425 if (ic->dialog) return;
9426 dialog = e_dialog_new(con, "E", "_fm_file_delete_dialog");
9427 ic->dialog = dialog;
9428 E_OBJECT(dialog)->data = ic;
9429 e_object_del_attach_func_set(E_OBJECT(dialog), _e_fm2_file_delete_delete_cb);
9430 e_dialog_button_add(dialog, _("Yes"), NULL, _e_fm2_file_delete_yes_cb, ic);
9431 e_dialog_button_add(dialog, _("No"), NULL, _e_fm2_file_delete_no_cb, ic);
9432 e_dialog_button_focus_num(dialog, 1);
9433 e_dialog_title_set(dialog, _("Confirm Delete"));
9434 e_dialog_icon_set(dialog, "dialog-warning", 64);
9435 sel = e_fm2_selected_list_get(obj);
9436 if ((!sel) || (eina_list_count(sel) == 1))
9437 snprintf(text, sizeof(text),
9438 _("Are you sure you want to delete<br>"
9439 "<hilight>%s</hilight> ?"),
9443 snprintf(text, sizeof(text),
9444 _("Are you sure you want to delete<br>"
9445 "the %d selected files in:<br>"
9446 "<hilight>%s</hilight> ?"),
9447 eina_list_count(sel),
9450 if (sel) eina_list_free(sel);
9451 e_dialog_text_set(dialog, text);
9452 e_win_centered_set(dialog->win, 1);
9453 e_dialog_show(dialog);
9457 _e_fm2_file_delete_delete_cb(void *obj)
9461 ic = E_OBJECT(obj)->data;
9466 _e_fm_string_append_char(char *str, size_t *size, size_t *len, char c)
9476 if (*len >= *size - 1)
9479 str = realloc(str, *size);
9489 _e_fm_string_append_quoted(char *str, size_t *size, size_t *len, const char *src)
9491 str = _e_fm_string_append_char(str, size, len, '\'');
9497 str = _e_fm_string_append_char(str, size, len, '\'');
9498 str = _e_fm_string_append_char(str, size, len, '\\');
9499 str = _e_fm_string_append_char(str, size, len, '\'');
9500 str = _e_fm_string_append_char(str, size, len, '\'');
9503 str = _e_fm_string_append_char(str, size, len, *src);
9508 str = _e_fm_string_append_char(str, size, len, '\'');
9514 _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog)
9516 E_Fm2_Icon *ic, *ic_next;
9522 E_Fm2_Icon_Info *ici;
9527 e_object_del(E_OBJECT(dialog));
9528 ic_next = _e_fm2_icon_next_find(ic->sd->obj, 1, NULL, NULL);
9529 sel = e_fm2_selected_list_get(ic->sd->obj);
9530 if (sel && (eina_list_count(sel) != 1))
9532 EINA_LIST_FOREACH(sel, l, ici)
9534 if (ic_next && (&(ic_next->info) == ici))
9537 snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ici->file);
9538 if (e_filereg_file_protected(buf)) continue;
9540 files = _e_fm_string_append_quoted(files, &size, &len, buf);
9541 if (eina_list_next(l))
9542 files = _e_fm_string_append_char(files, &size, &len, ' ');
9545 eina_list_free(sel);
9549 _e_fm2_icon_realpath(ic, buf, sizeof(buf));
9550 if (e_filereg_file_protected(buf)) return;
9551 files = _e_fm_string_append_quoted(files, &size, &len, buf);
9554 _e_fm_client_file_del(files, ic->sd->obj);
9560 _e_fm2_icon_select(ic_next);
9561 evas_object_smart_callback_call(ic_next->sd->obj, "selection_change", NULL);
9562 _e_fm2_icon_make_visible(ic_next);
9565 evas_object_smart_callback_call(ic->sd->obj, "files_deleted", NULL);
9569 _e_fm2_file_delete_no_cb(void *data, E_Dialog *dialog)
9575 e_object_del(E_OBJECT(dialog));
9579 _e_fm2_refresh_job_cb(void *data)
9581 E_Fm2_Smart_Data *sd;
9583 sd = evas_object_smart_data_get(data);
9585 e_fm2_refresh(data);
9586 sd->refresh_job = NULL;
9590 _e_fm2_live_file_add(Evas_Object *obj, const char *file, const char *file_rel, int after, E_Fm2_Finfo *finf)
9592 E_Fm2_Smart_Data *sd;
9595 sd = evas_object_smart_data_get(obj);
9597 a = E_NEW(E_Fm2_Action, 1);
9599 sd->live.actions = eina_list_append(sd->live.actions, a);
9601 a->file = eina_stringshare_add(file);
9602 a->file2 = eina_stringshare_add(file_rel);
9604 if (finf) memcpy(&(a->finf), finf, sizeof(E_Fm2_Finfo));
9605 a->finf.lnk = eina_stringshare_add(a->finf.lnk);
9606 a->finf.rlnk = eina_stringshare_add(a->finf.rlnk);
9607 _e_fm2_live_process_begin(obj);
9611 _e_fm2_live_file_del(Evas_Object *obj, const char *file)
9613 E_Fm2_Smart_Data *sd;
9616 sd = evas_object_smart_data_get(obj);
9618 a = E_NEW(E_Fm2_Action, 1);
9620 sd->live.actions = eina_list_append(sd->live.actions, a);
9622 a->file = eina_stringshare_add(file);
9623 _e_fm2_live_process_begin(obj);
9627 _e_fm2_live_file_changed(Evas_Object *obj, const char *file, E_Fm2_Finfo *finf)
9629 E_Fm2_Smart_Data *sd;
9632 sd = evas_object_smart_data_get(obj);
9634 a = E_NEW(E_Fm2_Action, 1);
9636 sd->live.actions = eina_list_append(sd->live.actions, a);
9637 a->type = FILE_CHANGE;
9638 a->file = eina_stringshare_add(file);
9639 if (finf) memcpy(&(a->finf), finf, sizeof(E_Fm2_Finfo));
9640 a->finf.lnk = eina_stringshare_add(a->finf.lnk);
9641 a->finf.rlnk = eina_stringshare_add(a->finf.rlnk);
9642 _e_fm2_live_process_begin(obj);
9646 _e_fm2_live_process_begin(Evas_Object *obj)
9648 E_Fm2_Smart_Data *sd;
9650 sd = evas_object_smart_data_get(obj);
9651 if (!sd->live.actions) return;
9652 if ((sd->live.idler) || (sd->live.timer) ||
9653 (sd->listing) || (sd->scan_timer)) return;
9654 sd->live.idler = ecore_idler_add(_e_fm2_cb_live_idler, obj);
9655 sd->live.timer = ecore_timer_add(0.2, _e_fm2_cb_live_timer, obj);
9656 sd->tmp.last_insert = NULL;
9660 _e_fm2_live_process_end(Evas_Object *obj)
9662 E_Fm2_Smart_Data *sd;
9665 sd = evas_object_smart_data_get(obj);
9666 EINA_LIST_FREE(sd->live.actions, a)
9668 eina_stringshare_del(a->file);
9669 eina_stringshare_del(a->file2);
9670 eina_stringshare_del(a->finf.lnk);
9671 eina_stringshare_del(a->finf.rlnk);
9676 ecore_idler_del(sd->live.idler);
9677 sd->live.idler = NULL;
9681 ecore_timer_del(sd->live.timer);
9682 sd->live.timer = NULL;
9684 sd->tmp.last_insert = NULL;
9688 _e_fm2_live_process(Evas_Object *obj)
9690 E_Fm2_Smart_Data *sd;
9695 sd = evas_object_smart_data_get(obj);
9696 if (!sd->live.actions) return;
9697 a = eina_list_data_get(sd->live.actions);
9698 sd->live.actions = eina_list_remove_list(sd->live.actions, sd->live.actions);
9702 /* new file to sort in place */
9703 if (!strcmp(a->file, ".order"))
9705 sd->order_file = EINA_TRUE;
9706 /* FIXME: reload fm view */
9710 if (!((a->file[0] == '.') && (!sd->show_hidden_files)))
9711 _e_fm2_file_add(obj, a->file, 1, a->file2, a->flags, &(a->finf));
9716 if (!strcmp(a->file, ".order"))
9718 sd->order_file = EINA_FALSE;
9719 /* FIXME: reload fm view */
9723 if (!((a->file[0] == '.') && (!sd->show_hidden_files)))
9724 _e_fm2_file_del(obj, a->file);
9725 sd->live.deletions = EINA_TRUE;
9730 if (!strcmp(a->file, ".order"))
9732 /* FIXME: reload fm view - ignore for now */
9736 if (!((a->file[0] == '.') && (!sd->show_hidden_files)))
9738 EINA_LIST_FOREACH(sd->icons, l, ic)
9740 if (!strcmp(ic->info.file, a->file))
9742 if (ic->removable_state_change)
9744 _e_fm2_icon_unfill(ic);
9745 _e_fm2_icon_fill(ic, &(a->finf));
9746 ic->removable_state_change = EINA_FALSE;
9747 if ((ic->realized) && (ic->obj_icon))
9749 _e_fm2_icon_removable_update(ic);
9750 _e_fm2_icon_label_set(ic, ic->obj);
9757 realized = ic->realized;
9758 if (realized) _e_fm2_icon_unrealize(ic);
9759 _e_fm2_icon_unfill(ic);
9760 _e_fm2_icon_fill(ic, &(a->finf));
9761 if (realized) _e_fm2_icon_realize(ic);
9773 eina_stringshare_del(a->file);
9774 eina_stringshare_del(a->file2);
9775 eina_stringshare_del(a->finf.lnk);
9776 eina_stringshare_del(a->finf.rlnk);
9781 _e_fm2_cb_live_idler(void *data)
9783 E_Fm2_Smart_Data *sd;
9786 sd = evas_object_smart_data_get(data);
9787 if (!sd) return ECORE_CALLBACK_CANCEL;
9788 t = ecore_time_get();
9791 if (!sd->live.actions) break;
9792 _e_fm2_live_process(data);
9794 while ((ecore_time_get() - t) > 0.02);
9795 if (sd->live.actions) return ECORE_CALLBACK_RENEW;
9796 _e_fm2_live_process_end(data);
9797 _e_fm2_cb_live_timer(data);
9798 if ((sd->order_file) || (sd->config->view.always_order))
9800 e_fm2_refresh(data);
9802 sd->live.idler = NULL;
9803 return ECORE_CALLBACK_CANCEL;
9807 _e_fm2_cb_live_timer(void *data)
9809 E_Fm2_Smart_Data *sd;
9811 sd = evas_object_smart_data_get(data);
9812 if (!sd) return ECORE_CALLBACK_CANCEL;
9813 if (sd->queue) _e_fm2_queue_process(data);
9814 else if (sd->iconlist_changed)
9816 if (sd->resize_job) ecore_job_del(sd->resize_job);
9817 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, sd->obj);
9821 if (sd->live.deletions)
9823 sd->iconlist_changed = EINA_TRUE;
9824 if (sd->resize_job) ecore_job_del(sd->resize_job);
9825 sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, sd->obj);
9828 sd->live.deletions = EINA_FALSE;
9829 sd->live.timer = NULL;
9830 if ((!sd->queue) && (!sd->live.idler)) return ECORE_CALLBACK_CANCEL;
9831 sd->live.timer = ecore_timer_add(0.2, _e_fm2_cb_live_timer, data);
9832 return ECORE_CALLBACK_CANCEL;
9836 _e_fm2_theme_edje_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group)
9841 if (sd->custom_theme_content)
9842 snprintf(buf, sizeof(buf), "e/fileman/%s/%s", sd->custom_theme_content, group);
9844 snprintf(buf, sizeof(buf), "e/fileman/default/%s", group);
9846 if (sd->custom_theme)
9848 if (edje_object_file_set(o, sd->custom_theme, buf)) return 1;
9850 if (sd->custom_theme)
9852 if (!ecore_file_exists(sd->custom_theme))
9854 eina_stringshare_del(sd->custom_theme);
9855 sd->custom_theme = NULL;
9858 ret = e_theme_edje_object_set(o, category, buf);
9863 _e_fm2_theme_edje_icon_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *category, const char *group)
9868 // if (sd->custom_theme_content)
9869 // snprintf(buf, sizeof(buf), "e/icons/fileman/%s/%s", sd->custom_theme_content, group);
9871 snprintf(buf, sizeof(buf), "e/icons/fileman/%s", group);
9873 if (sd->custom_theme)
9875 if (edje_object_file_set(o, sd->custom_theme, buf)) return 1;
9877 if (sd->custom_theme)
9879 if (!ecore_file_exists(sd->custom_theme))
9881 eina_stringshare_del(sd->custom_theme);
9882 sd->custom_theme = NULL;
9885 ret = e_theme_edje_object_set(o, category, buf);
9890 _e_fm2_volume_mount(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9898 mp = e_fm2_device_volume_mountpoint_get(v);
9899 _e_fm2_client_mount(v->udi, mp);
9900 eina_stringshare_del(mp);
9904 _e_fm2_volume_unmount(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9911 v->auto_unmount = EINA_FALSE;
9912 _e_fm2_client_unmount(v->udi);
9916 _e_fm2_volume_eject(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__)
9923 v->auto_unmount = EINA_FALSE;
9924 _e_fm2_client_eject(v->udi);
9928 _update_volume_icon(E_Volume *v, E_Fm2_Icon *ic)
9930 if (ic->info.removable_full)
9931 edje_object_signal_emit(ic->obj_icon, "e,state,removable,full", "e");
9933 edje_object_signal_emit(ic->obj_icon, "e,state,removable,empty", "e");
9938 edje_object_signal_emit(ic->obj, "e,state,volume,mounted", "e");
9940 edje_object_signal_emit(ic->obj, "e,state,volume,unmounted", "e");
9943 edje_object_signal_emit(ic->obj, "e,state,volume,off", "e");
9947 _e_fm2_volume_icon_update(E_Volume *v)
9950 char file[PATH_MAX], fav[PATH_MAX], desk[PATH_MAX];
9954 if (!v || !v->storage) return;
9956 e_user_dir_snprintf(fav, sizeof(fav), "fileman/favorites");
9957 e_user_homedir_concat(desk, sizeof(desk), _("Desktop"));
9958 snprintf(file, sizeof(file), "|%s_%d.desktop",
9959 ecore_file_file_get(v->storage->udi), v->partition_number);
9961 EINA_LIST_FOREACH(_e_fm2_list, l, o)
9965 if ((_e_fm2_list_walking > 0) &&
9966 (eina_list_data_find(_e_fm2_list_remove, o))) continue;
9968 rp = e_fm2_real_path_get(o);
9969 if ((rp) && (strcmp(rp, fav)) && (strcmp(rp, desk))) continue;
9971 ic = _e_fm2_icon_find(o, file);
9973 _update_volume_icon(v, ic);
9978 _e_fm2_icon_removable_update(E_Fm2_Icon *ic)
9983 v = e_fm2_device_volume_find(ic->info.link);
9984 _update_volume_icon(v, ic);
9988 _e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere)
9990 ere->status = E_FM2_OP_STATUS_ABORTED;
9992 ere->needs_attention = 0;
9994 e_fm2_op_registry_entry_changed(ere);
9995 _e_fm_client_send(E_FM_OP_ABORT, ere->id, NULL, 0);
9999 e_fm2_operation_abort(int id)
10001 E_Fm2_Op_Registry_Entry *ere;
10003 ere = e_fm2_op_registry_entry_get(id);
10006 e_fm2_op_registry_entry_ref(ere);
10007 e_fm2_op_registry_entry_abort(ere);
10008 e_fm2_op_registry_entry_unref(ere);