Remove deprecated define.
[claws.git] / src / mimeview.c
index e1598f381956de7f154e6dd73b28876423dd1620..bb14a60ec5786f7622ba0847bf46532e7d4c8696 100644 (file)
@@ -63,9 +63,10 @@ typedef enum
        COL_SIZE     = 1,
        COL_NAME     = 2,
        COL_DATA     = 3,
+       N_MIMEVIEW_COLUMNS
 } MimeViewColumnPos;
 
-#define N_MIMEVIEW_COLS        4
+#define N_MIMEVIEW_COLS        (N_MIMEVIEW_COLUMNS)
 
 static void mimeview_set_multipart_tree                (MimeView       *mimeview,
                                                 MimeInfo       *mimeinfo,
@@ -157,6 +158,33 @@ static void mimeview_open_with_cb(GtkAction *action, gpointer data)
 }
 #endif
 
+static void mimeview_copy_cb(GtkAction *action, gpointer data)
+{
+       MimeView *mimeview = (MimeView *)data;
+       MimeInfo *mimeinfo = mimeview_get_part_to_use(mimeview);
+
+       if (mimeinfo == NULL)
+               return;
+
+       if (mimeinfo->type == MIMETYPE_IMAGE) {
+               GError *error = NULL;
+               GdkPixbuf *pixbuf = procmime_get_part_as_pixbuf(mimeinfo, &error);
+               if (error != NULL) {
+                       g_warning("could not copy: %s", error->message);
+                       g_error_free(error);
+               } else {
+                       gtk_clipboard_set_image(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD),
+                                               pixbuf);
+               }
+               g_object_unref(pixbuf);
+       } else {
+               void *data = procmime_get_part_as_string(mimeinfo, FALSE);
+               gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD),
+                                      data, mimeinfo->length);
+               g_free(data);
+       }
+}
+
 static void mimeview_send_to_cb(GtkAction *action, gpointer data)
 {
        MimeView *mimeview = (MimeView *)data;  
@@ -194,6 +222,7 @@ static GtkActionEntry mimeview_menu_actions[] = {
 #if (!defined G_OS_WIN32)
        { "MimeView/OpenWith", NULL, N_("Open _with..."), NULL, "Open MIME part with...", G_CALLBACK(mimeview_open_with_cb) },
 #endif
+       { "MimeView/Copy", NULL, N_("Copy"), NULL, "Copy", G_CALLBACK(mimeview_copy_cb) },
        { "MimeView/SendTo", NULL, N_("Send to..."), NULL, "Send to", G_CALLBACK(mimeview_send_to_cb) },
        { "MimeView/DisplayAsText", NULL, N_("_Display as text"), NULL, "Display as text", G_CALLBACK(mimeview_display_as_text_cb) },
        { "MimeView/SaveAs", NULL, N_("_Save as..."), NULL, "Save as", G_CALLBACK(mimeview_save_as_cb) },
@@ -400,6 +429,9 @@ MimeView *mimeview_create(MainWindow *mainwin)
                        GTK_UI_MANAGER_MENUITEM);
 #endif
        MENUITEM_ADDUI_MANAGER(mimeview->ui_manager, 
+                       "/Menus/MimeView/", "Copy", "MimeView/Copy",
+                       GTK_UI_MANAGER_MENUITEM);
+       MENUITEM_ADDUI_MANAGER(mimeview->ui_manager,
                        "/Menus/MimeView/", "SendTo", "MimeView/SendTo",
                        GTK_UI_MANAGER_MENUITEM);
        MENUITEM_ADDUI_MANAGER(mimeview->ui_manager, 
@@ -1275,7 +1307,7 @@ static void mimeview_check_sig_in_thread(MimeView *mimeview)
                        mimeview_check_sig_worker_thread, 
                        mimeview) != 0) {
                /* arh. We'll do it synchronously. */
-               g_warning("can't create thread");
+               g_warning("can't create checked thread");
                g_free(mimeview->check_data);
                mimeview->check_data = NULL;
                return;
@@ -1285,12 +1317,17 @@ static void mimeview_check_sig_in_thread(MimeView *mimeview)
        }
 
        /* create the killer thread */
-       pthread_create(&th2, &detach2, 
+       if (pthread_create(&th2, &detach2, 
                        mimeview_check_sig_cancel_thread, 
-                       mimeview);
-
-       mimeview->check_data->cancel_th = th2;
-       mimeview->check_data->cancel_th_init = TRUE;
+                       mimeview) != 0) {
+               g_warning("can't create killer thread");
+               g_free(mimeview->check_data);
+               mimeview->check_data = NULL;
+               return;
+       } else {
+               mimeview->check_data->cancel_th = th2;
+               mimeview->check_data->cancel_th_init = TRUE;
+       }
 }
 #endif
 
@@ -1491,17 +1528,17 @@ static gboolean mimeview_scrolled(GtkWidget *widget, GdkEventScroll *event,
        return TRUE;
 }
 
-/* from gdkevents.c */
-#define DOUBLE_CLICK_TIME 250
-
 static gboolean part_button_pressed(MimeView *mimeview, GdkEventButton *event, 
                                    MimeInfo *partinfo)
 {
        static MimeInfo *lastinfo;
        static guint32 lasttime;
 
+       gint double_click_time;
+       g_object_get(gtk_settings_get_default(), "gtk-double-click-time", &double_click_time, NULL);
+
        if (event->button == 2 ||
-           (event->button == 1 && (event->time - lasttime) < DOUBLE_CLICK_TIME && lastinfo == partinfo)) {
+           (event->button == 1 && (event->time - lasttime) < double_click_time && lastinfo == partinfo)) {
                /* call external program for image, audio or html */
                mimeview_launch(mimeview, partinfo);
                return TRUE;
@@ -1514,6 +1551,13 @@ static gboolean part_button_pressed(MimeView *mimeview, GdkEventButton *event,
                        cm_menu_set_sensitive_full(mimeview->ui_manager, "Menus/MimeView/DisplayAsText", FALSE);
                else
                        cm_menu_set_sensitive_full(mimeview->ui_manager, "Menus/MimeView/DisplayAsText", TRUE);
+
+               if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
+                                partinfo->type == MIMETYPE_IMAGE ||
+                                partinfo->type == MIMETYPE_TEXT))
+                       cm_menu_set_sensitive_full(mimeview->ui_manager, "Menus/MimeView/Copy", TRUE);
+               else
+                       cm_menu_set_sensitive_full(mimeview->ui_manager, "Menus/MimeView/Copy", FALSE);
 #ifndef G_OS_WIN32
                if (partinfo &&
                    partinfo->type == MIMETYPE_APPLICATION &&
@@ -2290,11 +2334,11 @@ static void mimeview_view_file(const gchar *filename, MimeInfo *partinfo,
        if ((SHGetFileInfo((LPCWSTR)fn16, 0, &file_info, sizeof(SHFILEINFO), SHGFI_EXETYPE)) != 0) {
                AlertValue val = alertpanel_full(_("Execute untrusted binary?"), 
                                      _("This attachment is an executable file. Executing "
-                                       "untrusted binaries is dangerous and could probably "
-                                       "lead to compromission of your computer.\n\n"
+                                       "untrusted binaries is dangerous and could compromise "
+                                       "your computer.\n\n"
                                        "Do you want to run this file?"), GTK_STOCK_CANCEL, 
                                        _("Run binary"),
-                                     NULL, FALSE, NULL, ALERT_WARNING, G_ALERTDEFAULT);
+                                     NULL, ALERTFOCUS_FIRST, FALSE, NULL, ALERT_WARNING);
                if (val == G_ALERTALTERNATE) {
                        debug_print("executing binary\n");
                        ShellExecute(NULL, L"open", (LPCWSTR)fn16, NULL, NULL, SW_SHOW);
@@ -2619,8 +2663,12 @@ static void icon_list_append_icon (MimeView *mimeview, MimeInfo *mimeinfo)
                g_free(escaped);
        }
        if (sigshort && *sigshort) {
-               tiptmp = g_strjoin("\n", tip, g_markup_escape_text(sigshort, -1), NULL);
+               gchar *sigshort_escaped =
+                       g_markup_escape_text(sigshort, -1);
+
+               tiptmp = g_strjoin("\n", tip, sigshort_escaped, NULL);
                g_free(tip);
+               g_free(sigshort_escaped);
                tip = tiptmp;
        }
        g_free(sigshort);