abstract the "get terminal desktop" code into util code and now use

from e_exec AND in efm - open terminal here menu item is there with
code to set your default terminal in default applications too.



SVN revision: 75290
This commit is contained in:
Carsten Haitzler 2012-08-15 09:59:37 +00:00
parent bd1e81be80
commit 6efc2eb976
5 changed files with 145 additions and 32 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -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__,