summaryrefslogtreecommitdiff
path: root/plugins/nvidia/nvidia-plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/nvidia/nvidia-plugin.c')
-rw-r--r--plugins/nvidia/nvidia-plugin.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/plugins/nvidia/nvidia-plugin.c b/plugins/nvidia/nvidia-plugin.c
new file mode 100644
index 0000000..ab4c937
--- /dev/null
+++ b/plugins/nvidia/nvidia-plugin.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2006 Sven Peter <[email protected]>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <X11/Xlib.h>
+#include <NVCtrl/NVCtrl.h>
+#include <NVCtrl/NVCtrlLib.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include "nvidia-plugin.h"
+
+const gchar *plugin_name = "nvidia";
+
+#define GPU_CORE_TEMP "CoreTemp"
+#define AMBIENT_TEMP "AmbientTemp"
+
+/* global variables */
+Display *nvidia_sensors_dpy; /* the connection to the X server */
+
+int num_gpus;
+
+/* returns the value of the sensor */
+static gdouble nvidia_plugin_get_sensor_value(const gchar *path,
+ const gchar *id,
+ SensorType type,
+ GError **error)
+{
+ Bool res;
+ int temp;
+ int i;
+
+ i = g_ascii_strtoll(id + strlen("GPU"), NULL, 10);
+ if (g_ascii_strcasecmp(path, GPU_CORE_TEMP) == 0) {
+ res = XNVCTRLQueryTargetAttribute(nvidia_sensors_dpy,
+ NV_CTRL_TARGET_TYPE_GPU,
+ i,
+ 0,
+ NV_CTRL_GPU_CORE_TEMPERATURE,
+ &temp);
+ } else if (g_ascii_strcasecmp(path, AMBIENT_TEMP) == 0) {
+ res = XNVCTRLQueryTargetAttribute(nvidia_sensors_dpy,
+ NV_CTRL_TARGET_TYPE_GPU,
+ i,
+ 0,
+ NV_CTRL_AMBIENT_TEMPERATURE,
+ &temp);
+ } else {
+ g_set_error(error, SENSORS_APPLET_PLUGIN_ERROR, 0, "Invalid path string passed to nvidia_plugin_get_sensor_value");
+ return 0;
+ }
+
+
+ if (res != True) {
+ /* when res isn't true something went wrong */
+ g_set_error(error, SENSORS_APPLET_PLUGIN_ERROR, 0, "XNVCTRLQueryAttribute returned false");
+ return 0;
+ }
+
+ /* convert the int to gdouble and return it */
+ return (gdouble)temp;
+}
+
+/* creates the connection to the X server and checks whether the
+ * NV-CONTROL extension is loaded */
+static GList *nvidia_plugin_init(void)
+{
+ int dummy;
+ int event_base, error_base;
+ GList *sensors = NULL;
+
+ /* create the connection to the X server */
+ if (!(nvidia_sensors_dpy = XOpenDisplay(NULL))) {
+ /* no connection to the X server avaible */
+ return sensors;
+ }
+
+ /* check if the NV-CONTROL extension is available on this X
+ * server - if so add the two sensors if they exist */
+ if (XNVCTRLQueryExtension(nvidia_sensors_dpy, &event_base, &error_base)) {
+ if (XNVCTRLQueryTargetCount(nvidia_sensors_dpy,
+ NV_CTRL_TARGET_TYPE_GPU,
+ &num_gpus))
+ {
+ int i;
+ for (i = 0; i < num_gpus; i++)
+ {
+ if (XNVCTRLQueryTargetAttribute(nvidia_sensors_dpy,
+ NV_CTRL_TARGET_TYPE_GPU,
+ i,
+ 0, NV_CTRL_GPU_CORE_TEMPERATURE, &dummy)) {
+ gchar *id = g_strdup_printf("GPU%d%s", i, GPU_CORE_TEMP);
+
+ sensors_applet_plugin_add_sensor(&sensors,
+ GPU_CORE_TEMP,
+ id,
+ _("GPU"),
+ TEMP_SENSOR,
+ TRUE,
+ GPU_ICON,
+ DEFAULT_GRAPH_COLOR);
+ g_free(id);
+ }
+ if (XNVCTRLQueryTargetAttribute(nvidia_sensors_dpy,
+ NV_CTRL_TARGET_TYPE_GPU,
+ i,
+ 0, NV_CTRL_AMBIENT_TEMPERATURE, &dummy)) {
+ gchar *id = g_strdup_printf("GPU%d%s", i, AMBIENT_TEMP);
+
+ sensors_applet_plugin_add_sensor(&sensors,
+ AMBIENT_TEMP,
+ id,
+ _("Ambient"),
+ TEMP_SENSOR,
+ FALSE,
+ GENERIC_ICON,
+ DEFAULT_GRAPH_COLOR);
+ g_free(id);
+ }
+ }
+ }
+
+ }
+ return sensors;
+}
+
+const gchar *sensors_applet_plugin_name(void)
+{
+ return plugin_name;
+}
+
+GList *sensors_applet_plugin_init(void)
+{
+ return nvidia_plugin_init();
+}
+
+gdouble sensors_applet_plugin_get_sensor_value(const gchar *path,
+ const gchar *id,
+ SensorType type,
+ GError **error) {
+ return nvidia_plugin_get_sensor_value(path, id, type, error);
+}
+
+