#include "timing.h"
#include "manage_window.h"
#include "privacy.h"
-#include "claws_io.h"
+#include "file-utils.h"
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,
}
#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;
#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) },
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,
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;
}
/* 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
MimeView *mimeview = (MimeView *) user_data;
MimeInfo *mimeinfo = mimeview->siginfo;
- if (mimeinfo == NULL)
+ if (mimeinfo == NULL || !noticeview_is_visible(mimeview->siginfoview))
return;
#ifdef USE_PTHREAD
if (mimeview->check_data)
noticeview_show(mimeview->siginfoview);
}
+void mimeview_show_part_as_text(MimeView *mimeview, MimeInfo *partinfo)
+{
+ cm_return_if_fail(mimeview != NULL);
+ cm_return_if_fail(partinfo != NULL);
+
+ mimeview_show_message_part(mimeview, partinfo);
+}
+
static void mimeview_selected(GtkTreeSelection *selection, MimeView *mimeview)
{
GtkTreeView *ctree = GTK_TREE_VIEW(mimeview->ctree);
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;
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 &&
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);
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);