static void low_value_changed(GtkSpinButton *spin_button, IsSensorDialog *self) { is_sensor_set_low_value(self->priv->sensor, gtk_spin_button_get_value(spin_button)); }
static void is_fake_plugin_activate(PeasActivatable *activatable) { IsFakePlugin *self = IS_FAKE_PLUGIN(activatable); IsFakePluginPrivate *priv = self->priv; int i; int n_fans = 0; /* generate some fake sensors */ for (i = 0; i < 5; i++) { gchar *path; gchar *label; IsSensor *sensor; path = g_strdup_printf("fake/sensor%d", i); if (g_rand_boolean(priv->rand)) { n_fans++; sensor = is_fan_sensor_new(path); is_sensor_set_low_value(sensor, 100.0); is_sensor_set_high_value(sensor, 5000.0); label = g_strdup_printf(_("Fake Fan %d"), n_fans); } else { sensor = is_temperature_sensor_new(path); is_sensor_set_icon(sensor, IS_STOCK_CPU); label = g_strdup_printf(_("Fake CPU %d"), i - n_fans + 1); } /* no decimal places to display */ is_sensor_set_digits(sensor, 0); is_sensor_set_label(sensor, label); /* connect to update-value signal */ g_signal_connect(sensor, "update-value", G_CALLBACK(update_sensor_value), self); is_manager_add_sensor(is_application_get_manager(priv->application), sensor); g_free(label); g_free(path); } }
static void is_nvidia_plugin_activate(PeasActivatable *activatable) { IsNvidiaPlugin *self = IS_NVIDIA_PLUGIN(activatable); IsNvidiaPluginPrivate *priv = self->priv; Bool ret; int event_base, error_base; gint n; int i; /* search for sensors and add them to manager */ if (!priv->inited) { is_warning("nvidia", "not inited, unable to find sensors"); goto out; } is_debug("nvidia", "searching for sensors"); /* check if the NV-CONTROL extension is available on this X * server */ ret = XNVCTRLQueryExtension(priv->display, &event_base, &error_base); if (!ret) { goto out; } /* get number of GPUs, then for each GPU get any thermal_sensors and coolers used by it */ ret = XNVCTRLQueryTargetCount(priv->display, NV_CTRL_TARGET_TYPE_GPU, &n); if (!ret) { goto out; } for (i = 0; i < n; i++) { guint j; char *label = NULL; ret = XNVCTRLQueryTargetStringAttribute(priv->display, NV_CTRL_TARGET_TYPE_GPU, i, 0, NV_CTRL_STRING_PRODUCT_NAME, &label); for (j = 0; j < G_N_ELEMENTS(map); j++) { int32_t *data; int len; int k; ret = XNVCTRLQueryTargetBinaryData(priv->display, NV_CTRL_TARGET_TYPE_GPU, i, 0, map[j].gpu_attribute, (unsigned char **)&data, &len); if (!ret) { continue; } /* data[0] contains number of sensors, and each sensor indice follows */ for (k = 1; k <= data[0]; k++) { int idx = data[k]; gint value; IsSensor *sensor; gchar *path; ret = XNVCTRLQueryTargetAttribute(priv->display, map[j].target, idx, 0, map[j].attribute, &value); if (!ret) { continue; } path = g_strdup_printf("nvidia/%s%d", map[j].description, idx); if (map[j].target == NV_CTRL_TARGET_TYPE_COOLER) { /* fan sensors are given as a percentage from 0 to 100 */ sensor = is_sensor_new(path); is_sensor_set_icon(sensor, IS_STOCK_FAN); is_sensor_set_units(sensor, "%"); is_sensor_set_low_value(sensor, 0.0); is_sensor_set_high_value(sensor, 100.0); } else { sensor = is_temperature_sensor_new(path); is_sensor_set_icon(sensor, IS_STOCK_GPU); } /* no decimal places to display */ is_sensor_set_digits(sensor, 0); is_sensor_set_label(sensor, label); /* connect to update-value signal */ g_signal_connect(sensor, "update-value", G_CALLBACK(update_sensor_value), self); is_manager_add_sensor(is_application_get_manager(priv->application), sensor); g_free(path); } free(data); } free(label); } out: return; }
static void is_aticonfig_plugin_activate(PeasActivatable *activatable) { IsATIConfigPlugin *self = IS_ATICONFIG_PLUGIN(activatable); IsManager *manager; gchar *output = NULL; GError *error = NULL; GRegex *regex = NULL; GMatchInfo *match = NULL; gboolean ret; manager = is_application_get_manager(self->priv->application); /* search for sensors and add them to manager */ is_debug("aticonfig", "searching for sensors"); /* call aticonfig with --list-adapters to get available adapters, * then test if each can do temperature and fan speed - if so add * appropriate sensors */ ret = g_spawn_command_line_sync("aticonfig --list-adapters", &output, NULL, NULL, &error); if (!ret) { is_warning("aticonfig", "Error calling aticonfig to detect available sensors: %s", error->message); g_error_free(error); goto out; } regex = g_regex_new("^.*([0-9]+)\\. ([0-9][0-9]:[0-9][0-9]\\.[0-9])\\s*(.*?)\\s*$", G_REGEX_MULTILINE, 0, &error); if (!regex) { is_warning("aticonfig", "Error compiling regex to detect listed sensors: %s", error->message); g_error_free(error); goto out; } ret = g_regex_match(regex, output, 0, &match); if (!ret) { is_warning("aticonfig", "No sensors found in aticonfig output: %s", output); goto out; } while (g_match_info_matches(match)) { gint i; gchar *idx, *pci, *name; gdouble value; gchar *path; IsSensor *sensor; idx = g_match_info_fetch(match, 1); pci = g_match_info_fetch(match, 2); name = g_match_info_fetch(match, 3); i = g_ascii_strtoull(idx, NULL, 10); /* we have an adapter - see if we can get its temperature and fanspeed */ ret = aticonfig_get_temperature(self, i, &value, &error); if (!ret) { is_warning("aticonfig", "Error getting temperature for adapter %d: %s", i, error->message); g_clear_error(&error); } else { path = g_strdup_printf("%s%d%s", ATICONFIG_PATH_PREFIX, i, _("Temperature")); sensor = is_temperature_sensor_new(path); is_sensor_set_label(sensor, name); is_sensor_set_icon(sensor, IS_STOCK_GPU); g_signal_connect(sensor, "update-value", G_CALLBACK(update_sensor_value), self); is_manager_add_sensor(manager, sensor); g_object_unref(sensor); g_free(path); } ret = aticonfig_get_fanspeed(self, i, &value, &error); if (!ret) { is_warning("aticonfig", "Error getting fanpeed for adapter %d: %s", i, error->message); g_clear_error(&error); } else { path = g_strdup_printf("%s%d%s", ATICONFIG_PATH_PREFIX, i, _("Fan")); sensor = is_sensor_new(path); is_sensor_set_label(sensor, name); /* fan sensors are given as a percentage from 0 to 100 */ is_sensor_set_units(sensor, "%"); is_sensor_set_low_value(sensor, 0.0); is_sensor_set_high_value(sensor, 100.0); is_sensor_set_digits(sensor, 0); is_sensor_set_icon(sensor, IS_STOCK_FAN); g_signal_connect(sensor, "update-value", G_CALLBACK(update_sensor_value), self); is_manager_add_sensor(manager, sensor); g_object_unref(sensor); g_free(path); } g_free(idx); g_free(pci); g_free(name); g_match_info_next(match, &error); } out: g_match_info_free(match); if (regex) { g_regex_unref(regex); } g_free(output); return; }