summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@gnome.org>2015-08-21 16:25:23 -0400
committerShaun McCance <shaunm@gnome.org>2015-08-25 22:56:16 -0400
commit62e1f329533ddff346b619a5cd16d347a8d46c05 (patch)
treee4526fbae6419a6515b45edcd534d72481c702fa
parenta111b7ecc71ac12fc06c05c22ac575f405faaa14 (diff)
downloadyelp-62e1f329533ddff346b619a5cd16d347a8d46c05.tar.gz
Use XDG_CURRENT_DESKTOP for conditionals when available
Previously we had been using various DBus introspection routines to check the current desktop. That code is still there, but we don't use it if we can get the right information from XDG_CURRENT_DESKTOP. This adds more desktops we can check for, including gnome-shell derivatives like Elementary Pantheon and Cinnamon. We also set the new platform:gnome-3 token for GNOME 3 standard mode.
-rw-r--r--libyelp/yelp-settings.c230
1 files changed, 145 insertions, 85 deletions
diff --git a/libyelp/yelp-settings.c b/libyelp/yelp-settings.c
index 8957dc2c..fe0b49c3 100644
--- a/libyelp/yelp-settings.c
+++ b/libyelp/yelp-settings.c
@@ -238,92 +238,11 @@ static void
yelp_settings_constructed (GObject *object)
{
YelpSettings *settings = YELP_SETTINGS (object);
- GDBusConnection *connection;
- GVariant *ret, *names;
- GVariantIter iter;
- gchar *name;
- gboolean env_shell, env_classic, env_panel, env_unity, env_xfce;
+ gboolean skip_dbus_checks = FALSE;
gchar *os_release = NULL;
- GError *error = NULL;
+ const gchar *desktop;
- connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
- if (connection == NULL) {
- g_warning ("Unable to connect to dbus: %s", error->message);
- g_error_free (error);
- return;
- }
-
- ret = g_dbus_connection_call_sync (connection,
- "org.freedesktop.DBus",
- "/org/freedesktop/DBus",
- "org.freedesktop.DBus",
- "ListNames",
- NULL,
- G_VARIANT_TYPE ("(as)"),
- G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, &error);
- if (ret == NULL) {
- g_warning ("Unable to query dbus: %s", error->message);
- g_error_free (error);
- return;
- }
- env_shell = env_classic = env_panel = env_unity = env_xfce = FALSE;
- names = g_variant_get_child_value (ret, 0);
- g_variant_iter_init (&iter, names);
- while (g_variant_iter_loop (&iter, "&s", &name)) {
- if (g_str_equal (name, "org.gnome.Panel"))
- env_panel = TRUE;
- else if (g_str_equal (name, "org.gnome.Shell"))
- env_shell = TRUE;
- else if (g_str_equal (name, "com.canonical.Unity"))
- env_unity = TRUE;
- else if (g_str_equal (name, "org.xfce.Panel"))
- env_xfce = TRUE;
- }
- g_variant_unref (names);
- g_variant_unref (ret);
- if (env_shell) {
- ret = g_dbus_connection_call_sync (connection,
- "org.gnome.Shell",
- "/org/gnome/Shell",
- "org.freedesktop.DBus.Properties",
- "Get",
- g_variant_new ("(ss)",
- "org.gnome.Shell",
- "Mode"),
- G_VARIANT_TYPE ("(v)"),
- G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, &error);
- if (ret == NULL) {
- g_warning ("Failed to get GNOME shell mode: %s", error->message);
- g_error_free (error);
- } else {
- GVariant *v;
- g_variant_get (ret, "(v)", &v);
- if (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING) &&
- g_str_equal (g_variant_get_string (v, NULL), "classic")) {
- env_classic = TRUE;
- }
- g_variant_unref (v);
- g_variant_unref (ret);
- }
- }
-
- if (env_classic)
- yelp_settings_set_if_token (settings, "platform:gnome-classic");
-
- /* order is important:
- gnome-shell also provides org.gnome.Panel
- unity also provides org.gnome.Shell
- */
- if (env_unity)
- yelp_settings_set_if_token (settings, "platform:unity");
- else if (env_shell)
- yelp_settings_set_if_token (settings, "platform:gnome-shell");
- else if (env_xfce)
- yelp_settings_set_if_token (settings, "platform:xfce");
- else if (env_panel)
- yelp_settings_set_if_token (settings, "platform:gnome-panel");
+ yelp_settings_set_if_token (settings, "action:install");
g_file_get_contents ("/etc/os-release", &os_release, NULL, NULL);
if (os_release == NULL)
@@ -384,7 +303,148 @@ yelp_settings_constructed (GObject *object)
g_strfreev(lines);
}
- yelp_settings_set_if_token (settings, "action:install");
+ desktop = g_getenv ("XDG_CURRENT_DESKTOP");
+ if (desktop != NULL) {
+ gchar **desktops = g_strsplit (desktop, ":", -1);
+ gint i;
+ gboolean xdg_gnome = FALSE, xdg_gnome_classic = FALSE;
+ for (i = 0; desktops[i]; i++) {
+ if (!g_ascii_strcasecmp (desktops[i], "gnome")) {
+ xdg_gnome = TRUE;
+ }
+ else if (!g_ascii_strcasecmp (desktops[i], "gnome")) {
+ xdg_gnome_classic = TRUE;
+ }
+ else if (!g_ascii_strcasecmp (desktops[i], "kde")) {
+ yelp_settings_set_if_token (settings, "platform:kde");
+ skip_dbus_checks = TRUE;
+ break;
+ }
+ else if (!g_ascii_strcasecmp (desktops[i], "mate")) {
+ yelp_settings_set_if_token (settings, "platform:mate");
+ yelp_settings_set_if_token (settings, "platform:gnome-panel");
+ skip_dbus_checks = TRUE;
+ break;
+ }
+ else if (!g_ascii_strcasecmp (desktops[i], "pantheon")) {
+ yelp_settings_set_if_token (settings, "platform:pantheon");
+ yelp_settings_set_if_token (settings, "platform:gnome-shell");
+ skip_dbus_checks = TRUE;
+ break;
+ }
+ else if (!g_ascii_strcasecmp (desktops[i], "unity")) {
+ yelp_settings_set_if_token (settings, "platform:unity");
+ skip_dbus_checks = TRUE;
+ break;
+ }
+ else if (!g_ascii_strcasecmp (desktops[i], "x-cinnamon")) {
+ yelp_settings_set_if_token (settings, "platform:cinnamon");
+ yelp_settings_set_if_token (settings, "platform:gnome-shell");
+ skip_dbus_checks = TRUE;
+ break;
+ }
+ }
+ if (xdg_gnome) {
+ yelp_settings_set_if_token (settings, "platform:gnome-shell");
+ if (!xdg_gnome_classic)
+ yelp_settings_set_if_token (settings, "platform:gnome-3");
+ skip_dbus_checks = TRUE;
+ }
+ if (xdg_gnome_classic) {
+ yelp_settings_set_if_token (settings, "platform:gnome-classic");
+ yelp_settings_set_if_token (settings, "platform:gnome-shell");
+ skip_dbus_checks = TRUE;
+ }
+ g_strfreev (desktops);
+ }
+
+ if (!skip_dbus_checks) {
+ GDBusConnection *connection;
+ GVariant *ret, *names;
+ GVariantIter iter;
+ gchar *name;
+ gboolean env_shell, env_classic, env_panel, env_unity, env_xfce;
+ GError *error = NULL;
+
+ connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+ if (connection == NULL) {
+ g_warning ("Unable to connect to dbus: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ ret = g_dbus_connection_call_sync (connection,
+ "org.freedesktop.DBus",
+ "/org/freedesktop/DBus",
+ "org.freedesktop.DBus",
+ "ListNames",
+ NULL,
+ G_VARIANT_TYPE ("(as)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &error);
+ if (ret == NULL) {
+ g_warning ("Unable to query dbus: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+ env_shell = env_classic = env_panel = env_unity = env_xfce = FALSE;
+ names = g_variant_get_child_value (ret, 0);
+ g_variant_iter_init (&iter, names);
+ while (g_variant_iter_loop (&iter, "&s", &name)) {
+ if (g_str_equal (name, "org.gnome.Panel"))
+ env_panel = TRUE;
+ else if (g_str_equal (name, "org.gnome.Shell"))
+ env_shell = TRUE;
+ else if (g_str_equal (name, "com.canonical.Unity"))
+ env_unity = TRUE;
+ else if (g_str_equal (name, "org.xfce.Panel"))
+ env_xfce = TRUE;
+ }
+ g_variant_unref (names);
+ g_variant_unref (ret);
+ if (env_shell) {
+ ret = g_dbus_connection_call_sync (connection,
+ "org.gnome.Shell",
+ "/org/gnome/Shell",
+ "org.freedesktop.DBus.Properties",
+ "Get",
+ g_variant_new ("(ss)",
+ "org.gnome.Shell",
+ "Mode"),
+ G_VARIANT_TYPE ("(v)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &error);
+ if (ret == NULL) {
+ g_warning ("Failed to get GNOME shell mode: %s", error->message);
+ g_error_free (error);
+ } else {
+ GVariant *v;
+ g_variant_get (ret, "(v)", &v);
+ if (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING) &&
+ g_str_equal (g_variant_get_string (v, NULL), "classic")) {
+ env_classic = TRUE;
+ }
+ g_variant_unref (v);
+ g_variant_unref (ret);
+ }
+ }
+
+ if (env_classic)
+ yelp_settings_set_if_token (settings, "platform:gnome-classic");
+
+ /* order is important:
+ gnome-shell also provides org.gnome.Panel
+ unity also provides org.gnome.Shell
+ */
+ if (env_unity)
+ yelp_settings_set_if_token (settings, "platform:unity");
+ else if (env_shell)
+ yelp_settings_set_if_token (settings, "platform:gnome-shell");
+ else if (env_xfce)
+ yelp_settings_set_if_token (settings, "platform:xfce");
+ else if (env_panel)
+ yelp_settings_set_if_token (settings, "platform:gnome-panel");
+ }
}
static void