Merge lp:~larsu/ido/lp1229076 into lp:ido/13.10

Proposed by Lars Karlitski
Status: Merged
Approved by: Ted Gould
Approved revision: 149
Merged at revision: 149
Proposed branch: lp:~larsu/ido/lp1229076
Merge into: lp:ido/13.10
Diff against target: 141 lines (+59/-9)
1 file modified
src/idoscalemenuitem.c (+59/-9)
To merge this branch: bzr merge lp:~larsu/ido/lp1229076
Reviewer Review Type Date Requested Status
Ted Gould (community) Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+187378@code.launchpad.net

Description of the change

idoscalemenuitem: don't update the action state when the action state changes

GtkRange has the same weird semantics for its "value-changed" signal that the check menu items have: it is emitted not only on user interaction, but also when gtk_range_set_value() is called.

The handler to "value-changed" updates the action. gtk_range_set_value() is called when the action notifies about a state change. Loop, meet loop.

This patch works around that by adding a "value-changed" to IdoScaleMenuItem that is only emitted when the user changes the slider's value.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Ted Gould (ted) wrote :

Code looks fine. I'm not able to reproduce the issue with the previous version. But this version works for me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/idoscalemenuitem.c'
--- src/idoscalemenuitem.c 2013-09-15 18:21:14 +0000
+++ src/idoscalemenuitem.c 2013-09-24 22:29:17 +0000
@@ -76,6 +76,7 @@
76 IdoScaleMenuItemStyle style;76 IdoScaleMenuItemStyle style;
77 IdoRangeStyle range_style;77 IdoRangeStyle range_style;
78 gint toggle_size;78 gint toggle_size;
79 gboolean ignore_value_changed;
79};80};
8081
81enum {82enum {
@@ -83,6 +84,7 @@
83 SLIDER_RELEASED,84 SLIDER_RELEASED,
84 PRIMARY_CLICKED,85 PRIMARY_CLICKED,
85 SECONDARY_CLICKED,86 SECONDARY_CLICKED,
87 VALUE_CHANGED,
86 LAST_SIGNAL88 LAST_SIGNAL
87};89};
8890
@@ -207,6 +209,20 @@
207}209}
208210
209static void211static void
212ido_scale_menu_item_scale_value_changed (GtkRange *range,
213 gpointer user_data)
214{
215 IdoScaleMenuItem *self = user_data;
216 IdoScaleMenuItemPrivate *priv = GET_PRIVATE (self);
217
218 /* The signal is not sent when it was set through
219 * ido_scale_menu_item_set_value(). */
220
221 if (!priv->ignore_value_changed)
222 g_signal_emit (self, signals[VALUE_CHANGED], 0, gtk_range_get_value (range));
223}
224
225static void
210ido_scale_menu_item_constructed (GObject *object)226ido_scale_menu_item_constructed (GObject *object)
211{227{
212 IdoScaleMenuItem *self = IDO_SCALE_MENU_ITEM (object);228 IdoScaleMenuItem *self = IDO_SCALE_MENU_ITEM (object);
@@ -222,6 +238,7 @@
222 NULL);238 NULL);
223239
224 priv->scale = ido_range_new (adj, range_style);240 priv->scale = ido_range_new (adj, range_style);
241 g_signal_connect (priv->scale, "value-changed", G_CALLBACK (ido_scale_menu_item_scale_value_changed), self);
225 g_object_ref (priv->scale);242 g_object_ref (priv->scale);
226 gtk_scale_set_draw_value (GTK_SCALE (priv->scale), FALSE);243 gtk_scale_set_draw_value (GTK_SCALE (priv->scale), FALSE);
227244
@@ -368,6 +385,23 @@
368 G_TYPE_NONE, /* return type */385 G_TYPE_NONE, /* return type */
369 0 /* n_params */);386 0 /* n_params */);
370387
388 /**
389 * IdoScaleMenuItem::value-changed:
390 * @menuitem: the #IdoScaleMenuItem for which the value changed
391 * @value: the new value
392 *
393 * Emitted whenever the value of the contained scale changes because
394 * of user input.
395 */
396 signals[VALUE_CHANGED] = g_signal_new ("value-changed",
397 IDO_TYPE_SCALE_MENU_ITEM,
398 G_SIGNAL_RUN_LAST,
399 0, NULL, NULL,
400 g_cclosure_marshal_VOID__DOUBLE,
401 G_TYPE_NONE,
402 1, G_TYPE_DOUBLE);
403
404
371 g_type_class_add_private (item_class, sizeof (IdoScaleMenuItemPrivate));405 g_type_class_add_private (item_class, sizeof (IdoScaleMenuItemPrivate));
372}406}
373407
@@ -977,6 +1011,26 @@
977 gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj));1011 gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj));
978}1012}
9791013
1014/* ido_scale_menu_item_set_value:
1015 *
1016 * Sets the value of the scale inside @item to @value, without emitting
1017 * "value-changed".
1018 */
1019static void
1020ido_scale_menu_item_set_value (IdoScaleMenuItem *item,
1021 gdouble value)
1022{
1023 IdoScaleMenuItemPrivate *priv = GET_PRIVATE (item);
1024
1025 /* set ignore_value_changed to signify to the scale menu item that it
1026 * should not emit its own value-changed signal, as that should only
1027 * be emitted when the value is changed by the user. */
1028
1029 priv->ignore_value_changed = TRUE;
1030 gtk_range_set_value (GTK_RANGE (priv->scale), value);
1031 priv->ignore_value_changed = FALSE;
1032}
1033
980/**1034/**
981 * ido_scale_menu_item_state_changed:1035 * ido_scale_menu_item_state_changed:
982 *1036 *
@@ -988,20 +1042,19 @@
988 GVariant *state,1042 GVariant *state,
989 gpointer user_data)1043 gpointer user_data)
990{1044{
991 GtkWidget *scale;1045 GtkWidget *menuitem;
9921046
993 scale = ido_scale_menu_item_get_scale (IDO_SCALE_MENU_ITEM (ido_action_helper_get_widget (helper)));1047 menuitem = ido_action_helper_get_widget (helper);
994 gtk_range_set_value (GTK_RANGE (scale), g_variant_get_double (state));1048 ido_scale_menu_item_set_value (IDO_SCALE_MENU_ITEM (menuitem), g_variant_get_double (state));
995}1049}
9961050
997static void1051static void
998ido_scale_menu_item_value_changed (GtkScale *scale,1052ido_scale_menu_item_value_changed (GtkScale *scale,
1053 gdouble value,
999 gpointer user_data)1054 gpointer user_data)
1000{1055{
1001 IdoActionHelper *helper = user_data;1056 IdoActionHelper *helper = user_data;
1002 gdouble value;
10031057
1004 value = gtk_range_get_value (GTK_RANGE (scale));
1005 ido_action_helper_change_action_state (helper, g_variant_new_double (value));1058 ido_action_helper_change_action_state (helper, g_variant_new_double (value));
1006}1059}
10071060
@@ -1046,15 +1099,12 @@
1046 if (g_menu_item_get_attribute (menuitem, "action", "s", &action))1099 if (g_menu_item_get_attribute (menuitem, "action", "s", &action))
1047 {1100 {
1048 IdoActionHelper *helper;1101 IdoActionHelper *helper;
1049 GtkWidget *scale;
10501102
1051 helper = ido_action_helper_new (item, actions, action, NULL);1103 helper = ido_action_helper_new (item, actions, action, NULL);
1052 g_signal_connect (helper, "action-state-changed",1104 g_signal_connect (helper, "action-state-changed",
1053 G_CALLBACK (ido_scale_menu_item_state_changed), NULL);1105 G_CALLBACK (ido_scale_menu_item_state_changed), NULL);
10541106
1055 scale = ido_scale_menu_item_get_scale (IDO_SCALE_MENU_ITEM (item));1107 g_signal_connect (item, "value-changed", G_CALLBACK (ido_scale_menu_item_value_changed), helper);
1056 g_signal_connect (scale, "value-changed", G_CALLBACK (ido_scale_menu_item_value_changed), helper);
1057
1058 g_signal_connect_swapped (item, "destroy", G_CALLBACK (g_object_unref), helper);1108 g_signal_connect_swapped (item, "destroy", G_CALLBACK (g_object_unref), helper);
10591109
1060 g_free (action);1110 g_free (action);

Subscribers

People subscribed via source and target branches