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_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_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 */
|
/* DesktopFileDir implementation {{{1 */
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -243,6 +240,29 @@ get_lowercase_current_desktops (void)
|
|||||||
return (const gchar **) result;
|
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 >
|
/*< internal >
|
||||||
* add_to_table_if_appropriate:
|
* add_to_table_if_appropriate:
|
||||||
* @apps: a string to GDesktopAppInfo hash table
|
* @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:
|
* g_desktop_app_info_get_show_in:
|
||||||
* @info: a #GDesktopAppInfo
|
* @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
|
* Checks if the application info should be shown in menus that list available
|
||||||
* applications for a specific name of the desktop, based on the
|
* applications for a specific name of the desktop, based on the
|
||||||
* `OnlyShowIn` and `NotShowIn` keys.
|
* `OnlyShowIn` and `NotShowIn` keys.
|
||||||
*
|
*
|
||||||
* If @desktop_env is %NULL, then the name of the desktop set with
|
* @desktop_env should typically be given as %NULL, in which case the
|
||||||
* g_desktop_app_info_set_desktop_env() is used.
|
* `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
|
* Note that g_app_info_should_show() for @info will include this check (with
|
||||||
* %NULL for @desktop_env) as well as additional checks.
|
* %NULL for @desktop_env) as well as additional checks.
|
||||||
@ -2062,45 +2084,33 @@ gboolean
|
|||||||
g_desktop_app_info_get_show_in (GDesktopAppInfo *info,
|
g_desktop_app_info_get_show_in (GDesktopAppInfo *info,
|
||||||
const gchar *desktop_env)
|
const gchar *desktop_env)
|
||||||
{
|
{
|
||||||
gboolean found;
|
const gchar *specified_envs[] = { desktop_env, NULL };
|
||||||
int i;
|
const gchar * const *envs;
|
||||||
|
gint i;
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), FALSE);
|
g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), FALSE);
|
||||||
|
|
||||||
if (!desktop_env) {
|
if (desktop_env)
|
||||||
G_LOCK (g_desktop_env);
|
envs = specified_envs;
|
||||||
desktop_env = g_desktop_env;
|
else
|
||||||
G_UNLOCK (g_desktop_env);
|
envs = get_current_desktops (NULL);
|
||||||
}
|
|
||||||
|
for (i = 0; envs[i]; i++)
|
||||||
|
{
|
||||||
|
gint j;
|
||||||
|
|
||||||
if (info->only_show_in)
|
if (info->only_show_in)
|
||||||
{
|
for (j = 0; info->only_show_in[j]; j++)
|
||||||
if (desktop_env == NULL)
|
if (g_str_equal (info->only_show_in[j], envs[i]))
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
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->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)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
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 info->only_show_in == NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Launching... {{{2 */
|
/* Launching... {{{2 */
|
||||||
@ -2958,26 +2968,15 @@ g_desktop_app_info_launch_uris_as_manager (GDesktopAppInfo *appinfo,
|
|||||||
* `OnlyShowIn` and `NotShowIn`
|
* `OnlyShowIn` and `NotShowIn`
|
||||||
* desktop entry fields.
|
* 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.
|
* 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
|
void
|
||||||
g_desktop_app_info_set_desktop_env (const gchar *desktop_env)
|
g_desktop_app_info_set_desktop_env (const gchar *desktop_env)
|
||||||
{
|
{
|
||||||
G_LOCK (g_desktop_env);
|
get_current_desktops (desktop_env);
|
||||||
if (!g_desktop_env)
|
|
||||||
g_desktop_env = g_strdup (desktop_env);
|
|
||||||
G_UNLOCK (g_desktop_env);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -71,7 +71,7 @@ GDesktopAppInfo *g_desktop_app_info_new (const char *desktop_
|
|||||||
GLIB_AVAILABLE_IN_ALL
|
GLIB_AVAILABLE_IN_ALL
|
||||||
gboolean g_desktop_app_info_get_is_hidden (GDesktopAppInfo *info);
|
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);
|
void g_desktop_app_info_set_desktop_env (const char *desktop_env);
|
||||||
|
|
||||||
GLIB_AVAILABLE_IN_2_36
|
GLIB_AVAILABLE_IN_2_36
|
||||||
|
Loading…
Reference in New Issue
Block a user