+ return NULL;
+}
+
+static struct sensor_pref *
+get_selected_sensor_pref(GtkBuilder *builder, struct sensor_pref **ps)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ struct sensor_pref *pref = NULL;
+ GtkTreeSelection *selection;
+ GtkTreeView *tree;
+
+ tree = GTK_TREE_VIEW(gtk_builder_get_object(builder,
+ "sensors_list"));
+
+ selection = gtk_tree_view_get_selection(tree);
+
+ if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ GtkTreePath *p = gtk_tree_model_get_path(model, &iter);
+ gint *indices = gtk_tree_path_get_indices(p);
+
+ pref = ps[*indices];
+
+ gtk_tree_path_free(p);
+ }
+
+ return pref;
+}
+
+static void on_name_changed(GtkEntry *entry, gpointer data)
+{
+ struct cb_data *cbdata = data;
+ struct sensor_pref *p;
+ const char *str;
+
+ str = gtk_entry_get_text(entry);
+
+ p = get_selected_sensor_pref(cbdata->builder, cbdata->prefs);
+
+ if (p && strcmp(p->name, str)) {
+ free(p->name);
+ p->name = strdup(str);
+ }
+}
+
+static void
+on_drawed_toggled(GtkToggleButton *btn, gpointer data)
+{
+ struct cb_data *cbdata = data;
+ struct sensor_pref *p;
+
+ p = get_selected_sensor_pref(cbdata->builder, cbdata->prefs);
+
+ if (p)
+ p->enabled = gtk_toggle_button_get_active(btn);
+}
+
+static void
+on_alarm_toggled(GtkToggleButton *btn, gpointer data)
+{
+ struct cb_data *cbdata = data;
+ struct sensor_pref *p;
+
+ p = get_selected_sensor_pref(cbdata->builder, cbdata->prefs);
+
+ if (p)
+ p->alarm_enabled = gtk_toggle_button_get_active(btn);
+}
+
+static void
+on_appindicator_toggled(GtkToggleButton *btn, gpointer data)
+{
+ struct cb_data *cbdata = data;
+ struct sensor_pref *p;
+
+ p = get_selected_sensor_pref(cbdata->builder, cbdata->prefs);
+
+ if (p)
+ p->appindicator_enabled = gtk_toggle_button_get_active(btn);
+}
+
+static void on_color_set(GtkColorButton *widget, gpointer data)
+{
+ struct cb_data *cbdata = data;
+ struct sensor_pref *p;
+ GdkColor color;
+
+ p = get_selected_sensor_pref(cbdata->builder, cbdata->prefs);
+
+ if (p) {
+ gtk_color_button_get_color(widget, &color);
+ color_set(p->color, color.red, color.green, color.blue);
+ }
+}
+
+static void on_alarm_high_threshold_changed(GtkSpinButton *btn, gpointer data)
+{
+ struct cb_data *cbdata;
+ struct sensor_pref *p;
+
+ cbdata = data;
+
+ p = get_selected_sensor_pref(cbdata->builder, cbdata->prefs);
+
+ if (p)
+ p->alarm_high_threshold = gtk_spin_button_get_value(btn);
+}
+
+static void on_alarm_low_threshold_changed(GtkSpinButton *btn, gpointer data)
+{
+ struct cb_data *cbdata;
+ struct sensor_pref *p;
+
+ cbdata = data;
+
+ p = get_selected_sensor_pref(cbdata->builder, cbdata->prefs);
+
+ if (p)
+ p->alarm_low_threshold = gtk_spin_button_get_value(btn);
+}
+
+static void connect_signals(GtkBuilder *builder, struct cb_data *cbdata)
+{
+ g_signal_connect(gtk_builder_get_object(builder, "sensor_name"),
+ "changed", G_CALLBACK(on_name_changed), cbdata);
+
+ g_signal_connect(gtk_builder_get_object(builder, "sensor_draw"),
+ "toggled", G_CALLBACK(on_drawed_toggled), cbdata);
+
+ g_signal_connect(gtk_builder_get_object(builder, "sensor_color"),
+ "color-set", G_CALLBACK(on_color_set), cbdata);
+
+ g_signal_connect(gtk_builder_get_object(builder, "sensor_alarm"),
+ "toggled", G_CALLBACK(on_alarm_toggled), cbdata);
+
+ g_signal_connect(gtk_builder_get_object(builder,
+ "sensor_alarm_high_threshold"),
+ "value-changed",
+ G_CALLBACK(on_alarm_high_threshold_changed),
+ cbdata);
+
+ g_signal_connect(gtk_builder_get_object(builder,
+ "sensor_alarm_low_threshold"),
+ "value-changed",
+ G_CALLBACK(on_alarm_low_threshold_changed),
+ cbdata);
+
+ g_signal_connect(gtk_builder_get_object(builder,
+ "indicator_checkbox"),
+ "toggled",
+ G_CALLBACK(on_appindicator_toggled),
+ cbdata);
+}
+
+static void
+update_pref(struct psensor *s,
+ struct sensor_pref **prefs,
+ struct config *cfg,
+ GtkBuilder *builder)
+{
+ GtkLabel *w_id, *w_type, *w_high_threshold_unit, *w_low_threshold_unit,
+ *w_chipname;
+ GtkEntry *w_name;
+ GtkToggleButton *w_draw, *w_alarm, *w_appindicator_enabled;
+ GtkColorButton *w_color;
+ GtkSpinButton *w_high_threshold, *w_low_threshold;
+ GdkColor *color;
+ struct sensor_pref *p = sensor_pref_get(prefs, s);
+ int use_celcius;
+