diff options
Diffstat (limited to 'plugins/nvidia/nvidia-plugin.c')
-rw-r--r-- | plugins/nvidia/nvidia-plugin.c | 162 |
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); +} + + |