diff --git a/src/bin/e_fwin.c b/src/bin/e_fwin.c index 9b06a1f8f..208cfc683 100644 --- a/src/bin/e_fwin.c +++ b/src/bin/e_fwin.c @@ -19,7 +19,14 @@ static void _e_fwin_menu_extend(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_I static void _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_fwin_file_open_app(E_Fwin *fwin, E_App *a, const char *file); -static void _e_fwin_cb_ilist_change(void *data, Evas_Object *obj); +static void _e_fwin_cb_ilist_change(void *data); +static void _e_fwin_cb_ilist_selected(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_cb_fm_selection_change(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_cb_fm_selected(void *data, Evas_Object *obj, void *event_info); +static void _e_fwin_cb_open(void *data, E_Dialog *dia); +static void _e_fwin_cb_close(void *data, E_Dialog *dia); +static void _e_fwin_cb_dialog_free(void *obj); +static Evas_Bool _e_fwin_cb_hash_foreach(Evas_Hash *hash, const char *key, void *data, void *fdata); static void _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files); /* local subsystem globals */ @@ -145,6 +152,11 @@ e_fwin_new(E_Container *con, const char *dev, const char *path) static void _e_fwin_free(E_Fwin *fwin) { + if (fwin->fad) + { + e_object_del(E_OBJECT(fwin->fad->dia)); + fwin->fad = NULL; + } e_object_del(E_OBJECT(fwin->win)); fwins = evas_list_remove(fwins, fwin); free(fwin); @@ -229,7 +241,8 @@ _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi) e_fm2_parent_go(data); } - +/* KILL: this func will die as soon as ecore_desktops's cmd thing works + * perfectly */ static void _e_fwin_file_open_app(E_Fwin *fwin, E_App *a, const char *file) { @@ -291,24 +304,8 @@ _e_fwin_file_open_app(E_Fwin *fwin, E_App *a, const char *file) e_zone_exec(fwin->win->border->zone, buf); } - - - - - - -typedef struct _E_Fwin_Apps_Dialog E_Fwin_Apps_Dialog; - -struct _E_Fwin_Apps_Dialog -{ - E_Dialog *dia; - E_Fwin *fwin; - char *app1, *app2; - Evas_Object *o_ilist, *o_fm; -}; - static void -_e_fwin_cb_ilist_change(void *data, Evas_Object *obj) +_e_fwin_cb_ilist_change(void *data) { E_Fwin_Apps_Dialog *fad; @@ -317,6 +314,15 @@ _e_fwin_cb_ilist_change(void *data, Evas_Object *obj) if (fad->o_fm) e_fm2_select_set(fad->o_fm, NULL, 0); } +static void +_e_fwin_cb_ilist_selected(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin_Apps_Dialog *fad; + + fad = data; + _e_fwin_cb_open(fad, fad->dia); +} + static void _e_fwin_cb_fm_selection_change(void *data, Evas_Object *obj, void *event_info) { @@ -337,6 +343,15 @@ _e_fwin_cb_fm_selection_change(void *data, Evas_Object *obj, void *event_info) } } +static void +_e_fwin_cb_fm_selected(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin_Apps_Dialog *fad; + + fad = data; + _e_fwin_cb_open(fad, fad->dia); +} + static void _e_fwin_cb_open(void *data, E_Dialog *dia) { @@ -366,6 +381,10 @@ _e_fwin_cb_open(void *data, E_Dialog *dia) for (l = selected; l; l = l->next) { ici = l->data; + /* this snprintf is silly - but it's here in case i really do + * need to provide full paths (seems silly since we chdir + * into the dir) + */ buf[0] = 0; if (!((ici->link) && (ici->mount))) { @@ -401,7 +420,7 @@ _e_fwin_cb_open(void *data, E_Dialog *dia) } chdir(pcwd); } - e_object_del(fad->dia); + e_object_del(E_OBJECT(fad->dia)); } static void @@ -410,7 +429,7 @@ _e_fwin_cb_close(void *data, E_Dialog *dia) E_Fwin_Apps_Dialog *fad; fad = data; - e_object_del(fad->dia); + e_object_del(E_OBJECT(fad->dia)); } static void @@ -423,6 +442,7 @@ _e_fwin_cb_dialog_free(void *obj) fad = dia->data; E_FREE(fad->app1); E_FREE(fad->app2); + fad->fwin->fad = NULL; free(fad); } @@ -453,7 +473,12 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) int need_dia = 0; Evas_Hash *mimes = NULL; Evas_List *mlist = NULL; - + + if (fwin->fad) + { + e_object_del(E_OBJECT(fwin->fad->dia)); + fwin->fad = NULL; + } for (l = files; l; l = l->next) { ici = l->data; @@ -523,10 +548,6 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) * are multiple or no previously used app for this mime - then open * dialog */ - /* FIXME: double click on fm2 or ilist entry shoudl implicitly be - * open. need to add callback for fm2 and make ilist handle double - * click stuff - */ fad = E_NEW(E_Fwin_Apps_Dialog, 1); dia = e_dialog_new(fwin->win->border->zone->container, @@ -540,6 +561,7 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) fad->dia = dia; fad->fwin = fwin; + fwin->fad = fad; dia->data = fad; e_object_free_attach_func_set(E_OBJECT(dia), _e_fwin_cb_dialog_free); @@ -566,6 +588,8 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) e_widget_min_size_set(o, 160, 240); e_widget_framelist_object_append(of, o); e_widget_list_object_append(ocon, of, 1, 1, 0.5); + evas_object_smart_callback_add(o, "selected", + _e_fwin_cb_ilist_selected, fad); } of = e_widget_framelist_add(evas, _("All Applications"), 0); @@ -592,6 +616,8 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) e_fm2_config_set(mt, &fmc); evas_object_smart_callback_add(mt, "selection_change", _e_fwin_cb_fm_selection_change, fad); + evas_object_smart_callback_add(mt, "selected", + _e_fwin_cb_fm_selected, fad); snprintf(buf, sizeof(buf), "%s/.e/e/applications/all", e_user_homedir_get()); e_fm2_path_set(mt, buf, "/"); o = e_widget_scrollframe_pan_add(evas, mt, @@ -606,6 +632,5 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) e_widget_min_size_get(ocon, &mw, &mh); e_dialog_content_set(dia, ocon, mw, mh); - /* FIXME: store fad in fwin (on fwin delete close fad. on fad close, delete from fwin) */ e_dialog_show(dia); } diff --git a/src/bin/e_fwin.h b/src/bin/e_fwin.h index 604dfade4..c5a00ee02 100644 --- a/src/bin/e_fwin.h +++ b/src/bin/e_fwin.h @@ -4,6 +4,7 @@ #ifdef E_TYPEDEFS typedef struct _E_Fwin E_Fwin; +typedef struct _E_Fwin_Apps_Dialog E_Fwin_Apps_Dialog; #else #ifndef E_FWIN_H @@ -19,6 +20,15 @@ struct _E_Fwin Evas_Object *scrollframe_obj; Evas_Object *fm_obj; Evas_Object *bg_obj; + E_Fwin_Apps_Dialog *fad; +}; + +struct _E_Fwin_Apps_Dialog +{ + E_Dialog *dia; + E_Fwin *fwin; + char *app1, *app2; + Evas_Object *o_ilist, *o_fm; }; EAPI int e_fwin_init (void); diff --git a/src/bin/e_ilist.c b/src/bin/e_ilist.c index 1deabe5a6..a1752c9e1 100644 --- a/src/bin/e_ilist.c +++ b/src/bin/e_ilist.c @@ -440,6 +440,8 @@ _e_smart_event_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf break; } } + if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + evas_object_smart_callback_call(si->sd->smart_obj, "selected", NULL); } static void diff --git a/src/bin/e_widget_ilist.c b/src/bin/e_widget_ilist.c index 6e09f7adb..d76cfbbdc 100644 --- a/src/bin/e_widget_ilist.c +++ b/src/bin/e_widget_ilist.c @@ -23,6 +23,7 @@ static void _e_wid_focus_hook(Evas_Object *obj); static void _e_wid_cb_scrollframe_resize(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _e_wid_cb_item_sel(void *data, void *data2); static void _e_wid_cb_item_hilight(void *data, void *data2); +static void _e_wid_cb_selected(void *data, Evas_Object *obj, void *event_info); static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info); /* externally accessible functions */ @@ -55,6 +56,8 @@ e_widget_ilist_add(Evas *evas, int icon_w, int icon_h, char **value) e_scrollframe_child_set(wd->o_scrollframe, o); e_widget_sub_object_add(obj, o); evas_object_show(o); + evas_object_smart_callback_add(o, "selected", _e_wid_cb_selected, obj); + evas_object_resize(obj, 32, 32); e_widget_min_size_set(obj, 32, 32); @@ -352,6 +355,12 @@ _e_wid_cb_item_hilight(void *data, void *data2) e_scrollframe_child_region_show(wd->o_scrollframe, x, y, w, h); } +static void +_e_wid_cb_selected(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_smart_callback_call(data, "selected", event_info); +} + static void _e_wid_focus_steal(void *data, Evas *e, Evas_Object *obj, void *event_info) {