+ TnyHeader *header;
+ ModestHeaderWindow *self;
+ ModestHeaderWindowPrivate *priv;
+
+ self = (ModestHeaderWindow *) user_data;
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+
+ header = modest_header_view_get_header_at_pos ((ModestHeaderView *) priv->header_view,
+ priv->x_coord, priv->y_coord);
+
+ if (header) {
+ tny_header_unset_flag (header, TNY_HEADER_FLAG_SEEN);
+ g_object_unref (header);
+ }
+}
+
+static void
+on_header_view_model_destroyed (gpointer user_data,
+ GObject *model)
+{
+ ModestHeaderWindow *self;
+ ModestHeaderWindowPrivate *priv;
+
+ self = (ModestHeaderWindow *) user_data;
+ if (!GTK_IS_WIDGET (self))
+ return;
+
+ priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+ priv->model_weak_ref = NULL;
+
+ priv->sort_column_handler = 0;
+}
+
+static void
+on_header_view_model_changed (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data)
+{
+ ModestHeaderWindow *self = (ModestHeaderWindow *) user_data;
+ ModestHeaderWindowPrivate *priv = MODEST_HEADER_WINDOW_GET_PRIVATE (self);
+ GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (gobject));
+
+ if (priv->model_weak_ref ) {
+ g_object_weak_unref ((GObject *) priv->model_weak_ref,
+ on_header_view_model_destroyed,
+ self);
+ if (g_signal_handler_is_connected (G_OBJECT (priv->model_weak_ref),
+ priv->sort_column_handler)) {
+ g_signal_handler_disconnect (G_OBJECT (priv->model_weak_ref),
+ priv->sort_column_handler);
+ }
+ on_header_view_model_destroyed (self, (GObject *) priv->model_weak_ref);
+ }
+
+ if (!model)
+ return;
+
+ /* Connect the signal. Listen to object destruction to disconnect it */
+ priv->sort_column_handler = g_signal_connect ((GObject *) model,
+ "sort-column-changed",
+ G_CALLBACK (on_sort_column_changed),
+ self);
+ priv->model_weak_ref = model;
+ g_object_weak_ref ((GObject *) model, on_header_view_model_destroyed, self);