diff options
-rw-r--r-- | src/trg-menu-bar.c | 21 | ||||
-rw-r--r-- | src/trg-prefs.c | 27 | ||||
-rw-r--r-- | src/trg-prefs.h | 1 |
3 files changed, 40 insertions, 9 deletions
diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c index a206179..2d955d8 100644 --- a/src/trg-menu-bar.c +++ b/src/trg-menu-bar.c @@ -57,6 +57,8 @@ enum { PROP_START_NOW }; +#define G_DATAKEY_CONF_KEY "conf-key" + G_DEFINE_TYPE(TrgMenuBar, trg_menu_bar, GTK_TYPE_MENU_BAR) #define TRG_MENU_BAR_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_MENU_BAR, TrgMenuBarPrivate)) @@ -293,7 +295,7 @@ GtkWidget *trg_menu_bar_item_new(GtkMenuShell * shell, char *text, static void view_menu_item_toggled_cb(GtkCheckMenuItem * w, gpointer data) { TrgPrefs *p = TRG_PREFS(data); - gchar *key = (gchar*)g_object_get_data(G_OBJECT(w), "conf-key"); + gchar *key = (gchar*)g_object_get_data(G_OBJECT(w), G_DATAKEY_CONF_KEY); trg_prefs_set_bool(p, key, gtk_check_menu_item_get_active(w), TRG_PREFS_GLOBAL); } @@ -302,21 +304,22 @@ static void view_menu_bar_toggled_dependency_cb(GtkCheckMenuItem *w, gpointer da gtk_widget_set_sensitive(GTK_WIDGET(data), gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w))); } -static void trg_menu_bar_view_item_exposed(GtkWidget *w, GdkEvent *event G_GNUC_UNUSED, gpointer data) +static void trg_menu_bar_view_item_update(TrgPrefs *p, gchar *updatedKey, gpointer data) { - TrgPrefs *prefs = TRG_PREFS(data); - gchar *key = (gchar*)g_object_get_data(G_OBJECT(w), "conf-key"); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM - (w), trg_prefs_get_bool(prefs, key, TRG_PREFS_GLOBAL)); + gchar *key = (gchar*)g_object_get_data(G_OBJECT(data), G_DATAKEY_CONF_KEY); + if (!g_strcmp0(updatedKey, key)) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(data) , trg_prefs_get_bool(p, key, TRG_PREFS_GLOBAL)); } static GtkWidget *trg_menu_bar_view_item_new(TrgPrefs *prefs, gchar *key, gchar *label, GtkWidget *dependency) { GtkWidget *w = gtk_check_menu_item_new_with_label(label); - g_object_set_data_full(G_OBJECT(w), "conf-key", g_strdup(key), + g_object_set_data_full(G_OBJECT(w), G_DATAKEY_CONF_KEY, g_strdup(key), g_free); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w) , trg_prefs_get_bool(prefs, key, TRG_PREFS_GLOBAL)); + if (dependency) { gtk_widget_set_sensitive(w, gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(dependency))); g_signal_connect(dependency, "toggled", @@ -325,8 +328,8 @@ static GtkWidget *trg_menu_bar_view_item_new(TrgPrefs *prefs, gchar *key, g_signal_connect(w, "toggled", G_CALLBACK(view_menu_item_toggled_cb), prefs); - g_signal_connect(w, "expose-event", - G_CALLBACK(trg_menu_bar_view_item_exposed), prefs); + g_signal_connect(prefs, "pref-changed", + G_CALLBACK(trg_menu_bar_view_item_update), w); return w; } diff --git a/src/trg-prefs.c b/src/trg-prefs.c index 7ea742f..32315cd 100644 --- a/src/trg-prefs.c +++ b/src/trg-prefs.c @@ -43,6 +43,18 @@ struct _TrgPrefsPrivate { gchar *file; }; +enum { + PREF_CHANGE, + PREFS_SIGNAL_COUNT +}; + +static guint signals[PREFS_SIGNAL_COUNT] = { 0 }; + +static void trg_prefs_changed_emit_signal(TrgPrefs *p, gchar *key) +{ + g_signal_emit(p, signals[PREF_CHANGE], 0, key); +} + static void trg_prefs_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { switch (property_id) { @@ -108,6 +120,15 @@ static void trg_prefs_class_init(TrgPrefsClass *klass) { object_class->set_property = trg_prefs_set_property; object_class->dispose = trg_prefs_dispose; object_class->constructor = trg_prefs_constructor; + + signals[PREF_CHANGE] = + g_signal_new("pref-changed", + G_TYPE_FROM_CLASS(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET(TrgPrefsClass, + pref_changed), NULL, + NULL, g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); } static void trg_prefs_init(TrgPrefs *self) { @@ -213,12 +234,14 @@ gboolean trg_prefs_get_bool(TrgPrefs *p, gchar *key, int flags) { void trg_prefs_set_int(TrgPrefs *p, gchar *key, int value, int flags) { JsonNode *node = trg_prefs_get_value(p, key, flags | TRG_PREFS_NEWNODE); json_node_set_int(node, (gint64) value); + trg_prefs_changed_emit_signal(p, key); } void trg_prefs_set_string(TrgPrefs *p, gchar *key, const gchar *value, int flags) { JsonNode *node = trg_prefs_get_value(p, key, flags | TRG_PREFS_NEWNODE); json_node_set_string(node, value); + trg_prefs_changed_emit_signal(p, key); } void trg_prefs_set_profile(TrgPrefs *p, JsonObject *profile) { @@ -238,6 +261,8 @@ void trg_prefs_set_profile(TrgPrefs *p, JsonObject *profile) { } g_list_free(profiles); + + trg_prefs_changed_emit_signal(p, NULL); } JsonObject *trg_prefs_new_profile(TrgPrefs *p) { @@ -280,11 +305,13 @@ JsonArray* trg_prefs_get_profiles(TrgPrefs *p) { void trg_prefs_set_double(TrgPrefs *p, gchar *key, gdouble value, int flags) { JsonNode *node = trg_prefs_get_value(p, key, flags | TRG_PREFS_NEWNODE); json_node_set_double(node, value); + trg_prefs_changed_emit_signal(p, key); } void trg_prefs_set_bool(TrgPrefs *p, gchar *key, gboolean value, int flags) { JsonNode *node = trg_prefs_get_value(p, key, flags | TRG_PREFS_NEWNODE); json_node_set_boolean(node, value); + trg_prefs_changed_emit_signal(p, key); } gboolean trg_prefs_save(TrgPrefs *p) { diff --git a/src/trg-prefs.h b/src/trg-prefs.h index 422b8a9..b76e8cb 100644 --- a/src/trg-prefs.h +++ b/src/trg-prefs.h @@ -96,6 +96,7 @@ typedef struct { typedef struct { GObjectClass parent_class; + void (*pref_changed) (TrgPrefs *tc, gchar *key, gpointer data); } TrgPrefsClass; GType trg_prefs_get_type (void); |