From: Enlightenment S. <no-...@en...> - 2009-01-27 17:57:59
|
Log: Fix by Luis Felipe, Clang errors. Author: barbieri Date: 2009-01-27 09:57:49 -0800 (Tue, 27 Jan 2009) New Revision: 38816 Modified: trunk/e/src/bin/e_eap_editor.c Modified: trunk/e/src/bin/e_eap_editor.c =================================================================== --- trunk/e/src/bin/e_eap_editor.c 2009-01-27 16:59:06 UTC (rev 38815) +++ trunk/e/src/bin/e_eap_editor.c 2009-01-27 17:57:49 UTC (rev 38816) @@ -172,9 +172,9 @@ e_object_del(E_OBJECT(editor)); editor = NULL; } + else + e_config_dialog_changed_set(editor->cfd, new_desktop); - e_config_dialog_changed_set(editor->cfd, new_desktop); - return editor; } |
From: Enlightenment S. <no-...@en...> - 2009-02-15 14:31:15
|
Log: DONE: fm2 "delete" key needs to... delete. http://trac.enlightenment.org/e/wiki/Release Author: barbieri Date: 2009-02-15 06:31:09 -0800 (Sun, 15 Feb 2009) New Revision: 39026 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-15 14:02:28 UTC (rev 39025) +++ trunk/e/src/bin/e_fm.c 2009-02-15 14:31:09 UTC (rev 39026) @@ -5681,9 +5681,15 @@ } else if (!strcmp(ev->keyname, "Delete")) { - /* FIXME: all */ - /* delete file dialog */ - /* typebuf mode: delete */ + /* FIXME: typebuf extras */ + if (sd->typebuf_visible) + { /* typebuf mode: delete */ } + else + { + ic = _e_fm2_icon_first_selected_find(obj); + if (ic) + _e_fm2_file_delete(ic, NULL, NULL); + } } else { |
From: Enlightenment S. <no-...@en...> - 2009-02-15 14:50:33
|
Log: keyboard shortcuts: ^X, ^C and ^V now works. http://trac.enlightenment.org/e/wiki/Release Author: barbieri Date: 2009-02-15 06:50:30 -0800 (Sun, 15 Feb 2009) New Revision: 39027 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-15 14:31:09 UTC (rev 39026) +++ trunk/e/src/bin/e_fm.c 2009-02-15 14:50:30 UTC (rev 39027) @@ -5547,6 +5547,26 @@ sd = data; ev = event_info; + + if (evas_key_modifier_is_set(ev->modifiers, "Control")) + { + if (!strcmp(ev->keyname, "x")) + { + _e_fm2_file_cut(sd, NULL, NULL); + return; + } + else if (!strcmp(ev->keyname, "c")) + { + _e_fm2_file_copy(sd, NULL, NULL); + return; + } + else if (!strcmp(ev->keyname, "v")) + { + _e_fm2_file_paste(sd, NULL, NULL); + return; + } + } + if (!strcmp(ev->keyname, "Left")) { /* FIXME: icon mode, typebuf extras */ |
From: Enlightenment S. <no-...@en...> - 2009-02-15 15:25:30
|
Log: Minor refactor of interfaces, split code and menu callbacks. Let's make real code interfaces to take a single Evas_Object and menu items callbacks should call them. Author: barbieri Date: 2009-02-15 07:25:27 -0800 (Sun, 15 Feb 2009) New Revision: 39028 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-15 14:50:30 UTC (rev 39027) +++ trunk/e/src/bin/e_fm.c 2009-02-15 15:25:27 UTC (rev 39028) @@ -325,15 +325,19 @@ static void _e_fm_error_ignore_this_cb(void *data, E_Dialog *dialog); static void _e_fm_error_ignore_all_cb(void *data, E_Dialog *dialog); -static void _e_fm2_file_delete(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fm2_file_delete(Evas_Object *obj); +static void _e_fm2_file_delete_menu(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_file_delete_delete_cb(void *obj); static void _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog); static void _e_fm2_file_delete_no_cb(void *data, E_Dialog *dialog); static void _e_fm2_refresh_job_cb(void *data); static void _e_fm_file_buffer_clear(void); -static void _e_fm2_file_cut(void *data, E_Menu *m, E_Menu_Item *mi); -static void _e_fm2_file_copy(void *data, E_Menu *m, E_Menu_Item *mi); -static void _e_fm2_file_paste(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fm2_file_cut(Evas_Object *obj); +static void _e_fm2_file_copy(Evas_Object *obj); +static void _e_fm2_file_paste(Evas_Object *obj); +static void _e_fm2_file_cut_menu(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fm2_file_copy_menu(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fm2_file_paste_menu(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_live_file_add(Evas_Object *obj, const char *file, const char *file_rel, int after, E_Fm2_Finfo *finf); static void _e_fm2_live_file_del(Evas_Object *obj, const char *file); @@ -2439,21 +2443,18 @@ _e_fm_file_buffer_copying = 0; } -static void -_e_fm2_file_cut(void *data, E_Menu *m, E_Menu_Item *mi) +static void +_e_fm2_file_cut(Evas_Object *obj) { - E_Fm2_Smart_Data *sd; Eina_List *sel = NULL, *l = NULL; const char *realpath; - sd = data; - if (!sd) return; - sel = e_fm2_selected_list_get(sd->obj); + sel = e_fm2_selected_list_get(obj); if (!sel) return; _e_fm_file_buffer_clear(); - realpath = e_fm2_real_path_get(sd->obj); + realpath = e_fm2_real_path_get(obj); _e_fm_file_buffer_cutting = 1; for (l = sel; l; l = l->next) { @@ -2467,21 +2468,18 @@ } } -static void -_e_fm2_file_copy(void *data, E_Menu *m, E_Menu_Item *mi) +static void +_e_fm2_file_copy(Evas_Object *obj) { - E_Fm2_Smart_Data *sd; Eina_List *sel = NULL, *l = NULL; const char *realpath; - sd = data; - if (!sd) return; - sel = e_fm2_selected_list_get(sd->obj); + sel = e_fm2_selected_list_get(obj); if (!sel) return; _e_fm_file_buffer_clear(); - realpath = e_fm2_real_path_get(sd->obj); + realpath = e_fm2_real_path_get(obj); _e_fm_file_buffer_copying = 1; for (l = sel; l; l = l->next) { @@ -2495,8 +2493,8 @@ } } -static void -_e_fm2_file_paste(void *data, E_Menu *m, E_Menu_Item *mi) +static void +_e_fm2_file_paste(Evas_Object *obj) { E_Fm2_Smart_Data *sd; Eina_List *paths; @@ -2504,8 +2502,8 @@ size_t length = 0; size_t size = 0; char *args = NULL; - - sd = data; + + sd = evas_object_smart_data_get(obj); if (!sd) return; /* Convert URI list to a list of real paths. */ @@ -2556,6 +2554,27 @@ } static void +_e_fm2_file_cut_menu(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Fm2_Smart_Data *sd = data; + _e_fm2_file_cut(sd->obj); +} + +static void +_e_fm2_file_copy_menu(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Fm2_Smart_Data *sd = data; + _e_fm2_file_copy(sd->obj); +} + +static void +_e_fm2_file_paste_menu(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Fm2_Smart_Data *sd; + _e_fm2_file_paste(sd->obj); +} + +static void _e_fm2_queue_process(Evas_Object *obj) { E_Fm2_Smart_Data *sd; @@ -5552,17 +5571,17 @@ { if (!strcmp(ev->keyname, "x")) { - _e_fm2_file_cut(sd, NULL, NULL); + _e_fm2_file_cut(obj); return; } else if (!strcmp(ev->keyname, "c")) { - _e_fm2_file_copy(sd, NULL, NULL); + _e_fm2_file_copy(obj); return; } else if (!strcmp(ev->keyname, "v")) { - _e_fm2_file_paste(sd, NULL, NULL); + _e_fm2_file_paste(obj); return; } } @@ -5705,11 +5724,7 @@ if (sd->typebuf_visible) { /* typebuf mode: delete */ } else - { - ic = _e_fm2_icon_first_selected_find(obj); - if (ic) - _e_fm2_file_delete(ic, NULL, NULL); - } + _e_fm2_file_delete(obj); } else { @@ -6499,7 +6514,7 @@ e_theme_edje_file_get("base/theme/fileman", "e/fileman/default/button/paste"), "e/fileman/default/button/paste"); - e_menu_item_callback_set(mi, _e_fm2_file_paste, sd); + e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd); } } @@ -6658,7 +6673,7 @@ e_theme_edje_file_get("base/theme/fileman", "e/fileman/default/button/cut"), "e/fileman/default/button/cut"); - e_menu_item_callback_set(mi, _e_fm2_file_cut, sd); + e_menu_item_callback_set(mi, _e_fm2_file_cut_menu, sd); } } if (!(sd->icon_menu.flags & E_FM2_MENU_NO_COPY)) @@ -6675,7 +6690,7 @@ e_theme_edje_file_get("base/theme/fileman", "e/fileman/default/button/copy"), "e/fileman/default/button/copy"); - e_menu_item_callback_set(mi, _e_fm2_file_copy, sd); + e_menu_item_callback_set(mi, _e_fm2_file_copy_menu, sd); } if ((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) && @@ -6689,7 +6704,7 @@ e_theme_edje_file_get("base/theme/fileman", "e/fileman/default/button/paste"), "e/fileman/default/button/paste"); - e_menu_item_callback_set(mi, _e_fm2_file_paste, sd); + e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd); } } @@ -6748,7 +6763,7 @@ e_theme_edje_file_get("base/theme/fileman", "e/fileman/default/button/delete"), "e/fileman/default/button/delete"); - e_menu_item_callback_set(mi, _e_fm2_file_delete, ic); + e_menu_item_callback_set(mi, _e_fm2_file_delete_menu, ic); } if (!(sd->icon_menu.flags & E_FM2_MENU_NO_RENAME)) @@ -7563,21 +7578,28 @@ } static void -_e_fm2_file_delete(void *data, E_Menu *m, E_Menu_Item *mi) +_e_fm2_file_delete_menu(void *data, E_Menu *m, E_Menu_Item *mi) { + E_Fm2_Icon *ic = data; + _e_fm2_file_delete(ic->obj); +} + +static void +_e_fm2_file_delete(Evas_Object *obj) +{ E_Manager *man; E_Container *con; E_Dialog *dialog; E_Fm2_Icon *ic; char text[4096 + 256]; Eina_List *sel; - + man = e_manager_current_get(); if (!man) return; con = e_container_current_get(man); if (!con) return; - - ic = data; + ic = _e_fm2_icon_first_selected_find(obj); + if (!ic) return; if (ic->dialog) return; dialog = e_dialog_new(con, "E", "_fm_file_delete_dialog"); ic->dialog = dialog; @@ -7587,7 +7609,7 @@ e_dialog_button_add(dialog, _("No"), NULL, _e_fm2_file_delete_no_cb, ic); e_dialog_button_focus_num(dialog, 1); e_dialog_title_set(dialog, _("Confirm Delete")); - sel = e_fm2_selected_list_get(ic->sd->obj); + sel = e_fm2_selected_list_get(obj); if ((!sel) || (eina_list_count(sel) == 1)) snprintf(text, sizeof(text), _("Are you sure you want to delete<br>" |
From: Enlightenment S. <no-...@en...> - 2009-02-15 17:06:53
|
Log: Remove some warnings I introduced with past commits. Author: barbieri Date: 2009-02-15 09:06:49 -0800 (Sun, 15 Feb 2009) New Revision: 39029 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-15 15:25:27 UTC (rev 39028) +++ trunk/e/src/bin/e_fm.c 2009-02-15 17:06:49 UTC (rev 39029) @@ -2554,23 +2554,26 @@ } static void -_e_fm2_file_cut_menu(void *data, E_Menu *m, E_Menu_Item *mi) +_e_fm2_file_cut_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Fm2_Smart_Data *sd = data; + if (!sd) return; _e_fm2_file_cut(sd->obj); } static void -_e_fm2_file_copy_menu(void *data, E_Menu *m, E_Menu_Item *mi) +_e_fm2_file_copy_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Fm2_Smart_Data *sd = data; + if (!sd) return; _e_fm2_file_copy(sd->obj); } static void -_e_fm2_file_paste_menu(void *data, E_Menu *m, E_Menu_Item *mi) +_e_fm2_file_paste_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Fm2_Smart_Data *sd; + if (!sd) return; _e_fm2_file_paste(sd->obj); } @@ -7578,9 +7581,10 @@ } static void -_e_fm2_file_delete_menu(void *data, E_Menu *m, E_Menu_Item *mi) +_e_fm2_file_delete_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Fm2_Icon *ic = data; + if (!ic) return; _e_fm2_file_delete(ic->obj); } |
From: Enlightenment S. <no-...@en...> - 2009-02-15 23:09:13
|
Log: e_fm: remember directory settings. e_fm2_custom_file now remembers directory settings, it will save position on screen (horizontal and vertical pan percentage), view mode, icon size, if to remember ordering and if it should show hidden files. There is a menu option to remove these settings and inherit settings from parent. Author: barbieri Date: 2009-02-15 15:09:09 -0800 (Sun, 15 Feb 2009) New Revision: 39031 Modified: trunk/e/src/bin/e_fm.c trunk/e/src/bin/e_fm.h trunk/e/src/bin/e_fm_custom.c trunk/e/src/bin/e_fm_custom.h Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-15 18:54:41 UTC (rev 39030) +++ trunk/e/src/bin/e_fm.c 2009-02-15 23:09:09 UTC (rev 39031) @@ -76,6 +76,7 @@ unsigned char typebuf_visible : 1; unsigned char show_hidden_files : 1; unsigned char listing : 1; + unsigned char inherited_dir_props : 1; signed char view_mode; /* -1 = unset */ signed short icon_size; /* -1 = unset */ @@ -206,6 +207,9 @@ static void _e_fm2_regions_eval(Evas_Object *obj); static void _e_fm2_config_free(E_Fm2_Config *cfg); +static void _e_fm2_dir_load_props(E_Fm2_Smart_Data *sd); +static void _e_fm2_dir_save_props(E_Fm2_Smart_Data *sd); + static Evas_Object *_e_fm2_file_fm2_find(const char *file); static E_Fm2_Icon *_e_fm2_icon_find(Evas_Object *obj, const char *file); static const char *_e_fm2_uri_escape(const char *path); @@ -286,6 +290,7 @@ static void _e_fm2_icon_menu(E_Fm2_Icon *ic, Evas_Object *obj, unsigned int timestamp); static void _e_fm2_icon_menu_post_cb(void *data, E_Menu *m); static void _e_fm2_icon_menu_item_cb(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_view_menu_grid_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_view_menu_custom_icons_cb(void *data, E_Menu *m, E_Menu_Item *mi); @@ -590,6 +595,8 @@ _e_fm2_icons_free(obj); edje_object_part_text_set(sd->overlay, "e.text.busy_label", ""); + _e_fm2_dir_load_props(sd); + /* If the path change from a mountpoint to something else, we fake-unmount */ if (sd->mount && sd->mount->mount_point && strncmp(sd->mount->mount_point, sd->realpath, @@ -720,6 +727,126 @@ if (path) *path = sd->path; } +static E_Fm2_Custom_File * +_e_fm2_dir_load_props_from_parent(const char *path) +{ + E_Fm2_Custom_File *cf; + char *parent; + + if ((!path) || (path[0] == '\0') || (strcmp(path, "/") == 0)) + return NULL; + + parent = ecore_file_dir_get(path); + cf = e_fm2_custom_file_get(parent); + if ((cf) && (cf->dir) && (cf->dir->prop.in_use)) + { + free(parent); + return cf; + } + + cf = _e_fm2_dir_load_props_from_parent(parent); + free(parent); + return cf; +} + +static void +_e_fm2_dir_load_props(E_Fm2_Smart_Data *sd) +{ + E_Fm2_Custom_File *cf; + + cf = e_fm2_custom_file_get(sd->realpath); + if ((cf) && (cf->dir)) + { + Evas_Coord x, y; + + if (sd->max.w - sd->w > 0) + x = (sd->max.w - sd->w) * cf->dir->pos.x; + else + x = 0; + + if (sd->max.h - sd->h > 0) + y = (sd->max.h - sd->h) * cf->dir->pos.y; + else + y = 0; + + e_fm2_pan_set(sd->obj, x, y); + + if (cf->dir->prop.in_use) + { + sd->view_mode = cf->dir->prop.view_mode; + sd->icon_size = cf->dir->prop.icon_size; + sd->order_file = !!cf->dir->prop.order_file; + sd->show_hidden_files = !!cf->dir->prop.show_hidden_files; + sd->inherited_dir_props = 0; + return; + } + } + else + { + sd->pos.x = 0; + sd->pos.y = 0; + } + + sd->inherited_dir_props = 1; + + cf = _e_fm2_dir_load_props_from_parent(sd->realpath); + if ((cf) && (cf->dir) && (cf->dir->prop.in_use)) + { + sd->view_mode = cf->dir->prop.view_mode; + sd->icon_size = cf->dir->prop.icon_size; + sd->order_file = !!cf->dir->prop.order_file; + sd->show_hidden_files = !!cf->dir->prop.show_hidden_files; + } + else + { + sd->view_mode = -1; + sd->icon_size = -1; + sd->order_file = 0; + sd->show_hidden_files = 0; + } +} + +static void +_e_fm2_dir_save_props(E_Fm2_Smart_Data *sd) +{ + E_Fm2_Custom_File *cf, cf0; + E_Fm2_Custom_Dir dir0; + + cf = e_fm2_custom_file_get(sd->realpath); + if (!cf) + { + cf = &cf0; + memset(cf, 0, sizeof(*cf)); + cf->dir = &dir0; + } + else if (!cf->dir) + { + E_Fm2_Custom_File *cf2 = cf; + cf = &cf0; + memcpy(cf, cf2, sizeof(*cf2)); + cf->dir = &dir0; + } + + if (sd->max.w - sd->w > 0) + cf->dir->pos.x = sd->pos.x / (double)(sd->max.w - sd->w); + else + cf->dir->pos.x = 0.0; + + if (sd->max.h - sd->h) + cf->dir->pos.y = sd->pos.y / (double)(sd->max.h - sd->h); + else + cf->dir->pos.y = 0.0; + + cf->dir->prop.icon_size = sd->icon_size; + cf->dir->prop.view_mode = sd->view_mode; + cf->dir->prop.order_file = sd->order_file; + cf->dir->prop.show_hidden_files = sd->show_hidden_files; + cf->dir->prop.in_use = !sd->inherited_dir_props; + + e_fm2_custom_file_set(sd->realpath, cf); + e_fm2_custom_file_flush(); +} + EAPI void e_fm2_refresh(Evas_Object *obj) { @@ -730,6 +857,8 @@ if (!evas_object_type_get(obj)) return; // safety if (strcmp(evas_object_type_get(obj), "e_fm")) return; // safety + _e_fm2_dir_save_props(sd); + _e_fm2_queue_free(obj); _e_fm2_regions_free(obj); _e_fm2_icons_free(obj); @@ -5942,6 +6071,7 @@ _e_fm2_obj_icons_place(sd); edje_thaw(); evas_event_thaw(evas_object_evas_get(sd->obj)); + _e_fm2_dir_save_props(sd); } static void @@ -6022,6 +6152,17 @@ sd->iconlist_changed = 0; sd->pw = sd->w; sd->ph = sd->h; + + if ((sd->max.w > 0) && (sd->max.h > 0) && (sd->w > 0) && (sd->h > 0)) + { + E_Fm2_Custom_File *cf = e_fm2_custom_file_get(sd->realpath); + if ((cf) && (cf->dir)) + { + sd->pos.x = cf->dir->pos.x * (sd->max.w - sd->w); + sd->pos.y = cf->dir->pos.y * (sd->max.h - sd->h); + evas_object_smart_callback_call(sd->obj, "pan_changed", NULL); + } + } } static int @@ -6432,6 +6573,18 @@ mi = e_menu_item_new(mn); e_menu_item_separator_set(mi, 1); } + if (!(sd->icon_menu.flags & E_FM2_MENU_NO_INHERIT_PARENT)) + { + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Inherit parent settings")); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/inherit"), + "e/fileman/default/button/inherit"); + e_menu_item_check_set(mi, 1); + e_menu_item_toggle_set(mi, sd->inherited_dir_props); + e_menu_item_callback_set(mi, _e_fm2_toggle_inherit_dir_props, sd); + } if (!(sd->icon_menu.flags & E_FM2_MENU_NO_VIEW_MENU)) { mi = e_menu_item_new(mn); @@ -6589,6 +6742,18 @@ e_menu_item_separator_set(mi, 1); } + if (!(sd->icon_menu.flags & E_FM2_MENU_NO_INHERIT_PARENT)) + { + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Inherit parent settings")); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/inherit"), + "e/fileman/default/button/inherit"); + e_menu_item_check_set(mi, 1); + e_menu_item_toggle_set(mi, sd->inherited_dir_props); + e_menu_item_callback_set(mi, _e_fm2_toggle_inherit_dir_props, sd); + } if (!(sd->icon_menu.flags & E_FM2_MENU_NO_VIEW_MENU)) { mi = e_menu_item_new(mn); @@ -6947,9 +7112,10 @@ struct e_fm2_view_menu_icon_size_data *d = data; short current_size = _e_fm2_icon_w_get(d->sd); d->sd->icon_size = d->size; + d->sd->inherited_dir_props = 0; if (current_size == d->size) return; - e_fm2_refresh(d->sd->obj); + _e_fm2_refresh(d->sd, m, mi); } static void @@ -6966,11 +7132,12 @@ sd->icon_size = -1; new = _e_fm2_icon_w_get(sd); + sd->inherited_dir_props = 0; if (new == old) return; - e_fm2_refresh(sd->obj); + _e_fm2_refresh(sd, m, mi); } static void @@ -7027,6 +7194,17 @@ e_menu_item_callback_set(mi, _e_fm2_view_menu_icon_size_use_default, sd); } +static void +_e_fm2_toggle_inherit_dir_props(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Fm2_Smart_Data *sd = data; + + sd->inherited_dir_props = !sd->inherited_dir_props; + _e_fm2_dir_save_props(sd); + _e_fm2_dir_load_props(sd); + _e_fm2_refresh(sd, m, mi); +} + static void _e_fm2_view_menu_pre(void *data, E_Menu *m, E_Menu_Item *mi) { @@ -7101,10 +7279,11 @@ old = _e_fm2_view_mode_get(sd); sd->view_mode = E_FM2_VIEW_MODE_GRID_ICONS; + sd->inherited_dir_props = 0; if (old == E_FM2_VIEW_MODE_GRID_ICONS) return; - e_fm2_refresh(sd->obj); + _e_fm2_refresh(sd, m, mi); } static void @@ -7115,10 +7294,11 @@ old = _e_fm2_view_mode_get(sd); sd->view_mode = E_FM2_VIEW_MODE_CUSTOM_ICONS; + sd->inherited_dir_props = 0; if (old == E_FM2_VIEW_MODE_CUSTOM_ICONS) return; - e_fm2_refresh(sd->obj); + _e_fm2_refresh(sd, m, mi); } static void @@ -7129,10 +7309,11 @@ old = _e_fm2_view_mode_get(sd); sd->view_mode = E_FM2_VIEW_MODE_LIST; + sd->inherited_dir_props = 0; if (old == E_FM2_VIEW_MODE_LIST) return; - e_fm2_refresh(sd->obj); + _e_fm2_refresh(sd, m, mi); } static void @@ -7149,11 +7330,12 @@ sd->view_mode = -1; new = _e_fm2_view_mode_get(sd); + sd->inherited_dir_props = 0; if (new == old) return; - e_fm2_refresh(sd->obj); + _e_fm2_refresh(sd, m, mi); } static void @@ -7177,6 +7359,7 @@ else sd->show_hidden_files = 1; + sd->inherited_dir_props = 0; _e_fm2_refresh(data, m, mi); } @@ -7201,6 +7384,7 @@ f = fopen(buf, "w"); if (f) fclose(f); } + sd->inherited_dir_props = 0; _e_fm2_refresh(data, m, mi); } Modified: trunk/e/src/bin/e_fm.h =================================================================== --- trunk/e/src/bin/e_fm.h 2009-02-15 18:54:41 UTC (rev 39030) +++ trunk/e/src/bin/e_fm.h 2009-02-15 23:09:09 UTC (rev 39031) @@ -30,7 +30,8 @@ E_FM2_MENU_NO_CUT = (1 << 6), E_FM2_MENU_NO_COPY = (1 << 7), E_FM2_MENU_NO_PASTE = (1 << 8), - E_FM2_MENU_NO_VIEW_MENU = (1 << 9) + E_FM2_MENU_NO_VIEW_MENU = (1 << 9), + E_FM2_MENU_NO_INHERIT_PARENT = (1 << 10) } E_Fm2_Menu_Flags; typedef struct _E_Fm2_Config E_Fm2_Config; Modified: trunk/e/src/bin/e_fm_custom.c =================================================================== --- trunk/e/src/bin/e_fm_custom.c 2009-02-15 18:54:41 UTC (rev 39030) +++ trunk/e/src/bin/e_fm_custom.c 2009-02-15 23:09:09 UTC (rev 39031) @@ -17,8 +17,10 @@ static E_Powersave_Deferred_Action*_e_fm2_flush_defer = NULL; static Eet_File *_e_fm2_custom_file = NULL; static Eet_Data_Descriptor *_e_fm2_custom_file_edd = NULL; +static Eet_Data_Descriptor *_e_fm2_custom_dir_edd = NULL; static Eina_Hash *_e_fm2_custom_hash = NULL; static int _e_fm2_custom_writes = 0; +static int _e_fm2_custom_init = 0; /* FIXME: this uses a flat path key for custom file info. this is fine as * long as we only expect a limited number of custom info nodes. if we @@ -31,7 +33,12 @@ e_fm2_custom_file_init(void) { Eet_Data_Descriptor_Class eddc; - + + _e_fm2_custom_init++; + if (_e_fm2_custom_init > 1) return _e_fm2_custom_init; + + _e_fm2_custom_hash = eina_hash_string_superfast_new(NULL); + eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION; eddc.func.mem_alloc = NULL; eddc.func.mem_free = NULL; @@ -45,10 +52,21 @@ (void (*) (void *, int (*) (void *, const char *, void *, void *), void *)) eina_hash_foreach; eddc.func.hash_add = (void* (*) (void *, const char *, void *)) eet_eina_hash_add_alloc; - eddc.func.hash_free = (void (*) (Eina_Hash *)) eina_hash_free; + eddc.func.hash_free = (void (*) (void *)) eina_hash_free; eddc.name = "e_fm_custom_file"; eddc.size = sizeof(E_Fm2_Custom_File); + _e_fm2_custom_dir_edd = eet_data_descriptor2_new(&eddc); +#define DAT(x, y, z) EET_DATA_DESCRIPTOR_ADD_BASIC(_e_fm2_custom_dir_edd, E_Fm2_Custom_Dir, x, y, z) + DAT("pos.x", pos.x, EET_T_DOUBLE); + DAT("pos.y", pos.y, EET_T_DOUBLE); + DAT("prop.icon_size", prop.icon_size, EET_T_SHORT); + DAT("prop.view_mode", prop.view_mode, EET_T_CHAR); + DAT("prop.order_file", prop.order_file, EET_T_UCHAR); + DAT("prop.show_hidden_files", prop.show_hidden_files, EET_T_UCHAR); + DAT("prop.in_use", prop.in_use, EET_T_UCHAR); +#undef DAT + _e_fm2_custom_file_edd = eet_data_descriptor2_new(&eddc); #define DAT(x, y, z) EET_DATA_DESCRIPTOR_ADD_BASIC(_e_fm2_custom_file_edd, E_Fm2_Custom_File, x, y, z) DAT("g.x", geom.x, EET_T_INT); @@ -65,19 +83,29 @@ DAT("i.v", icon.valid, EET_T_UCHAR); DAT("l", label, EET_T_STRING); - + +#undef DAT + + EET_DATA_DESCRIPTOR_ADD_SUB(_e_fm2_custom_file_edd, E_Fm2_Custom_File, "dir", + dir, _e_fm2_custom_dir_edd); + return 1; } EAPI void e_fm2_custom_file_shutdown(void) { + _e_fm2_custom_init--; + if (_e_fm2_custom_init != 0) return; + _e_fm2_custom_file_info_save(); _e_fm2_custom_file_info_free(); if (_e_fm2_flush_defer) e_powersave_deferred_action_del(_e_fm2_flush_defer); _e_fm2_flush_defer = NULL; eet_data_descriptor_free(_e_fm2_custom_file_edd); _e_fm2_custom_file_edd = NULL; + eet_data_descriptor_free(_e_fm2_custom_dir_edd); + _e_fm2_custom_dir_edd = NULL; } EAPI E_Fm2_Custom_File * @@ -92,27 +120,75 @@ return cf; } +static void +_e_fm2_custom_dir_del(E_Fm2_Custom_Dir *dir) +{ + free(dir); +} + +static void +_e_fm2_custom_file_del(E_Fm2_Custom_File *cf) +{ + if (!cf) return; + + eina_stringshare_del(cf->icon.icon); + eina_stringshare_del(cf->label); + _e_fm2_custom_dir_del(cf->dir); + free(cf); +} + +static E_Fm2_Custom_Dir * +_e_fm2_custom_dir_dup(const E_Fm2_Custom_Dir *dir) +{ + E_Fm2_Custom_Dir *copy; + + if (!dir) return NULL; + + copy = calloc(1, sizeof(*copy)); + if (!copy) return NULL; + + memcpy(copy, dir, sizeof(*copy)); + return copy; +} + +EAPI E_Fm2_Custom_File * +e_fm2_custom_file_dup(const E_Fm2_Custom_File *cf) +{ + E_Fm2_Custom_File *copy; + + if (!cf) return NULL; + + copy = calloc(1, sizeof(*copy)); + if (!copy) return NULL; + + memcpy(copy, cf, sizeof(*copy)); + copy->icon.icon = eina_stringshare_add(cf->icon.icon); + copy->label = eina_stringshare_add(cf->label); + copy->dir = _e_fm2_custom_dir_dup(cf->dir); + return copy; +} + EAPI void -e_fm2_custom_file_set(const char *path, E_Fm2_Custom_File *cf) +e_fm2_custom_file_set(const char *path, const E_Fm2_Custom_File *cf) { + E_Fm2_Custom_File *cf1; _e_fm2_custom_file_info_load(); if (!_e_fm2_custom_file) return; if (_e_fm2_flush_defer) e_fm2_custom_file_flush(); - if (eina_hash_find(_e_fm2_custom_hash, path) != cf) + + cf1 = eina_hash_find(_e_fm2_custom_hash, path); + if ((cf1 != cf) || ((cf1) && (cf) && (cf1->dir != cf->dir))) { - E_Fm2_Custom_File *cf2; - - cf2 = calloc(1, sizeof(E_Fm2_Custom_File)); + E_Fm2_Custom_File *cf2 = e_fm2_custom_file_dup(cf); if (cf2) { - memcpy(cf2, cf, sizeof(E_Fm2_Custom_File)); - if (cf->icon.icon) - cf2->icon.icon = eina_stringshare_add(cf->icon.icon); - if (cf->label) - cf2->label = eina_stringshare_add(cf->label); - if (!_e_fm2_custom_hash) - _e_fm2_custom_hash = eina_hash_string_superfast_new(NULL); - eina_hash_add(_e_fm2_custom_hash, path, cf2); + if (cf1) + { + eina_hash_modify(_e_fm2_custom_hash, path, cf2); + _e_fm2_custom_file_del(cf1); + } + else + eina_hash_add(_e_fm2_custom_hash, path, cf2); } } _e_fm2_custom_writes = 1; @@ -137,9 +213,7 @@ if (cf2) { eina_hash_del(_e_fm2_custom_hash, l->data, cf2); - if (cf2->icon.icon) eina_stringshare_del(cf2->icon.icon); - if (cf2->label) eina_stringshare_del(cf2->label); - free(cf2); + _e_fm2_custom_file_del(cf2); } } eina_list_free(list); @@ -162,11 +236,7 @@ eina_hash_del(_e_fm2_custom_hash, path, cf2); cf = eina_hash_find(_e_fm2_custom_hash, new_path); if (cf) - { - if (cf->icon.icon) eina_stringshare_del(cf->icon.icon); - if (cf->label) eina_stringshare_del(cf->label); - free(cf); - } + _e_fm2_custom_file_del(cf); eina_hash_add(_e_fm2_custom_hash, new_path, cf2); } list = _e_fm2_custom_hash_key_base_list(_e_fm2_custom_hash, path); @@ -184,11 +254,7 @@ eina_hash_del(_e_fm2_custom_hash, l->data, cf2); cf = eina_hash_find(_e_fm2_custom_hash, buf); if (cf) - { - if (cf->icon.icon) eina_stringshare_del(cf->icon.icon); - if (cf->label) eina_stringshare_del(cf->label); - free(cf); - } + _e_fm2_custom_file_del(cf); eina_hash_add(_e_fm2_custom_hash, buf, cf2); } } @@ -270,12 +336,7 @@ static Eina_Bool _e_fm2_custom_file_hash_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata) { - E_Fm2_Custom_File *cf; - - cf = data; - if (cf->icon.icon) eina_stringshare_del(cf->icon.icon); - if (cf->label) eina_stringshare_del(cf->label); - free(cf); + _e_fm2_custom_file_del(data); return 1; } @@ -317,12 +378,7 @@ cf = eet_data_read(_e_fm2_custom_file, _e_fm2_custom_file_edd, list[i]); if (cf) - { - if (!_e_fm2_custom_hash) - _e_fm2_custom_hash = - eina_hash_string_superfast_new(NULL); - eina_hash_add(_e_fm2_custom_hash, list[i], cf); - } + eina_hash_add(_e_fm2_custom_hash, list[i], cf); } free(list); } @@ -372,7 +428,7 @@ eina_hash_foreach(_e_fm2_custom_hash, _e_fm2_custom_file_hash_foreach, NULL); eina_hash_free(_e_fm2_custom_hash); - _e_fm2_custom_hash = NULL; + _e_fm2_custom_hash = eina_hash_string_superfast_new(NULL); } } Modified: trunk/e/src/bin/e_fm_custom.h =================================================================== --- trunk/e/src/bin/e_fm_custom.h 2009-02-15 18:54:41 UTC (rev 39030) +++ trunk/e/src/bin/e_fm_custom.h 2009-02-15 23:09:09 UTC (rev 39031) @@ -4,11 +4,26 @@ #ifdef E_TYPEDEFS typedef struct _E_Fm2_Custom_File E_Fm2_Custom_File; +typedef struct _E_Fm2_Custom_Dir E_Fm2_Custom_Dir; #else #ifndef E_FM_CUSTOM_H #define E_FM_CUSTOM_H +struct _E_Fm2_Custom_Dir +{ + struct { + double x, y; + } pos; + struct { + signed short icon_size; /* -1 = unset */ + signed char view_mode; /* -1 = unset */ + unsigned char order_file; + unsigned char show_hidden_files; + unsigned char in_use; + } prop; +}; + struct _E_Fm2_Custom_File { struct { @@ -23,16 +38,19 @@ unsigned char valid; } icon; const char *label; + E_Fm2_Custom_Dir *dir; /* FIXME: this will have more added */ }; EAPI int e_fm2_custom_file_init(void); EAPI void e_fm2_custom_file_shutdown(void); EAPI E_Fm2_Custom_File *e_fm2_custom_file_get(const char *path); -EAPI void e_fm2_custom_file_set(const char *path, E_Fm2_Custom_File *cf); +EAPI void e_fm2_custom_file_set(const char *path, const E_Fm2_Custom_File *cf); EAPI void e_fm2_custom_file_del(const char *path); EAPI void e_fm2_custom_file_rename(const char *path, const char *new_path); EAPI void e_fm2_custom_file_flush(void); +EAPI E_Fm2_Custom_File *e_fm2_custom_file_dup(const E_Fm2_Custom_File *cf); + #endif #endif |
From: Enlightenment S. <no-...@en...> - 2009-02-16 00:29:02
|
Log: Oops, fix some bugs introduced with past commits. Author: barbieri Date: 2009-02-15 16:28:51 -0800 (Sun, 15 Feb 2009) New Revision: 39032 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-15 23:09:09 UTC (rev 39031) +++ trunk/e/src/bin/e_fm.c 2009-02-16 00:28:51 UTC (rev 39032) @@ -2701,7 +2701,7 @@ static void _e_fm2_file_paste_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { - E_Fm2_Smart_Data *sd; + E_Fm2_Smart_Data *sd = data; if (!sd) return; _e_fm2_file_paste(sd->obj); } @@ -7768,8 +7768,8 @@ _e_fm2_file_delete_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Fm2_Icon *ic = data; - if (!ic) return; - _e_fm2_file_delete(ic->obj); + if ((!ic) || (!ic->sd)) return; + _e_fm2_file_delete(ic->sd->obj); } static void |
From: Enlightenment S. <no-...@en...> - 2009-02-24 05:22:19
|
Log: fm: handle symbolic links. Symbolic links are handled similar to "paste". If you "Copy" you'll get the "Link" menu item that will create a symbolic link instead of real copying the file. Drag and Drop works similarly, use "Alt" in order to get a popup and select "Link" there. Toma: we do miss icons for it! Mekius & Ptomaine: please review as I'm not that familiar with e_fm_op.c Author: barbieri Date: 2009-02-23 21:22:14 -0800 (Mon, 23 Feb 2009) New Revision: 39170 Modified: trunk/e/src/bin/e_fm.c trunk/e/src/bin/e_fm.h trunk/e/src/bin/e_fm_main.c trunk/e/src/bin/e_fm_op.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-24 01:23:18 UTC (rev 39169) +++ trunk/e/src/bin/e_fm.c 2009-02-24 05:22:14 UTC (rev 39170) @@ -340,9 +340,11 @@ static void _e_fm2_file_cut(Evas_Object *obj); static void _e_fm2_file_copy(Evas_Object *obj); static void _e_fm2_file_paste(Evas_Object *obj); +static void _e_fm2_file_symlink(Evas_Object *obj); static void _e_fm2_file_cut_menu(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_file_copy_menu(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_file_paste_menu(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fm2_file_symlink_menu(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_live_file_add(Evas_Object *obj, const char *file, const char *file_rel, int after, E_Fm2_Finfo *finf); static void _e_fm2_live_file_del(Evas_Object *obj, const char *file); @@ -368,6 +370,7 @@ static int _e_fm_client_file_move(const char *args); 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); static int _e_fm_client_file_copy(const char *args); +static int _e_fm_client_file_symlink(const char *args); static void _e_fm2_sel_rect_update(void *data); static inline void _e_fm2_context_menu_append(Evas_Object *obj, const char *path, Eina_List *l, E_Menu *mn, E_Fm2_Icon *ic); @@ -1829,6 +1832,7 @@ 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) { +#if 0 char *d; int l1, l2, l3, l; @@ -1864,6 +1868,19 @@ } return _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)d, l); +#else + char *args = NULL; + size_t size = 0, length = 0; + + args = _e_fm_string_append_quoted(args, &size, &length, path); + args = _e_fm_string_append_char(args, &size, &length, ' '); + args = _e_fm_string_append_quoted(args, &size, &length, dest); + + fputs("WARNING: using new E_FM_OP_SYMLINK, remove deprecated ASAP\n", stderr); + int r = _e_fm_client_file_symlink(args); + free(args); + return r; +#endif } static int @@ -1872,6 +1889,12 @@ return _e_fm_client_send_new(E_FM_OP_COPY, (void *)args, strlen(args) + 1); } +static int +_e_fm_client_file_symlink(const char *args) +{ + return _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)args, strlen(args) + 1); +} + EAPI int _e_fm2_client_mount(const char *udi, const char *mountpoint) { @@ -2683,6 +2706,60 @@ } static void +_e_fm2_file_symlink(Evas_Object *obj) +{ + E_Fm2_Smart_Data *sd; + Eina_List *paths; + const char *filepath; + size_t length = 0; + size_t size = 0; + char *args = NULL; + + sd = evas_object_smart_data_get(obj); + if (!sd) return; + + /* Convert URI list to a list of real paths. */ + paths = _e_fm2_uri_path_list_get(_e_fm_file_buffer); + + while (paths) + { + /* Get file's full path. */ + filepath = eina_list_data_get(paths); + if (!filepath) + { + paths = eina_list_remove_list(paths, paths); + continue; + } + + /* Check if file is protected. */ + if (e_filereg_file_protected(filepath)) + { + eina_stringshare_del(filepath); + paths = eina_list_remove_list(paths, paths); + continue; + } + + /* Put filepath into a string of args. + * If there are more files, put an additional space. + */ + args = _e_fm_string_append_quoted(args, &size, &length, filepath); + args = _e_fm_string_append_char(args, &size, &length, ' '); + + eina_stringshare_del(filepath); + paths = eina_list_remove_list(paths, paths); + } + + /* Add destination to the arguments. */ + args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath); + + /* Roll the operation! */ + if (_e_fm_file_buffer_copying) + _e_fm_client_file_symlink(args); + + free(args); +} + +static void _e_fm2_file_cut_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) { E_Fm2_Smart_Data *sd = data; @@ -2707,6 +2784,14 @@ } static void +_e_fm2_file_symlink_menu(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi __UNUSED__) +{ + E_Fm2_Smart_Data *sd = data; + if (!sd) return; + _e_fm2_file_symlink(sd->obj); +} + +static void _e_fm2_queue_process(Evas_Object *obj) { E_Fm2_Smart_Data *sd; @@ -4909,6 +4994,16 @@ } static void +_e_fm_drop_menu_symlink_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + char *args = data; + + if (!data) return; + + _e_fm_client_file_symlink(args); +} + +static void _e_fm_drop_menu_abort_cb(void *data, E_Menu *m, E_Menu_Item *mi) { if (!data) return; @@ -4953,6 +5048,17 @@ "e/fileman/default/button/move"); item = e_menu_item_new(menu); + e_menu_item_label_set(item, _("Link")); + e_menu_item_callback_set(item, _e_fm_drop_menu_symlink_cb, args); + e_menu_item_icon_edje_set(item, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/symlink"), + "e/fileman/default/button/symlink"); + + item = e_menu_item_new(menu); + e_menu_item_separator_set(item, 1); + + item = e_menu_item_new(menu); e_menu_item_label_set(item, _("Abort")); e_menu_item_callback_set(item, _e_fm_drop_menu_abort_cb, args); e_menu_item_icon_edje_set(item, @@ -6656,15 +6762,17 @@ e_menu_item_callback_set(mi, _e_fm2_new_directory, sd); } - if ((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) && - (eina_list_count(_e_fm_file_buffer) > 0)) + if (((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) || + (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))) && + (eina_list_count(_e_fm_file_buffer) > 0) && + ecore_file_can_write(sd->realpath)) { - if (ecore_file_can_write(sd->realpath)) + mi = e_menu_item_new(mn); + e_menu_item_separator_set(mi, 1); + + if (!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) { mi = e_menu_item_new(mn); - e_menu_item_separator_set(mi, 1); - - mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Paste")); e_menu_item_icon_edje_set(mi, e_theme_edje_file_get("base/theme/fileman", @@ -6672,8 +6780,19 @@ "e/fileman/default/button/paste"); e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd); } + + if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK)) + { + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Link")); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/symlink"), + "e/fileman/default/button/symlink"); + e_menu_item_callback_set(mi, _e_fm2_file_symlink_menu, sd); + } } - + if (sd->icon_menu.end.func) sd->icon_menu.end.func(sd->icon_menu.end.data, sd->obj, mn, NULL); } @@ -6861,10 +6980,12 @@ e_menu_item_callback_set(mi, _e_fm2_file_copy_menu, sd); } - if ((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) && - (eina_list_count(_e_fm_file_buffer) > 0)) + if (((!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) || + (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK))) && + (eina_list_count(_e_fm_file_buffer) > 0) && + ecore_file_can_write(sd->realpath)) { - if (ecore_file_can_write(sd->realpath)) + if (!(sd->icon_menu.flags & E_FM2_MENU_NO_PASTE)) { mi = e_menu_item_new(mn); e_menu_item_label_set(mi, _("Paste")); @@ -6874,8 +6995,19 @@ "e/fileman/default/button/paste"); e_menu_item_callback_set(mi, _e_fm2_file_paste_menu, sd); } + + if (!(sd->icon_menu.flags & E_FM2_MENU_NO_SYMLINK)) + { + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Link")); + e_menu_item_icon_edje_set(mi, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/symlink"), + "e/fileman/default/button/symlink"); + e_menu_item_callback_set(mi, _e_fm2_file_symlink_menu, sd); + } } - + can_w = 0; can_w2 = 1; if (ic->sd->order_file) Modified: trunk/e/src/bin/e_fm.h =================================================================== --- trunk/e/src/bin/e_fm.h 2009-02-24 01:23:18 UTC (rev 39169) +++ trunk/e/src/bin/e_fm.h 2009-02-24 05:22:14 UTC (rev 39170) @@ -30,8 +30,9 @@ E_FM2_MENU_NO_CUT = (1 << 6), E_FM2_MENU_NO_COPY = (1 << 7), E_FM2_MENU_NO_PASTE = (1 << 8), - E_FM2_MENU_NO_VIEW_MENU = (1 << 9), - E_FM2_MENU_NO_INHERIT_PARENT = (1 << 10) + E_FM2_MENU_NO_SYMLINK = (1 << 9), + E_FM2_MENU_NO_VIEW_MENU = (1 << 10), + E_FM2_MENU_NO_INHERIT_PARENT = (1 << 11) } E_Fm2_Menu_Flags; typedef struct _E_Fm2_Config E_Fm2_Config; Modified: trunk/e/src/bin/e_fm_main.c =================================================================== --- trunk/e/src/bin/e_fm_main.c 2009-02-24 01:23:18 UTC (rev 39169) +++ trunk/e/src/bin/e_fm_main.c 2009-02-24 05:22:14 UTC (rev 39170) @@ -1340,6 +1340,11 @@ _e_fm_slave_run(E_FM_OP_COPY, (const char *)e->data, e->ref); } break; + case E_FM_OP_SYMLINK: /* fop ln -s */ + { + _e_fm_slave_run(E_FM_OP_SYMLINK, (const char *)e->data, e->ref); + } + break; case E_FM_OP_MKDIR: /* fop mkdir */ { const char *src, *rel; @@ -1422,21 +1427,6 @@ } } break; - case E_FM_OP_SYMLINK: /* dop ln -s */ - { - const char *src, *dst, *rel; - int rel_to, x, y; - - src = e->data; - dst = src + strlen(src) + 1; - rel = dst + strlen(dst) + 1; - memcpy(&rel_to, rel + strlen(rel) + 1, sizeof(int)); - memcpy(&x, rel + strlen(rel) + 1 + sizeof(int), sizeof(int)); - memcpy(&y, rel + strlen(rel) + 1 + sizeof(int), sizeof(int)); - ecore_file_symlink(src, dst); - /* FIXME: send back file add if succeeded */ - } - break; case E_FM_OP_ERROR_RESPONSE_IGNORE_THIS: case E_FM_OP_ERROR_RESPONSE_IGNORE_ALL: case E_FM_OP_ERROR_RESPONSE_ABORT: @@ -2151,14 +2141,18 @@ { char *buffer; unsigned int length = 0; - char command[3]; + char command[4]; if (type == E_FM_OP_MOVE) strcpy(command, "mv"); else if (type == E_FM_OP_REMOVE) strcpy(command, "rm"); - else + else if (type == E_FM_OP_COPY) strcpy(command, "cp"); + else if (type == E_FM_OP_SYMLINK) + strcpy(command, "lns"); + else + strcpy(command, "???"); length = 256 + strlen(getenv("E_LIB_DIR")) + strlen(args); buffer = malloc(length); Modified: trunk/e/src/bin/e_fm_op.c =================================================================== --- trunk/e/src/bin/e_fm_op.c 2009-02-24 01:23:18 UTC (rev 39169) +++ trunk/e/src/bin/e_fm_op.c 2009-02-24 05:22:14 UTC (rev 39170) @@ -66,6 +66,7 @@ static int _e_fm_op_copy_atom(E_Fm_Op_Task * task); static int _e_fm_op_scan_atom(E_Fm_Op_Task * task); static int _e_fm_op_copy_stat_info_atom(E_Fm_Op_Task * task); +static int _e_fm_op_symlink_atom(E_Fm_Op_Task * task); static int _e_fm_op_remove_atom(E_Fm_Op_Task * task); Ecore_Fd_Handler *_e_fm_op_stdin_handler = NULL; @@ -152,9 +153,11 @@ type = E_FM_OP_MOVE; else if (strcmp(argv[1], "rm") == 0) type = E_FM_OP_REMOVE; + else if (strcmp(argv[1], "lns") == 0) + type = E_FM_OP_SYMLINK; else return 0; - if ((type == E_FM_OP_COPY) || (type == E_FM_OP_MOVE)) + if ((type == E_FM_OP_COPY) || (type == E_FM_OP_MOVE) || (type == E_FM_OP_SYMLINK)) { if (argc < 4) goto quit; @@ -189,6 +192,9 @@ if ((type == E_FM_OP_MOVE) && (rename(task->src.name, task->dst.name) == 0)) _e_fm_op_task_free(task); + else if ((type == E_FM_OP_SYMLINK) && + (symlink(task->src.name, task->dst.name) == 0)) + _e_fm_op_task_free(task); else _e_fm_op_scan_queue = eina_list_append(_e_fm_op_scan_queue, task); @@ -214,7 +220,10 @@ /* Try a rename */ if ((type == E_FM_OP_MOVE) && (rename(argv[2], argv[3]) == 0)) goto quit; - + else if ((type == E_FM_OP_SYMLINK) && + (symlink(task->src.name, task->dst.name) == 0)) + goto quit; + /* If that does work, setup a copy and delete operation. It's not atomic, but it's the best we can do. */ task = _e_fm_op_task_new(); @@ -613,6 +622,8 @@ _e_fm_op_remove_atom(task); else if (task->type == E_FM_OP_COPY_STAT_INFO) _e_fm_op_copy_stat_info_atom(task); + else if (task->type == E_FM_OP_SYMLINK) + _e_fm_op_symlink_atom(task); if (task->finished) { @@ -1338,7 +1349,20 @@ ctask->link = _e_fm_op_separator->next; } + else if (task->type == E_FM_OP_SYMLINK) + { + _e_fm_op_update_progress(NULL, 0, REMOVECHUNKSIZE); + rtask = _e_fm_op_task_new(); + rtask->src.name = eina_stringshare_add(task->src.name); + memcpy(&(rtask->src.st), &(task->src.st), sizeof(struct stat)); + if (task->dst.name) + rtask->dst.name = eina_stringshare_add(task->dst.name); + rtask->type = E_FM_OP_SYMLINK; + + _e_fm_op_work_queue = eina_list_prepend(_e_fm_op_work_queue, rtask); + } + return 1; } @@ -1357,6 +1381,23 @@ } static int +_e_fm_op_symlink_atom(E_Fm_Op_Task *task) +{ + if (_e_fm_op_abort) return 1; + + E_FM_OP_DEBUG("Symlink: %s -> %s\n", task->src.name, task->dst.name); + + if (symlink(task->src.name, task->dst.name) != 0) + _E_FM_OP_ERROR_SEND_WORK(task, E_FM_OP_ERROR, "Cannot create link from '%s' to '%s': %s.", task->src.name, task->dst.name); + + task->dst.done += REMOVECHUNKSIZE; + _e_fm_op_update_progress(task, REMOVECHUNKSIZE, 0); + task->finished = 1; + + return 0; +} + +static int _e_fm_op_remove_atom(E_Fm_Op_Task * task) { if (_e_fm_op_abort) return 1; |
From: Enlightenment S. <no-...@en...> - 2009-02-25 21:06:32
|
Log: Enable per-dir theme of rubberband as well. Author: barbieri Date: 2009-02-25 13:06:21 -0800 (Wed, 25 Feb 2009) New Revision: 39219 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-02-25 20:19:32 UTC (rev 39218) +++ trunk/e/src/bin/e_fm.c 2009-02-25 21:06:21 UTC (rev 39219) @@ -695,6 +695,8 @@ "list/drop_in"); _e_fm2_theme_edje_object_set(sd, sd->overlay, "base/theme/fileman", "overlay"); + _e_fm2_theme_edje_object_set(sd, sd->sel_rect, "base/theme/fileman", + "rubberband"); } EAPI void |
From: Enlightenment S. <no-...@en...> - 2009-03-01 21:07:03
|
Log: efm: use freedesktop icons from icon theme. This almost remove need of e_fm_mime.c since it will use efreet, but may bring some slowdowns due efreet. In this case let's try to optimize efreet and improve everything. Author: barbieri Date: 2009-03-01 13:06:51 -0800 (Sun, 01 Mar 2009) New Revision: 39315 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-01 19:48:30 UTC (rev 39314) +++ trunk/e/src/bin/e_fm.c 2009-03-01 21:06:51 UTC (rev 39315) @@ -229,11 +229,11 @@ static void _e_fm2_icon_free(E_Fm2_Icon *ic); static void _e_fm2_icon_realize(E_Fm2_Icon *ic); static void _e_fm2_icon_unrealize(E_Fm2_Icon *ic); -static int _e_fm2_icon_visible(E_Fm2_Icon *ic); +static Eina_Bool _e_fm2_icon_visible(const E_Fm2_Icon *ic); static void _e_fm2_icon_label_set(E_Fm2_Icon *ic, Evas_Object *obj); static Evas_Object *_e_fm2_icon_icon_direct_set(E_Fm2_Icon *ic, Evas_Object *o, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen); static void _e_fm2_icon_icon_set(E_Fm2_Icon *ic); -static void _e_fm2_icon_thumb(E_Fm2_Icon *ic, Evas_Object *oic, int force); +static void _e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force); static void _e_fm2_icon_select(E_Fm2_Icon *ic); static void _e_fm2_icon_deselect(E_Fm2_Icon *ic); static int _e_fm2_icon_desktop_load(E_Fm2_Icon *ic); @@ -398,6 +398,8 @@ static int _e_fm_file_buffer_copying = 0; static const char *_e_fm2_icon_desktop_str = NULL; static const char *_e_fm2_icon_thumb_str = NULL; +static const char *_e_fm2_mime_inode_directory = NULL; +static const char *_e_fm2_mime_app_desktop = NULL; /* contains: * _e_volume_edd @@ -499,6 +501,30 @@ return ((p) && (_e_fm2_ext_is_desktop(p + 1))); } +static inline char +_e_fm2_view_mode_get(const E_Fm2_Smart_Data *sd) +{ + if (sd->view_mode > -1) + return sd->view_mode; + return sd->config->view.mode; +} + +static inline Evas_Coord +_e_fm2_icon_w_get(const E_Fm2_Smart_Data *sd) +{ + if (sd->icon_size > -1) + return sd->icon_size * e_scale; + return sd->config->icon.icon.w; +} + +static inline Evas_Coord +_e_fm2_icon_h_get(const E_Fm2_Smart_Data *sd) +{ + if (sd->icon_size > -1) + return sd->icon_size * e_scale; + return sd->config->icon.icon.h; +} + /***/ EAPI int @@ -542,6 +568,8 @@ _e_fm2_icon_desktop_str = eina_stringshare_add("DESKTOP"); _e_fm2_icon_thumb_str = eina_stringshare_add("THUMB"); + _e_fm2_mime_inode_directory = eina_stringshare_add("inode/directory"); + _e_fm2_mime_app_desktop = eina_stringshare_add("application/x-desktop"); return 1; } @@ -549,10 +577,10 @@ EAPI int e_fm2_shutdown(void) { - eina_stringshare_del(_e_fm2_icon_desktop_str); - _e_fm2_icon_desktop_str = NULL; - eina_stringshare_del(_e_fm2_icon_thumb_str); - _e_fm2_icon_thumb_str = NULL; + _eina_stringshare_replace(&_e_fm2_icon_desktop_str, NULL); + _eina_stringshare_replace(&_e_fm2_icon_thumb_str, NULL); + _eina_stringshare_replace(&_e_fm2_mime_inode_directory, NULL); + _eina_stringshare_replace(&_e_fm2_mime_app_desktop, NULL); evas_smart_free(_e_fm2_smart); _e_fm2_smart = NULL; @@ -1434,7 +1462,7 @@ * @see _e_fm2_icon_explicit_get() */ static Evas_Object * -_e_fm2_icon_explicit_edje_get(Evas *evas, E_Fm2_Icon *ic, const char *iconpath, const char **type_ret) +_e_fm2_icon_explicit_edje_get(Evas *evas, const E_Fm2_Icon *ic, const char *iconpath, const char **type_ret) { Evas_Object *o = edje_object_add(evas); if (!o) @@ -1459,7 +1487,7 @@ * @see _e_fm2_icon_explicit_get() */ static Evas_Object * -_e_fm2_icon_explicit_theme_icon_get(Evas *evas, E_Fm2_Icon *ic, const char *name, const char **type_ret) +_e_fm2_icon_explicit_theme_icon_get(Evas *evas, const E_Fm2_Icon *ic, const char *name, const char **type_ret) { Evas_Object *o = edje_object_add(evas); if (!o) @@ -1485,7 +1513,7 @@ * @see _e_fm2_icon_explicit_get() */ static Evas_Object * -_e_fm2_icon_explicit_theme_get(Evas *evas, E_Fm2_Icon *ic, const char *name, const char **type_ret) +_e_fm2_icon_explicit_theme_get(Evas *evas, const E_Fm2_Icon *ic, const char *name, const char **type_ret) { Evas_Object *o = edje_object_add(evas); if (!o) @@ -1510,7 +1538,7 @@ * @param icon might be an absolute or relative path, or icon name or edje path. */ static Evas_Object * -_e_fm2_icon_explicit_get(Evas *evas, E_Fm2_Icon *ic, const char *icon, const char **type_ret) +_e_fm2_icon_explicit_get(Evas *evas, const E_Fm2_Icon *ic, const char *icon, const char **type_ret) { char buf[PATH_MAX]; const char *iconpath; @@ -1545,7 +1573,7 @@ * It will find out if it is a folder, file or like and set it accordingly. */ static Evas_Object * -_e_fm2_icon_fallback_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret) +_e_fm2_icon_fallback_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret) { const char *name; @@ -1585,7 +1613,7 @@ * @param force_gen whenever to force generation of thumbnails, even it exists. */ static Evas_Object * -_e_fm2_icon_thumb_get(Evas *evas, E_Fm2_Icon *ic, const char *group, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) +_e_fm2_icon_thumb_get(Evas *evas, const E_Fm2_Icon *ic, const char *group, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) { Evas_Object *o; char buf[PATH_MAX]; @@ -1614,7 +1642,7 @@ * known groups like 'icon', 'e/desktop/background' and 'e/init/splash'. */ static Evas_Object * -_e_fm2_icon_thumb_edje_get(Evas *evas, E_Fm2_Icon *ic, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) +_e_fm2_icon_thumb_edje_get(Evas *evas, const E_Fm2_Icon *ic, void (*cb) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) { char buf[PATH_MAX]; const char **itr, *group; @@ -1658,7 +1686,7 @@ * Machinery for _e_fm2_icon_desktop_get() and others with instances of desktop. */ static Evas_Object * -_e_fm2_icon_desktop_get_internal(Evas *evas, E_Fm2_Icon *ic, Efreet_Desktop *desktop, const char **type_ret) +_e_fm2_icon_desktop_get_internal(Evas *evas, const E_Fm2_Icon *ic, Efreet_Desktop *desktop, const char **type_ret) { Evas_Object *o; @@ -1681,7 +1709,7 @@ * Use freedesktop.org '.desktop' files to set icon. */ static Evas_Object * -_e_fm2_icon_desktop_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret) +_e_fm2_icon_desktop_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret) { Efreet_Desktop *ef; Evas_Object *o; @@ -1702,13 +1730,63 @@ return o; } +static inline const char * +_e_fm2_icon_mime_type_special_match(const E_Fm2_Icon *ic) +{ + const Eina_List *l; + const E_Config_Mime_Icon *mi; + const char *mime = ic->info.mime; + + EINA_LIST_FOREACH(e_config->mime_icons, l, mi) + if (mi->mime == mime) /* both in the same stringshare pool */ + return mi->icon; + + return NULL; +} + +static inline unsigned int +_e_fm2_icon_mime_size_normalize(const E_Fm2_Icon *ic) +{ + const unsigned int *itr, known_sizes[] = { + 16, 22, 24, 32, 36, 48, 64, 72, 96, 128, 192, -1 + }; + unsigned int desired = _e_fm2_icon_w_get(ic->sd); + for (itr = known_sizes; *itr > 0; itr++) + if (*itr >= desired) + return *itr; + + return 256; /* largest know size? */ +} + /** * Use mime type information to set icon. */ static Evas_Object * -_e_fm2_icon_mime_get(Evas *evas, E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) +_e_fm2_icon_mime_get(Evas *evas, const E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) { - const char *icon = e_fm_mime_icon_get(ic->info.mime); + const char *icon; + unsigned int size; + + icon = _e_fm2_icon_mime_type_special_match(ic); + if (icon) + { + if (icon == _e_fm2_icon_desktop_str) + return _e_fm2_icon_desktop_get(evas, ic, type_ret); + else if (icon == _e_fm2_icon_thumb_str) + return _e_fm2_icon_thumb_get(evas, ic, NULL, + gen_func, data, force_gen, type_ret); + else if (strncmp(icon, "e/icons/fileman/mime/", 21) == 0) + return _e_fm2_icon_explicit_theme_get(evas, ic, icon + 21 - 5, type_ret); + else + return _e_fm2_icon_explicit_get(evas, ic, icon, type_ret); + } + + size = _e_fm2_icon_mime_size_normalize(ic); + icon = efreet_mime_type_icon_get(ic->info.mime, e_config->icon_theme, size); + if (icon) return _e_fm2_icon_explicit_get(evas, ic, icon, type_ret); + + /* XXX REMOVE/DEPRECATED below here */ + icon = e_fm_mime_icon_get(ic->info.mime); if (!icon) return NULL; if (icon == _e_fm2_icon_desktop_str) @@ -1726,7 +1804,7 @@ * Discovers the executable of Input Method Config file and set icon. */ static Evas_Object * -_e_fm2_icon_imc_get(Evas *evas, E_Fm2_Icon *ic, const char **type_ret) +_e_fm2_icon_imc_get(Evas *evas, const E_Fm2_Icon *ic, const char **type_ret) { E_Input_Method_Config *imc; Efreet_Desktop *desktop; @@ -1769,7 +1847,7 @@ * Use heuristics to discover and set icon. */ static Evas_Object * -_e_fm2_icon_discover_get(Evas *evas, E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) +_e_fm2_icon_discover_get(Evas *evas, const E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), void *data, int force_gen, const char **type_ret) { const char *p; @@ -3505,30 +3583,6 @@ } } -static inline char -_e_fm2_view_mode_get(const E_Fm2_Smart_Data *sd) -{ - if (sd->view_mode > -1) - return sd->view_mode; - return sd->config->view.mode; -} - -static inline Evas_Coord -_e_fm2_icon_w_get(const E_Fm2_Smart_Data *sd) -{ - if (sd->icon_size > -1) - return sd->icon_size * e_scale; - return sd->config->icon.icon.w; -} - -static inline Evas_Coord -_e_fm2_icon_h_get(const E_Fm2_Smart_Data *sd) -{ - if (sd->icon_size > -1) - return sd->icon_size * e_scale; - return sd->config->icon.icon.h; -} - static void _e_fm2_icons_place(Evas_Object *obj) { @@ -3930,11 +3984,14 @@ if (S_ISDIR(ic->info.statinfo.st_mode)) { - ic->info.mime = eina_stringshare_add("inode/directory"); + ic->info.mime = eina_stringshare_ref(_e_fm2_mime_inode_directory); } - if (!ic->info.mime) + else if (!ic->info.mime) { - mime = e_fm_mime_filename_get(ic->info.file); + mime = efreet_mime_type_get(buf); + if (!mime) + /* XXX REMOVE/DEPRECATE ME LATER */ + mime = e_fm_mime_filename_get(ic->info.file); if (mime) ic->info.mime = eina_stringshare_add(mime); } @@ -4207,8 +4264,8 @@ ic->obj_icon = NULL; } -static int -_e_fm2_icon_visible(E_Fm2_Icon *ic) +static Eina_Bool +_e_fm2_icon_visible(const E_Fm2_Icon *ic) { /* return if the icon is visible */ if ( @@ -4282,7 +4339,7 @@ } static void -_e_fm2_icon_thumb(E_Fm2_Icon *ic, Evas_Object *oic, int force) +_e_fm2_icon_thumb(const E_Fm2_Icon *ic, Evas_Object *oic, int force) { if ((force) || ((_e_fm2_icon_visible(ic)) && |
From: Enlightenment S. <no-...@en...> - 2009-03-02 11:56:08
|
Log: fix problem with double directories in virtual devices. oops, were using realpath and not path! PS: still segfaults on some cases, related to mouse up callback being called on already deleted icons, that should not happen as objects are unrealized before being deleted. Need to investigate. Author: barbieri Date: 2009-03-02 03:55:57 -0800 (Mon, 02 Mar 2009) New Revision: 39329 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-02 11:50:38 UTC (rev 39328) +++ trunk/e/src/bin/e_fm.c 2009-03-02 11:55:57 UTC (rev 39329) @@ -427,12 +427,18 @@ } static inline Eina_Bool -_e_fm2_icon_path(const E_Fm2_Icon *ic, char *buf, int buflen) +_e_fm2_icon_realpath(const E_Fm2_Icon *ic, char *buf, int buflen) { int r = snprintf(buf, buflen, "%s/%s", ic->sd->realpath, ic->info.file); return r < buflen; } +static inline Eina_Bool +_e_fm2_icon_path(const E_Fm2_Icon *ic, char *buf, int buflen) +{ + int r = snprintf(buf, buflen, "%s/%s", ic->sd->path, ic->info.file); + return r < buflen; +} static inline Eina_Bool _e_fm2_ext_is_edje(const char *ext) @@ -1625,7 +1631,7 @@ else { char buf[PATH_MAX]; - if (!_e_fm2_icon_path(ic, buf, sizeof(buf))) + if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf))) name = "file"; else { @@ -1653,7 +1659,7 @@ Evas_Object *o; char buf[PATH_MAX]; - if (!_e_fm2_icon_path(ic, buf, sizeof(buf))) + if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf))) return NULL; o = e_thumb_icon_add(evas); @@ -1690,7 +1696,7 @@ NULL }; - if (!_e_fm2_icon_path(ic, buf, sizeof(buf))) + if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf))) return NULL; known_groups[0] = ic->sd->config->icon.key_hint; @@ -1753,7 +1759,7 @@ if (!ic->info.file) return NULL; - if (!_e_fm2_icon_path(ic, buf,sizeof(buf))) + if (!_e_fm2_icon_realpath(ic, buf,sizeof(buf))) return NULL; ef = efreet_desktop_new(buf); @@ -1850,7 +1856,7 @@ if (!ic->info.file) return NULL; - if (!_e_fm2_icon_path(ic, buf, sizeof(buf))) + if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf))) return NULL; imc_ef = eet_open(buf, EET_FILE_MODE_READ); @@ -3962,7 +3968,7 @@ const char *mime; E_Fm2_Custom_File *cf; - if (!_e_fm2_icon_path(ic, buf, sizeof(buf))) + if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf))) return 0; cf = e_fm2_custom_file_get(buf); if (finf) @@ -4450,7 +4456,7 @@ char buf[PATH_MAX]; Efreet_Desktop *desktop; - if (!_e_fm2_icon_path(ic, buf, sizeof(buf))) + if (!_e_fm2_icon_realpath(ic, buf, sizeof(buf))) return 0; desktop = efreet_desktop_new(buf); @@ -4820,29 +4826,14 @@ static void _e_fm2_typebuf_run(Evas_Object *obj) { - E_Fm2_Smart_Data *sd; E_Fm2_Icon *ic; - - sd = evas_object_smart_data_get(obj); - if (!sd) return; + _e_fm2_typebuf_hide(obj); ic = _e_fm2_icon_first_selected_find(obj); if (ic) { - if ((S_ISDIR(ic->info.statinfo.st_mode)) && - (ic->sd->config->view.open_dirs_in_place) && - (!ic->sd->config->view.no_subdir_jump) && - (!ic->sd->config->view.single_click) - ) - { - char buf[PATH_MAX]; - if (_e_fm2_icon_path(ic, buf, sizeof(buf))) - e_fm2_path_set(ic->sd->obj, ic->sd->dev, buf); - } - else - { - evas_object_smart_callback_call(ic->sd->obj, "selected", NULL); - } + if (_e_fm2_inplace_open(ic) == 0) + evas_object_smart_callback_call(ic->sd->obj, "selected", NULL); } } @@ -7301,7 +7292,7 @@ can_w = 1; /* struct stat st; - if (_e_fm2_icon_path(ic, buf, sizeof(buf)) && + if (_e_fm2_icon_realpath(ic, buf, sizeof(buf)) && (lstat(buf, &st) == 0)) { if (st.st_uid == getuid()) @@ -7324,7 +7315,7 @@ sel = e_fm2_selected_list_get(ic->sd->obj); if ((!sel) || eina_list_count(sel) == 1) { - _e_fm2_icon_path(ic, buf, sizeof(buf)); + _e_fm2_icon_realpath(ic, buf, sizeof(buf)); protect = e_filereg_file_protected(buf); } else @@ -7373,7 +7364,7 @@ l = e_fm2_mime_handler_mime_handlers_get(ic->info.mime); if (l) { - _e_fm2_icon_path(ic, buf, sizeof(buf)); + _e_fm2_icon_realpath(ic, buf, sizeof(buf)); _e_fm2_context_menu_append(obj, buf, l, mn, ic); } } @@ -7383,7 +7374,7 @@ l = e_fm2_mime_handler_glob_handlers_get(buf); if (l) { - _e_fm2_icon_path(ic, buf, sizeof(buf)); + _e_fm2_icon_realpath(ic, buf, sizeof(buf)); _e_fm2_context_menu_append(obj, buf, l, mn, ic); eina_list_free(l); } @@ -7913,7 +7904,7 @@ ic->entry_dialog = NULL; if ((text) && (strcmp(text, ic->info.file))) { - _e_fm2_icon_path(ic, oldpath, sizeof(oldpath)); + _e_fm2_icon_realpath(ic, oldpath, sizeof(oldpath)); snprintf(newpath, sizeof(newpath), "%s/%s", ic->sd->realpath, text); if (e_filereg_file_protected(oldpath)) return; @@ -8313,7 +8304,7 @@ } else { - _e_fm2_icon_path(ic, buf, sizeof(buf)); + _e_fm2_icon_realpath(ic, buf, sizeof(buf)); if (e_filereg_file_protected(buf)) return; files = _e_fm_string_append_quoted(files, &size, &len, buf); } |
From: Enlightenment S. <no-...@en...> - 2009-03-04 00:39:51
|
Log: fdo menu icons now scales. Author: barbieri Date: 2009-03-03 16:39:49 -0800 (Tue, 03 Mar 2009) New Revision: 39353 Modified: trunk/e/src/bin/e_fm.c trunk/e/src/bin/e_utils.c trunk/e/src/bin/e_utils.h Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-03 23:07:53 UTC (rev 39352) +++ trunk/e/src/bin/e_fm.c 2009-03-04 00:39:49 UTC (rev 39353) @@ -1817,15 +1817,7 @@ static inline unsigned int _e_fm2_icon_mime_size_normalize(const E_Fm2_Icon *ic) { - const unsigned int *itr, known_sizes[] = { - 16, 22, 24, 32, 36, 48, 64, 72, 96, 128, 192, -1 - }; - unsigned int desired = _e_fm2_icon_w_get(ic->sd); - for (itr = known_sizes; *itr > 0; itr++) - if (*itr >= desired) - return *itr; - - return 256; /* largest know size? */ + return e_util_icon_size_normalize(_e_fm2_icon_w_get(ic->sd)); } /** Modified: trunk/e/src/bin/e_utils.c =================================================================== --- trunk/e/src/bin/e_utils.c 2009-03-03 23:07:53 UTC (rev 39352) +++ trunk/e/src/bin/e_utils.c 2009-03-04 00:39:49 UTC (rev 39353) @@ -397,13 +397,28 @@ return 0; } +EAPI unsigned int +e_util_icon_size_normalize(unsigned int desired) +{ + const unsigned int *itr, known_sizes[] = { + 16, 22, 24, 32, 36, 48, 64, 72, 96, 128, 192, 256, -1 + }; + for (itr = known_sizes; *itr > 0; itr++) + if (*itr >= desired) + return *itr; + + return 256; /* largest know size? */ +} + EAPI int e_util_menu_item_fdo_icon_set(E_Menu_Item *mi, const char *icon) { char *path = NULL; + unsigned int size; if ((!icon) || (!icon[0])) return 0; - path = efreet_icon_path_find(e_config->icon_theme, icon, 16); + size = e_util_icon_size_normalize(16 * e_scale); + path = efreet_icon_path_find(e_config->icon_theme, icon, size); if (!path) return 0; e_menu_item_icon_file_set(mi, path); E_FREE(path); Modified: trunk/e/src/bin/e_utils.h =================================================================== --- trunk/e/src/bin/e_utils.h 2009-03-03 23:07:53 UTC (rev 39352) +++ trunk/e/src/bin/e_utils.h 2009-03-04 00:39:49 UTC (rev 39353) @@ -33,6 +33,7 @@ EAPI int e_util_edje_icon_check(const char *name); EAPI int e_util_edje_icon_set(Evas_Object *obj, const char *name); EAPI int e_util_menu_item_edje_icon_set(E_Menu_Item *mi, const char *name); +EAPI unsigned int e_util_icon_size_normalize(unsigned int desired); EAPI int e_util_menu_item_fdo_icon_set(E_Menu_Item *mi, const char *icon); EAPI E_Container *e_util_container_window_find(Ecore_X_Window win); EAPI E_Border *e_util_desk_border_above(E_Border *bd); |
From: Enlightenment S. <no-...@en...> - 2009-03-04 03:25:42
|
Log: symlink icons back! Author: barbieri Date: 2009-03-03 19:25:40 -0800 (Tue, 03 Mar 2009) New Revision: 39357 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-04 03:02:01 UTC (rev 39356) +++ trunk/e/src/bin/e_fm.c 2009-03-04 03:25:40 UTC (rev 39357) @@ -4103,8 +4103,17 @@ { ic->info.mime = eina_stringshare_ref(_e_fm2_mime_inode_directory); } - else if (!ic->info.mime) + else if (ic->info.real_link) { + mime = efreet_mime_type_get(ic->info.real_link); + if (!mime) + /* XXX REMOVE/DEPRECATE ME LATER */ + mime = e_fm_mime_filename_get(ic->info.file); + if (mime) ic->info.mime = eina_stringshare_add(mime); + } + + if (!ic->info.mime) + { mime = efreet_mime_type_get(buf); if (!mime) /* XXX REMOVE/DEPRECATE ME LATER */ |
From: Enlightenment S. <no-...@en...> - 2009-03-18 01:59:06
|
Log: add filemanager operation registry. This huge commit will add e_fm2_op_registry, a central place that will store all on-going operations. You will find that it will report when operations are added, remove and when they change, for example when they change progress. Please notice that the recommended way to present information is to add listener to specific entries, as opposed to use E_EVENT_FM_OP_REGISTRY_CHANGED since it will be called immediately and you do not have to filter which entry is being changed. Entries will be associated with the e_fm object that originated it. With that one can get the Ecore_X_Window and request the window to be raised from somewhere else (ie: gadman/gadget). If object is deleted (ie: window is closed), the pointer will be made NULL and it will be a "windowless operation". TO DO (I need someone to do those): - e_fwin: windows should present on-going operations as an overlay, Dave Andreolli already started such work, it's just a matter of using the new infrastructure. - create a new gadget that present all on-going operations and maybe a history. It would be nice to show the e_fwin of if the entry is clicked, as well as a cancel button and a progress bar. See "places" module, make them similar. Author: barbieri Date: 2009-03-17 18:33:06 -0700 (Tue, 17 Mar 2009) New Revision: 39541 Added: trunk/e/src/bin/e_fm_op_registry.c trunk/e/src/bin/e_fm_op_registry.h Modified: trunk/e/src/bin/Makefile.am trunk/e/src/bin/e_fm.c trunk/e/src/bin/e_fm_main.c trunk/e/src/bin/e_fm_op.c trunk/e/src/bin/e_includes.h Modified: trunk/e/src/bin/Makefile.am =================================================================== --- trunk/e/src/bin/Makefile.am 2009-03-18 01:16:25 UTC (rev 39540) +++ trunk/e/src/bin/Makefile.am 2009-03-18 01:33:06 UTC (rev 39541) @@ -136,6 +136,7 @@ e_entry_dialog.h \ e_fm.h \ e_fm_op.h \ +e_fm_op_registry.h \ e_fm_hal.h \ e_widget_scrollframe.h \ e_sha1.h \ @@ -276,6 +277,7 @@ e_entry_dialog.c \ e_fm.c \ e_fm_hal.c \ +e_fm_op_registry.c \ e_widget_scrollframe.c \ e_sha1.c \ e_widget_fsel.c \ Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-18 01:16:25 UTC (rev 39540) +++ trunk/e/src/bin/e_fm.c 2009-03-18 01:33:06 UTC (rev 39541) @@ -377,13 +377,13 @@ static E_Fm2_Client *_e_fm2_client_get(void); static int _e_fm2_client_monitor_add(const char *path); static void _e_fm2_client_monitor_del(int id, const char *path); -static int _e_fm_client_file_del(const char *args); -static int _e_fm2_client_file_trash(const char *path); -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); -static int _e_fm_client_file_move(const char *args); -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); -static int _e_fm_client_file_copy(const char *args); -static int _e_fm_client_file_symlink(const char *args); +static int _e_fm_client_file_del(const char *args, Evas_Object *e_fm); +static int _e_fm2_client_file_trash(const char *path, Evas_Object *e_fm); +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); +static int _e_fm_client_file_move(const char *args, Evas_Object *e_fm); +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); +static int _e_fm_client_file_copy(const char *args, Evas_Object *e_fm); +static int _e_fm_client_file_symlink(const char *args, Evas_Object *e_fm); static void _e_fm2_sel_rect_update(void *data); static inline void _e_fm2_context_menu_append(Evas_Object *obj, const char *path, Eina_List *l, E_Menu *mn, E_Fm2_Icon *ic); @@ -555,6 +555,105 @@ return 1; } +static void +_e_fm2_op_registry_go_on(int id) +{ + E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id); + if (!ere) return; + ere->status = E_FM2_OP_STATUS_IN_PROGRESS; + ere->needs_attention = 0; + e_fm2_op_registry_entry_changed(ere); +} + +static void +_e_fm2_op_registry_aborted(int id) +{ + E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id); + if (!ere) return; + ere->status = E_FM2_OP_STATUS_ABORTED; + ere->needs_attention = 0; + ere->finished = 1; + e_fm2_op_registry_entry_changed(ere); + // XXX e_fm2_op_registry_entry_del(id); +} + +static void +_e_fm2_op_registry_error(int id) +{ + E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id); + if (!ere) return; + ere->status = E_FM2_OP_STATUS_ERROR; + ere->needs_attention = 1; + e_fm2_op_registry_entry_changed(ere); +} + +static void +_e_fm2_op_registry_needs_attention(int id) +{ + E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(id); + if (!ere) return; + ere->needs_attention = 1; + e_fm2_op_registry_entry_changed(ere); +} + +/////////////// DBG: +static void +_e_fm2_op_registry_entry_print(const E_Fm2_Op_Registry_Entry *ere) +{ + const char *status_strings[] = { + "UNKNOWN", "IN_PROGRESS", "SUCCESSFUL", "ABORTED", "ERROR" + }; + const char *status; + + if ((ere->status >= 0) && + (ere->status < sizeof(status_strings)/sizeof(status_strings[0]))) + status = status_strings[ere->status]; + else + status = status_strings[0]; + + printf("id: %8d, op: %2d [%s] finished: %hhu, needs_attention: %hhu\n" + " %3d%% (%8zd/%8zd), time: %10.0f + %5ds, xwin: %#x\n" + " src=[%s]\n" + " dst=[%s]\n", + ere->id, ere->op, status, ere->finished, ere->needs_attention, + ere->percent, ere->done, ere->total, ere->start_time, ere->duration, + e_fm2_op_registry_entry_xwin_get(ere), + ere->src, ere->dst); +} + +static int +_e_fm2_op_registry_entry_add_cb(void *data, int type, void *event) +{ + const E_Fm2_Op_Registry_Entry *ere = event; + printf("E FM OPERATION STARTED: id=%d, op=%d\n", ere->id, ere->op); + return ECORE_CALLBACK_RENEW; +} + +static int +_e_fm2_op_registry_entry_del_cb(void *data, int type, void *event) +{ + const E_Fm2_Op_Registry_Entry *ere = event; + puts("E FM OPERATION FINISHED:"); + _e_fm2_op_registry_entry_print(ere); + puts("---"); + return ECORE_CALLBACK_RENEW; +} + +static int +_e_fm2_op_registry_entry_changed_cb(void *data, int type, void *event) +{ + const E_Fm2_Op_Registry_Entry *ere = event; + puts("E FM OPERATION CHANGED:"); + _e_fm2_op_registry_entry_print(ere); + puts("---"); + return ECORE_CALLBACK_RENEW; +} + +static Ecore_Event_Handler *_e_fm2_op_registry_entry_add_handler = NULL; +static Ecore_Event_Handler *_e_fm2_op_registry_entry_del_handler = NULL; +static Ecore_Event_Handler *_e_fm2_op_registry_entry_changed_handler = NULL; +/////////////// DBG: + /***/ EAPI int @@ -594,6 +693,7 @@ } // _e_fm2_client_spawn(); e_fm2_custom_file_init(); + e_fm2_op_registry_init(); efreet_mime_init(); /* XXX: move this to a central/global place? */ @@ -606,6 +706,21 @@ _e_fm2_mime_app_desktop = eina_stringshare_add("application/x-desktop"); _e_fm2_mime_app_edje = eina_stringshare_add("application/x-edje"); + /// DBG + if (!_e_fm2_op_registry_entry_add_handler) + _e_fm2_op_registry_entry_add_handler = + ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_ADD, + _e_fm2_op_registry_entry_add_cb, NULL); + if (!_e_fm2_op_registry_entry_del_handler) + _e_fm2_op_registry_entry_del_handler = + ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_DEL, + _e_fm2_op_registry_entry_del_cb, NULL); + if (!_e_fm2_op_registry_entry_changed_handler) + _e_fm2_op_registry_entry_changed_handler = + ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_CHANGED, + _e_fm2_op_registry_entry_changed_cb, NULL); + /// DBG + return 1; } @@ -618,6 +733,24 @@ _eina_stringshare_replace(&_e_fm2_mime_app_desktop, NULL); _eina_stringshare_replace(&_e_fm2_mime_app_edje, NULL); + /// DBG + if (_e_fm2_op_registry_entry_add_handler) + { + ecore_event_handler_del(_e_fm2_op_registry_entry_add_handler); + _e_fm2_op_registry_entry_add_handler = NULL; + } + if (_e_fm2_op_registry_entry_del_handler) + { + ecore_event_handler_del(_e_fm2_op_registry_entry_del_handler); + _e_fm2_op_registry_entry_del_handler = NULL; + } + if (_e_fm2_op_registry_entry_changed_handler) + { + ecore_event_handler_del(_e_fm2_op_registry_entry_changed_handler); + _e_fm2_op_registry_entry_changed_handler = NULL; + } + /// DBG + ecore_timer_del(_e_fm2_mime_flush); _e_fm2_mime_flush = NULL; ecore_timer_del(_e_fm2_mime_clear); @@ -628,6 +761,7 @@ E_FREE(_e_fm2_meta_path); e_fm2_custom_file_shutdown(); _e_storage_volume_edd_shutdown(); + e_fm2_op_registry_shutdown(); efreet_mime_shutdown(); ecore_job_shutdown(); eina_stringshare_shutdown(); @@ -2247,22 +2381,26 @@ } static int -_e_fm_client_file_del(const char *files) +_e_fm_client_file_del(const char *files, Evas_Object *e_fm) { - return _e_fm_client_send_new(E_FM_OP_REMOVE, (void *)files, strlen(files) + 1); + int id = _e_fm_client_send_new(E_FM_OP_REMOVE, (void *)files, strlen(files) + 1); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_REMOVE); + return id; } static int -_e_fm2_client_file_trash(const char *path) +_e_fm2_client_file_trash(const char *path, Evas_Object *e_fm) { - return _e_fm_client_send_new(E_FM_OP_TRASH, (void *)path, strlen(path) + 1); + int id = _e_fm_client_send_new(E_FM_OP_TRASH, (void *)path, strlen(path) + 1); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_TRASH); + return id; } 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) +_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) { char *d; - int l1, l2, l; + int l1, l2, l, id; l1 = strlen(path); l2 = strlen(rel); @@ -2274,21 +2412,26 @@ memcpy(d + l1 + 1 + l2 + 1 + sizeof(int), &x, sizeof(int)); memcpy(d + l1 + 1 + l2 + 1 + (2 * sizeof(int)), &y, sizeof(int)); - return _e_fm_client_send_new(E_FM_OP_MKDIR, (void *)d, l); + id = _e_fm_client_send_new(E_FM_OP_MKDIR, (void *)d, l); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MKDIR); + return id; } static int -_e_fm_client_file_move(const char *args) +_e_fm_client_file_move(const char *args, Evas_Object *e_fm) { - return _e_fm_client_send_new(E_FM_OP_MOVE, (void *)args, strlen(args) + 1); + int id = _e_fm_client_send_new(E_FM_OP_MOVE, (void *)args, strlen(args) + 1); + printf("REQUEST CLIENT TO MOVE: %s, id=%d, op=%d\n", args, id, E_FM_OP_MOVE); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MOVE); + return id; } 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) +_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) { #if 0 char *d; - int l1, l2, l3, l; + int l1, l2, l3, l, id; l1 = strlen(path); l2 = strlen(dest); @@ -2321,7 +2464,9 @@ e_fm2_custom_file_flush(); } - return _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)d, l); + id = _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)d, l); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK); + return id; #else char *args = NULL; size_t size = 0, length = 0; @@ -2331,22 +2476,27 @@ args = _e_fm_string_append_quoted(args, &size, &length, dest); fputs("WARNING: using new E_FM_OP_SYMLINK, remove deprecated ASAP\n", stderr); - int r = _e_fm_client_file_symlink(args); + int r = _e_fm_client_file_symlink(args, e_fm); free(args); return r; #endif } static int -_e_fm_client_file_copy(const char *args) +_e_fm_client_file_copy(const char *args, Evas_Object *e_fm) { - return _e_fm_client_send_new(E_FM_OP_COPY, (void *)args, strlen(args) + 1); + int id = _e_fm_client_send_new(E_FM_OP_COPY, (void *)args, strlen(args) + 1); + printf("REQUEST CLIENT TO COPY: %s, id=%d, op=%d\n", args, id, E_FM_OP_COPY); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_COPY); + return id; } static int -_e_fm_client_file_symlink(const char *args) +_e_fm_client_file_symlink(const char *args, Evas_Object *e_fm) { - return _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)args, strlen(args) + 1); + int id = _e_fm_client_send_new(E_FM_OP_SYMLINK, (void *)args, strlen(args) + 1); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK); + return id; } EAPI int @@ -2753,18 +2903,21 @@ break; case E_FM_OP_ERROR:/*error*/ - printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data); - _e_fm_error_dialog(e->ref, e->data); + printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data); + _e_fm_error_dialog(e->ref, e->data); + _e_fm2_op_registry_error(e->ref); break; case E_FM_OP_ERROR_RETRY_ABORT:/*error*/ - printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data); - _e_fm_retry_abort_dialog(e->ref, (char *)e->data); + printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data); + _e_fm_retry_abort_dialog(e->ref, (char *)e->data); + _e_fm2_op_registry_error(e->ref); break; case E_FM_OP_OVERWRITE:/*overwrite*/ - printf("%s:%s(%d) Overwrite from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data); - _e_fm_overwrite_dialog(e->ref, (char *)e->data); + printf("%s:%s(%d) Overwrite from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, (char *)e->data); + _e_fm_overwrite_dialog(e->ref, (char *)e->data); + _e_fm2_op_registry_needs_attention(e->ref); break; case E_FM_OP_PROGRESS:/*progress*/ @@ -2785,10 +2938,28 @@ #undef UP src = p; dst = p + strlen(src) + 1; - printf("%s:%s(%d) Progress from slave #%d:\n\t%d%% done,\n\t%d seconds left,\n\t%d done,\n\t%d total,\n\tsrc = %s,\n\tdst = %s.\n", __FILE__, __FUNCTION__, __LINE__, e->ref, percent, seconds, done, total, src, dst); + // 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); + + E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(e->ref); + if (!ere) return; + ere->percent = percent; + ere->done = done; + ere->total = total; + ere->duration = seconds; + e_fm2_op_registry_entry_files_set(ere, src, dst); + if (ere->percent == 100) + { + ere->status = E_FM2_OP_STATUS_SUCCESSFUL; + ere->finished = 1; + } + e_fm2_op_registry_entry_changed(ere); } break; + case E_FM_OP_QUIT:/*finished*/ + e_fm2_op_registry_entry_del(e->ref); + break; + default: break; } @@ -3066,6 +3237,7 @@ int bufused, buffree; const char *realpath; const E_Fm2_Icon_Info *ici; + Eina_Bool ret; sel = e_fm2_selected_list_get(obj); if (!sel) return 0; @@ -3085,6 +3257,7 @@ pfile = buf + bufused; buffree = sizeof(buf) - bufused; + ret = !!sel; EINA_LIST_FREE(sel, ici) { if (!ici) continue; @@ -3092,7 +3265,7 @@ _e_fm_file_buffer = eina_list_append(_e_fm_file_buffer, _e_fm2_uri_escape(buf)); } - return !!sel; + return ret; } static void @@ -3152,11 +3325,11 @@ /* Roll the operation! */ if (_e_fm_file_buffer_copying) { - _e_fm_client_file_copy(args); + _e_fm_client_file_copy(args, sd->obj); } else { - _e_fm_client_file_move(args); + _e_fm_client_file_move(args, sd->obj); } free(args); @@ -3204,7 +3377,7 @@ /* Roll the operation! */ if (_e_fm_file_buffer_copying) - _e_fm_client_file_symlink(args); + _e_fm_client_file_symlink(args, sd->obj); free(args); } @@ -5652,55 +5825,54 @@ e_fm2_custom_file_flush(); } +struct e_fm_drop_menu_data +{ + Evas_Object *e_fm; + char *args; +}; + static void _e_fm_drop_menu_copy_cb(void *data, E_Menu *m, E_Menu_Item *mi) { - char *args = data; - - if (!data) return; - - _e_fm_client_file_copy(args); + struct e_fm_drop_menu_data *d = data; + if (!d) return; + _e_fm_client_file_copy(d->args, d->e_fm); } static void _e_fm_drop_menu_move_cb(void *data, E_Menu *m, E_Menu_Item *mi) { - char *args = data; - - if (!data) return; - - _e_fm_client_file_move(args); + struct e_fm_drop_menu_data *d = data; + if (!d) return; + _e_fm_client_file_move(d->args, d->e_fm); } static void _e_fm_drop_menu_symlink_cb(void *data, E_Menu *m, E_Menu_Item *mi) { - char *args = data; - - if (!data) return; - - _e_fm_client_file_symlink(args); + struct e_fm_drop_menu_data *d = data; + if (!d) return; + _e_fm_client_file_symlink(d->args, d->e_fm); } static void _e_fm_drop_menu_abort_cb(void *data, E_Menu *m, E_Menu_Item *mi) { - if (!data) return; } static void -_e_fm_drop_menu_post_cb(void *data, E_Menu *m) +_e_fm_drop_menu_free(void *data) { - char *args = data; - - if (!data) return; - - free(args); + struct e_fm_drop_menu_data *d = e_object_data_get(data); + if (!d) return; + free(d->args); + free(d); } static void -_e_fm_drop_menu(char *args) +_e_fm_drop_menu(char *args, Evas_Object *e_fm) { + struct e_fm_drop_menu_data *d; E_Menu *menu = e_menu_new(); E_Menu_Item *item = NULL; E_Manager *man = NULL; @@ -5710,14 +5882,27 @@ if (!menu) return; + d = malloc(sizeof(*d)); + if (!d) + { + e_object_del(E_OBJECT(menu)); + return; + } + + d->e_fm = e_fm; + d->args = args; + + e_object_data_set(E_OBJECT(menu), d); + e_object_free_attach_func_set(E_OBJECT(menu), _e_fm_drop_menu_free); + item = e_menu_item_new(menu); e_menu_item_label_set(item, _("Copy")); - e_menu_item_callback_set(item, _e_fm_drop_menu_copy_cb, args); + e_menu_item_callback_set(item, _e_fm_drop_menu_copy_cb, d); e_util_menu_item_theme_icon_set(item, "edit-copy"); item = e_menu_item_new(menu); e_menu_item_label_set(item, _("Move")); - e_menu_item_callback_set(item, _e_fm_drop_menu_move_cb, args); + e_menu_item_callback_set(item, _e_fm_drop_menu_move_cb, d); e_menu_item_icon_edje_set(item, e_theme_edje_file_get("base/theme/fileman", "e/fileman/default/button/move"), @@ -5725,7 +5910,7 @@ item = e_menu_item_new(menu); e_menu_item_label_set(item, _("Link")); - e_menu_item_callback_set(item, _e_fm_drop_menu_symlink_cb, args); + e_menu_item_callback_set(item, _e_fm_drop_menu_symlink_cb, d); e_util_menu_item_theme_icon_set(item, "emblem-symbolic-link"); item = e_menu_item_new(menu); @@ -5733,35 +5918,23 @@ item = e_menu_item_new(menu); e_menu_item_label_set(item, _("Abort")); - e_menu_item_callback_set(item, _e_fm_drop_menu_abort_cb, args); + e_menu_item_callback_set(item, _e_fm_drop_menu_abort_cb, d); e_menu_item_icon_edje_set(item, e_theme_edje_file_get("base/theme/fileman", "e/fileman/default/button/abort"), "e/fileman/default/button/abort"); man = e_manager_current_get(); - if (!man) - { - e_object_del(E_OBJECT(menu)); - return; - } + if (!man) goto error; con = e_container_current_get(man); - if (!con) - { - e_object_del(E_OBJECT(menu)); - return; - } + if (!con) goto error; ecore_x_pointer_xy_get(con->win, &x, &y); zone = e_util_zone_current_get(man); - if (!zone) - { - e_object_del(E_OBJECT(menu)); - return; - } - e_menu_post_deactivate_callback_set(menu, _e_fm_drop_menu_post_cb, args); - e_menu_activate_mouse(menu, zone, - x, y, 1, 1, - E_MENU_POP_DIRECTION_DOWN, 0); + if (!zone) goto error; + e_menu_activate_mouse(menu, zone, x, y, 1, 1, E_MENU_POP_DIRECTION_DOWN, 0); + + error: + e_object_del(E_OBJECT(menu)); } static void @@ -5906,7 +6079,7 @@ sd->realpath, ecore_file_file_get(fp)); if (sd->config->view.link_drop) { - _e_fm2_client_file_symlink(buf, fp, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->h, sd->h); + _e_fm2_client_file_symlink(buf, fp, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->h, sd->h, sd->obj); } else { @@ -5941,17 +6114,17 @@ if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_COPY) { - _e_fm_client_file_copy(args); + _e_fm_client_file_copy(args, sd->obj); free(args); } else if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_MOVE) { - _e_fm_client_file_move(args); + _e_fm_client_file_move(args, sd->obj); free(args); } else if (e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_ASK) { - _e_fm_drop_menu(args); + _e_fm_drop_menu(args, sd->obj); } _e_fm2_dnd_drop_hide(sd->obj); @@ -6202,7 +6375,7 @@ free(drag->data); } -void +static void _e_fm_drag_key_down_cb(E_Drag *drag, Ecore_Event_Key *e) { if (!strncmp(e->keyname, "Alt", 3)) @@ -6222,7 +6395,7 @@ } } -void +static void _e_fm_drag_key_up_cb(E_Drag *drag, Ecore_Event_Key *e) { /* Default action would be move. ;) */ @@ -8139,7 +8312,7 @@ { snprintf(buf, sizeof(buf), "%s/%s", sd->realpath, text); - _e_fm2_client_file_mkdir(buf, "", 0, 0, 0, sd->w, sd->h); + _e_fm2_client_file_mkdir(buf, "", 0, 0, 0, sd->w, sd->h, sd->obj); } } @@ -8210,7 +8383,7 @@ args = _e_fm_string_append_char(args, &size, &length, ' '); args = _e_fm_string_append_quoted(args, &size, &length, newpath); - _e_fm_client_file_move(args); + _e_fm_client_file_move(args, ic->sd->obj); free(args); } } @@ -8267,6 +8440,7 @@ static void _e_fm_retry_abort_retry_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_RETRY, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8274,6 +8448,7 @@ static void _e_fm_retry_abort_abort_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_aborted(*id); _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_ABORT, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8325,6 +8500,7 @@ _e_fm_overwrite_no_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_NO, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8333,6 +8509,7 @@ _e_fm_overwrite_no_all_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_NO_ALL, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8341,6 +8518,7 @@ _e_fm_overwrite_yes_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_YES, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8349,6 +8527,7 @@ _e_fm_overwrite_yes_all_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_YES_ALL, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8401,6 +8580,7 @@ _e_fm_error_retry_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_RETRY, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8409,6 +8589,7 @@ _e_fm_error_abort_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_aborted(*id); _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_ABORT, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8417,6 +8598,7 @@ _e_fm_error_ignore_this_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_IGNORE_THIS, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8425,6 +8607,7 @@ _e_fm_error_ignore_all_cb(void *data, E_Dialog *dialog) { int *id = E_OBJECT(dialog)->data; + _e_fm2_op_registry_go_on(*id); _e_fm_client_send(E_FM_OP_ERROR_RESPONSE_IGNORE_ALL, *id, NULL, 0); e_object_del(E_OBJECT(dialog)); } @@ -8607,7 +8790,7 @@ files = _e_fm_string_append_quoted(files, &size, &len, buf); } - _e_fm_client_file_del(files); + _e_fm_client_file_del(files, ic->sd->obj); free(files); Modified: trunk/e/src/bin/e_fm_main.c =================================================================== --- trunk/e/src/bin/e_fm_main.c 2009-03-18 01:16:25 UTC (rev 39540) +++ trunk/e/src/bin/e_fm_main.c 2009-03-18 01:33:06 UTC (rev 39541) @@ -1605,6 +1605,7 @@ if (!e) return 1; slave = ecore_exe_data_get(e->exe); + _e_client_send(slave->id, E_FM_OP_QUIT, NULL, 0); if (!slave) return 1; Modified: trunk/e/src/bin/e_fm_op.c =================================================================== --- trunk/e/src/bin/e_fm_op.c 2009-03-18 01:16:25 UTC (rev 39540) +++ trunk/e/src/bin/e_fm_op.c 2009-03-18 01:33:06 UTC (rev 39541) @@ -53,6 +53,7 @@ static void _e_fm_op_send_error(E_Fm_Op_Task * task, E_Fm_Op_Type type, const char *fmt, ...); static void _e_fm_op_rollback(E_Fm_Op_Task * task); +static void _e_fm_op_update_progress_report_simple_done(const char *src, const char *dst); static void _e_fm_op_update_progress(E_Fm_Op_Task *task, long long _plus_e_fm_op_done, long long _plus_e_fm_op_total); static void _e_fm_op_copy_stat_info(E_Fm_Op_Task *task); static int _e_fm_op_handle_overwrite(E_Fm_Op_Task *task); @@ -191,10 +192,18 @@ if ((type == E_FM_OP_MOVE) && (rename(task->src.name, task->dst.name) == 0)) - _e_fm_op_task_free(task); + { + _e_fm_op_update_progress_report_simple_done + (task->src.name, task->dst.name); + _e_fm_op_task_free(task); + } else if ((type == E_FM_OP_SYMLINK) && (symlink(task->src.name, task->dst.name) == 0)) - _e_fm_op_task_free(task); + { + _e_fm_op_update_progress_report_simple_done + (task->src.name, task->dst.name); + _e_fm_op_task_free(task); + } else _e_fm_op_scan_queue = eina_list_append(_e_fm_op_scan_queue, task); @@ -219,10 +228,16 @@ /* Try a rename */ if ((type == E_FM_OP_MOVE) && (rename(argv[2], argv[3]) == 0)) - goto quit; + { + _e_fm_op_update_progress_report_simple_done(argv[2], argv[3]); + goto quit; + } else if ((type == E_FM_OP_SYMLINK) && (symlink(argv[2], argv[3]) == 0)) - goto quit; + { + _e_fm_op_update_progress_report_simple_done(argv[2], argv[3]); + goto quit; + } /* If that doesn't work, setup a copy and delete operation. It's not atomic, but it's the best we can do. */ @@ -847,6 +862,53 @@ _e_fm_op_update_progress(task, -REMOVECHUNKSIZE, -REMOVECHUNKSIZE); } +static void +_e_fm_op_update_progress_report(int percent, int eta, double elapsed, size_t done, size_t total, const char *src, const char *dst) +{ + const int magic = E_FM_OP_MAGIC; + const int id = E_FM_OP_PROGRESS; + void *p, *data; + int size, src_len, dst_len; + + src_len = strlen(src); + dst_len = strlen(dst); + + size = 2 * sizeof(int) + 2 * sizeof(size_t) + src_len + 1 + dst_len + 1; + data = alloca(3 * sizeof(int) + size); + if (!data) return; + p = data; + +#define P(value) memcpy(p, &(value), sizeof(int)); p += sizeof(int) + P(magic); + P(id); + P(size); + P(percent); + P(eta); +#undef P + +#define P(value) memcpy(p, &(value), sizeof(size_t)); p += sizeof(size_t) + P(done); + P(total); +#undef P + +#define P(value) memcpy(p, value, value ## _len + 1); p += value ## _len + 1 + P(src); + P(dst); +#undef P + + write(STDOUT_FILENO, data, 3 * sizeof(int) + size); + + E_FM_OP_DEBUG("Time left: %d at %e\n", eta, elapsed); + E_FM_OP_DEBUG("Progress %d. \n", percent); +} + +static void +_e_fm_op_update_progress_report_simple_done(const char *src, const char *dst) +{ + _e_fm_op_update_progress_report + (100, 0, 0, REMOVECHUNKSIZE, REMOVECHUNKSIZE, src, dst); +} + /* Updates progress. * _plus_data is how much more works is done and _plus_e_fm_op_total * is how much more work we found out needs to be done @@ -866,11 +928,6 @@ double eta = 0; static int peta = -1; static E_Fm_Op_Task *ptask = NULL; - void *data; - void *p; - int magic = E_FM_OP_MAGIC; - int id = E_FM_OP_PROGRESS; - int size = 0; _e_fm_op_done += _plus_e_fm_op_done; _e_fm_op_total += _plus_e_fm_op_total; @@ -902,37 +959,9 @@ ppercent = percent; peta = eta; ptask = task; - - size = 2 * sizeof(int) + 2 * sizeof(size_t) + strlen(ptask->src.name) + 1 + strlen(ptask->dst.name) + 1; - data = malloc(3 * sizeof(int) + size); - - if (!data) return; - p = data; - -#define P(value) memcpy(p, &(value), sizeof(int)); p += sizeof(int) - P(magic); - P(id); - P(size); - P(ppercent); - P(peta); -#undef P - -#define P(value) memcpy(p, &(value), sizeof(size_t)); p += sizeof(size_t) - P(ptask->dst.done); - P(ptask->src.st.st_size); -#undef P - -#define P(value) memcpy(p, value, strlen(value) + 1); p += strlen(value) + 1 - P(ptask->src.name); - P(ptask->dst.name); -#undef P - - write(STDOUT_FILENO, data, 3 * sizeof(int) + size); - - E_FM_OP_DEBUG("Time left: %d at %e\n", peta, ctime - stime); - E_FM_OP_DEBUG("Progress %d. \n", percent); - - free(data); + _e_fm_op_update_progress_report(percent, eta, ctime - stime, + task->dst.done, task->src.st.st_size, + task->src.name, task->dst.name); } } } Added: trunk/e/src/bin/e_fm_op_registry.c Added: trunk/e/src/bin/e_fm_op_registry.h Modified: trunk/e/src/bin/e_includes.h =================================================================== --- trunk/e/src/bin/e_includes.h 2009-03-18 01:16:25 UTC (rev 39540) +++ trunk/e/src/bin/e_includes.h 2009-03-18 01:33:06 UTC (rev 39541) @@ -103,6 +103,7 @@ #include "e_int_border_prop.h" #include "e_entry_dialog.h" #include "e_fm.h" +#include "e_fm_op_registry.h" #include "e_widget_scrollframe.h" #include "e_sha1.h" #include "e_widget_framelist.h" |
From: Enlightenment S. <no-...@en...> - 2009-03-18 14:01:30
|
Log: less noise/debug. Author: barbieri Date: 2009-03-18 07:00:45 -0700 (Wed, 18 Mar 2009) New Revision: 39547 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-18 13:29:36 UTC (rev 39546) +++ trunk/e/src/bin/e_fm.c 2009-03-18 14:00:45 UTC (rev 39547) @@ -2421,7 +2421,6 @@ _e_fm_client_file_move(const char *args, Evas_Object *e_fm) { int id = _e_fm_client_send_new(E_FM_OP_MOVE, (void *)args, strlen(args) + 1); - printf("REQUEST CLIENT TO MOVE: %s, id=%d, op=%d\n", args, id, E_FM_OP_MOVE); e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MOVE); return id; } @@ -2486,7 +2485,6 @@ _e_fm_client_file_copy(const char *args, Evas_Object *e_fm) { int id = _e_fm_client_send_new(E_FM_OP_COPY, (void *)args, strlen(args) + 1); - printf("REQUEST CLIENT TO COPY: %s, id=%d, op=%d\n", args, id, E_FM_OP_COPY); e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_COPY); return id; } |
From: Enlightenment S. <no-...@en...> - 2009-03-18 14:06:32
|
Log: e_fm_op: cleanup and fix memory leaks. * reduce variable scope to avoid bugs. * add missing free(d) * move invariant snprintf() out of loop Author: barbieri Date: 2009-03-18 07:06:22 -0700 (Wed, 18 Mar 2009) New Revision: 39548 Modified: trunk/e/src/bin/e_fm_op.c Modified: trunk/e/src/bin/e_fm_op.c =================================================================== --- trunk/e/src/bin/e_fm_op.c 2009-03-18 14:00:45 UTC (rev 39547) +++ trunk/e/src/bin/e_fm_op.c 2009-03-18 14:06:22 UTC (rev 39548) @@ -126,13 +126,8 @@ int main(int argc, char **argv) { - E_Fm_Op_Task *task = NULL; int i, last; - char *byte = "/"; - char buf[PATH_MAX]; - const char *name = NULL; E_Fm_Op_Type type; - char *p = NULL, *p2 = NULL; ecore_init(); eina_stringshare_init(); @@ -162,93 +157,122 @@ { if (argc < 4) goto quit; - if (type == E_FM_OP_MOVE) - { - _e_fm_op_work_queue = eina_list_append(_e_fm_op_work_queue, NULL); - _e_fm_op_separator = _e_fm_op_work_queue; - } + if (type == E_FM_OP_MOVE) + { + _e_fm_op_work_queue = eina_list_append(_e_fm_op_work_queue, NULL); + _e_fm_op_separator = _e_fm_op_work_queue; + } - if ((argc >= 4) && (ecore_file_is_dir(argv[last]))) - { - if (argv[last][strlen(argv[last]) - 1] == '/') byte = ""; - p2 = ecore_file_realpath(argv[last]); + if ((argc >= 4) && (ecore_file_is_dir(argv[last]))) + { + char buf[PATH_MAX]; + char *p2, *p3; + int p2_len, last_len; - for(; i < last; i++) - { - p = ecore_file_realpath(argv[i]); + p2 = ecore_file_realpath(argv[last]); + if (!p2) goto quit; + p2_len = strlen(p2); - /* Don't move a dir into itself */ - if ((p) && (p2) && (ecore_file_is_dir(argv[i])) && - (strstr(p2, p) == p2)) - continue; + last_len = strlen(argv[last]); + if ((last_len < 1) || (last_len + 2 >= PATH_MAX)) + { + free(p2); + goto quit; + } + memcpy(buf, argv[last], last_len); + if (buf[last_len - 1] != '/') + { + buf[last_len] = '/'; + last_len++; + } - name = ecore_file_file_get(argv[i]); - task = _e_fm_op_task_new(); - task->type = type; - task->src.name = eina_stringshare_add(argv[i]); + p3 = buf + last_len; - snprintf(buf, PATH_MAX, "%s%s%s", argv[last], byte, name); - task->dst.name = eina_stringshare_add(buf); + for (; i < last; i++) + { + char *p = ecore_file_realpath(argv[i]); + const char *name; + int name_len; - if ((type == E_FM_OP_MOVE) && - (rename(task->src.name, task->dst.name) == 0)) - { - _e_fm_op_update_progress_report_simple_done - (task->src.name, task->dst.name); - _e_fm_op_task_free(task); - } + if (!p) continue; + + /* Don't move a dir into itself */ + if (ecore_file_is_dir(p) && + (strncmp(p, p2, p2_len) == 0) && + ((p[p2_len] == '/') || (p[p2_len] == '\0'))) + goto skip_arg; + + name = ecore_file_file_get(p); + if (!name) goto skip_arg; + name_len = strlen(name); + if (p2_len + name_len >= PATH_MAX) goto skip_arg; + memcpy(p3, name, name_len + 1); + + if ((type == E_FM_OP_MOVE) && + (rename(argv[i], buf) == 0)) + _e_fm_op_update_progress_report_simple_done(argv[i], buf); else if ((type == E_FM_OP_SYMLINK) && - (symlink(task->src.name, task->dst.name) == 0)) + (symlink(argv[i], buf) == 0)) + _e_fm_op_update_progress_report_simple_done(argv[i], buf); + else { - _e_fm_op_update_progress_report_simple_done - (task->src.name, task->dst.name); - _e_fm_op_task_free(task); + E_Fm_Op_Task *task; + + task = _e_fm_op_task_new(); + task->type = type; + task->src.name = eina_stringshare_add(argv[i]); + task->dst.name = eina_stringshare_add(buf); + + _e_fm_op_scan_queue = + eina_list_append(_e_fm_op_scan_queue, task); } - else - _e_fm_op_scan_queue = - eina_list_append(_e_fm_op_scan_queue, task); - } - } - else if (argc == 4) - { - snprintf(buf, sizeof(buf), "%s/%s", ecore_file_realpath(argv[i]), - ecore_file_file_get(argv[i])); - p = strdup(buf); - snprintf(buf, sizeof(buf), "%s/%s", - ecore_file_realpath(argv[last]), - ecore_file_file_get(argv[last])); - p2 = strdup(buf); + skip_arg: + free(p); + } - /* Don't move a file on top of itself. */ - i = (strlen(p) == strlen(p2)) && !strncmp(p,p2,strlen(p)); - free(p); - free(p2); - if (i) goto quit; + free(p2); + } + else if (argc == 4) + { + char *p, *p2; - /* Try a rename */ - if ((type == E_FM_OP_MOVE) && (rename(argv[2], argv[3]) == 0)) + p = ecore_file_realpath(argv[2]); + p2 = ecore_file_realpath(argv[3]); + + /* Don't move a file on top of itself. */ + i = (strcmp(p, p2) == 0); + free(p); + free(p2); + if (i) goto quit; + + /* Try a rename */ + if ((type == E_FM_OP_MOVE) && (rename(argv[2], argv[3]) == 0)) { _e_fm_op_update_progress_report_simple_done(argv[2], argv[3]); goto quit; } - else if ((type == E_FM_OP_SYMLINK) && + else if ((type == E_FM_OP_SYMLINK) && (symlink(argv[2], argv[3]) == 0)) { _e_fm_op_update_progress_report_simple_done(argv[2], argv[3]); goto quit; } + else + { + E_Fm_Op_Task *task; - /* If that doesn't work, setup a copy and delete operation. - It's not atomic, but it's the best we can do. */ - task = _e_fm_op_task_new(); - task->type = type; - task->src.name = eina_stringshare_add(argv[2]); - task->dst.name = eina_stringshare_add(argv[3]); - _e_fm_op_scan_queue = eina_list_append(_e_fm_op_scan_queue, task); - } - else - goto quit; + /* If that doesn't work, setup a copy and delete operation. + It's not atomic, but it's the best we can do. */ + task = _e_fm_op_task_new(); + task->type = type; + task->src.name = eina_stringshare_add(argv[2]); + task->dst.name = eina_stringshare_add(argv[3]); + _e_fm_op_scan_queue = eina_list_append(_e_fm_op_scan_queue, task); + } + } + else + goto quit; } else if (type == E_FM_OP_REMOVE) { @@ -256,6 +280,8 @@ while (i <= last) { + E_Fm_Op_Task *task; + task = _e_fm_op_task_new(); task->type = type; task->src.name = eina_stringshare_add(argv[i]); |
From: Enlightenment S. <no-...@en...> - 2009-03-18 14:07:47
|
Log: e_fm_op: fix simpe operations report. Author: barbieri Date: 2009-03-18 07:07:34 -0700 (Wed, 18 Mar 2009) New Revision: 39549 Modified: trunk/e/src/bin/e_fm_op.c Modified: trunk/e/src/bin/e_fm_op.c =================================================================== --- trunk/e/src/bin/e_fm_op.c 2009-03-18 14:06:22 UTC (rev 39548) +++ trunk/e/src/bin/e_fm_op.c 2009-03-18 14:07:34 UTC (rev 39549) @@ -53,7 +53,7 @@ static void _e_fm_op_send_error(E_Fm_Op_Task * task, E_Fm_Op_Type type, const char *fmt, ...); static void _e_fm_op_rollback(E_Fm_Op_Task * task); -static void _e_fm_op_update_progress_report_simple_done(const char *src, const char *dst); +static void _e_fm_op_update_progress_report_simple(int percent, const char *src, const char *dst); static void _e_fm_op_update_progress(E_Fm_Op_Task *task, long long _plus_e_fm_op_done, long long _plus_e_fm_op_total); static void _e_fm_op_copy_stat_info(E_Fm_Op_Task *task); static int _e_fm_op_handle_overwrite(E_Fm_Op_Task *task); @@ -167,7 +167,7 @@ { char buf[PATH_MAX]; char *p2, *p3; - int p2_len, last_len; + int p2_len, last_len, done, total; p2 = ecore_file_realpath(argv[last]); if (!p2) goto quit; @@ -188,6 +188,9 @@ p3 = buf + last_len; + done = 0; + total = last - 2; + for (; i < last; i++) { char *p = ecore_file_realpath(argv[i]); @@ -210,10 +213,18 @@ if ((type == E_FM_OP_MOVE) && (rename(argv[i], buf) == 0)) - _e_fm_op_update_progress_report_simple_done(argv[i], buf); + { + done++; + _e_fm_op_update_progress_report_simple + (done * 100 / total, argv[i], buf); + } else if ((type == E_FM_OP_SYMLINK) && (symlink(argv[i], buf) == 0)) - _e_fm_op_update_progress_report_simple_done(argv[i], buf); + { + done++; + _e_fm_op_update_progress_report_simple + (done * 100 / total, argv[i], buf); + } else { E_Fm_Op_Task *task; @@ -249,13 +260,13 @@ /* Try a rename */ if ((type == E_FM_OP_MOVE) && (rename(argv[2], argv[3]) == 0)) { - _e_fm_op_update_progress_report_simple_done(argv[2], argv[3]); + _e_fm_op_update_progress_report_simple(100, argv[2], argv[3]); goto quit; } else if ((type == E_FM_OP_SYMLINK) && (symlink(argv[2], argv[3]) == 0)) { - _e_fm_op_update_progress_report_simple_done(argv[2], argv[3]); + _e_fm_op_update_progress_report_simple(100, argv[2], argv[3]); goto quit; } else @@ -929,10 +940,11 @@ } static void -_e_fm_op_update_progress_report_simple_done(const char *src, const char *dst) +_e_fm_op_update_progress_report_simple(int percent, const char *src, const char *dst) { + size_t done = (percent * REMOVECHUNKSIZE) / 100; _e_fm_op_update_progress_report - (100, 0, 0, REMOVECHUNKSIZE, REMOVECHUNKSIZE, src, dst); + (percent, 0, 0, done, REMOVECHUNKSIZE, src, dst); } /* Updates progress. |
From: Enlightenment S. <no-...@en...> - 2009-03-18 23:34:35
|
Log: move loops to eina macros. Author: barbieri Date: 2009-03-18 16:34:29 -0700 (Wed, 18 Mar 2009) New Revision: 39561 Modified: trunk/e/src/bin/e_dnd.c Modified: trunk/e/src/bin/e_dnd.c =================================================================== --- trunk/e/src/bin/e_dnd.c 2009-03-18 21:27:38 UTC (rev 39560) +++ trunk/e/src/bin/e_dnd.c 2009-03-18 23:34:29 UTC (rev 39561) @@ -121,7 +121,7 @@ EAPI int e_dnd_shutdown(void) { - Eina_List *l; + Ecore_Event_Handler *h; while (_drag_list) { @@ -131,16 +131,9 @@ e_object_del(E_OBJECT(drag)); } - for (l = _event_handlers; l; l = l->next) - { - Ecore_Event_Handler *h; + EINA_LIST_FREE(_event_handlers, h) + ecore_event_handler_del(h); - h = l->data; - ecore_event_handler_del(h); - } - eina_list_free(_event_handlers); - _event_handlers = NULL; - eina_hash_free(_drop_win_hash); eina_list_free(_drop_handlers); _drop_handlers = NULL; @@ -277,7 +270,8 @@ EAPI int e_drag_start(E_Drag *drag, int x, int y) { - Eina_List *l; + const Eina_List *l; + E_Drop_Handler *h; if (_drag_win) return 0; _drag_win = ecore_x_window_input_new(drag->container->win, @@ -296,13 +290,10 @@ drag->dx = x - drag->x; drag->dy = y - drag->y; - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - int i, j; + int i, j; - h = l->data; - h->active = 0; h->active_type = NULL; for (i = 0; i < h->num_types; i++) @@ -456,13 +447,11 @@ EAPI void e_drag_idler_before(void) { - Eina_List *l; - - for (l = _drag_list; l; l = l->next) + const Eina_List *l; + E_Drag *drag; + + EINA_LIST_FOREACH(_drag_list, l, drag) { - E_Drag *drag; - - drag = l->data; if (drag->need_shape_export) { Ecore_X_Rectangle *rects, *orects; @@ -749,7 +738,7 @@ static int _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action) { - Eina_List *l; + const Eina_List *l; E_Event_Dnd_Enter enter_ev; E_Event_Dnd_Move move_ev; E_Event_Dnd_Leave leave_ev; @@ -789,11 +778,9 @@ if (_drag_current) { - for (l = _drop_handlers; l; l = l->next) + E_Drop_Handler *h; + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; if (!h->active) continue; _e_drag_coords_update(h, &dx, &dy, &dw, &dh); enter_ev.x = x - dx; @@ -844,11 +831,9 @@ } else if (_xdnd) { - for (l = _drop_handlers; l; l = l->next) + E_Drop_Handler *h; + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; if (!h->active) continue; _e_drag_coords_update(h, &dx, &dy, &dw, &dh); enter_ev.x = x - dx; @@ -893,7 +878,7 @@ _e_drag_end(Ecore_X_Window root, int x, int y) { E_Zone *zone; - Eina_List *l; + const Eina_List *l; E_Event_Dnd_Drop ev; int dx, dy, dw, dh; Ecore_X_Window win, ignore_win[2]; @@ -938,14 +923,11 @@ if (_drag_current->data) { - int dropped; + E_Drop_Handler *h; + int dropped = 0; - dropped = 0; - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; if (!h->active) continue; _e_drag_coords_update(h, &dx, &dy, &dw, &dh); ev.x = x - dx; @@ -976,17 +958,14 @@ { /* Just leave */ E_Event_Dnd_Leave leave_ev; + E_Drop_Handler *h; /* FIXME: We don't need x and y in leave */ leave_ev.x = 0; leave_ev.y = 0; - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; - if (!h->active) continue; @@ -1003,7 +982,7 @@ static void _e_drag_xdnd_end(Ecore_X_Window win, int x, int y) { - Eina_List *l; + const Eina_List *l; E_Event_Dnd_Drop ev; int dx, dy, dw, dh; @@ -1013,14 +992,11 @@ if (ev.data) { - int dropped; + E_Drop_Handler *h; + int dropped = 0; - dropped = 0; - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; if (!h->active) continue; _e_drag_coords_update(h, &dx, &dy, &dw, &dh); ev.x = x - dx; @@ -1037,17 +1013,14 @@ { /* Just leave */ E_Event_Dnd_Leave leave_ev; + E_Drop_Handler *h; /* FIXME: We don't need x and y in leave */ leave_ev.x = 0; leave_ev.y = 0; - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; - if (!h->active) continue; @@ -1068,8 +1041,9 @@ if (drag == _drag_current) { - Eina_List *l; + const Eina_List *l; E_Event_Dnd_Leave leave_ev; + E_Drop_Handler *h; e_grabinput_release(_drag_win, _drag_win); ecore_x_window_del(_drag_win); @@ -1078,12 +1052,8 @@ leave_ev.x = 0; leave_ev.y = 0; - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; - if ((h->active) && (h->entered)) { if (h->cb.leave) @@ -1117,15 +1087,12 @@ static int _e_dnd_cb_window_shape(void *data, int ev_type, void *ev) { - Eina_List *l; - Ecore_X_Event_Window_Shape *e; - - e = ev; - for (l = _drag_list; l; l = l->next) + Ecore_X_Event_Window_Shape *e = ev; + const Eina_List *l; + E_Drag *drag; + + EINA_LIST_FOREACH(_drag_list, l, drag) { - E_Drag *drag; - - drag = l->data; if (drag->evas_win == e->win) drag->need_shape_export = 1; } @@ -1194,19 +1161,17 @@ _e_dnd_cb_event_dnd_enter(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Enter *ev; + E_Drop_Handler *h; const char *id; - Eina_List *l; + const Eina_List *l; int i, j; ev = event; id = e_util_winid_str_get(ev->win); if (!eina_hash_find(_drop_win_hash, id)) return 1; - for (l = _drop_handlers; l; l = l->next) - { - E_Drop_Handler *h; - h = l->data; - + EINA_LIST_FOREACH(_drop_handlers, l, h) + { h->active = 0; h->active_type = NULL; h->entered = 0; @@ -1218,12 +1183,8 @@ { _xdnd = E_NEW(XDnd, 1); _xdnd->type = strdup("text/uri-list"); - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; - h->active = 0; h->active_type = NULL; for (j = 0; j < h->num_types; j++) @@ -1245,12 +1206,8 @@ { _xdnd = E_NEW(XDnd, 1); _xdnd->type = strdup("text/x-moz-url"); - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; - h->active = !strcmp(h->type, "enlightenment/x-file"); h->entered = 0; } @@ -1267,7 +1224,7 @@ Ecore_X_Event_Xdnd_Leave *ev; E_Event_Dnd_Leave leave_ev; const char *id; - Eina_List *l; + const Eina_List *l; ev = event; @@ -1279,12 +1236,9 @@ if (_xdnd) { - for (l = _drop_handlers; l; l = l->next) + E_Drop_Handler *h; + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; - if (!h->active) continue; @@ -1310,7 +1264,8 @@ Ecore_X_Rectangle rect; Ecore_X_Action action; const char *id; - Eina_List *l; + const Eina_List *l; + E_Drop_Handler *h; int active; int responsive; @@ -1333,11 +1288,8 @@ action = ev->action; active = 0; - for (l = _drop_handlers; l; l = l->next) + EINA_LIST_FOREACH(_drop_handlers, l, h) { - E_Drop_Handler *h; - - h = l->data; if (h->active) { active = 1; |
From: Enlightenment S. <no-...@en...> - 2009-03-18 23:39:17
|
Log: constness Author: barbieri Date: 2009-03-18 16:39:03 -0700 (Wed, 18 Mar 2009) New Revision: 39562 Modified: trunk/e/src/bin/e_dnd.c trunk/e/src/bin/e_dnd.h Modified: trunk/e/src/bin/e_dnd.c =================================================================== --- trunk/e/src/bin/e_dnd.c 2009-03-18 23:34:29 UTC (rev 39561) +++ trunk/e/src/bin/e_dnd.c 2009-03-18 23:39:03 UTC (rev 39562) @@ -18,8 +18,8 @@ static void _e_drag_show(E_Drag *drag); static void _e_drag_hide(E_Drag *drag); static void _e_drag_move(E_Drag *drag, int x, int y); -static void _e_drag_coords_update(E_Drop_Handler *h, int *dx, int *dy, int *dw, int *dh); -static Ecore_X_Window _e_drag_win_get(E_Drop_Handler *h, int xdnd); +static void _e_drag_coords_update(const E_Drop_Handler *h, int *dx, int *dy, int *dw, int *dh); +static Ecore_X_Window _e_drag_win_get(const E_Drop_Handler *h, int xdnd); static int _e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win, int xdnd); static void _e_drag_win_show(E_Drop_Handler *h); static void _e_drag_win_hide(E_Drop_Handler *h); @@ -228,7 +228,7 @@ } EAPI Evas * -e_drag_evas_get(E_Drag *drag) +e_drag_evas_get(const E_Drag *drag) { return drag->evas; } @@ -399,7 +399,7 @@ } EAPI int -e_drop_inside(E_Drop_Handler *handler, int x, int y) +e_drop_inside(const E_Drop_Handler *handler, int x, int y) { int dx, dy, dw, dh; @@ -521,7 +521,7 @@ } EAPI int -e_drop_handler_responsive_get(E_Drop_Handler *handler) +e_drop_handler_responsive_get(const E_Drop_Handler *handler) { Ecore_X_Window hwin = _e_drag_win_get(handler, 1); const char *wid = e_util_winid_str_get(hwin); @@ -591,7 +591,7 @@ } static void -_e_drag_coords_update(E_Drop_Handler *h, int *dx, int *dy, int *dw, int *dh) +_e_drag_coords_update(const E_Drop_Handler *h, int *dx, int *dy, int *dw, int *dh) { int px = 0, py = 0; @@ -638,7 +638,7 @@ } static Ecore_X_Window -_e_drag_win_get(E_Drop_Handler *h, int xdnd) +_e_drag_win_get(const E_Drop_Handler *h, int xdnd) { Ecore_X_Window hwin = 0; Modified: trunk/e/src/bin/e_dnd.h =================================================================== --- trunk/e/src/bin/e_dnd.h 2009-03-18 23:34:29 UTC (rev 39561) +++ trunk/e/src/bin/e_dnd.h 2009-03-18 23:39:03 UTC (rev 39562) @@ -117,7 +117,7 @@ void *data, int size, void *(*convert_cb)(E_Drag *drag, const char *type), void (*finished_cb)(E_Drag *drag, int dropped)); -EAPI Evas *e_drag_evas_get(E_Drag *drag); +EAPI Evas *e_drag_evas_get(const E_Drag *drag); EAPI void e_drag_object_set(E_Drag *drag, Evas_Object *object); EAPI void e_drag_move(E_Drag *drag, int x, int y); EAPI void e_drag_resize(E_Drag *drag, int w, int h); @@ -138,11 +138,11 @@ const char **types, unsigned int num_types, int x, int y, int w, int h); EAPI void e_drop_handler_geometry_set(E_Drop_Handler *handler, int x, int y, int w, int h); -EAPI int e_drop_inside(E_Drop_Handler *handler, int x, int y); +EAPI int e_drop_inside(const E_Drop_Handler *handler, int x, int y); EAPI void e_drop_handler_del(E_Drop_Handler *handler); EAPI int e_drop_xdnd_register_set(Ecore_X_Window win, int reg); EAPI void e_drop_handler_responsive_set(E_Drop_Handler *handler); -EAPI int e_drop_handler_responsive_get(E_Drop_Handler *handler); +EAPI int e_drop_handler_responsive_get(const E_Drop_Handler *handler); EAPI void e_drop_handler_action_set(Ecore_X_Atom action); EAPI Ecore_X_Atom e_drop_handler_action_get(); |
From: Enlightenment S. <no-...@en...> - 2009-03-19 00:15:08
|
Log: cleanup memory usage, add stringshare, fix bug. * h->active_type was referring to xdnd->type, that could be freed already. Now it's a reference to that string. * strcmp() are now direct pointer comparison since strings are shared. * no more extra "types" allocated member, make it a variable array at the end of the structure. Author: barbieri Date: 2009-03-18 17:14:57 -0700 (Wed, 18 Mar 2009) New Revision: 39564 Modified: trunk/e/src/bin/e_dnd.c trunk/e/src/bin/e_dnd.h Modified: trunk/e/src/bin/e_dnd.c =================================================================== --- trunk/e/src/bin/e_dnd.c 2009-03-18 23:51:35 UTC (rev 39563) +++ trunk/e/src/bin/e_dnd.c 2009-03-19 00:14:57 UTC (rev 39564) @@ -49,7 +49,7 @@ struct _XDnd { int x, y; - char *type; + const char *type; void *data; }; @@ -65,6 +65,10 @@ static XDnd *_xdnd = NULL; +static const char *_type_text_uri_list = NULL; +static const char *_type_text_x_moz_url = NULL; +static const char *_type_enlightenment_x_file = NULL; + static Eina_Hash *_drop_handlers_responsives; static Ecore_X_Atom _action; @@ -73,6 +77,10 @@ EAPI int e_dnd_init(void) { + _type_text_uri_list = eina_stringshare_add("text/uri-list"); + _type_text_x_moz_url = eina_stringshare_add("text/x-moz-url"); + _type_enlightenment_x_file = eina_stringshare_add("enlightenment/x-file"); + _drop_win_hash = eina_hash_string_superfast_new(NULL); _drop_handlers_responsives = eina_hash_string_superfast_new(NULL); @@ -140,6 +148,13 @@ eina_hash_free(_drop_handlers_responsives); + eina_stringshare_del(_type_text_uri_list); + eina_stringshare_del(_type_text_x_moz_url); + eina_stringshare_del(_type_enlightenment_x_file); + _type_text_uri_list = NULL; + _type_text_x_moz_url = NULL; + _type_enlightenment_x_file = NULL; + return 1; } @@ -155,7 +170,8 @@ /* No need to create a drag object without type */ if ((!types) || (!num_types)) return NULL; - drag = E_OBJECT_ALLOC(E_Drag, E_DRAG_TYPE, _e_drag_free); + drag = e_object_alloc(sizeof(E_Drag) + num_types * sizeof(char *), + E_DRAG_TYPE, E_OBJECT_CLEANUP_FUNC(_e_drag_free)); if (!drag) return NULL; drag->x = x; @@ -206,9 +222,8 @@ drag->type = E_DRAG_NONE; - drag->types = malloc(num_types * sizeof(char *)); for (i = 0; i < num_types; i++) - drag->types[i] = strdup(types[i]); + drag->types[i] = eina_stringshare_add(types[i]); drag->num_types = num_types; drag->data = data; drag->data_size = size; @@ -295,15 +310,16 @@ int i, j; h->active = 0; + eina_stringshare_del(h->active_type); h->active_type = NULL; for (i = 0; i < h->num_types; i++) { for (j = 0; j < drag->num_types; j++) { - if (!strcmp(h->types[i], drag->types[j])) + if (h->types[i] == drag->types[j]) { h->active = 1; - h->active_type = h->types[i]; + h->active_type = eina_stringshare_ref(h->types[i]); break; } } @@ -361,7 +377,7 @@ E_Drop_Handler *handler; int i; - handler = E_NEW(E_Drop_Handler, 1); + handler = calloc(1, sizeof(E_Drop_Handler) + num_types * sizeof(char *)); if (!handler) return NULL; handler->cb.data = data; @@ -370,12 +386,8 @@ handler->cb.leave = leave_cb; handler->cb.drop = drop_cb; handler->num_types = num_types; - if (num_types) - { - handler->types = malloc(num_types * sizeof(char *)); - for (i = 0; i < num_types; i++) - handler->types[i] = strdup(types[i]); - } + for (i = 0; i < num_types; i++) + handler->types[i] = eina_stringshare_add(types[i]); handler->x = x; handler->y = y; handler->w = w; @@ -413,12 +425,9 @@ int i; _drop_handlers = eina_list_remove(_drop_handlers, handler); - if (handler->types) - { - for (i = 0; i < handler->num_types; i++) - free(handler->types[i]); - free(handler->types); - } + for (i = 0; i < handler->num_types; i++) + eina_stringshare_del(handler->types[i]); + eina_stringshare_del(handler->active_type); free(handler); } @@ -1077,8 +1086,8 @@ evas_object_del(drag->object); e_canvas_del(drag->ecore_evas); ecore_evas_free(drag->ecore_evas); - for (i = 0; i < drag->num_types; i++) free(drag->types[i]); - free(drag->types); + for (i = 0; i < drag->num_types; i++) + eina_stringshare_del(drag->types[i]); free(drag); ecore_x_window_shadow_tree_flush(); } @@ -1173,26 +1182,29 @@ EINA_LIST_FOREACH(_drop_handlers, l, h) { h->active = 0; + eina_stringshare_del(h->active_type); h->active_type = NULL; h->entered = 0; } for (i = 0; i < ev->num_types; i++) { /* FIXME: Maybe we want to get something else then files dropped? */ - if (!strcmp("text/uri-list", ev->types[i])) + if ((_type_text_uri_list == ev->types[i]) || + (!strcmp(_type_text_uri_list, ev->types[i]))) /* not sure it is stringshared */ { _xdnd = E_NEW(XDnd, 1); - _xdnd->type = strdup("text/uri-list"); + _xdnd->type = eina_stringshare_ref(_type_text_uri_list); EINA_LIST_FOREACH(_drop_handlers, l, h) { h->active = 0; + eina_stringshare_del(h->active_type); h->active_type = NULL; for (j = 0; j < h->num_types; j++) { - if (!strcmp(h->types[j], _xdnd->type)) + if (h->types[j] == _xdnd->type) { h->active = 1; - h->active_type = _xdnd->type; + h->active_type = eina_stringshare_ref(_xdnd->type); break; } } @@ -1202,13 +1214,14 @@ break; } #if 0 - else if (!strcmp("text/x-moz-url", ev->types[i])) + else if ((_type_text_x_moz_url == ev->types[i]) || + (!strcmp(_type_text_x_moz_url, ev->types[i]))) /* not sure it is stringshared */ { _xdnd = E_NEW(XDnd, 1); - _xdnd->type = strdup("text/x-moz-url"); + _xdnd->type = eina_stringshare_ref(_type_text_x_moz_url); EINA_LIST_FOREACH(_drop_handlers, l, h) { - h->active = !strcmp(h->type, "enlightenment/x-file"); + h->active = (h->type == _type_enlightenment_x_file); h->entered = 0; } break; @@ -1250,7 +1263,7 @@ } } - free(_xdnd->type); + eina_stringshare_del(_xdnd->type); free(_xdnd); _xdnd = NULL; } @@ -1384,7 +1397,7 @@ if (!eina_hash_find(_drop_win_hash, id)) return 1; if (ev->selection != ECORE_X_SELECTION_XDND) return 1; - if (!strcmp("text/uri-list", _xdnd->type)) + if (_type_text_uri_list == _xdnd->type) { Ecore_X_Selection_Data_Files *files; Eina_List *l = NULL; @@ -1396,7 +1409,7 @@ _e_drag_xdnd_end(ev->win, _xdnd->x, _xdnd->y); eina_list_free(l); } - else if (!strcmp("text/x-moz-url", _xdnd->type)) + else if (_type_text_x_moz_url == _xdnd->type) { /* FIXME: Create a ecore x parser for this type */ Ecore_X_Selection_Data *data; @@ -1442,7 +1455,7 @@ /* FIXME: When to execute this? It could be executed in ecore_x after getting * the drop property... */ ecore_x_dnd_send_finished(); - free(_xdnd->type); + eina_stringshare_del(_xdnd->type); free(_xdnd); _xdnd = NULL; return 1; Modified: trunk/e/src/bin/e_dnd.h =================================================================== --- trunk/e/src/bin/e_dnd.h 2009-03-18 23:51:35 UTC (rev 39563) +++ trunk/e/src/bin/e_dnd.h 2009-03-19 00:14:57 UTC (rev 39564) @@ -28,8 +28,6 @@ { E_Object e_obj_inherit; - char **types; - unsigned int num_types; void *data; int data_size; @@ -59,6 +57,9 @@ unsigned char visible : 1; unsigned char need_shape_export : 1; unsigned char xy_update : 1; + + unsigned int num_types; + const char *types[]; }; struct _E_Drop_Handler @@ -72,14 +73,13 @@ } cb; E_Object *obj; - char **types; - unsigned int num_types; - int x, y, w, h; unsigned char active : 1; unsigned char entered : 1; const char *active_type; + unsigned int num_types; + const char *types[]; }; struct _E_Event_Dnd_Enter |
From: Enlightenment S. <no-...@en...> - 2009-03-19 00:19:27
|
Log: proper cleanup of drop_handlers. Author: barbieri Date: 2009-03-18 17:19:12 -0700 (Wed, 18 Mar 2009) New Revision: 39565 Modified: trunk/e/src/bin/e_dnd.c Modified: trunk/e/src/bin/e_dnd.c =================================================================== --- trunk/e/src/bin/e_dnd.c 2009-03-19 00:14:57 UTC (rev 39564) +++ trunk/e/src/bin/e_dnd.c 2009-03-19 00:19:12 UTC (rev 39565) @@ -133,18 +133,20 @@ while (_drag_list) { - E_Drag *drag; - - drag = _drag_list->data; + E_Drag *drag = _drag_list->data; e_object_del(E_OBJECT(drag)); } + while (_drop_handlers) + { + E_Drop_Handler *h = _drop_handlers->data; + e_drop_handler_del(h); + } + EINA_LIST_FREE(_event_handlers, h) ecore_event_handler_del(h); eina_hash_free(_drop_win_hash); - eina_list_free(_drop_handlers); - _drop_handlers = NULL; eina_hash_free(_drop_handlers_responsives); |
From: Enlightenment S. <no-...@en...> - 2009-03-19 00:36:27
|
Log: enjoy stringshare benefits. Author: barbieri Date: 2009-03-18 17:36:12 -0700 (Wed, 18 Mar 2009) New Revision: 39566 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-19 00:19:12 UTC (rev 39565) +++ trunk/e/src/bin/e_fm.c 2009-03-19 00:36:12 UTC (rev 39566) @@ -407,6 +407,7 @@ static const char *_e_fm2_mime_inode_directory = NULL; static const char *_e_fm2_mime_app_desktop = NULL; static const char *_e_fm2_mime_app_edje = NULL; +static const char *_e_fm2_mime_text_uri_list = NULL; static Ecore_Timer *_e_fm2_mime_flush = NULL; static Ecore_Timer *_e_fm2_mime_clear = NULL; @@ -705,6 +706,7 @@ _e_fm2_mime_inode_directory = eina_stringshare_add("inode/directory"); _e_fm2_mime_app_desktop = eina_stringshare_add("application/x-desktop"); _e_fm2_mime_app_edje = eina_stringshare_add("application/x-edje"); + _e_fm2_mime_text_uri_list = eina_stringshare_add("text/uri-list"); /// DBG if (!_e_fm2_op_registry_entry_add_handler) @@ -732,6 +734,7 @@ _eina_stringshare_replace(&_e_fm2_mime_inode_directory, NULL); _eina_stringshare_replace(&_e_fm2_mime_app_desktop, NULL); _eina_stringshare_replace(&_e_fm2_mime_app_edje, NULL); + _eina_stringshare_replace(&_e_fm2_mime_text_uri_list, NULL); /// DBG if (_e_fm2_op_registry_entry_add_handler) @@ -5651,8 +5654,7 @@ { E_Event_Dnd_Enter *ev; - if (!type) return; - if (strcmp(type, "text/uri-list")) return; + if (type != _e_fm2_mime_text_uri_list) return; ev = (E_Event_Dnd_Enter *)event; e_drop_handler_action_set(ev->action); } @@ -5666,8 +5668,7 @@ Eina_List *l; sd = data; - if (!type) return; - if (strcmp(type, "text/uri-list")) return; + if (type != _e_fm2_mime_text_uri_list) return; ev = (E_Event_Dnd_Move *)event; e_drop_handler_action_set(ev->action); EINA_LIST_FOREACH(sd->icons, l, ic) @@ -5770,8 +5771,7 @@ E_Event_Dnd_Leave *ev; sd = data; - if (!type) return; - if (strcmp(type, "text/uri-list")) return; + if (type != _e_fm2_mime_text_uri_list) return; ev = (E_Event_Dnd_Leave *)event; _e_fm2_dnd_drop_hide(sd->obj); _e_fm2_dnd_drop_all_hide(sd->obj); @@ -5953,8 +5953,7 @@ size_t length = 0; sd = data; - if (!type) return; - if (strcmp(type, "text/uri-list")) return; + if (type != _e_fm2_mime_text_uri_list) return; ev = (E_Event_Dnd_Drop *)event; fsel = _e_fm2_uri_path_list_get(ev->data); |
From: Enlightenment S. <no-...@en...> - 2009-03-19 00:50:50
|
Log: move loop invariant sprintf() outside loop. Author: barbieri Date: 2009-03-18 17:50:35 -0700 (Wed, 18 Mar 2009) New Revision: 39567 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-19 00:36:12 UTC (rev 39566) +++ trunk/e/src/bin/e_fm.c 2009-03-19 00:50:35 UTC (rev 39567) @@ -6436,10 +6436,10 @@ Evas_Object *o, *o2; Evas_Coord x, y, w, h; const char *drag_types[] = { "text/uri-list" }, *realpath; - char buf[PATH_MAX + 8], *sel = NULL; + char buf[PATH_MAX + 8], *p, *sel = NULL; E_Container *con = NULL; Eina_List *sl; - int sel_length = 0; + int sel_length = 0, p_offset, p_length; switch (ic->sd->eobj->type) { @@ -6470,6 +6470,16 @@ ic->drag.start = 0; evas_object_geometry_get(ic->obj, &x, &y, &w, &h); realpath = e_fm2_real_path_get(ic->sd->obj); + p_offset = ecore_strlcpy(buf, realpath, sizeof(buf)); + if ((p_offset < 1) || (p_offset >= sizeof(buf) - 2)) return; + if (buf[p_offset - 1] != '/') + { + buf[p_offset] = '/'; + p_offset++; + } + p = buf + p_offset; + p_length = sizeof(buf) - p_offset - 1; + sl = e_fm2_selected_list_get(ic->sd->obj); EINA_LIST_FREE(sl, ici) { @@ -6477,7 +6487,7 @@ const char *s; int s_len; - snprintf(buf, sizeof(buf), "%s/%s", realpath, ici->file); + if (ecore_strlcpy(p, ici->file, p_length) >= p_length) continue; s = _e_fm2_uri_escape(buf); if (!s) continue; s_len = strlen(s); |
From: Enlightenment S. <no-...@en...> - 2009-03-19 01:46:18
|
Log: fix drag&drop of multiple files and reduce variables scopes. Author: barbieri Date: 2009-03-18 18:45:58 -0700 (Wed, 18 Mar 2009) New Revision: 39568 Modified: trunk/e/src/bin/e_fm.c Modified: trunk/e/src/bin/e_fm.c =================================================================== --- trunk/e/src/bin/e_fm.c 2009-03-19 00:50:35 UTC (rev 39567) +++ trunk/e/src/bin/e_fm.c 2009-03-19 01:45:58 UTC (rev 39568) @@ -6150,9 +6150,7 @@ static void _e_fm2_mouse_1_handler(E_Fm2_Icon *ic, int up, Evas_Modifier *modifiers) { - Eina_List *l; - E_Fm2_Icon *ic2; - int multi_sel = 0, range_sel = 0, seen = 0, sel_change = 0; + int multi_sel = 0, range_sel = 0, sel_change = 0; if (ic->sd->config->selection.windows_modifiers) { @@ -6175,6 +6173,9 @@ } if (range_sel) { + const Eina_List *l; + E_Fm2_Icon *ic2; + Eina_Bool seen = 0; /* find last selected - if any, and select all icons between */ EINA_LIST_FOREACH(ic->sd->icons, l, ic2) { @@ -6206,8 +6207,10 @@ } } } - else if (!multi_sel) + else if ((!multi_sel) && ((up) || ((!up) && (!ic->selected)))) { + const Eina_List *l; + E_Fm2_Icon *ic2; /* desel others */ EINA_LIST_FOREACH(ic->sd->icons, l, ic2) { @@ -6225,6 +6228,8 @@ { if (!up) { + const Eina_List *l; + E_Fm2_Icon *ic2; EINA_LIST_FOREACH(ic->sd->icons, l, ic2) { ic2->last_selected = 0; |
From: Enlightenment S. <no-...@en...> - 2009-03-19 02:08:23
|
Log: have all exits and restarts to use e_sys_action_do() Author: barbieri Date: 2009-03-18 19:08:09 -0700 (Wed, 18 Mar 2009) New Revision: 39569 Modified: trunk/e/src/bin/e_ipc_handlers.h trunk/e/src/bin/e_main.c trunk/e/src/bin/e_msgbus.c trunk/e/src/bin/e_sys.c Modified: trunk/e/src/bin/e_ipc_handlers.h =================================================================== --- trunk/e/src/bin/e_ipc_handlers.h 2009-03-19 01:45:58 UTC (rev 39568) +++ trunk/e/src/bin/e_ipc_handlers.h 2009-03-19 02:08:09 UTC (rev 39569) @@ -1378,8 +1378,7 @@ REQ_NULL(HDL); #elif (TYPE == E_WM_IN) GENERIC(HDL); - restart = 1; - ecore_main_loop_quit(); + e_sys_action_do(E_SYS_RESTART, NULL); END_GENERIC(); #elif (TYPE == E_REMOTE_IN) #endif @@ -1393,7 +1392,7 @@ REQ_NULL(HDL); #elif (TYPE == E_WM_IN) GENERIC(HDL); - if (!e_util_immortal_check()) ecore_main_loop_quit(); + e_sys_action_do(E_SYS_EXIT, NULL); END_GENERIC(); #elif (TYPE == E_REMOTE_IN) #endif @@ -5048,8 +5047,7 @@ e_config_profile_set(s); e_config_profile_save(); e_config_save_block_set(1); - restart = 1; - ecore_main_loop_quit(); + e_sys_action_do(E_SYS_RESTART, NULL); END_STRING(s); #elif (TYPE == E_REMOTE_IN) #endif Modified: trunk/e/src/bin/e_main.c =================================================================== --- trunk/e/src/bin/e_main.c 2009-03-19 01:45:58 UTC (rev 39568) +++ trunk/e/src/bin/e_main.c 2009-03-19 02:08:09 UTC (rev 39569) @@ -1474,16 +1474,14 @@ _e_main_cb_signal_exit(void *data __UNUSED__, int ev_type __UNUSED__, void *ev __UNUSED__) { /* called on ctrl-c, kill (pid) (also SIGINT, SIGTERM and SIGQIT) */ - if (!e_util_immortal_check()) ecore_main_loop_quit(); + e_sys_action_do(E_SYS_EXIT, NULL); return 1; } static int _e_main_cb_signal_hup(void *data __UNUSED__, int ev_type __UNUSED__, void *ev __UNUSED__) { - /* called on SIGHUP to restart Enlightenment */ - restart = 1; - ecore_main_loop_quit(); + e_sys_action_do(E_SYS_RESTART, NULL); return 1; } Modified: trunk/e/src/bin/e_msgbus.c =================================================================== --- trunk/e/src/bin/e_msgbus.c 2009-03-19 01:45:58 UTC (rev 39568) +++ trunk/e/src/bin/e_msgbus.c 2009-03-19 02:08:09 UTC (rev 39569) @@ -127,17 +127,14 @@ static DBusMessage* _e_msgbus_core_restart_cb(E_DBus_Object *obj, DBusMessage *msg) { - restart = 1; - ecore_main_loop_quit(); - + e_sys_action_do(E_SYS_RESTART, NULL); return dbus_message_new_method_return(msg); } static DBusMessage* _e_msgbus_core_shutdown_cb(E_DBus_Object *obj, DBusMessage *msg) { - if (!e_util_immortal_check()) ecore_main_loop_quit(); - + e_sys_action_do(E_SYS_EXIT, NULL); return dbus_message_new_method_return(msg); } @@ -265,8 +262,7 @@ e_config_profile_set(profile); e_config_profile_save(); e_config_save_block_set(1); - restart = 1; - ecore_main_loop_quit(); + e_sys_action_do(E_SYS_RESTART, NULL); return dbus_message_new_method_return(msg); } Modified: trunk/e/src/bin/e_sys.c =================================================================== --- trunk/e/src/bin/e_sys.c 2009-03-19 01:45:58 UTC (rev 39568) +++ trunk/e/src/bin/e_sys.c 2009-03-19 02:08:09 UTC (rev 39569) @@ -499,16 +499,22 @@ switch (a) { case E_SYS_EXIT: + // XXX TODO: check for e_fm_op_registry entries and confirm if (!e_util_immortal_check()) ecore_main_loop_quit(); break; case E_SYS_RESTART: - restart = 1; - ecore_main_loop_quit(); + // XXX TODO: check for e_fm_op_registry entries and confirm + if (!e_util_immortal_check()) + { + restart = 1; + ecore_main_loop_quit(); + } break; case E_SYS_EXIT_NOW: exit(0); break; case E_SYS_LOGOUT: + // XXX TODO: check for e_fm_op_registry entries and confirm _e_sys_logout_begin(E_SYS_EXIT); break; case E_SYS_HALT: |