static void
sensor_notify_high_value(IsSensor *sensor,
			 GParamSpec *pspec,
			 IsSensorDialog *self)
{
	gtk_spin_button_set_value(GTK_SPIN_BUTTON(self->priv->high_value),
				  is_sensor_get_high_value(sensor));
}
static void
update_sensor_value(IsSensor *sensor,
		    IsFakePlugin *self)
{
	/* fake value */
	is_sensor_set_value(sensor,
			    g_rand_double_range(self->priv->rand,
						is_sensor_get_low_value(sensor),
						is_sensor_get_high_value(sensor)));
}
void is_temperature_sensor_set_scale(IsTemperatureSensor *self,
                                     IsTemperatureSensorScale scale)
{
  IsTemperatureSensorPrivate *priv;

  g_return_if_fail(IS_IS_TEMPERATURE_SENSOR(self));
  g_return_if_fail(scale == IS_TEMPERATURE_SENSOR_SCALE_CELSIUS ||
                   scale == IS_TEMPERATURE_SENSOR_SCALE_FAHRENHEIT);

  priv = self->priv;

  if (scale != priv->scale)
  {
    gdouble value = is_sensor_get_value(IS_SENSOR(self));
    gdouble alarm_value = is_sensor_get_alarm_value(IS_SENSOR(self));
    gdouble low_value = is_sensor_get_low_value(IS_SENSOR(self));
    gdouble high_value = is_sensor_get_high_value(IS_SENSOR(self));

    /* convert from current scale to new */
    switch (priv->scale)
    {
      case IS_TEMPERATURE_SENSOR_SCALE_CELSIUS:
        value = celcius_to_fahrenheit(value);
        alarm_value = celcius_to_fahrenheit(alarm_value);
        low_value = celcius_to_fahrenheit(low_value);
        high_value = celcius_to_fahrenheit(high_value);
        break;
      case IS_TEMPERATURE_SENSOR_SCALE_FAHRENHEIT:
        value = fahrenheit_to_celcius(value);
        alarm_value = fahrenheit_to_celcius(alarm_value);
        low_value = fahrenheit_to_celcius(low_value);
        high_value = fahrenheit_to_celcius(high_value);
        break;
      case IS_TEMPERATURE_SENSOR_SCALE_INVALID:
      case NUM_IS_TEMPERATURE_SENSOR_SCALE:
      default:
        g_assert_not_reached();
        break;
    }
    priv->scale = scale;
    is_sensor_set_units(IS_SENSOR(self),
                        is_temperature_sensor_scale_to_string(priv->scale));
    /* set all in one go */
    g_object_set(self,
                 "value", value,
                 "alarm-value", alarm_value,
                 "low-value", low_value,
                 "high-value", high_value,
                 NULL);
  }

}
static void
is_sensor_dialog_set_property(GObject *object,
			      guint property_id, const GValue *value, GParamSpec *pspec)
{
	IsSensorDialog *self = IS_SENSOR_DIALOG(object);
	IsSensorDialogPrivate *priv = self->priv;
	gchar *markup;

	switch (property_id) {
	case PROP_SENSOR:
		priv->sensor = g_object_ref(g_value_get_object(value));
		markup = g_strdup_printf("<span weight='bold'>%s: %s</span>",
					 _("Sensor"),
					 is_sensor_get_path(priv->sensor));
		gtk_label_set_markup(GTK_LABEL(priv->path_label),
				     markup);
		g_free(markup);
		gtk_widget_set_sensitive(priv->label_entry, TRUE);
		gtk_entry_set_text(GTK_ENTRY(priv->label_entry),
				   is_sensor_get_label(priv->sensor));
		g_signal_connect(priv->label_entry, "changed",
				 G_CALLBACK(label_changed),
				 self);
		g_signal_connect(priv->sensor, "notify::label",
				 G_CALLBACK(sensor_notify_label),
				 self);
		gtk_widget_set_sensitive(priv->alarm_mode_combo_box, TRUE);
		gtk_combo_box_set_active(GTK_COMBO_BOX(priv->alarm_mode_combo_box),
					 is_sensor_get_alarm_mode(priv->sensor));
		g_signal_connect(priv->alarm_mode_combo_box, "changed",
				 G_CALLBACK(alarm_mode_changed),
				 self);
		g_signal_connect(priv->sensor, "notify::alarm-mode",
				 G_CALLBACK(sensor_notify_alarm_mode),
				 self);

		/* set sensitive so we can update */
		gtk_widget_set_sensitive(priv->alarm_value_spin_button, TRUE);
		gtk_spin_button_set_digits(GTK_SPIN_BUTTON(priv->alarm_value_spin_button),
					   is_sensor_get_digits(priv->sensor));
		gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->alarm_value_spin_button),
					  is_sensor_get_alarm_value(priv->sensor));
		g_signal_connect(priv->alarm_value_spin_button, "value-changed",
				 G_CALLBACK(alarm_value_changed),
				 self);
		g_signal_connect(priv->sensor, "notify::alarm-value",
				 G_CALLBACK(sensor_notify_alarm_value),
				 self);
		gtk_widget_set_sensitive(priv->alarm_value_spin_button,
					 (is_sensor_get_alarm_mode(priv->sensor) !=
					  IS_SENSOR_ALARM_MODE_DISABLED));
		gtk_widget_set_sensitive(priv->units_label, TRUE);
		gtk_label_set_text(GTK_LABEL(priv->units_label),
				   is_sensor_get_units(priv->sensor));
		g_signal_connect(priv->sensor, "notify::units",
				 G_CALLBACK(sensor_notify_units),
				 self);

		gtk_widget_set_sensitive(priv->low_value, TRUE);
		gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->low_value),
					  is_sensor_get_low_value(priv->sensor));
		g_signal_connect(priv->low_value, "value-changed",
				 G_CALLBACK(low_value_changed),
				 self);
		g_signal_connect(priv->sensor, "notify::low-value",
				 G_CALLBACK(sensor_notify_low_value),
				 self);
		gtk_label_set_text(GTK_LABEL(priv->low_units_label),
				   is_sensor_get_units(priv->sensor));

		gtk_widget_set_sensitive(priv->high_value, TRUE);
		gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->high_value),
					  is_sensor_get_high_value(priv->sensor));
		g_signal_connect(priv->high_value, "value-changed",
				 G_CALLBACK(high_value_changed),
				 self);
		g_signal_connect(priv->sensor, "notify::high-value",
				 G_CALLBACK(sensor_notify_high_value),
				 self);
		gtk_label_set_text(GTK_LABEL(priv->high_units_label),
				   is_sensor_get_units(priv->sensor));
		break;
	default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
		break;
	}
}