Example #1
0
static void
is_max_plugin_activate(PeasActivatable *activatable)
{
  IsMaxPlugin *self = IS_MAX_PLUGIN(activatable);
  IsMaxPluginPrivate *priv = self->priv;
  IsManager *manager;
  GSList *sensors, *_list;
  int i = 0;

  manager = is_application_get_manager(priv->application);

  // create our virtual sensor which mimics the current highest value sensor's
  // value and label
  is_debug("max", "creating virtual sensor");
  priv->sensor = is_sensor_new(MAX_SENSOR_PATH);
  is_sensor_set_label(priv->sensor, "Δ");
  is_sensor_set_icon(priv->sensor, IS_STOCK_CHIP);
  is_sensor_set_value(priv->sensor, 0.0);
  is_sensor_set_units(priv->sensor, "");
  is_sensor_set_digits(priv->sensor, 1);
  is_manager_add_sensor(manager, priv->sensor);

  is_debug("max", "attaching to signals");
  sensors = is_manager_get_enabled_sensors_list(manager);
  for (_list = sensors;
       _list != NULL;
       _list = _list->next)
  {
    IsSensor *sensor = IS_SENSOR(_list->data);
    on_sensor_enabled(manager, sensor, i, self);
    g_object_unref(sensor);
    i++;
  }
  g_slist_free(sensors);
  g_signal_connect(manager, "sensor-enabled",
                   G_CALLBACK(on_sensor_enabled), self);
  g_signal_connect(manager, "sensor-disabled",
                   G_CALLBACK(on_sensor_disabled), self);

}
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;
}