From 5e6e5981bd9a12208a2608fd7d15a53e9f704fa0 Mon Sep 17 00:00:00 2001 From: Leandro Pereira Date: Fri, 28 Jul 2017 21:41:31 -0700 Subject: Refactor desktop environment detection routine Code is longer, but is more readable. --- modules/computer/os.c | 202 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 128 insertions(+), 74 deletions(-) diff --git a/modules/computer/os.c b/modules/computer/os.c index 72cd0b5c..2e255dee 100644 --- a/modules/computer/os.c +++ b/modules/computer/os.c @@ -16,6 +16,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include #include #include "hardinfo.h" @@ -77,84 +78,137 @@ get_libc_version(void) return g_strdup(_("Unknown")); } -#include -void -detect_desktop_environment(OperatingSystem * os) +static gchar *detect_kde_version(void) { - const gchar *tmp = g_getenv("GNOME_DESKTOP_SESSION_ID"); - FILE *version; - char vers[16]; + const gchar *cmd; + const gchar *tmp = g_getenv("KDE_SESSION_VERSION"); + gchar *out; + gboolean spawned; - if (tmp) { - /* FIXME: this might not be true, as the gnome-panel in path - may not be the one that's running. - see where the user's running panel is and run *that* to - obtain the version. */ - version = popen("gnome-about --gnome-version", "r"); - if (version) { - (void)fscanf(version, _("Version: %s"), vers); - if (pclose(version)) - goto unknown; - } else { - goto unknown; - } - - os->desktop = g_strdup_printf("GNOME %s", vers); - } else if (g_getenv("KDE_FULL_SESSION")) { - - if (g_getenv("KDE_SESSION_VERSION") && strstr(g_getenv("KDE_SESSION_VERSION"),(gchar *)"4")) { - version = popen("kwin --version", "r"); - } else { - version = popen("kcontrol --version", "r"); - } - - if (version) { - char buf[32]; - - (void)fgets(buf, 32, version); - - (void)fscanf(version, "KDE: %s", vers); - if (pclose(version)) - goto unknown; - } else { - goto unknown; - } - - os->desktop = g_strdup_printf("KDE %s", vers); + if (tmp && tmp[0] == '4') { + cmd = "kwin --version"; } else { - unknown: - os->desktop = NULL; - - if (!g_getenv("DISPLAY")) { - os->desktop = g_strdup(_("Terminal")); - } else { - GdkScreen *screen = gdk_screen_get_default(); - - if (screen && GDK_IS_SCREEN(screen)) { - const gchar *windowman; - - windowman = gdk_x11_screen_get_window_manager_name(screen); - if (g_str_equal(windowman, "Xfwm4")) { - /* FIXME: check if xprop -root | grep XFCE_DESKTOP_WINDOW is defined */ - os->desktop = g_strdup("XFCE 4"); - } else if ((tmp = g_getenv("XDG_CURRENT_DESKTOP"))) { - os->desktop = g_strdup(tmp); - if ((tmp = g_getenv("DESKTOP_SESSION")) && !g_str_equal(os->desktop, tmp)) { - g_free(os->desktop); - os->desktop = g_strdup(tmp); - } - } - - if (!os->desktop) { - os->desktop = g_strdup_printf(_("Unknown (Window Manager: %s)"), - windowman); - } - } else { - os->desktop = g_strdup(_("Unknown")); - } - } + cmd = "kcontrol --version"; + } + + spawned = g_spawn_command_line_sync(cmd, &out, NULL, NULL, NULL); + if (!spawned) + return NULL; + + tmp = strstr(idle_free(out), "KDE: "); + return tmp ? g_strdup(tmp + strlen("KDE: ")) : NULL; +} + +static gchar * +detect_gnome_version(void) +{ + gchar *tmp; + gchar *out; + gboolean spawned; + + spawned = g_spawn_command_line_sync( + "gnome-shell --version", &out, NULL, NULL, NULL); + if (spawned) { + tmp = strstr(idle_free(out), _("GNOME Shell ")); + + if (tmp) { + tmp += strlen(_("GNOME Shell ")); + return g_strdup_printf("GNOME %s", strend(tmp, '\n')); + } + } + + spawned = g_spawn_command_line_sync( + "gnome-about --gnome-version", &out, NULL, NULL, NULL); + if (spawned) { + tmp = strstr(idle_free(out), _("Version: ")); + + if (tmp) { + tmp += strlen(_("Version: ")); + return g_strdup_printf("GNOME %s", strend(tmp, '\n')); + } + } + + return NULL; +} + +static gchar * +detect_window_manager(void) +{ + GdkScreen *screen = gdk_screen_get_default(); + const gchar *windowman; + const gchar *curdesktop; + + if (!screen || !GDK_IS_SCREEN(screen)) + return NULL; + + windowman = gdk_x11_screen_get_window_manager_name(screen); + + if (g_str_equal(windowman, "Xfwm4")) + return g_strdup("XFCE 4"); + + curdesktop = g_getenv("XDG_CURRENT_DESKTOP"); + if (curdesktop) { + const gchar *desksession = g_getenv("DESKTOP_SESSION"); + + if (desksession && !g_str_equal(curdesktop, desksession)) + return g_strdup(desksession); } + + return g_strdup_printf(_("Unknown (Window Manager: %s)"), windowman); +} + +static gchar * +detect_desktop_environment(void) +{ + const char *tmp; + + tmp = g_getenv("XDG_CURRENT_DESKTOP"); + if (tmp) { + if (g_str_equal(tmp, "GNOME")) { + const gchar *maybe_gnome = detect_gnome_version(); + + if (maybe_gnome) + tmp = maybe_gnome; + } + + return g_strdup(tmp); + } + + tmp = g_getenv("XDG_SESSION_DESKTOP"); + if (tmp) { + if (g_str_equal(tmp, "gnome")) { + const gchar *maybe_gnome = detect_gnome_version(); + + if (maybe_gnome) + tmp = maybe_gnome; + } + + return g_strdup(tmp); + } + + tmp = g_getenv("KDE_FULL_SESSION"); + if (tmp) { + tmp = detect_kde_version(); + if (tmp) + return g_strdup(tmp); + } + + tmp = g_getenv("GNOME_DESKTOP_SESSION_ID"); + if (tmp) { + tmp = detect_gnome_version(); + if (tmp) + return g_strdup(tmp); + } + + tmp = detect_window_manager(); + if (tmp) + return g_strdup(tmp); + + if (!g_getenv("DISPLAY")) + return g_strdup("Terminal"); + + return g_strdup("Unknown"); } gchar * @@ -302,7 +356,7 @@ computer_get_os(void) g_get_user_name(), g_get_real_name()); os->libc = get_libc_version(); scan_languages(os); - detect_desktop_environment(os); + os->desktop = detect_desktop_environment(); os->entropy_avail = computer_get_entropy_avail(); -- cgit v1.2.3