Fixes NB#132390, added a couple of extra checks to prevent invalid dereferences
[modest] / src / widgets / modest-attachments-view.c
index cb26f1e..3fae008 100644 (file)
@@ -60,6 +60,7 @@ struct _ModestAttachmentsViewPrivate
        GList *selected;
        GtkWidget *rubber_start;
        GtkWidget *press_att_view;
+       GtkWidget *previous_selection;
        ModestAttachmentsViewStyle style;
 };
 
@@ -149,13 +150,11 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        priv->selected = NULL;
 
        gtk_container_foreach (GTK_CONTAINER (priv->box), (GtkCallback) gtk_widget_destroy, NULL);
-       
-       if (priv->msg == NULL) {
+
+       if (priv->msg == NULL)
                return;
-       }
 
        part_to_check = modest_tny_msg_get_attachments_parent (TNY_MSG (msg));
-
        msg_content_type = modest_tny_mime_part_get_content_type (TNY_MIME_PART (part_to_check));
        is_alternate = !strcasecmp (msg_content_type, "multipart/alternative");
 
@@ -168,7 +167,7 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
                g_free (msg_content_type);
 
                header_content_type = modest_tny_mime_part_get_headers_content_type (TNY_MIME_PART (part_to_check));
-               
+
                if ((header_content_type != NULL) && 
                    !strstr (header_content_type, "application/")) {
                        application_multipart = TRUE;
@@ -234,7 +233,6 @@ modest_attachments_view_set_message (ModestAttachmentsView *attachments_view, Tn
        g_object_unref (iter);
        g_object_unref (parts);
        g_object_unref (part_to_check);
-       
 
        gtk_widget_queue_draw (GTK_WIDGET (attachments_view));
 
@@ -472,12 +470,16 @@ button_press_event (GtkWidget *widget,
                if (att_view != NULL) {
                        if (priv->style == MODEST_ATTACHMENTS_VIEW_STYLE_NO_FOCUS) {
                                unselect_all (MODEST_ATTACHMENTS_VIEW (widget));
-                       } else if ((priv->style == MODEST_ATTACHMENTS_VIEW_STYLE_LINKS) ||
-                           (GTK_WIDGET_STATE (att_view) == GTK_STATE_SELECTED && (g_list_length (priv->selected) < 2))) {
+                       } else if (priv->style == MODEST_ATTACHMENTS_VIEW_STYLE_LINKS) {
                                priv->press_att_view = att_view;
                                set_selected (MODEST_ATTACHMENTS_VIEW (widget), MODEST_ATTACHMENT_VIEW (att_view));
                                gtk_grab_add (widget);
                        } else {
+                               if (g_list_length (priv->selected) == 1) {
+                                       priv->previous_selection = GTK_WIDGET (priv->selected->data);
+                               } else {
+                                       priv->previous_selection = NULL;
+                               }
                                TnyMimePart *mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
 
                                /* Do not select purged attachments */
@@ -517,7 +519,14 @@ button_release_event (GtkWidget *widget,
                        priv->press_att_view = NULL;
                } else {
 
-                       if (att_view != NULL) {
+                       if (priv->style != MODEST_ATTACHMENTS_VIEW_STYLE_NO_FOCUS &&
+                           priv->rubber_start == att_view  && 
+                           priv->previous_selection == att_view) {
+                               TnyMimePart *mime_part;
+                               mime_part = tny_mime_part_view_get_part (TNY_MIME_PART_VIEW (att_view));
+                               g_signal_emit (G_OBJECT (widget), signals[ACTIVATE_SIGNAL], 0, mime_part);
+                               g_object_unref (mime_part);
+                       } else if (att_view != NULL) {
                                unselect_all (MODEST_ATTACHMENTS_VIEW (widget));
                                select_range (MODEST_ATTACHMENTS_VIEW (widget), 
                                              MODEST_ATTACHMENT_VIEW (priv->rubber_start),