From 2f76dd5d99a03cc722120d5abc9d9f1d9a5158b0 Mon Sep 17 00:00:00 2001 From: semernin Date: Mon, 29 Jun 2009 14:38:03 +0000 Subject: [PATCH] List of changes: 1. Gadcon sities: -- 'E_Gadcon_Site' enum to list all available sities, -- added 'is_site' callback for distinguish gadcon sities, -- 'e_gadcon_site_is_*' helpers written to use in gadget modules, -- gadcon config dialogs modified to show only gadgets that appropriate to selected gadcon site, -- all gadget modules updated for using new callback. When callback is not provided in module, then gadget can be used in any gadcon site. 2. Filemanager: -- added error icon to unexisting path dialog, -- added callback 'func.abort' to 'E_Fm2_Op_Registry_Entry' to specify abort operation sequence (if not provided, then operation is not cancelable), -- added parameter to 'e_fm2_op_registry_entry_add' to specify abort method on construct 'E_Fm2_Op_Registry_Entry' or make non-cancelable operation if this function is not provided, -- added 'e_fm2_operation_abort' call to cancel efm2 operation, -- added method '_e_fm2_operation_abort_internal' that represent efm2 default handler of operation cancelling, -- 'done' and 'total' fields of 'E_Fm2_Op_Registry_Entry' changed to off_t type, also all message handlers modified to work with it (to show progress for large files correctly), -- improved file operation progress processing, -- added cancel button to operation progress gadget in filemanager window, -- added delete file glyph to operation progress gadget, -- improved status message for efm2 operation progress. 3. Filemanager slave: -- fixed critical bug in message handling via stdin/stdout, -- fixed critical bug in removing task from list, -- improved 'E_FM_OP_ABORT' handling, -- fix rollback counting on moving files. 4. Fileman_opinfo module: -- a new theme writed: status string and gadget for view operation status in summary and detail modes, -- summary mode: operation glyph, state message, progressbar, abort button, -- detail mode: all for summary + from filename, to filename, -- summary/detailed button works as trigger, -- added source of module theme and used images. 4. Pathbar module: -- non-critical fix, just for safety. Also patch contains several minor updates to serve main task. SVN revision: 41224 --- data/themes/default.edc | 137 +++++-- data/themes/images/icon_efm_file_del.png | Bin 0 -> 3786 bytes src/bin/e_fm.c | 61 ++- src/bin/e_fm.h | 2 + src/bin/e_fm_main.c | 12 +- src/bin/e_fm_op.c | 20 +- src/bin/e_fm_op_registry.c | 12 +- src/bin/e_fm_op_registry.h | 15 +- src/bin/e_gadcon.c | 46 +++ src/bin/e_gadcon.h | 20 + src/bin/e_int_gadcon_config.c | 40 +- src/modules/battery/e_mod_main.c | 2 +- src/modules/clock/e_mod_main.c | 2 +- src/modules/conf/e_mod_main.c | 3 +- src/modules/connman/e_mod_main.c | 3 +- src/modules/cpufreq/e_mod_main.c | 2 +- src/modules/fileman/e_fwin.c | 84 +++- .../e-module-fileman_opinfo.edj | Bin 18521 -> 41962 bytes src/modules/fileman_opinfo/e_mod_main.c | 370 ++++++++++++++---- src/modules/gadman/e_mod_config.c | 2 + src/modules/ibar/e_mod_main.c | 3 +- src/modules/ibox/e_mod_main.c | 3 +- src/modules/illume/e_mod_gad_bluetooth.c | 3 +- src/modules/illume/e_mod_gad_gsm.c | 3 +- src/modules/illume/e_mod_gad_usb.c | 3 +- src/modules/illume/e_mod_gad_wifi.c | 3 +- src/modules/mixer/e_mod_main.c | 5 +- src/modules/pager/e_mod_main.c | 3 +- src/modules/start/e_mod_main.c | 3 +- src/modules/systray/e_mod_main.c | 5 +- src/modules/temperature/e_mod_main.c | 3 +- 31 files changed, 712 insertions(+), 158 deletions(-) create mode 100644 data/themes/images/icon_efm_file_del.png diff --git a/data/themes/default.edc b/data/themes/default.edc index d2d4f004e..9f424fffb 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -11881,6 +11881,9 @@ collections { /* begin the collection of edje groups that are in this file */ } group { name: "e/fileman/default/progress"; min: 250 40; + images { + image: "icon_efm_file_del.png" COMP; + } parts { part { name: "bg"; type: IMAGE; @@ -11910,7 +11913,7 @@ collections { /* begin the collection of edje groups that are in this file */ description { state: "default" 0.0; min: 32 32; max: 32 32; - align: 0.02 0.5; + align: 0.01 0.5; rel1.to: "bg"; rel2.to: "bg"; image.normal: "icon_efm_dnd_ask.png"; @@ -11923,6 +11926,10 @@ collections { /* begin the collection of edje groups that are in this file */ inherit: "default" 0.0; image.normal: "icon_efm_dnd_move.png"; } + description { state: "delete" 0.0; + inherit: "default" 0.0; + image.normal: "icon_efm_file_del.png"; + } } part { name: "gauge_bg"; type: IMAGE; @@ -11964,15 +11971,21 @@ collections { /* begin the collection of edje groups that are in this file */ confine:"gauge_confine"; } } - part { name: "e.text.label1"; + part { name: "e.text.info"; type: TEXT; mouse_events: 0; scale: 1; description { state: "default" 0.0; - rel1.to: "icon"; - rel1.relative: 1.0 0.0; - rel2.to: "bg"; - rel2.relative: 1.0 0.6; + rel1 { + relative: 1.0 0.0; + to_x: "icon"; + to_y: "bg"; + } + rel2 { + relative: 0.0 0.6; + to_x: "bt_abort"; + to_y: "icon"; + } color: 0 0 0 255; text { font: "Sans"; @@ -11982,26 +11995,73 @@ collections { /* begin the collection of edje groups that are in this file */ } } } - //~ part { name: "e.text.label2"; - //~ type: TEXT; - //~ mouse_events: 0; - //~ scale: 1; - //~ description { state: "default" 0.0; - //~ align: 0.5 0.0; - //~ rel1.to: "e.text.label1"; - //~ rel1.relative: 0.0 1.3; - //~ //rel1.offset: 5 0; - //~ rel2.to: "e.text.label1"; - //~ rel2.relative: 1.0 3.0; - //~ color: 0 0 0 255; - //~ text { - //~ font: "Sans"; - //~ size: 9; - //~ min: 1 0; - //~ align: 0.0 1.0; - //~ } - //~ } - //~ } + part { name: "bt_abort"; + type: IMAGE; + mouse_events: 0; + description { state: "default" 0.0; + align: 1.0 0.5; + min: 19 19; + max: 19 19; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + rel1 { + relative: 1.0 0.0; + to_x: "e.text.info"; + to_y: "bg"; + } + rel2 { + relative: 0.99 1.0; + to_x: "bg"; + to_y: "e.text.info"; + } + image.normal: "bd_button_close_shadow.png"; + } + } + part { name: "bt_abort_unfoc"; + type: IMAGE; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1.to: "bt_abort"; + rel2.to: "bt_abort"; + image.normal: "bd_button_close_unfocused.png"; + } + description { state: "active" 0.0; + inherit: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.offset: 0 1; + rel2.offset: -1 0; + } + } + part { name: "bt_abort_foc"; + type: IMAGE; + mouse_events: 0; + description { state: "default" 0.0; + visible: 0; + color: 255 255 255 0; + rel1.to: "bt_abort"; + rel2.to: "bt_abort"; + image.normal: "bd_button_close_focused.png"; + } + description { state: "active" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1.offset: 0 1; + rel2.offset: -1 0; + } + } + part { name: "e.event.abort"; + type: RECT; + mouse_events: 1; + description { state: "default" 0.0; + rel1.to: "bt_abort"; + rel2.to: "bt_abort"; + color: 0 0 0 0; + } + } } programs { program { name: "set_need_attention"; @@ -12043,6 +12103,31 @@ collections { /* begin the collection of edje groups that are in this file */ action: STATE_SET "move" 0.0; target: "icon"; } + program { name: "set_icon_delete"; + signal: "e,action,icon,delete"; + source: "e"; + action: STATE_SET "delete" 0.0; + target: "icon"; + } + program { name: "bt_abort_down"; + signal: "mouse,down,*"; + source: "e.event.abort"; + action: STATE_SET "active" 0.0; + target: "bt_abort_unfoc"; + target: "bt_abort_foc"; + } + program { name: "bt_abort_up"; + signal: "mouse,up,*"; + source: "e.event.abort"; + action: STATE_SET "default" 0.0; + target: "bt_abort_unfoc"; + target: "bt_abort_foc"; + } + program { name: "bt_abort_click"; + signal: "mouse,clicked,*"; + source: "e.event.abort"; + action: SIGNAL_EMIT "e,fm,operation,abort" ""; + } } } group { name: "e/fileman/default/scrollframe"; diff --git a/data/themes/images/icon_efm_file_del.png b/data/themes/images/icon_efm_file_del.png new file mode 100644 index 0000000000000000000000000000000000000000..019e3d6100a591dbc4ce7421aa79e4bd9d3071b2 GIT binary patch literal 3786 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index a47b26c79..7d43c270b 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -419,6 +419,8 @@ static void _e_fm2_volume_eject(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fm2_icon_removable_update(E_Fm2_Icon *ic); static void _e_fm2_volume_icon_update(E_Volume *v); +static void _e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere); + static char *_e_fm2_meta_path = NULL; static Evas_Smart *_e_fm2_smart = NULL; static Eina_List *_e_fm2_list = NULL; @@ -630,7 +632,7 @@ _e_fm2_op_registry_entry_print(const E_Fm2_Op_Registry_Entry *ere) status = status_strings[0]; printf("id: %8d, op: %2d [%s] finished: %hhu, needs_attention: %hhu\n" - " %3d%% (%8zd/%8zd), start_time: %10.0f, eta: %5ds, xwin: %#x\n" + " %3d%% (%lld/%lld), start_time: %10.0f, eta: %5ds, xwin: %#x\n" " src=[%s]\n" " dst=[%s]\n", ere->id, ere->op, status, ere->finished, ere->needs_attention, @@ -933,6 +935,7 @@ e_fm2_path_set(Evas_Object *obj, const char *dev, const char *path) e_dialog_button_add(dialog, _("Close"), NULL, NULL, dialog); e_dialog_button_focus_num(dialog, 0); e_dialog_title_set(dialog, _("Nonexistent path")); + e_dialog_icon_set(dialog, "dialog-error", 64); snprintf(text, sizeof(text), _("%s doesn't exist."), @@ -2463,7 +2466,7 @@ static int _e_fm_client_file_del(const char *files, Evas_Object *e_fm) { 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); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_REMOVE, _e_fm2_operation_abort_internal); return id; } @@ -2471,7 +2474,7 @@ static int _e_fm2_client_file_trash(const char *path, Evas_Object *e_fm) { 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); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_TRASH, _e_fm2_operation_abort_internal); return id; } @@ -2492,7 +2495,7 @@ _e_fm2_client_file_mkdir(const char *path, const char *rel, int rel_to, int x, i memcpy(d + l1 + 1 + l2 + 1 + (2 * sizeof(int)), &y, sizeof(int)); 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); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MKDIR, _e_fm2_operation_abort_internal); return id; } @@ -2500,7 +2503,7 @@ static int _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); - e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MOVE); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_MOVE, _e_fm2_operation_abort_internal); return id; } @@ -2543,7 +2546,7 @@ _e_fm2_client_file_symlink(const char *path, const char *dest, const char *rel, } 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); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK, _e_fm2_operation_abort_internal); return id; #else char *args = NULL; @@ -2564,7 +2567,7 @@ static int _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); - e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_COPY); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_COPY, _e_fm2_operation_abort_internal); return id; } @@ -2572,7 +2575,7 @@ static int _e_fm_client_file_symlink(const char *args, Evas_Object *e_fm) { 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); + e_fm2_op_registry_entry_add(id, e_fm, E_FM_OP_SYMLINK, _e_fm2_operation_abort_internal); return id; } @@ -3085,7 +3088,7 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) case E_FM_OP_PROGRESS:/*progress*/ { int percent, seconds; - size_t done, total; + off_t done, total; char *src = NULL; char *dst = NULL; void *p = e->data; @@ -3095,8 +3098,8 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) #define UP(value, type) (value) = *(type *)p; p += sizeof(type) UP(percent, int); UP(seconds, int); - UP(done, size_t); - UP(total, size_t); + UP(done, off_t); + UP(total, off_t); #undef UP src = p; dst = p + strlen(src) + 1; @@ -3119,8 +3122,17 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) break; case E_FM_OP_QUIT:/*finished*/ - e_fm2_op_registry_entry_del(e->ref); - break; + { + E_Fm2_Op_Registry_Entry *ere = e_fm2_op_registry_entry_get(e->ref); + if (ere) + { + ere->finished = 1; + ere->eta = 0; + e_fm2_op_registry_entry_changed(ere); + } + e_fm2_op_registry_entry_del(e->ref); + } + break; default: break; @@ -9803,3 +9815,26 @@ _e_fm2_icon_removable_update(E_Fm2_Icon *ic) v = e_fm2_hal_volume_find(ic->info.link); _update_volume_icon(v, ic); } + +static void +_e_fm2_operation_abort_internal(E_Fm2_Op_Registry_Entry *ere) +{ + ere->status = E_FM2_OP_STATUS_ABORTED; + ere->finished = 1; + ere->needs_attention = 0; + e_fm2_op_registry_entry_changed(ere); + _e_fm_client_send(E_FM_OP_ABORT, ere->id, NULL, 0); +} + +EAPI void +e_fm2_operation_abort(int id) +{ + E_Fm2_Op_Registry_Entry *ere; + + ere = e_fm2_op_registry_entry_get(id); + if (!ere) return; + + e_fm2_op_registry_entry_ref(ere); + e_fm2_op_registry_entry_abort(ere); + e_fm2_op_registry_entry_unref(ere); +} diff --git a/src/bin/e_fm.h b/src/bin/e_fm.h index 170dfb9be..b8480ea62 100644 --- a/src/bin/e_fm.h +++ b/src/bin/e_fm.h @@ -168,6 +168,8 @@ EAPI void e_fm2_pan_child_size_get(Evas_Object *obj, Evas_Coord EAPI void e_fm2_all_icons_update(void); +EAPI void e_fm2_operation_abort(int id); + EAPI Evas_Object * e_fm2_icon_get(Evas *evas, E_Fm2_Icon *ic, void (*gen_func) (void *data, Evas_Object *obj, void *event_info), diff --git a/src/bin/e_fm_main.c b/src/bin/e_fm_main.c index 60386fb9c..845d734fa 100644 --- a/src/bin/e_fm_main.c +++ b/src/bin/e_fm_main.c @@ -1639,6 +1639,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event) } } break; + case E_FM_OP_ABORT: // abort copy/move/delete operation by user + { + E_Fm_Slave *slave = _e_fm_slave_get(e->ref); + if (slave) + _e_fm_slave_send(slave, e->minor, NULL, 0); + } + break; case E_FM_OP_ERROR_RESPONSE_IGNORE_THIS: case E_FM_OP_ERROR_RESPONSE_IGNORE_ALL: case E_FM_OP_ERROR_RESPONSE_ABORT: @@ -1777,8 +1784,8 @@ static int _e_fm_slave_data_cb(void *data, int type, void *event) sdata = e->data; ssize = e->size; - while (ssize) - { + while (ssize >= 3 * sizeof(int)) + { memcpy(&magic, sdata, sizeof(int)); memcpy(&id, sdata + sizeof(int), sizeof(int)); memcpy(&size, sdata + sizeof(int) + sizeof(int), sizeof(int)); @@ -1786,6 +1793,7 @@ static int _e_fm_slave_data_cb(void *data, int type, void *event) if (magic != E_FM_OP_MAGIC) { printf("%s:%s(%d) Wrong magic number from slave #%d. ", __FILE__, __FUNCTION__, __LINE__, slave->id); + break; } sdata += 3 * sizeof(int); diff --git a/src/bin/e_fm_op.c b/src/bin/e_fm_op.c index f04fbde16..1f3ddbe8c 100644 --- a/src/bin/e_fm_op.c +++ b/src/bin/e_fm_op.c @@ -52,7 +52,7 @@ static int _e_fm_op_scan_idler(void *data); 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(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_update_progress(E_Fm_Op_Task *task, off_t _plus_e_fm_op_done, off_t _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); @@ -73,7 +73,7 @@ Ecore_Fd_Handler *_e_fm_op_stdin_handler = NULL; Eina_List *_e_fm_op_work_queue = NULL, *_e_fm_op_scan_queue = NULL; Ecore_Idler *_e_fm_op_work_idler_p = NULL, *_e_fm_op_scan_idler_p = NULL; -long long _e_fm_op_done, _e_fm_op_total; /* Type long long should be 64 bits wide everywhere, +off_t _e_fm_op_done, _e_fm_op_total; /* Type long long should be 64 bits wide everywhere, this means that it's max value is 2^63 - 1, which is 8 388 608 terabytes, and this should be enough. Well, we'll be multipling _e_fm_op_done by 100, but @@ -370,11 +370,14 @@ _e_fm_op_task_free(void *t) static void _e_fm_op_remove_link_task(E_Fm_Op_Task *task) { + E_Fm_Op_Task *ltask; + if (task->link) { + ltask = eina_list_data_get(task->link); _e_fm_op_work_queue = eina_list_remove_list(_e_fm_op_work_queue, task->link); - _e_fm_op_task_free(task->link); + _e_fm_op_task_free(ltask); task->link = NULL; } } @@ -892,13 +895,14 @@ _e_fm_op_rollback(E_Fm_Op_Task *task) } if (task->type == E_FM_OP_COPY) - _e_fm_op_update_progress(task, -task->dst.done, -task->src.st.st_size); + _e_fm_op_update_progress(task, -task->dst.done, + -task->src.st.st_size - (task->link ? REMOVECHUNKSIZE : 0)); else _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) +_e_fm_op_update_progress_report(int percent, int eta, double elapsed, off_t done, off_t total, const char *src, const char *dst) { const int magic = E_FM_OP_MAGIC; const int id = E_FM_OP_PROGRESS; @@ -908,7 +912,7 @@ _e_fm_op_update_progress_report(int percent, int eta, double elapsed, size_t don src_len = strlen(src); dst_len = strlen(dst); - size = 2 * sizeof(int) + 2 * sizeof(size_t) + src_len + 1 + dst_len + 1; + size = 2 * sizeof(int) + 2 * sizeof(off_t) + src_len + 1 + dst_len + 1; data = alloca(3 * sizeof(int) + size); if (!data) return; p = data; @@ -921,7 +925,7 @@ _e_fm_op_update_progress_report(int percent, int eta, double elapsed, size_t don P(eta); #undef P -#define P(value) memcpy(p, &(value), sizeof(size_t)); p += sizeof(size_t) +#define P(value) memcpy(p, &(value), sizeof(off_t)); p += sizeof(off_t) P(done); P(total); #undef P @@ -955,7 +959,7 @@ _e_fm_op_update_progress_report_simple(int percent, const char *src, const char * packed and written to STDOUT. */ 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) +_e_fm_op_update_progress(E_Fm_Op_Task *task, off_t _plus_e_fm_op_done, off_t _plus_e_fm_op_total) { static int ppercent = -1; int percent; diff --git a/src/bin/e_fm_op_registry.c b/src/bin/e_fm_op_registry.c index b52083cb1..629ccc670 100644 --- a/src/bin/e_fm_op_registry.c +++ b/src/bin/e_fm_op_registry.c @@ -145,7 +145,7 @@ _e_fm2_op_registry_entry_internal_event(E_Fm2_Op_Registry_Entry_Internal *e, int } Eina_Bool -e_fm2_op_registry_entry_add(int id, Evas_Object *e_fm, E_Fm_Op_Type op) +e_fm2_op_registry_entry_add(int id, Evas_Object *e_fm, E_Fm_Op_Type op, E_Fm2_Op_Registry_Abort_Func abort) { E_Fm2_Op_Registry_Entry_Internal *e; @@ -157,6 +157,7 @@ e_fm2_op_registry_entry_add(int id, Evas_Object *e_fm, E_Fm_Op_Type op) e->entry.start_time = ecore_loop_time_get(); e->entry.op = op; e->entry.status = E_FM2_OP_STATUS_IN_PROGRESS; + e->entry.func.abort = abort; e->references = 1; if (!eina_hash_add(_e_fm2_op_registry, &id, e)) @@ -504,3 +505,12 @@ e_fm2_op_registry_shutdown(void) return 0; } + +EAPI void +e_fm2_op_registry_entry_abort(E_Fm2_Op_Registry_Entry *entry) +{ + if (!entry) return; + + if (entry->func.abort) + entry->func.abort(entry); +} diff --git a/src/bin/e_fm_op_registry.h b/src/bin/e_fm_op_registry.h index 299e1c7cb..d7b39935b 100644 --- a/src/bin/e_fm_op_registry.h +++ b/src/bin/e_fm_op_registry.h @@ -18,12 +18,14 @@ typedef struct _E_Fm2_Op_Registry_Entry E_Fm2_Op_Registry_Entry; #ifndef E_FM_OP_REGISTRY_H #define E_FM_OP_REGISTRY_H +typedef void (*E_Fm2_Op_Registry_Abort_Func)(E_Fm2_Op_Registry_Entry *entry); + struct _E_Fm2_Op_Registry_Entry { int id; int percent; /* XXX use char? */ - size_t done; - size_t total; + off_t done; + off_t total; Evas_Object *e_fm; const char *src; /* stringshared */ const char *dst; /* stringshared */ @@ -33,6 +35,12 @@ struct _E_Fm2_Op_Registry_Entry E_Fm2_Op_Status status; Eina_Bool needs_attention:1; Eina_Bool finished:1; + + // service callbacks + struct + { + E_Fm2_Op_Registry_Abort_Func abort; + } func; }; extern EAPI int E_EVENT_FM_OP_REGISTRY_ADD; @@ -55,12 +63,13 @@ EAPI void e_fm2_op_registry_get_all_free(Eina_List *list); EAPI Eina_Bool e_fm2_op_registry_is_empty(void); EAPI int e_fm2_op_registry_count(void); +EAPI void e_fm2_op_registry_entry_abort(E_Fm2_Op_Registry_Entry *entry); EAPI unsigned int e_fm2_op_registry_init(void); EAPI unsigned int e_fm2_op_registry_shutdown(void); /* E internal/private functions, symbols not exported outside e binary (e_fm.c mainly) */ -Eina_Bool e_fm2_op_registry_entry_add(int id, Evas_Object *e_fm, E_Fm_Op_Type op); +Eina_Bool e_fm2_op_registry_entry_add(int id, Evas_Object *e_fm, E_Fm_Op_Type op, E_Fm2_Op_Registry_Abort_Func abort); Eina_Bool e_fm2_op_registry_entry_del(int id); void e_fm2_op_registry_entry_changed(const E_Fm2_Op_Registry_Entry *entry); void e_fm2_op_registry_entry_e_fm_set(E_Fm2_Op_Registry_Entry *entry, Evas_Object *e_fm); diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index 9e079c44c..dca171f4a 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -5143,3 +5143,49 @@ _e_gadcon_provider_populate_unrequest(const E_Gadcon_Client_Class *cc) populate_idler = NULL; } } + +EAPI Eina_Bool +e_gadcon_site_is_shelf (E_Gadcon_Site site) +{ + return site == E_GADCON_SITE_SHELF; +} + +EAPI Eina_Bool +e_gadcon_site_is_desktop (E_Gadcon_Site site) +{ + return site == E_GADCON_SITE_DESKTOP; +} + +EAPI Eina_Bool +e_gadcon_site_is_efm_toolbar(E_Gadcon_Site site) +{ + return site == E_GADCON_SITE_EFM_TOOLBAR; +} + +EAPI Eina_Bool +e_gadcon_site_is_any_toolbar(E_Gadcon_Site site) +{ + switch (site) + { + // there should be all toolbar sities identifiers + case E_GADCON_SITE_TOOLBAR: + case E_GADCON_SITE_EFM_TOOLBAR: + return EINA_TRUE; + } + + return EINA_FALSE; +} + +EAPI Eina_Bool +e_gadcon_site_is_not_toolbar(E_Gadcon_Site site) +{ + switch (site) + { + // there should be all toolbar sities identifiers + case E_GADCON_SITE_TOOLBAR: + case E_GADCON_SITE_EFM_TOOLBAR: + return EINA_FALSE; + } + + return EINA_TRUE; +} diff --git a/src/bin/e_gadcon.h b/src/bin/e_gadcon.h index 2d8ffd9f7..0b97b3b54 100644 --- a/src/bin/e_gadcon.h +++ b/src/bin/e_gadcon.h @@ -31,6 +31,16 @@ typedef enum _E_Gadcon_Orient E_GADCON_ORIENT_CORNER_RB } E_Gadcon_Orient; +typedef enum _E_Gadcon_Site +{ + E_GADCON_SITE_UNKNOWN = 0, // when target site is unknown + /* generic sities */ + E_GADCON_SITE_SHELF, + E_GADCON_SITE_DESKTOP, + E_GADCON_SITE_TOOLBAR, // generic toolbar + E_GADCON_SITE_EFM_TOOLBAR // filemanager window toolbar +} E_Gadcon_Site; + #define E_GADCON_CLIENT_STYLE_PLAIN "plain" #define E_GADCON_CLIENT_STYLE_INSET "inset" @@ -134,6 +144,7 @@ struct _E_Gadcon_Client_Class /* Del an id when a gadcon client is removed from the system */ void (*id_del) (E_Gadcon_Client_Class *client_class, const char *id); /* All members below are part of version 3 */ + Eina_Bool (*is_site) (E_Gadcon_Site site); } func; char *default_style; }; @@ -257,5 +268,14 @@ EAPI void e_gadcon_client_util_menu_attach(E_Gadcon_Client *gcc); EAPI void e_gadcon_locked_set(E_Gadcon *gc, int lock); EAPI void e_gadcon_urgent_show(E_Gadcon *gc); +/* site helpers */ + +EAPI Eina_Bool e_gadcon_site_is_shelf (E_Gadcon_Site site); +EAPI Eina_Bool e_gadcon_site_is_desktop (E_Gadcon_Site site); +EAPI Eina_Bool e_gadcon_site_is_efm_toolbar(E_Gadcon_Site site); + +EAPI Eina_Bool e_gadcon_site_is_any_toolbar(E_Gadcon_Site site); // all toolbar sities +EAPI Eina_Bool e_gadcon_site_is_not_toolbar(E_Gadcon_Site site); // all non-toolbar sities + #endif #endif diff --git a/src/bin/e_int_gadcon_config.c b/src/bin/e_int_gadcon_config.c index 1fac27a46..f51ca113c 100644 --- a/src/bin/e_int_gadcon_config.c +++ b/src/bin/e_int_gadcon_config.c @@ -1,8 +1,10 @@ #include "e.h" /* local function protos */ -static void _e_int_gadcon_config(E_Gadcon *gc, const char *title); +static void _e_int_gadcon_config(E_Gadcon *gc, const char *title, void *(*data_func)(E_Config_Dialog*)); static void *_create_data(E_Config_Dialog *cfd); +static void *_create_data_shelf(E_Config_Dialog *cfd); +static void *_create_data_toolbar(E_Config_Dialog *cfd); static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); static int _cb_mod_update(void *data, int type, void *event); @@ -17,6 +19,8 @@ static int _gad_list_sort(void *data1, void *data2); struct _E_Config_Dialog_Data { + E_Gadcon_Site site; + Evas_Object *o_avail, *o_sel; Evas_Object *o_add, *o_del; Evas_Object *o_desc; @@ -29,18 +33,18 @@ struct _E_Config_Dialog_Data EAPI void e_int_gadcon_config_shelf(E_Gadcon *gc) { - _e_int_gadcon_config(gc, _("Shelf Contents")); + _e_int_gadcon_config(gc, _("Shelf Contents"), _create_data_shelf); } EAPI void e_int_gadcon_config_toolbar(E_Gadcon *gc) { - _e_int_gadcon_config(gc, _("Toolbar Contents")); + _e_int_gadcon_config(gc, _("Toolbar Contents"), _create_data_toolbar); } /* local functions */ static void -_e_int_gadcon_config(E_Gadcon *gc, const char *title) +_e_int_gadcon_config(E_Gadcon *gc, const char *title, void *(*data_func)(E_Config_Dialog*)) { E_Config_Dialog *cfd; E_Config_Dialog_View *v; @@ -51,7 +55,7 @@ _e_int_gadcon_config(E_Gadcon *gc, const char *title) con = e_container_current_get(e_manager_current_get()); - v->create_cfdata = _create_data; + v->create_cfdata = data_func ? data_func : _create_data; v->free_cfdata = _free_data; v->basic.create_widgets = _basic_create; @@ -67,6 +71,29 @@ _create_data(E_Config_Dialog *cfd) E_Config_Dialog_Data *cfdata; cfdata = E_NEW(E_Config_Dialog_Data, 1); + cfdata->site = E_GADCON_SITE_UNKNOWN; + cfdata->gc = cfd->data; + return cfdata; +} + +static void * +_create_data_shelf(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + cfdata->site = E_GADCON_SITE_SHELF; + cfdata->gc = cfd->data; + return cfdata; +} + +static void * +_create_data_toolbar(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + cfdata->site = E_GADCON_SITE_EFM_TOOLBAR; cfdata->gc = cfd->data; return cfdata; } @@ -207,6 +234,9 @@ _load_avail_gadgets(void *data) const char *lbl = NULL; if (!(cc = l->data)) continue; + // check the current site is allowed for this gadcon client + if (cc->func.is_site && !cc->func.is_site(cfdata->site)) + continue; if (cc->func.label) lbl = cc->func.label(cc); if (!lbl) lbl = cc->name; if (cc->func.icon) icon = cc->func.icon(cc, evas); diff --git a/src/modules/battery/e_mod_main.c b/src/modules/battery/e_mod_main.c index 566fd9a74..5625242c0 100644 --- a/src/modules/battery/e_mod_main.c +++ b/src/modules/battery/e_mod_main.c @@ -24,7 +24,7 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "battery", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, NULL }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/clock/e_mod_main.c b/src/modules/clock/e_mod_main.c index e5de0727d..dc8d04ed0 100644 --- a/src/modules/clock/e_mod_main.c +++ b/src/modules/clock/e_mod_main.c @@ -19,7 +19,7 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "clock", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, NULL }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/conf/e_mod_main.c b/src/modules/conf/e_mod_main.c index 7a0583928..f26f64dde 100644 --- a/src/modules/conf/e_mod_main.c +++ b/src/modules/conf/e_mod_main.c @@ -38,7 +38,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "configuration", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/connman/e_mod_main.c b/src/modules/connman/e_mod_main.c index d526f5858..7a591b356 100644 --- a/src/modules/connman/e_mod_main.c +++ b/src/modules/connman/e_mod_main.c @@ -36,7 +36,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "connman", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/cpufreq/e_mod_main.c b/src/modules/cpufreq/e_mod_main.c index f35943bb2..b7518f2e8 100644 --- a/src/modules/cpufreq/e_mod_main.c +++ b/src/modules/cpufreq/e_mod_main.c @@ -24,7 +24,7 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "cpufreq", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, NULL }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c index 07c9f2c4c..1a143b339 100644 --- a/src/modules/fileman/e_fwin.c +++ b/src/modules/fileman/e_fwin.c @@ -139,6 +139,7 @@ static int _e_fwin_dlg_cb_desk_list_sort(const void *data1, const void *data2); static void _e_fwin_op_registry_listener_cb(void *data, const E_Fm2_Op_Registry_Entry *ere); static int _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event); static void _e_fwin_op_registry_entry_iter(E_Fwin_Page *page); +static void _e_fwin_op_registry_abort_cb(void *data, Evas_Object *obj, const char *emission, const char *source); /* local subsystem globals */ static Eina_List *fwins = NULL; @@ -2174,43 +2175,75 @@ _e_fwin_op_registry_listener_cb(void *data, const E_Fm2_Op_Registry_Entry *ere) // Update element edje_object_part_drag_size_set(o, "e.gauge.bar", ((double)(ere->percent)) / 100, 1.0); - total = e_util_size_string_get(ere->total); + // Update icon switch (ere->op) { case E_FM_OP_COPY: edje_object_signal_emit(o, "e,action,icon,copy", "e"); - if (ere->finished) - snprintf(buf, sizeof(buf), "Copy of %s done", total); - else - snprintf(buf, sizeof(buf), "Copying %s (eta: %d sec)", total, ere->eta); break; case E_FM_OP_MOVE: edje_object_signal_emit(o, "e,action,icon,move", "e"); - if (ere->finished) - snprintf(buf, sizeof(buf), "Move of %s done", total); - else - snprintf(buf, sizeof(buf), "Moving %s (eta: %d sec)", total, ere->eta); break; case E_FM_OP_REMOVE: edje_object_signal_emit(o, "e,action,icon,delete", "e"); - if (ere->finished) - snprintf(buf, sizeof(buf), "Delete done"); - else - snprintf(buf, sizeof(buf), "Deleting files..."); break; default: edje_object_signal_emit(o, "e,action,icon,unknow", "e"); - snprintf(buf, sizeof(buf), "Unknow operation from slave %d", ere->id); - break; } - edje_object_part_text_set(o, "e.text.label1", buf); + + // Update information text + switch (ere->status) + { + case E_FM2_OP_STATUS_ABORTED: + switch (ere->op) + { + case E_FM_OP_COPY: + snprintf(buf, sizeof(buf), _("Copying is aborted")); + break; + case E_FM_OP_MOVE: + snprintf(buf, sizeof(buf), _("Moving is aborted")); + break; + case E_FM_OP_REMOVE: + snprintf(buf, sizeof(buf), _("Deleting is aborted")); + break; + default: + snprintf(buf, sizeof(buf), _("Unknown operation from slave is aborted")); + } + break; + + default: + total = e_util_size_string_get(ere->total); + switch (ere->op) + { + case E_FM_OP_COPY: + if (ere->finished) + snprintf(buf, sizeof(buf), _("Copy of %s done"), total); + else + snprintf(buf, sizeof(buf), _("Copying %s (eta: %d sec)"), total, ere->eta); + break; + case E_FM_OP_MOVE: + if (ere->finished) + snprintf(buf, sizeof(buf), _("Move of %s done"), total); + else + snprintf(buf, sizeof(buf), _("Moving %s (eta: %d sec)"), total, ere->eta); + break; + case E_FM_OP_REMOVE: + if (ere->finished) + snprintf(buf, sizeof(buf), _("Delete done")); + else + snprintf(buf, sizeof(buf), _("Deleting files...")); + break; + default: + snprintf(buf, sizeof(buf), _("Unknow operation from slave %d"), ere->id); + } + E_FREE(total); + } + edje_object_part_text_set(o, "e.text.info", buf); if (ere->needs_attention) edje_object_signal_emit(o, "e,action,set,need_attention", "e"); else edje_object_signal_emit(o, "e,action,set,normal", "e"); - - E_FREE(total); } static int @@ -2255,6 +2288,10 @@ _e_fwin_op_registry_entry_add_cb(void *data, int type, void *event) evas_object_size_hint_align_set(o, 1.0, 1.0); //FIXME this should be theme-configurable evas_object_show(o); + // add abort button callback with id of operation in registry + edje_object_signal_callback_add(o, "e,fm,operation,abort", "", + _e_fwin_op_registry_abort_cb, (void*)ere->id); + //Listen to progress changes e_fm2_op_registry_entry_listener_add(ere, _e_fwin_op_registry_listener_cb, o, _e_fwin_op_registry_free_data); @@ -2273,3 +2310,14 @@ _e_fwin_op_registry_entry_iter(E_Fwin_Page *page) _e_fwin_op_registry_entry_add_cb(page, 0, ere); eina_iterator_free(itr); } + +static void +_e_fwin_op_registry_abort_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + int id; + + id = (int)data; + if (!id) return; + + e_fm2_operation_abort(id); +} diff --git a/src/modules/fileman_opinfo/e-module-fileman_opinfo.edj b/src/modules/fileman_opinfo/e-module-fileman_opinfo.edj index e7f2d592d1be1f6720d6868c0b300150f05f3b0b..cdaf15280d74ce551daed9676fc6d0d6761148b7 100644 GIT binary patch literal 41962 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 literal 18521 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 H@lX99R`p<- diff --git a/src/modules/fileman_opinfo/e_mod_main.c b/src/modules/fileman_opinfo/e_mod_main.c index a1caef40e..bf76b2f7b 100644 --- a/src/modules/fileman_opinfo/e_mod_main.c +++ b/src/modules/fileman_opinfo/e_mod_main.c @@ -4,90 +4,327 @@ #include "e.h" #include "e_mod_main.h" -typedef struct _Instance Instance; - -struct _Instance +typedef struct _Instance { + char *theme_file; E_Gadcon_Client *gcc; - Evas_Object *o_btn; - Ecore_Event_Handler *fm_op_entry_add_handler; - Ecore_Event_Handler *fm_op_entry_del_handler; -}; + + Evas_Object *o_box, + *o_status; + + Ecore_Event_Handler *fm_op_entry_add_handler, + *fm_op_entry_del_handler; +} Instance; /* gadcon requirements */ -static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style); -static void _gc_shutdown(E_Gadcon_Client *gcc); -static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient); -static char *_gc_label(E_Gadcon_Client_Class *client_class); -static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas); -static const char *_gc_id_new(E_Gadcon_Client_Class *client_class); + +static E_Gadcon_Client *_gc_init (E_Gadcon *gc, const char *name, const char *id, const char *style); +static void _gc_shutdown(E_Gadcon_Client *gcc); +static void _gc_orient (E_Gadcon_Client *gcc, E_Gadcon_Orient orient); +static char *_gc_label (E_Gadcon_Client_Class *client_class); +static Evas_Object *_gc_icon (E_Gadcon_Client_Class *client_class, Evas *evas); +static const char *_gc_id_new (E_Gadcon_Client_Class *client_class); + static const E_Gadcon_Client_Class _gadcon_class = { - GADCON_CLIENT_CLASS_VERSION, "efm_info", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL - }, E_GADCON_CLIENT_STYLE_PLAIN + GADCON_CLIENT_CLASS_VERSION, "efm_info", + { + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_desktop + }, + E_GADCON_CLIENT_STYLE_PLAIN }; /******************** PROTOS *******************************************/ -void _opinfo_button_cb(void *data, void *data2); -static void _opinfo_update_gadget(Instance *inst); + +static int _opinfo_op_registry_entry_add_cb (void *data, int type, void *event); +static int _opinfo_op_registry_entry_del_cb (void *data, int type, void *event); +static void _opinfo_op_registry_update_all (Instance *inst); +static void _opinfo_op_registry_listener (void *data, const E_Fm2_Op_Registry_Entry *ere); +static void _opinfo_op_registry_free_data (void *data); +static int _opinfo_op_registry_free_data_delayed(void *data); +static void _opinfo_op_registry_abort_cb (void *data, Evas_Object *obj, const char *emission, const char *source); +static void _opinfo_op_registry_summary_cb (void *data, Evas_Object *obj, const char *emission, const char *source); +static void _opinfo_op_registry_detailed_cb (void *data, Evas_Object *obj, const char *emission, const char *source); +static void _opinfo_op_registry_update_status (Instance *inst); /******************** GLOBALS ******************************************/ + static E_Module *opinfo_module = NULL; /******************** OP_REGISTRY *************************************/ -static int -_opinfo_op_registry_entry_cb(void *data, int type, void *event) + +static void +_opinfo_op_registry_listener(void *data, const E_Fm2_Op_Registry_Entry *ere) { - _opinfo_update_gadget(data); + Evas_Object *o = data; + char *total, buf[PATH_MAX]; + + if (!o || !ere) return; + + // Update icon + switch (ere->op) + { + case E_FM_OP_COPY: + edje_object_signal_emit(o, "e,action,icon,copy", "e"); + break; + case E_FM_OP_MOVE: + edje_object_signal_emit(o, "e,action,icon,move", "e"); + break; + case E_FM_OP_REMOVE: + edje_object_signal_emit(o, "e,action,icon,delete", "e"); + break; + default: + edje_object_signal_emit(o, "e,action,icon,unknow", "e"); + } + + // Update information text + switch (ere->status) + { + case E_FM2_OP_STATUS_ABORTED: + switch (ere->op) + { + case E_FM_OP_COPY: + snprintf(buf, sizeof(buf), _("Copying is aborted")); + break; + case E_FM_OP_MOVE: + snprintf(buf, sizeof(buf), _("Moving is aborted")); + break; + case E_FM_OP_REMOVE: + snprintf(buf, sizeof(buf), _("Deleting is aborted")); + break; + default: + snprintf(buf, sizeof(buf), _("Unknown operation from slave is aborted")); + } + break; + + default: + total = e_util_size_string_get(ere->total); + switch (ere->op) + { + case E_FM_OP_COPY: + if (ere->finished) + snprintf(buf, sizeof(buf), _("Copy of %s done"), total); + else + snprintf(buf, sizeof(buf), _("Copying %s (eta: %d sec)"), total, ere->eta); + break; + case E_FM_OP_MOVE: + if (ere->finished) + snprintf(buf, sizeof(buf), _("Move of %s done"), total); + else + snprintf(buf, sizeof(buf), _("Moving %s (eta: %d sec)"), total, ere->eta); + break; + case E_FM_OP_REMOVE: + if (ere->finished) + snprintf(buf, sizeof(buf), _("Delete done")); + else + snprintf(buf, sizeof(buf), _("Deleting files...")); + break; + default: + snprintf(buf, sizeof(buf), _("Unknow operation from slave %d"), ere->id); + } + E_FREE(total); + } + edje_object_part_text_set(o, "e.text.info", buf); + + // Update detailed information + if (!ere->src) + edje_object_part_text_set(o, "e.text.src", _("(no information)")); + else + { + if (ere->op == E_FM_OP_REMOVE) + snprintf(buf, sizeof(buf), _("File: %s"), ere->src); + else + snprintf(buf, sizeof(buf), _("From: %s"), ere->src); + edje_object_part_text_set(o, "e.text.src", buf); + } + if (!ere->dst || ere->op == E_FM_OP_REMOVE) + edje_object_part_text_set(o, "e.text.dest", _("(no information)")); + else + { + snprintf(buf, sizeof(buf), _("To: %s"), ere->dst); + edje_object_part_text_set(o, "e.text.dest", buf); + } + + // Update gauge + edje_object_part_drag_size_set(o, "e.gauge.bar", ere->percent / 100.0, 1.0); + snprintf(buf, sizeof(buf), "%3i%%", ere->percent); + edje_object_part_text_set(o, "e.text.percent", buf); + + // Update attention + if (ere->needs_attention) + edje_object_signal_emit(o, "e,action,set,need_attention", "e"); + else + edje_object_signal_emit(o, "e,action,set,normal", "e"); +} + +static void +_opinfo_op_registry_free_data(void *data) +{ + ecore_timer_add(5.0, _opinfo_op_registry_free_data_delayed, data); +} + +static int +_opinfo_op_registry_free_data_delayed(void *data) +{ + Evas_Object *o = data; + + if (o) + { + e_box_unpack(o); + evas_object_del(o); + } + + return ECORE_CALLBACK_CANCEL; +} + +static void +_opinfo_op_registry_abort_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + int id; + + id = (int)data; + if (!id) return; + + e_fm2_operation_abort(id); +} + +static void +_opinfo_op_registry_summary_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + int mw, mh; + + edje_object_signal_emit(obj, "state,set,summary", "fileman_opinfo"); + + edje_object_size_min_get(obj, &mw, &mh); + e_box_pack_options_set(obj, 1, 0, 1, 0, 0.0, 0.0, mw, mh, 9999, mh); +} + +static void +_opinfo_op_registry_detailed_cb(void *data, Evas_Object *obj, const char *emission, const char *source) +{ + int mw, xh; + + edje_object_signal_emit(obj, "state,set,detailed", "fileman_opinfo"); + + edje_object_size_min_calc(obj, &mw, NULL); + edje_object_size_max_get(obj, NULL, &xh); + e_box_pack_options_set(obj, 1, 0, 1, 0, 0.0, 0.0, mw, xh, 9999, xh); +} + +static int +_opinfo_op_registry_entry_add_cb(void *data, int type, void *event) +{ + E_Fm2_Op_Registry_Entry *ere = event; + Instance *inst = data; + Evas_Object *o; + int mw, mh, xh; + + if (!inst || !ere) + return ECORE_CALLBACK_RENEW; + + _opinfo_op_registry_update_status(inst); + + if (!(ere->op == E_FM_OP_COPY || ere->op == E_FM_OP_MOVE || ere->op == E_FM_OP_REMOVE)) + return ECORE_CALLBACK_RENEW; + + o = edje_object_add(evas_object_evas_get(inst->o_box)); + if (!e_theme_edje_object_set(o, "base/theme/modules/fileman_opinfo", + "modules/fileman_opinfo/main")) + edje_object_file_set(o, inst->theme_file, "modules/fileman_opinfo/main"); + _opinfo_op_registry_listener(o, ere); + e_box_pack_before(inst->o_box, o, inst->o_status); + evas_object_show(o); + _opinfo_op_registry_summary_cb(inst, o, NULL, NULL); + + edje_object_signal_callback_add(o, "e,fm,operation,abort", "", + _opinfo_op_registry_abort_cb, (void*)ere->id); + edje_object_signal_callback_add(o, "state,request,summary", "fileman_opinfo", + _opinfo_op_registry_summary_cb, inst); + edje_object_signal_callback_add(o, "state,request,detailed", "fileman_opinfo", + _opinfo_op_registry_detailed_cb, inst); + + e_fm2_op_registry_entry_listener_add(ere, _opinfo_op_registry_listener, + o, _opinfo_op_registry_free_data); + + return ECORE_CALLBACK_RENEW; +} + +static int +_opinfo_op_registry_entry_del_cb(void *data, int type, void *event) +{ + Instance *inst = data; + + if (!inst) + return ECORE_CALLBACK_RENEW; + + _opinfo_op_registry_update_status(inst); + return ECORE_CALLBACK_RENEW; } static void -_opinfo_update_gadget(Instance *inst) +_opinfo_op_registry_update_all(Instance *inst) { - char buf[1024]; - int count; - - count = e_fm2_op_registry_count(); - if (count) - snprintf(buf, sizeof(buf), _("%d operations"), count); - else - snprintf(buf, sizeof(buf), _("idle")); - e_widget_button_label_set(inst->o_btn, buf); - e_widget_disabled_set(inst->o_btn, count ? 0 : 1); -} - -void -_opinfo_button_cb(void *data, void *data2) -{ - Ecore_X_Window win; Eina_Iterator *itr; E_Fm2_Op_Registry_Entry *ere; itr = e_fm2_op_registry_iterator_new(); EINA_ITERATOR_FOREACH(itr, ere) - { - win = e_fm2_op_registry_entry_xwin_get(ere); - e_util_dialog_show("TODO","What to show here ?"); - //ecore_x_window_show(win); - } + _opinfo_op_registry_entry_add_cb(inst, 0, ere); eina_iterator_free(itr); + + _opinfo_op_registry_update_status(inst); } + +static void +_opinfo_op_registry_update_status(Instance *inst) +{ + int cnt; + char buf[256]; + + cnt = e_fm2_op_registry_count(); + if (cnt) + { + snprintf(buf, sizeof(buf), _("Processing %d operation(s)"), cnt); + edje_object_part_text_set(inst->o_status, "e.text.info", buf); + } + else + edje_object_part_text_set(inst->o_status, "e.text.info", _("Filemanager is idle")); +} + /******************** GADCON *******************************************/ + static E_Gadcon_Client * _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) { - Evas_Object *o; E_Gadcon_Client *gcc; Instance *inst; + int mw, mh; inst = E_NEW(Instance, 1); - o = e_widget_button_add(gc->evas, "", NULL, _opinfo_button_cb, NULL, NULL); - inst->o_btn = o; - _opinfo_update_gadget(inst); + asprintf(&inst->theme_file, "%s/e-module-fileman_opinfo.edj", + e_module_dir_get(opinfo_module)); - gcc = e_gadcon_client_new(gc, name, id, style, o); + // main object + inst->o_box = e_box_add(gc->evas); + e_box_homogenous_set(inst->o_box, 0); + e_box_orientation_set(inst->o_box, 0); + e_box_align_set(inst->o_box, 0, 0); + + // status line + inst->o_status = edje_object_add(evas_object_evas_get(inst->o_box)); + if (!e_theme_edje_object_set(inst->o_status, "base/theme/modules/fileman_opinfo", + "modules/fileman_opinfo/status")) + edje_object_file_set(inst->o_status, inst->theme_file, "modules/fileman_opinfo/status"); + e_box_pack_end(inst->o_box, inst->o_status); + evas_object_show(inst->o_status); + edje_object_size_min_get(inst->o_status, &mw, &mh); + e_box_pack_options_set(inst->o_status, 1, 0, 1, 0, 0.0, 0.0, mw, mh, 9999, mh); + + _opinfo_op_registry_update_all(inst); + + gcc = e_gadcon_client_new(gc, name, id, style, inst->o_box); gcc->data = inst; inst->gcc = gcc; @@ -95,10 +332,10 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) inst->fm_op_entry_add_handler = ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_ADD, - _opinfo_op_registry_entry_cb, inst); + _opinfo_op_registry_entry_add_cb, inst); inst->fm_op_entry_del_handler = ecore_event_handler_add(E_EVENT_FM_OP_REGISTRY_DEL, - _opinfo_op_registry_entry_cb, inst); + _opinfo_op_registry_entry_del_cb, inst); return gcc; } @@ -106,29 +343,26 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) static void _gc_shutdown(E_Gadcon_Client *gcc) { - Instance *inst; + Instance *inst = gcc->data; - inst = gcc->data; - - if (inst->fm_op_entry_add_handler) + if (inst->fm_op_entry_add_handler) ecore_event_handler_del(inst->fm_op_entry_add_handler); - if (inst->fm_op_entry_del_handler) + if (inst->fm_op_entry_del_handler) ecore_event_handler_del(inst->fm_op_entry_del_handler); - - evas_object_del(inst->o_btn); - free(inst); + e_box_unpack(inst->o_status); + evas_object_del(inst->o_status); + evas_object_del(inst->o_box); + free(inst->theme_file); + E_FREE(inst); } static void _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient) { - Instance *inst; - Evas_Coord mw, mh; + Instance *inst = gcc->data; + Evas_Coord mw = 200, mh = 100; - inst = gcc->data; - - mw = 120, mh = 40; - evas_object_size_hint_min_set(inst->o_btn, mw, mh); + evas_object_size_hint_min_set(inst->o_box, mw, mh); e_gadcon_client_aspect_set(gcc, mw, mh); e_gadcon_client_min_size_set(gcc, mw, mh); } @@ -143,12 +377,13 @@ static Evas_Object * _gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas) { Evas_Object *o; - char buf[4096]; + char buf[PATH_MAX]; o = edje_object_add(evas); snprintf(buf, sizeof(buf), "%s/e-module-fileman_opinfo.edj", e_module_dir_get(opinfo_module)); edje_object_file_set(o, buf, "icon"); + return o; } @@ -159,10 +394,11 @@ _gc_id_new(E_Gadcon_Client_Class *client_class) } /******************** E MODULE ****************************************/ + EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, - "EFM Info" + "EFM Info" }; EAPI void * @@ -171,6 +407,7 @@ e_modapi_init(E_Module *m) opinfo_module = m; e_gadcon_provider_register(&_gadcon_class); + return m; } @@ -180,6 +417,7 @@ e_modapi_shutdown(E_Module *m) opinfo_module = NULL; e_gadcon_provider_unregister(&_gadcon_class); + return 1; } diff --git a/src/modules/gadman/e_mod_config.c b/src/modules/gadman/e_mod_config.c index 452d151e6..c8ddb16bc 100644 --- a/src/modules/gadman/e_mod_config.c +++ b/src/modules/gadman/e_mod_config.c @@ -297,6 +297,8 @@ _fill_gadgets_list(Evas_Object *ilist) const char *lbl = NULL; if (!(cc = l->data)) continue; + if (cc->func.is_site && !cc->func.is_site(E_GADCON_SITE_DESKTOP)) + continue; if (cc->func.label) lbl = cc->func.label(cc); if (!lbl) lbl = cc->name; if (cc->func.icon) icon = cc->func.icon(cc, evas); diff --git a/src/modules/ibar/e_mod_main.c b/src/modules/ibar/e_mod_main.c index 694d53ded..4404e0100 100644 --- a/src/modules/ibar/e_mod_main.c +++ b/src/modules/ibar/e_mod_main.c @@ -27,7 +27,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "ibar", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, _gc_id_del + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, _gc_id_del, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_INSET }; diff --git a/src/modules/ibox/e_mod_main.c b/src/modules/ibox/e_mod_main.c index 328a4f859..7c276192d 100644 --- a/src/modules/ibox/e_mod_main.c +++ b/src/modules/ibox/e_mod_main.c @@ -20,7 +20,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "ibox", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, _gc_id_del + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, _gc_id_del, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_INSET }; diff --git a/src/modules/illume/e_mod_gad_bluetooth.c b/src/modules/illume/e_mod_gad_bluetooth.c index f8c8cf743..43fb3f90c 100644 --- a/src/modules/illume/e_mod_gad_bluetooth.c +++ b/src/modules/illume/e_mod_gad_bluetooth.c @@ -26,7 +26,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "illume-bluetooth", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/illume/e_mod_gad_gsm.c b/src/modules/illume/e_mod_gad_gsm.c index 867ab25f1..ba477ef16 100644 --- a/src/modules/illume/e_mod_gad_gsm.c +++ b/src/modules/illume/e_mod_gad_gsm.c @@ -51,7 +51,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "illume-gsm", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/illume/e_mod_gad_usb.c b/src/modules/illume/e_mod_gad_usb.c index 3e37572d5..3da3a3fbe 100644 --- a/src/modules/illume/e_mod_gad_usb.c +++ b/src/modules/illume/e_mod_gad_usb.c @@ -26,7 +26,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "illume-usb", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/illume/e_mod_gad_wifi.c b/src/modules/illume/e_mod_gad_wifi.c index 01da6025d..9009dd240 100644 --- a/src/modules/illume/e_mod_gad_wifi.c +++ b/src/modules/illume/e_mod_gad_wifi.c @@ -28,7 +28,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "illume-wifi", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/mixer/e_mod_main.c b/src/modules/mixer/e_mod_main.c index b30de2d46..3183eb220 100644 --- a/src/modules/mixer/e_mod_main.c +++ b/src/modules/mixer/e_mod_main.c @@ -985,7 +985,10 @@ _gc_id_new(E_Gadcon_Client_Class *client_class) static const E_Gadcon_Client_Class _gc_class = { GADCON_CLIENT_CLASS_VERSION, _name, - {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL}, + { + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar + }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 3f6d8efe4..7be716995 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -18,7 +18,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "pager", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_INSET }; diff --git a/src/modules/start/e_mod_main.c b/src/modules/start/e_mod_main.c index afd33ed66..5c4eb6d7c 100644 --- a/src/modules/start/e_mod_main.c +++ b/src/modules/start/e_mod_main.c @@ -19,7 +19,8 @@ static const E_Gadcon_Client_Class _gadcon_class = GADCON_CLIENT_CLASS_VERSION, "start", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN }; diff --git a/src/modules/systray/e_mod_main.c b/src/modules/systray/e_mod_main.c index 90f751af2..8e7543f12 100644 --- a/src/modules/systray/e_mod_main.c +++ b/src/modules/systray/e_mod_main.c @@ -1092,7 +1092,10 @@ _gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__) static const E_Gadcon_Client_Class _gc_class = { GADCON_CLIENT_CLASS_VERSION, _name, - {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL}, + { + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar + }, E_GADCON_CLIENT_STYLE_INSET }; diff --git a/src/modules/temperature/e_mod_main.c b/src/modules/temperature/e_mod_main.c index e729b8890..0c157bfd7 100644 --- a/src/modules/temperature/e_mod_main.c +++ b/src/modules/temperature/e_mod_main.c @@ -24,7 +24,8 @@ static const E_Gadcon_Client_Class _gadcon_class = { GADCON_CLIENT_CLASS_VERSION, "temperature", { - _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, + e_gadcon_site_is_not_toolbar }, E_GADCON_CLIENT_STYLE_PLAIN };