From 098b06524243b6c9a66fd1702796634d448f3341 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Thu, 1 Aug 2013 17:48:47 +0200 Subject: Bug #699603 - Message list scrolls to cursor on style change --- e-util/e-tree.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'e-util/e-tree.c') diff --git a/e-util/e-tree.c b/e-util/e-tree.c index de11f96d19..208b2687f2 100644 --- a/e-util/e-tree.c +++ b/e-util/e-tree.c @@ -157,6 +157,8 @@ struct _ETreePrivate { gint length_threshold; + GtkAdjustment *table_canvas_vadjustment; + /* * Configuration settings */ @@ -491,10 +493,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; @@ -1235,6 +1243,40 @@ table_canvas_focus_event_cb (GtkWidget *widget, return TRUE; } +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 *tree) { @@ -1281,6 +1323,10 @@ e_tree_setup_table (ETree *tree) tree->priv->table_canvas, "reflow", G_CALLBACK (tree_canvas_reflow), tree); + et_setup_table_canvas_vadjustment (tree); + g_signal_connect_swapped (tree->priv->table_canvas, "notify::vadjustment", + G_CALLBACK (et_setup_table_canvas_vadjustment), tree); + widget = GTK_WIDGET (tree->priv->table_canvas); style = gtk_widget_get_style (widget); -- cgit v1.2.3