diff --git a/src/bin/e_exec.c b/src/bin/e_exec.c index ac6f991d0..7052df4fe 100644 --- a/src/bin/e_exec.c +++ b/src/bin/e_exec.c @@ -264,38 +264,9 @@ _e_exec_cb_exec(void *data, Efreet_Desktop *desktop, char *exec, int remaining) e_util_library_path_strip(); if ((desktop) && (desktop->terminal)) { - Efreet_Desktop *tdesktop, *td; - int i; - // XXX: FIXME: this should become config some day... - const char *terms[] = - { - "terminology.desktop", - "xterm.desktop", - "rxvt.desktop", - "gnome-terimnal.desktop", - "konsole.desktop", - NULL - }; + Efreet_Desktop *tdesktop; - for (i = 0; terms[i]; i++) - { - tdesktop = efreet_util_desktop_file_id_find(terms[i]); - if (tdesktop) break; - } - if (!tdesktop) - { - l = efreet_util_desktop_category_list("TerminalEmulator"); - if (l) - { - // just take first one since above list doesn't work. - tdesktop = l->data; - EINA_LIST_FREE(l, td) - { - // free/unref the desktosp we are not going to use - if (td != tdesktop) efreet_desktop_free(td); - } - } - } + tdesktop = e_util_terminal_desktop_get(); if (tdesktop) { if (tdesktop->exec) diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c index 650858483..bbcdbd115 100644 --- a/src/bin/e_utils.c +++ b/src/bin/e_utils.c @@ -1451,3 +1451,73 @@ e_util_size_debug_set(Evas_Object *obj, Eina_Bool enable) _e_util_size_debug, NULL); } } + +static Efreet_Desktop * +_e_util_default_terminal_get(const char *defaults_list) +{ + Efreet_Desktop *tdesktop = NULL; + Efreet_Ini *ini; + const char *s; + + ini = efreet_ini_new(defaults_list); + if ((ini) && (ini->data) && + (efreet_ini_section_set(ini, "Default Applications")) && + (ini->section)) + { + s = efreet_ini_string_get(ini, "x-scheme-handler/terminal"); + if (s) tdesktop = efreet_util_desktop_file_id_find(s); + } + if (ini) efreet_ini_free(ini); + return tdesktop; +} + +EAPI Efreet_Desktop * +e_util_terminal_desktop_get(void) +{ + const char *terms[] = + { + "terminology.desktop", + "xterm.desktop", + "rxvt.desktop", + "gnome-terimnal.desktop", + "konsole.desktop", + NULL + }; + const char *s; + char buf[PATH_MAX]; + Efreet_Desktop *tdesktop = NULL, *td; + Eina_List *l; + int i; + + snprintf(buf, sizeof(buf), "%s/applications/defaults.list", + efreet_data_home_get()); + tdesktop = _e_util_default_terminal_get(buf); + if (tdesktop) return tdesktop; + EINA_LIST_FOREACH(efreet_data_dirs_get(), l, s) + { + snprintf(buf, sizeof(buf), "%s/applications/defaults.list", s); + tdesktop = _e_util_default_terminal_get(buf); + if (tdesktop) return tdesktop; + } + + for (i = 0; terms[i]; i++) + { + tdesktop = efreet_util_desktop_file_id_find(terms[i]); + if (tdesktop) return tdesktop; + } + if (!tdesktop) + { + l = efreet_util_desktop_category_list("TerminalEmulator"); + if (l) + { + // just take first one since above list doesn't work. + tdesktop = l->data; + EINA_LIST_FREE(l, td) + { + // free/unref the desktosp we are not going to use + if (td != tdesktop) efreet_desktop_free(td); + } + } + } + return tdesktop; +} diff --git a/src/bin/e_utils.h b/src/bin/e_utils.h index 3d15e28f0..97e698e25 100644 --- a/src/bin/e_utils.h +++ b/src/bin/e_utils.h @@ -65,5 +65,7 @@ EAPI Eina_Bool e_util_fullscreen_curreny_any(void); EAPI Eina_Bool e_util_fullscreen_any(void); EAPI const char *e_util_time_str_get(long int seconds); EAPI void e_util_size_debug_set(Evas_Object *obj, Eina_Bool enable); +EAPI Efreet_Desktop *e_util_terminal_desktop_get(void); + #endif #endif diff --git a/src/modules/conf_applications/e_int_config_defapps.c b/src/modules/conf_applications/e_int_config_defapps.c index 297715846..3f664942f 100644 --- a/src/modules/conf_applications/e_int_config_defapps.c +++ b/src/modules/conf_applications/e_int_config_defapps.c @@ -35,6 +35,7 @@ struct _E_Config_Dialog_Data const char *mailto_desktop; const char *file_desktop; const char *trash_desktop; + const char *terminal_desktop; Ecore_Event_Handler *desk_change_handler; int gen; @@ -134,6 +135,8 @@ _create_data(E_Config_Dialog *cfd __UNUSED__) if (s) cfdata->file_desktop = eina_stringshare_add(s); s = efreet_ini_string_get(myini, "x-scheme-handler/trash"); if (s) cfdata->trash_desktop = eina_stringshare_add(s); + s = efreet_ini_string_get(myini, "x-scheme-handler/terminal"); + if (s) cfdata->terminal_desktop = eina_stringshare_add(s); } EINA_LIST_FOREACH(e_config->env_vars, l, evr) @@ -182,6 +185,7 @@ _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) if (cfdata->mailto_desktop) eina_stringshare_del(cfdata->mailto_desktop); if (cfdata->file_desktop) eina_stringshare_del(cfdata->file_desktop); if (cfdata->trash_desktop) eina_stringshare_del(cfdata->trash_desktop); + if (cfdata->terminal_desktop) eina_stringshare_del(cfdata->terminal_desktop); EINA_LIST_FREE(cfdata->mimes, m) { Config_Glob *g; @@ -254,6 +258,15 @@ _def_trash_cb(void *data) cfdata->gen = 0; } +static void +_def_terminal_cb(void *data) +{ + E_Config_Dialog_Data *cfdata = data; + cfdata->seldest = &(cfdata->terminal_desktop); + _fill_apps_list(cfdata, cfdata->obj.deflist, cfdata->seldest, 0); + cfdata->gen = 0; +} + static void _sel_mime_cb(void *data) { @@ -297,6 +310,7 @@ _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data e_widget_ilist_append(il, NULL, _("E-Mail"), _def_mailto_cb, cfdata, NULL); e_widget_ilist_append(il, NULL, _("File"), _def_file_cb, cfdata, NULL); e_widget_ilist_append(il, NULL, _("Trash"), _def_trash_cb, cfdata, NULL); + e_widget_ilist_append(il, NULL, _("Terminal"), _def_terminal_cb, cfdata, NULL); e_widget_ilist_go(il); e_widget_ilist_thaw(il); edje_thaw(); @@ -376,6 +390,9 @@ _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) if ((cfdata->trash_desktop) && (cfdata->trash_desktop[0])) efreet_ini_string_set(cfdata->ini, "x-scheme-handler/trash", cfdata->trash_desktop); + if ((cfdata->terminal_desktop) && (cfdata->terminal_desktop[0])) + efreet_ini_string_set(cfdata->ini, "x-scheme-handler/terminal", + cfdata->terminal_desktop); snprintf(buf, sizeof(buf), "%s/applications/defaults.list", efreet_data_home_get()); efreet_ini_save(cfdata->ini, buf); diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c index 5c876bd4e..d8375cdbc 100644 --- a/src/modules/fileman/e_fwin.c +++ b/src/modules/fileman/e_fwin.c @@ -141,6 +141,9 @@ static void _e_fwin_cb_menu_open_fast(void *data, static void _e_fwin_parent(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_fwin_terminal(void *data, + E_Menu *m, + E_Menu_Item *mi); static void _e_fwin_cb_key_down(void *data, Evas *e, Evas_Object *obj, @@ -1806,7 +1809,7 @@ _e_fwin_zone_del(void *data, /* fm menu extend */ static void -_e_fwin_menu_extend(void *data __UNUSED__, +_e_fwin_menu_extend(void *data, Evas_Object *obj, E_Menu *m, E_Fm2_Icon_Info *info __UNUSED__) @@ -1815,6 +1818,8 @@ _e_fwin_menu_extend(void *data __UNUSED__, if (e_fm2_has_parent_get(obj)) { + Efreet_Desktop *tdesktop; + mi = e_menu_item_new(m); e_menu_item_separator_set(mi, 1); @@ -1825,6 +1830,24 @@ _e_fwin_menu_extend(void *data __UNUSED__, "e/fileman/default/button/parent"), "e/fileman/default/button/parent"); e_menu_item_callback_set(mi, _e_fwin_parent, obj); + + tdesktop = e_util_terminal_desktop_get(); + if (tdesktop) + { + E_Fwin_Page *page = data; + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Open Terminal Here")); + e_menu_item_callback_set(mi, _e_fwin_terminal, page->fwin); + if (tdesktop->icon) + { + if (tdesktop->icon[0] == '/') + e_menu_item_icon_file_set(mi, tdesktop->icon); + else + e_util_menu_item_theme_icon_set(mi, tdesktop->icon); + } + efreet_desktop_free(tdesktop); + } } /* FIXME: if info != null then check mime type and offer options based * on that @@ -1839,6 +1862,36 @@ _e_fwin_parent(void *data, e_fm2_parent_go(data); } +static void +_e_fwin_terminal(void *data, + E_Menu *m __UNUSED__, + E_Menu_Item *mi __UNUSED__) +{ + E_Fwin *fwin = data; + Efreet_Desktop *tdesktop; + + if (!fwin->cur_page) return; + tdesktop = e_util_terminal_desktop_get(); + if (tdesktop) + { + char buf[PATH_MAX]; + + if (getcwd(buf, sizeof(buf)) > 0) + { + const char *path; + + path = e_fm2_real_path_get(fwin->cur_page->fm_obj); + if (path) + { + chdir(path); + e_exec(fwin->zone, tdesktop, NULL, NULL, "fileman"); + chdir(buf); + } + } + efreet_desktop_free(tdesktop); + } +} + static void _e_fwin_cb_menu_open_fast(void *data, E_Menu *m __UNUSED__,