summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/trg-menu-bar.c21
-rw-r--r--src/trg-prefs.c27
-rw-r--r--src/trg-prefs.h1
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);