diff options
author | Shaun McCance <shaunm@gnome.org> | 2015-08-21 16:25:23 -0400 |
---|---|---|
committer | Shaun McCance <shaunm@gnome.org> | 2015-08-25 22:56:16 -0400 |
commit | 62e1f329533ddff346b619a5cd16d347a8d46c05 (patch) | |
tree | e4526fbae6419a6515b45edcd534d72481c702fa | |
parent | a111b7ecc71ac12fc06c05c22ac575f405faaa14 (diff) | |
download | yelp-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.c | 230 |
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 |