/* * Copyright (C) 2006 Sven Peter * * 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 #include #include #include #include #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); }