From 4720821cdaaea68213a24e01796e6fc872e652c6 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 24 Oct 2006 11:23:02 +0000 Subject: [PATCH] now e will ask u for what app u want to launch the file in - and will launch it for u. SVN revision: 26764 --- src/bin/e_apps.c | 5 +- src/bin/e_fm.c | 2 +- src/bin/e_fwin.c | 201 ++++++++++++++++++++++++++++++----------------- 3 files changed, 133 insertions(+), 75 deletions(-) diff --git a/src/bin/e_apps.c b/src/bin/e_apps.c index 41d8a08b1..d80cdc24b 100644 --- a/src/bin/e_apps.c +++ b/src/bin/e_apps.c @@ -1471,6 +1471,7 @@ e_app_file_find(const char *file) if (!file) return NULL; + printf("e_app_file_find(%s\n", file); for (l = _e_apps_all->subapps; l; l = l->next) { E_App *a; @@ -1478,11 +1479,13 @@ e_app_file_find(const char *file) a = l->data; E_OBJECT_CHECK_RETURN(a, NULL); E_OBJECT_TYPE_CHECK_RETURN(a, E_APP_TYPE, NULL); + printf("%s\n", a); if (a->path) { char *p; - p = strchr(a->path, '/'); + p = strrchr(a->path, '/'); + printf("FIND: %s == %s\n", p, file); if (p) { p++; diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index fbcf4816e..5c40d0edb 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -540,7 +540,7 @@ e_fm2_select_set(Evas_Object *obj, const char *file, int select) for (l = sd->icons; l; l = l->next) { ic = l->data; - if (!strcmp(ic->info.file, file)) + if ((file) && (!strcmp(ic->info.file, file))) { if (select) _e_fm2_icon_select(ic); else _e_fm2_icon_deselect(ic); diff --git a/src/bin/e_fwin.c b/src/bin/e_fwin.c index 990b1dcfa..995fb7ea8 100644 --- a/src/bin/e_fwin.c +++ b/src/bin/e_fwin.c @@ -17,7 +17,6 @@ static void _e_fwin_changed(void *data, Evas_Object *obj, void *event_info); static void _e_fwin_selected(void *data, Evas_Object *obj, void *event_info); static void _e_fwin_menu_extend(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info); static void _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi); -static void _e_fwin_file_open(E_Fwin *fwin, const char *file, const char *mime); 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); @@ -230,57 +229,16 @@ _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi) e_fm2_parent_go(data); } -static void -_e_fwin_file_open(E_Fwin *fwin, const char *file, const char *mime) -{ - Evas_List *apps, *l; - E_App *a; - char pcwd[4096]; - - /* 1. find previously used launcher */ - /* if found - is there still an app for it? */ - /* a = e_app_file_find(prev_launcher); */ - /* if (a) - run it */ - /* return; */ - /* 2. list possible apps */ - /* if list == 1 element - run it */ - /* return; */ - /* 3. create dialog */ - /* if (list) add apps in list */ - /* dialog should have optin to show all apps */ - getcwd(pcwd, sizeof(pcwd)); - chdir(e_fm2_real_path_get(fwin->fm_obj)); - /* 1. */ - /* FIXME: implement the above # 1. */ - /* 2. */ - apps = e_app_mime_list(e_fm_mime_filename_get(file)); - if (apps) - { - if (evas_list_count(apps) == 1) - { - a = apps->data; - _e_fwin_file_open_app(fwin, a, ecore_file_get_file(file)); - } - else - { - /* FIXME: hack. do dialog as above in # 3. */ - a = apps->data; - _e_fwin_file_open_app(fwin, a, ecore_file_get_file(file)); - /* FIXME: register app a as handling mime type if app doesnt */ - /* say it can already in a separate info blob so in future */ - /* e will list it as an option */ - } - evas_list_free(apps); - } - chdir(pcwd); -} static void _e_fwin_file_open_app(E_Fwin *fwin, E_App *a, const char *file) { char buf[4096], *p, *e, *s; + const char *f; if (!a->exe) return; + f = e_util_filename_escape(file); + if (!f) return; if (a->exe_params) { /* cmd is "a->exe a->exe_params" where a->exe_params will */ @@ -313,10 +271,10 @@ _e_fwin_file_open_app(E_Fwin *fwin, E_App *a, const char *file) (*s == 'f') || (*s == 'F') || (*s == 'm') || (*s == 'M')) { - if ((e - p) > (strlen(file) + 1)) + if ((e - p) > (strlen(f) + 1)) { - strcpy(p, file); - p += strlen(file); + strcpy(p, f); + p += strlen(f); } } } @@ -328,11 +286,17 @@ _e_fwin_file_open_app(E_Fwin *fwin, E_App *a, const char *file) else { /* cmd is "a->exe filename" */ - snprintf(buf, sizeof(buf), "%s %s", a->exe, file); + snprintf(buf, sizeof(buf), "%s %s", a->exe, f); } e_zone_exec(fwin->win->border->zone, buf); } + + + + + + typedef struct _E_Fwin_Apps_Dialog E_Fwin_Apps_Dialog; struct _E_Fwin_Apps_Dialog @@ -346,6 +310,105 @@ struct _E_Fwin_Apps_Dialog static void _e_fwin_cb_ilist_change(void *data, Evas_Object *obj) { + E_Fwin_Apps_Dialog *fad; + + fad = data; + E_FREE(fad->app2); + e_fm2_select_set(fad->o_fm, NULL, 0); +} + +static void +_e_fwin_cb_fm_selection_change(void *data, Evas_Object *obj, void *event_info) +{ + E_Fwin_Apps_Dialog *fad; + Evas_List *sel; + E_Fm2_Icon_Info *ici; + + fad = data; + E_FREE(fad->app1); + e_widget_ilist_unselect(fad->o_ilist); + E_FREE(fad->app2); + sel = e_fm2_selected_list_get(obj); + if (sel) + { + ici = sel->data; + fad->app2 = strdup(ici->file); + evas_list_free(sel); + } +} + +static void +_e_fwin_cb_open(void *data, E_Dialog *dia) +{ + E_Fwin_Apps_Dialog *fad; + E_App *a = NULL; + char pcwd[4096], buf[4096]; + Evas_List *selected, *l; + E_Fm2_Icon_Info *ici; + + fad = data; + if (fad->app1) a = e_app_file_find(fad->app1); + else if (fad->app2) a = e_app_file_find(fad->app2); + if (a) + { + getcwd(pcwd, sizeof(pcwd)); + chdir(e_fm2_real_path_get(fad->fwin->fm_obj)); + + selected = e_fm2_selected_list_get(fad->fwin->fm_obj); + if (selected) + { + for (l = selected; l; l = l->next) + { + ici = l->data; + buf[0] = 0; + if (!((ici->link) && (ici->mount))) + { + if (ici->link) + { + if (!S_ISDIR(ici->statinfo.st_mode)) + snprintf(buf, sizeof(buf), "%s", ici->file); + } + else + { + if (!S_ISDIR(ici->statinfo.st_mode)) + snprintf(buf, sizeof(buf), "%s", ici->file); + } + } + if (buf[0] != 0) + { + /* FIXME: the question is - execute N times - or place N files on the cmd-line in place of %u/f/ etc */ + /* for now - execute N times as it's simple */ + printf("a->exe = %s, ici->file = %s\n", a->exe, ici->file); + _e_fwin_file_open_app(fad->fwin, a, ici->file); + } + } + evas_list_free(selected); + } + chdir(pcwd); + } + e_object_del(fad->dia); +} + +static void +_e_fwin_cb_close(void *data, E_Dialog *dia) +{ + E_Fwin_Apps_Dialog *fad; + + fad = data; + e_object_del(fad->dia); +} + +static void +_e_fwin_cb_dialog_free(void *obj) +{ + E_Dialog *dia; + E_Fwin_Apps_Dialog *fad; + + dia = (E_Dialog *)obj; + fad = dia->data; + E_FREE(fad->app1); + E_FREE(fad->app2); + free(fad); } static Evas_Bool @@ -387,7 +450,6 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) e_fwin_new(fwin->win->container, NULL, ici->link); else need_dia = 1; -// _e_fwin_file_open(fwin, ici->link, e_fm_mime_filename_get(ici->link)); } else { @@ -397,14 +459,9 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) e_fwin_new(fwin->win->container, NULL, buf); else need_dia = 1; -// _e_fwin_file_open(fwin, buf, ici->mime); } } if (!need_dia) return; - /* FIXME: display dialog. left side is all apps that say they handle - * the mime type(s) of the file(s) in the list. and the right side - * should have an fm2 view of ALL apps - */ /* 1. build hash of mimetypes */ for (l = files; l; l = l->next) @@ -447,29 +504,30 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) } fad = E_NEW(E_Fwin_Apps_Dialog, 1); - /* FIXME: add delete callback to dia obj to cleanup */ dia = e_dialog_new(fwin->win->border->zone->container, "E", "_fwin_open_apps"); e_dialog_title_set(dia, _("Open with...")); e_dialog_border_icon_set(dia, "enlightenment/applications"); - /* FIXME: add real callbacks */ - e_dialog_button_add(dia, _("Open"), "enlightenment/open", NULL, NULL); - e_dialog_button_add(dia, _("Close"), "enlightenment/close", NULL, NULL); + e_dialog_button_add(dia, _("Open"), "enlightenment/open", + _e_fwin_cb_open, fad); + e_dialog_button_add(dia, _("Close"), "enlightenment/close", + _e_fwin_cb_close, fad); - fad->dia = fad; + fad->dia = dia; fad->fwin = fwin; dia->data = fad; + e_object_free_attach_func_set(E_OBJECT(dia), _e_fwin_cb_dialog_free); evas = e_win_evas_get(dia->win); o = e_widget_list_add(evas, 1, 1); ocon = o; - - of = e_widget_framelist_add(evas, _("Specific Applications"), 0); - o = e_widget_ilist_add(evas, 24, 24, NULL); - fad->o_ilist = o; + if (apps) { + of = e_widget_framelist_add(evas, _("Specific Applications"), 0); + o = e_widget_ilist_add(evas, 24, 24, &(fad->app1)); + fad->o_ilist = o; for (l = apps; l; l = l->next) { a = l->data; @@ -479,11 +537,11 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) ecore_file_get_file(a->path)); } evas_list_free(apps); + e_widget_ilist_go(o); + 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); } - e_widget_ilist_go(o); - 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); of = e_widget_framelist_add(evas, _("All Applications"), 0); mt = e_fm2_add(evas); @@ -507,11 +565,8 @@ _e_fwin_file_open_dialog(E_Fwin *fwin, Evas_List *files) fmc.selection.single = 1; fmc.selection.windows_modifiers = 0; e_fm2_config_set(mt, &fmc); - /* FIXME: add real callbacks */ -// evas_object_smart_callback_add(mt, "selection_change", -// _cb_files_selection_change, fad); -// evas_object_smart_callback_add(mt, "changed", -// _cb_files_changed, fad); + evas_object_smart_callback_add(mt, "selection_change", + _e_fwin_cb_fm_selection_change, 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,