forked from enlightenment/enlightenment
e17 now respects default application settings in file manager.
load defaults.list from ~/.local/share/applications and $XDG_DATA_DIRS/share/applications. This file is a FreeDesktop.Org standard used by both Gnome and KDE. It is already managed by E17 at Settings > Apps > Default Applications. The standard allows a list of applications to be specified for each mime-type. This order is now used by e_fwin. If there was a list specified then "Open" will use the highest priority instead of asking which one to use. "Open with..." still works and respect the order. SVN revision: 73435
This commit is contained in:
parent
5e7e358e5b
commit
793a93c467
|
@ -102,7 +102,8 @@ static void _e_fwin_desktop_run(Efreet_Desktop *desktop,
|
|||
E_Fwin_Page *page,
|
||||
Eina_Bool skip_history);
|
||||
static Eina_List *_e_fwin_suggested_apps_list_get(Eina_List *files,
|
||||
Eina_List **mime_list);
|
||||
Eina_List **mime_list,
|
||||
Eina_Bool *has_default);
|
||||
static void _e_fwin_changed(void *data,
|
||||
Evas_Object *obj,
|
||||
void *event_info);
|
||||
|
@ -644,9 +645,100 @@ _e_fwin_custom_file_path_eval(E_Fwin *fwin,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static Eina_List *
|
||||
_e_fwin_defaults_apps_get(const char *mime, const char *path)
|
||||
{
|
||||
Efreet_Ini *ini;
|
||||
const char *str;
|
||||
Eina_List *apps = NULL;
|
||||
char **array, **itr;
|
||||
|
||||
if (!ecore_file_exists(path)) return NULL;
|
||||
|
||||
ini = efreet_ini_new(path);
|
||||
if (!ini) return NULL;
|
||||
|
||||
efreet_ini_section_set(ini, "Default Applications");
|
||||
str = efreet_ini_string_get(ini, mime);
|
||||
if (!str) goto end;
|
||||
|
||||
array = eina_str_split(str, ";", 0);
|
||||
if (!array) goto end;
|
||||
|
||||
for (itr = array; *itr != NULL; itr++)
|
||||
{
|
||||
const char *name = *itr;
|
||||
Efreet_Desktop *desktop;
|
||||
|
||||
if (name[0] == '/')
|
||||
desktop = efreet_desktop_new(name);
|
||||
else
|
||||
desktop = efreet_util_desktop_file_id_find(name);
|
||||
|
||||
if (!desktop) continue;
|
||||
if (!desktop->exec)
|
||||
{
|
||||
efreet_desktop_free(desktop);
|
||||
continue;
|
||||
}
|
||||
|
||||
apps = eina_list_append(apps, desktop);
|
||||
}
|
||||
|
||||
free(array[0]);
|
||||
free(array);
|
||||
end:
|
||||
efreet_ini_free(ini);
|
||||
return apps;
|
||||
}
|
||||
|
||||
static Eina_List *
|
||||
_e_fwin_suggested_apps_list_sort(const char *mime, Eina_List *desktops, Eina_Bool *has_default)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
Eina_List *order, *l;
|
||||
Efreet_Desktop *desktop;
|
||||
|
||||
snprintf(path, sizeof(path), "%s/applications/defaults.list",
|
||||
efreet_data_home_get());
|
||||
order = _e_fwin_defaults_apps_get(mime, path);
|
||||
|
||||
if (!order)
|
||||
{
|
||||
const Eina_List *n, *dirs = efreet_data_dirs_get();
|
||||
const char *d;
|
||||
EINA_LIST_FOREACH(dirs, n, d)
|
||||
{
|
||||
snprintf(path, sizeof(path), "%s/applications/defaults.list", d);
|
||||
order = _e_fwin_defaults_apps_get(mime, path);
|
||||
if (order)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!order)
|
||||
{
|
||||
if (has_default) *has_default = EINA_FALSE;
|
||||
return desktops;
|
||||
}
|
||||
|
||||
EINA_LIST_FOREACH(order, l, desktop)
|
||||
{
|
||||
Eina_List *node = eina_list_data_find_list(desktops, desktop);
|
||||
if (!node) continue;
|
||||
desktops = eina_list_remove_list(desktops, node);
|
||||
efreet_desktop_free(desktop);
|
||||
}
|
||||
|
||||
if (has_default) *has_default = EINA_TRUE;
|
||||
|
||||
return eina_list_merge(order, desktops);
|
||||
}
|
||||
|
||||
static Eina_List *
|
||||
_e_fwin_suggested_apps_list_get(Eina_List *files,
|
||||
Eina_List **mime_list)
|
||||
Eina_List **mime_list,
|
||||
Eina_Bool *has_default)
|
||||
{
|
||||
E_Fm2_Icon_Info *ici;
|
||||
Eina_Hash *set_mimes;
|
||||
|
@ -668,6 +760,7 @@ _e_fwin_suggested_apps_list_get(Eina_List *files,
|
|||
}
|
||||
|
||||
if (mime_list) *mime_list = NULL;
|
||||
if (has_default) *has_default = EINA_FALSE;
|
||||
|
||||
if (eina_hash_population(set_mimes) > 0)
|
||||
{
|
||||
|
@ -679,9 +772,14 @@ _e_fwin_suggested_apps_list_get(Eina_List *files,
|
|||
{
|
||||
Eina_List *desktops = efreet_util_desktop_mime_list(mime);
|
||||
Efreet_Desktop *d;
|
||||
Eina_Bool hd = EINA_FALSE;
|
||||
|
||||
if (mime_list) *mime_list = eina_list_append(*mime_list, mime);
|
||||
|
||||
desktops = _e_fwin_suggested_apps_list_sort(mime, desktops, &hd);
|
||||
if ((hd) && (has_default))
|
||||
*has_default = EINA_TRUE;
|
||||
|
||||
EINA_LIST_FREE(desktops, d)
|
||||
{
|
||||
if (eina_hash_find(set_apps, &d)) efreet_desktop_free(d);
|
||||
|
@ -1447,7 +1545,7 @@ _e_fwin_cb_menu_extend_open_with(void *data,
|
|||
selected = e_fm2_selected_list_get(page->fm_obj);
|
||||
if (!selected) return;
|
||||
|
||||
apps = _e_fwin_suggested_apps_list_get(selected, NULL);
|
||||
apps = _e_fwin_suggested_apps_list_get(selected, NULL, NULL);
|
||||
EINA_LIST_FOREACH(apps, l, desk)
|
||||
{
|
||||
if (!desk) continue;
|
||||
|
@ -1547,6 +1645,7 @@ _e_fwin_file_open_dialog(E_Fwin_Page *page,
|
|||
E_Fwin_Apps_Dialog *fad;
|
||||
E_Fm2_Icon_Info *ici;
|
||||
char buf[PATH_MAX];
|
||||
Eina_Bool has_default = EINA_FALSE;
|
||||
int need_dia = 0;
|
||||
|
||||
if (fwin->fad)
|
||||
|
@ -1737,7 +1836,7 @@ _e_fwin_file_open_dialog(E_Fwin_Page *page,
|
|||
if (!need_dia) return;
|
||||
}
|
||||
|
||||
apps = _e_fwin_suggested_apps_list_get(files, &mlist);
|
||||
apps = _e_fwin_suggested_apps_list_get(files, &mlist, &has_default);
|
||||
|
||||
if (!always)
|
||||
{
|
||||
|
@ -1755,14 +1854,15 @@ _e_fwin_file_open_dialog(E_Fwin_Page *page,
|
|||
* use it, if not fall back again - and so on - if all apps listed do
|
||||
* not contain 1 that handles all the mime types - fall back to dialog
|
||||
*/
|
||||
if (eina_list_count(mlist) <= 1)
|
||||
if ((has_default) || (eina_list_count(mlist) <= 1))
|
||||
{
|
||||
char *file;
|
||||
char pcwd[4096];
|
||||
Eina_List *files_list = NULL;
|
||||
|
||||
need_dia = 1;
|
||||
if (mlist) desk = e_exehist_mime_desktop_get(mlist->data);
|
||||
if ((has_default) && (apps)) desk = apps->data;
|
||||
else if (mlist) desk = e_exehist_mime_desktop_get(mlist->data);
|
||||
getcwd(pcwd, sizeof(pcwd));
|
||||
chdir(e_fm2_real_path_get(page->fm_obj));
|
||||
|
||||
|
|
Loading…
Reference in New Issue