diff options
author | Milan Crha <mcrha@redhat.com> | 2013-08-01 23:46:42 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2013-08-01 23:46:42 +0800 |
commit | ba0b8895f89ff97f424371ff4efab48dbccc0e18 (patch) | |
tree | 9bea847aa334419ffbdc01cbbba611f7680a766e /e-util/e-tree.c | |
parent | 7ef4b7616e7563f8c7181117d8ae16b044848a02 (diff) | |
download | gsoc2013-evolution-ba0b8895f89ff97f424371ff4efab48dbccc0e18.tar gsoc2013-evolution-ba0b8895f89ff97f424371ff4efab48dbccc0e18.tar.gz gsoc2013-evolution-ba0b8895f89ff97f424371ff4efab48dbccc0e18.tar.bz2 gsoc2013-evolution-ba0b8895f89ff97f424371ff4efab48dbccc0e18.tar.lz gsoc2013-evolution-ba0b8895f89ff97f424371ff4efab48dbccc0e18.tar.xz gsoc2013-evolution-ba0b8895f89ff97f424371ff4efab48dbccc0e18.tar.zst gsoc2013-evolution-ba0b8895f89ff97f424371ff4efab48dbccc0e18.zip |
Bug #699603 - Message list scrolls to cursor on style change
Diffstat (limited to 'e-util/e-tree.c')
-rw-r--r-- | e-util/e-tree.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/e-util/e-tree.c b/e-util/e-tree.c index 42ec7aadb2..0bea168dc9 100644 --- a/e-util/e-tree.c +++ b/e-util/e-tree.c @@ -158,6 +158,8 @@ struct _ETreePrivate { gint length_threshold; + GtkAdjustment *table_canvas_vadjustment; + /* * Configuration settings */ @@ -497,10 +499,16 @@ et_dispose (GObject *object) priv->info_text_resize_id = 0; if (priv->table_canvas != NULL) { + g_signal_handlers_disconnect_by_data (priv->table_canvas, object); gtk_widget_destroy (GTK_WIDGET (priv->table_canvas)); priv->table_canvas = NULL; } + if (priv->table_canvas_vadjustment) { + g_signal_handlers_disconnect_by_data (priv->table_canvas_vadjustment, object); + g_clear_object (&priv->table_canvas_vadjustment); + } + /* do not unref it, it was owned by priv->table_canvas */ priv->item = NULL; @@ -1236,6 +1244,40 @@ table_canvas_focus_event_cb (GtkWidget *widget, } static void +e_tree_table_canvas_scrolled_cb (GtkAdjustment *vadjustment, + GParamSpec *param, + ETree *tree) +{ + g_return_if_fail (E_IS_TREE (tree)); + + if (tree->priv->item) + e_table_item_cursor_scrolled (E_TABLE_ITEM (tree->priv->item)); +} + +static void +et_setup_table_canvas_vadjustment (ETree *tree) +{ + GtkAdjustment *vadjustment = NULL; + + g_return_if_fail (E_IS_TREE (tree)); + + if (tree->priv->table_canvas_vadjustment) { + g_signal_handlers_disconnect_by_data (tree->priv->table_canvas_vadjustment, tree); + g_clear_object (&tree->priv->table_canvas_vadjustment); + } + + if (tree->priv->table_canvas) + vadjustment = gtk_scrollable_get_vadjustment ( + GTK_SCROLLABLE (tree->priv->table_canvas)); + + if (vadjustment) { + tree->priv->table_canvas_vadjustment = g_object_ref (vadjustment); + g_signal_connect (vadjustment, "notify::value", + G_CALLBACK (e_tree_table_canvas_scrolled_cb), tree); + } +} + +static void e_tree_setup_table (ETree *e_tree) { GtkWidget *widget; @@ -1281,6 +1323,10 @@ e_tree_setup_table (ETree *e_tree) e_tree->priv->table_canvas, "reflow", G_CALLBACK (tree_canvas_reflow), e_tree); + et_setup_table_canvas_vadjustment (e_tree); + g_signal_connect_swapped (e_tree->priv->table_canvas, "notify::vadjustment", + G_CALLBACK (et_setup_table_canvas_vadjustment), e_tree); + widget = GTK_WIDGET (e_tree->priv->table_canvas); style = gtk_widget_get_style (widget); |