mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-11 23:16:14 +01:00
AppInfo: use XDG_CURRENT_DESKTOP for OnlyShowIn
Expand the functionality of g_desktop_app_info_set_desktop_env() to include the possibility of passing strings containing ':' characters (as some apps, such as gnome-session, are directly passing the value of XDG_CURRENT_DESKTOP). At the same time, deprecate it, since now we get the list from the environment variable for ourselves. Modify the checks in g_desktop_app_info_get_show_in() to deal with multiple items listed in XDG_CURRENT_DESKTOP. For example, if we find that we have XDG_CURRENT_DESKTOP=GNOME-Classic:GNOME and a desktop file contains: OnlyShowIn=GNOME then we will show this file because of the fallback to GNOME. If the file _also_ contains the line: NotShowIn=GNOME-Classic Then we will not show it, because GNOME-Classic comes before GNOME in XDG_CURRENT_DESKTOP. https://bugzilla.gnome.org/show_bug.cgi?id=729813
This commit is contained in:
parent
880e8e8cb2
commit
5a5e16e93c
@ -132,9 +132,6 @@ typedef enum {
|
||||
G_DEFINE_TYPE_WITH_CODE (GDesktopAppInfo, g_desktop_app_info, G_TYPE_OBJECT,
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_APP_INFO, g_desktop_app_info_iface_init))
|
||||
|
||||
G_LOCK_DEFINE_STATIC (g_desktop_env);
|
||||
static gchar *g_desktop_env = NULL;
|
||||
|
||||
/* DesktopFileDir implementation {{{1 */
|
||||
|
||||
typedef struct
|
||||
@ -243,6 +240,29 @@ get_lowercase_current_desktops (void)
|
||||
return (const gchar **) result;
|
||||
}
|
||||
|
||||
static const gchar * const *
|
||||
get_current_desktops (const gchar *value)
|
||||
{
|
||||
static gchar **result;
|
||||
|
||||
if (g_once_init_enter (&result))
|
||||
{
|
||||
gchar **tmp;
|
||||
|
||||
if (!value)
|
||||
value = g_getenv ("XDG_CURRENT_DESKTOP");
|
||||
|
||||
if (!value)
|
||||
value = "";
|
||||
|
||||
tmp = g_strsplit (value, ":", 0);
|
||||
|
||||
g_once_init_leave (&result, tmp);
|
||||
}
|
||||
|
||||
return (const gchar **) result;
|
||||
}
|
||||
|
||||
/*< internal >
|
||||
* add_to_table_if_appropriate:
|
||||
* @apps: a string to GDesktopAppInfo hash table
|
||||
@ -2040,14 +2060,16 @@ g_desktop_app_info_get_nodisplay (GDesktopAppInfo *info)
|
||||
/**
|
||||
* g_desktop_app_info_get_show_in:
|
||||
* @info: a #GDesktopAppInfo
|
||||
* @desktop_env: a string specifying a desktop name
|
||||
* @desktop_env: (nullable): a string specifying a desktop name
|
||||
*
|
||||
* Checks if the application info should be shown in menus that list available
|
||||
* applications for a specific name of the desktop, based on the
|
||||
* `OnlyShowIn` and `NotShowIn` keys.
|
||||
*
|
||||
* If @desktop_env is %NULL, then the name of the desktop set with
|
||||
* g_desktop_app_info_set_desktop_env() is used.
|
||||
* @desktop_env should typically be given as %NULL, in which case the
|
||||
* `XDG_CURRENT_DESKTOP` environment variable is consulted. If you want
|
||||
* to override the default mechanism then you may specify @desktop_env,
|
||||
* but this is not recommended.
|
||||
*
|
||||
* Note that g_app_info_should_show() for @info will include this check (with
|
||||
* %NULL for @desktop_env) as well as additional checks.
|
||||
@ -2062,45 +2084,33 @@ gboolean
|
||||
g_desktop_app_info_get_show_in (GDesktopAppInfo *info,
|
||||
const gchar *desktop_env)
|
||||
{
|
||||
gboolean found;
|
||||
int i;
|
||||
const gchar *specified_envs[] = { desktop_env, NULL };
|
||||
const gchar * const *envs;
|
||||
gint i;
|
||||
|
||||
g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), FALSE);
|
||||
|
||||
if (!desktop_env) {
|
||||
G_LOCK (g_desktop_env);
|
||||
desktop_env = g_desktop_env;
|
||||
G_UNLOCK (g_desktop_env);
|
||||
}
|
||||
if (desktop_env)
|
||||
envs = specified_envs;
|
||||
else
|
||||
envs = get_current_desktops (NULL);
|
||||
|
||||
if (info->only_show_in)
|
||||
for (i = 0; envs[i]; i++)
|
||||
{
|
||||
if (desktop_env == NULL)
|
||||
return FALSE;
|
||||
gint j;
|
||||
|
||||
found = FALSE;
|
||||
for (i = 0; info->only_show_in[i] != NULL; i++)
|
||||
{
|
||||
if (strcmp (info->only_show_in[i], desktop_env) == 0)
|
||||
{
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
return FALSE;
|
||||
}
|
||||
if (info->only_show_in)
|
||||
for (j = 0; info->only_show_in[j]; j++)
|
||||
if (g_str_equal (info->only_show_in[j], envs[i]))
|
||||
return TRUE;
|
||||
|
||||
if (info->not_show_in && desktop_env)
|
||||
{
|
||||
for (i = 0; info->not_show_in[i] != NULL; i++)
|
||||
{
|
||||
if (strcmp (info->not_show_in[i], desktop_env) == 0)
|
||||
if (info->not_show_in)
|
||||
for (j = 0; info->not_show_in[j]; j++)
|
||||
if (g_str_equal (info->not_show_in[j], envs[i]))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return info->only_show_in == NULL;
|
||||
}
|
||||
|
||||
/* Launching... {{{2 */
|
||||
@ -2958,26 +2968,15 @@ g_desktop_app_info_launch_uris_as_manager (GDesktopAppInfo *appinfo,
|
||||
* `OnlyShowIn` and `NotShowIn`
|
||||
* desktop entry fields.
|
||||
*
|
||||
* The
|
||||
* [Desktop Menu specification](http://standards.freedesktop.org/menu-spec/latest/)
|
||||
* recognizes the following:
|
||||
* - GNOME
|
||||
* - KDE
|
||||
* - ROX
|
||||
* - XFCE
|
||||
* - LXDE
|
||||
* - Unity
|
||||
* - Old
|
||||
*
|
||||
* Should be called only once; subsequent calls are ignored.
|
||||
*
|
||||
* Deprecated:2.42:do not use this API. Since 2.42 the value of the
|
||||
* `XDG_CURRENT_DESKTOP` environment variable will be used.
|
||||
*/
|
||||
void
|
||||
g_desktop_app_info_set_desktop_env (const gchar *desktop_env)
|
||||
{
|
||||
G_LOCK (g_desktop_env);
|
||||
if (!g_desktop_env)
|
||||
g_desktop_env = g_strdup (desktop_env);
|
||||
G_UNLOCK (g_desktop_env);
|
||||
get_current_desktops (desktop_env);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -71,7 +71,7 @@ GDesktopAppInfo *g_desktop_app_info_new (const char *desktop_
|
||||
GLIB_AVAILABLE_IN_ALL
|
||||
gboolean g_desktop_app_info_get_is_hidden (GDesktopAppInfo *info);
|
||||
|
||||
GLIB_AVAILABLE_IN_ALL
|
||||
GLIB_DEPRECATED_IN_2_42
|
||||
void g_desktop_app_info_set_desktop_env (const char *desktop_env);
|
||||
|
||||
GLIB_AVAILABLE_IN_2_36
|
||||
|
Loading…
Reference in New Issue
Block a user