summaryrefslogtreecommitdiffstats
path: root/src/remmina_sysinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/remmina_sysinfo.c')
-rw-r--r--src/remmina_sysinfo.c155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/remmina_sysinfo.c b/src/remmina_sysinfo.c
new file mode 100644
index 0000000..cfbe1c3
--- /dev/null
+++ b/src/remmina_sysinfo.c
@@ -0,0 +1,155 @@
+/*
+ * Remmina - The GTK+ Remote Desktop Client
+ * Copyright (C) 2010 Vic Lee
+ * Copyright (C) 2014-2015 Antenore Gatta, Fabio Castelli, Giovanni Panozzo
+ * Copyright (C) 2016-2023 Antenore Gatta, Giovanni Panozzo
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. * If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. * If you
+ * do not wish to do so, delete this exception statement from your
+ * version. * If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ *
+ */
+
+#include "config.h"
+#include <glib/gi18n.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include "remmina/remmina_trace_calls.h"
+#include "remmina_sysinfo.h"
+
+gboolean remmina_sysinfo_is_appindicator_available()
+{
+ /* Check if we have an appindicator available (which uses
+ * DBUS KDE StatusNotifier)
+ */
+
+ TRACE_CALL(__func__);
+ GDBusConnection *con;
+ GVariant *v;
+ GError *error;
+ gboolean available;
+
+ available = FALSE;
+ con = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
+ if (con) {
+ error = NULL;
+ v = g_dbus_connection_call_sync(con,
+ "org.kde.StatusNotifierWatcher",
+ "/StatusNotifierWatcher",
+ "org.freedesktop.DBus.Introspectable",
+ "Introspect",
+ NULL,
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (v) {
+ available = TRUE;
+ g_variant_unref(v);
+ }
+ g_object_unref(con);
+ }
+ return available;
+}
+
+/**
+ * Query DBUS to get GNOME Shell version.
+ * @return the GNOME Shell version as a string or NULL if error or no GNOME Shell found.
+ * @warning The returned string must be freed with g_free.
+ */
+gchar *remmina_sysinfo_get_gnome_shell_version()
+{
+ TRACE_CALL(__func__);
+ GDBusConnection *con;
+ GDBusProxy *p;
+ GVariant *v;
+ GError *error;
+ gsize sz;
+ gchar *ret;
+
+ ret = NULL;
+
+ con = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
+ if (con) {
+ error = NULL;
+ p = g_dbus_proxy_new_sync(con,
+ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+ NULL,
+ "org.gnome.Shell",
+ "/org/gnome/Shell",
+ "org.gnome.Shell",
+ NULL,
+ &error);
+ if (p) {
+ v = g_dbus_proxy_get_cached_property(p, "ShellVersion");
+ if (v) {
+ if (g_variant_is_of_type(v, G_VARIANT_TYPE_STRING)) {
+ ret = g_strdup(g_variant_get_string(v, &sz));
+ }
+ g_variant_unref(v);
+ }
+ g_object_unref(p);
+ }
+ g_object_unref(con);
+ }
+ return ret;
+}
+
+/**
+ * Query environment variables to get the Window manager name.
+ * @return a string composed by XDG_CURRENT_DESKTOP and GDMSESSION as a string
+ * or \0 if nothing has been found.
+ * @warning The returned string must be freed with g_free.
+ */
+gchar *remmina_sysinfo_get_wm_name()
+{
+ TRACE_CALL(__func__);
+ const gchar *xdg_current_desktop;
+ const gchar *gdmsession;
+ gchar *ret;
+
+ xdg_current_desktop = g_environ_getenv(g_get_environ(), "XDG_CURRENT_DESKTOP");
+ gdmsession = g_environ_getenv(g_get_environ(), "GDMSESSION");
+
+ if (!xdg_current_desktop || xdg_current_desktop[0] == '\0') {
+ if (!gdmsession || gdmsession[0] == '\0') {
+ ret = NULL;
+ }else {
+ ret = g_strdup_printf("%s", gdmsession);
+ }
+ }else if (!gdmsession || gdmsession[0] == '\0') {
+ ret = g_strdup_printf("%s", xdg_current_desktop);
+ return ret;
+ }else if (g_strcmp0(xdg_current_desktop,gdmsession) == 0) {
+ ret = g_strdup_printf("%s", xdg_current_desktop);
+ }else {
+ ret = g_strdup_printf("%s %s", xdg_current_desktop, gdmsession);
+ }
+ return ret;
+}