/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2008 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static void mimeview_save_all (MimeView *mimeview);
static void mimeview_launch (MimeView *mimeview,
MimeInfo *partinfo);
+#ifndef G_OS_WIN32
static void mimeview_open_with (MimeView *mimeview);
static void mimeview_open_part_with (MimeView *mimeview,
MimeInfo *partinfo,
gboolean automatic);
+#endif
static void mimeview_select_next_part (MimeView *mimeview);
static void mimeview_select_prev_part (MimeView *mimeview);
static void mimeview_view_file (const gchar *filename,
mimeview_launch(mimeview, mimeview_get_part_to_use(mimeview));
}
+#ifndef G_OS_WIN32
static void mimeview_open_with_cb(GtkAction *action, gpointer data)
{
mimeview_open_with((MimeView *)data);
}
+#endif
static void mimeview_display_as_text_cb(GtkAction *action, gpointer data)
{
static GtkActionEntry mimeview_menu_actions[] = {
{ "MimeView", NULL, "MimeView" },
{ "MimeView/Open", NULL, N_("_Open (l)"), NULL, "Open MIME part", G_CALLBACK(mimeview_launch_cb) },
-#ifndef MAEMO
+#if (!defined MAEMO && !defined G_OS_WIN32)
{ "MimeView/OpenWith", NULL, N_("Open _with (o)..."), NULL, "Open MIME part with...", G_CALLBACK(mimeview_open_with_cb) },
#endif
{ "MimeView/DisplayAsText", NULL, N_("_Display as text (t)"), NULL, "Display as text", G_CALLBACK(mimeview_display_as_text_cb) },
mime_toggle = gtk_event_box_new();
gtk_event_box_set_visible_window(GTK_EVENT_BOX(mime_toggle), FALSE);
- g_signal_connect(G_OBJECT(mime_toggle), "visibility-notify-event",
- G_CALLBACK(mimeview_visi_notify), mimeview);
g_signal_connect(G_OBJECT(mime_toggle), "motion-notify-event",
G_CALLBACK(mimeview_visi_notify), mimeview);
g_signal_connect(G_OBJECT(mime_toggle), "leave-notify-event",
MENUITEM_ADDUI_MANAGER(mimeview->ui_manager,
"/Menus/MimeView/", "Open", "MimeView/Open",
GTK_UI_MANAGER_MENUITEM);
-#ifndef MAEMO
+#if (!defined MAEMO && !defined G_OS_WIN32)
MENUITEM_ADDUI_MANAGER(mimeview->ui_manager,
"/Menus/MimeView/", "OpenWith", "MimeView/OpenWith",
GTK_UI_MANAGER_MENUITEM);
mimeview_clear(mimeview);
- g_return_if_fail(file != NULL);
- g_return_if_fail(mimeinfo != NULL);
+ cm_return_if_fail(file != NULL);
+ cm_return_if_fail(mimeinfo != NULL);
mimeview->mimeinfo = mimeinfo;
{
GtkCMCTreeNode *node;
- g_return_if_fail(mimeinfo != NULL);
+ cm_return_if_fail(mimeinfo != NULL);
while (mimeinfo != NULL) {
node = mimeview_append_part(mimeview, mimeinfo, parent);
str[COL_NAME] = (gchar *) get_part_name(partinfo);
node = gtk_sctree_insert_node(ctree, parent, NULL, str, 0,
- NULL, NULL, NULL, NULL,
+ NULL, NULL,
FALSE, TRUE);
gtk_cmctree_node_set_row_data(ctree, node, partinfo);
StockPixmap icon = STOCK_PIXMAP_PRIVACY_SIGNED;
SignatureStatus mycode = SIGNATURE_UNCHECKED;
- g_return_if_fail(mimeview != NULL);
- g_return_if_fail(mimeinfo != NULL);
+ cm_return_if_fail(mimeview != NULL);
+ cm_return_if_fail(mimeinfo != NULL);
if (special)
mycode = code;
MimeInfo *siginfo;
MimeInfo *first_text;
- g_return_if_fail(mimeview != NULL);
- g_return_if_fail(selected != NULL);
+ cm_return_if_fail(mimeview != NULL);
+ cm_return_if_fail(selected != NULL);
if (selected->type == MIMETYPE_MESSAGE
&& !g_ascii_strcasecmp(selected->subtype, "rfc822")) {
GdkDragContext *context;
MimeInfo *partinfo;
- g_return_if_fail(mimeview != NULL);
+ cm_return_if_fail(mimeview != NULL);
partinfo = mimeview_get_selected_part(mimeview);
if (partinfo->disposition == DISPOSITIONTYPE_INLINE) return;
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);
+#ifndef G_OS_WIN32
if (partinfo &&
partinfo->type == MIMETYPE_APPLICATION &&
!g_ascii_strcasecmp(partinfo->subtype, "octet-stream"))
cm_menu_set_sensitive_full(mimeview->ui_manager, "Menus/MimeView/Open", FALSE);
else
+#endif
cm_menu_set_sensitive_full(mimeview->ui_manager, "Menus/MimeView/Open", TRUE);
g_object_set_data(G_OBJECT(mimeview->popupmenu),
return FALSE;
switch (event->keyval) {
+ case GDK_Page_Down:
case GDK_space:
- if (mimeview_scroll_page(mimeview, FALSE))
+ if (mimeview_scroll_page(mimeview,
+ (event->state & GDK_SHIFT_MASK) != 0))
return TRUE;
-
- mimeview_select_next_part(mimeview);
+
+ if (!(event->state & GDK_SHIFT_MASK))
+ mimeview_select_next_part(mimeview);
return TRUE;
-
+ case GDK_Page_Up:
case GDK_BackSpace:
mimeview_scroll_page(mimeview, TRUE);
return TRUE;
mimeview_scroll_one_line(mimeview,
(event->state & GDK_MOD1_MASK) != 0);
return TRUE;
+ case GDK_Up:
+ case GDK_Down:
+ mimeview_scroll_one_line(mimeview, (event->keyval == GDK_Up));
+ return TRUE;
case GDK_n:
case GDK_N:
BREAK_ON_MODIFIER_KEY();
case GDK_o:
BREAK_ON_MODIFIER_KEY();
KEY_PRESS_EVENT_STOP();
+#ifndef G_OS_WIN32
mimeview_open_with(mimeview);
+#endif
return TRUE;
case GDK_c:
BREAK_ON_MODIFIER_KEY();
gchar *filename;
filename = g_strdup(get_part_name(partinfo));
- if (!filename || !*filename)
+ if (!filename || !*filename) {
+ g_free(filename);
filename = g_strdup_printf("noname.%d", number);
+ }
if (!g_utf8_validate(filename, -1, NULL)) {
gchar *tmp = conv_filename_to_utf8(filename);
partinfo = mimeview_get_part_to_use(mimeview);
- g_return_if_fail(partinfo != NULL);
+ cm_return_if_fail(partinfo != NULL);
if (get_part_name(partinfo) == NULL) {
return;
subst_for_filename(partname);
- if (prefs_common.attach_save_dir)
+ if (prefs_common.attach_save_dir && *prefs_common.attach_save_dir)
filepath = g_strconcat(prefs_common.attach_save_dir,
G_DIR_SEPARATOR_S, partname, NULL);
else
partinfo = mimeview_get_part_to_use(mimeview);
mimeview_select_mimepart_icon(mimeview, partinfo);
- g_return_if_fail(partinfo != NULL);
+ cm_return_if_fail(partinfo != NULL);
mimeview_show_message_part(mimeview, partinfo);
}
if (!partinfo)
partinfo = mimeview_get_part_to_use(mimeview);
- g_return_if_fail(partinfo != NULL);
+ cm_return_if_fail(partinfo != NULL);
filename = procmime_get_tmp_file_name(partinfo);
g_free(filename);
}
+#ifndef G_OS_WIN32
static void mimeview_open_with(MimeView *mimeview)
{
MimeInfo *partinfo;
gchar *uri;
int r = 0;
#endif
- g_return_if_fail(partinfo != NULL);
+ cm_return_if_fail(partinfo != NULL);
filename = procmime_get_tmp_file_name(partinfo);
if (content_type != NULL)
cmd = input_dialog_combo_remember
(_("Open with"),
- _("Enter the command line to open file:\n"
+ _("Enter the command-line to open file:\n"
"('%s' will be replaced with file name)"),
mime_command ? mime_command : prefs_common.mime_open_cmd,
prefs_common.mime_open_cmd_history, &remember);
else
cmd = input_dialog_combo
(_("Open with"),
- _("Enter the command line to open file:\n"
+ _("Enter the command-line to open file:\n"
"('%s' will be replaced with file name)"),
mime_command ? mime_command : prefs_common.mime_open_cmd,
prefs_common.mime_open_cmd_history);
g_free(content_type);
g_free(filename);
}
+#endif
static void mimeview_view_file(const gchar *filename, MimeInfo *partinfo,
const gchar *cmd, MimeView *mimeview)
{
+#ifndef G_OS_WIN32
gchar *p;
gchar buf[BUFFSIZE];
if (cmd == NULL)
else
g_chmod(filename, S_IRUSR|S_IWUSR);
} else {
- g_warning("MIME viewer command line is invalid: '%s'", cmd);
+ g_warning("MIME viewer command-line is invalid: '%s'", cmd);
mimeview_open_part_with(mimeview, partinfo, FALSE);
}
if (execute_command_line(buf, TRUE) != 0) {
mimeview_open_part_with(mimeview, partinfo, FALSE);
}
}
+#else
+ SHFILEINFO file_info;
+ if ((SHGetFileInfo(filename, 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"
+ "Do you want to run this file?"), GTK_STOCK_CANCEL,
+ _("Run binary"),
+ NULL, FALSE, NULL, ALERT_WARNING, G_ALERTDEFAULT);
+ if (val == G_ALERTALTERNATE) {
+ debug_print("executing binary\n");
+ ShellExecute(NULL, "open", filename, NULL, NULL, SW_SHOW);
+ }
+ } else
+ ShellExecute(NULL, "open", filename, NULL, NULL, SW_SHOW);
+
+#endif
}
void mimeview_register_viewer_factory(MimeViewerFactory *factory)
BREAK_ON_MODIFIER_KEY();
mimeview_launch(mimeview, NULL);
return TRUE;
+#ifndef G_OS_WIN32
case GDK_o:
BREAK_ON_MODIFIER_KEY();
mimeview_open_with(mimeview);
return TRUE;
+#endif
case GDK_c:
BREAK_ON_MODIFIER_KEY();
mimeview_check_signature(mimeview);
mimeview->icon_count++;
button = gtk_event_box_new();
- g_signal_connect(G_OBJECT(button), "visibility-notify-event",
- G_CALLBACK(mimeview_visi_notify), mimeview);
g_signal_connect(G_OBJECT(button), "motion-notify-event",
G_CALLBACK(mimeview_visi_notify), mimeview);
g_signal_connect(G_OBJECT(button), "leave-notify-event",
stockp = STOCK_PIXMAP_MIME_MESSAGE;
break;
case MIMETYPE_APPLICATION:
- if (mimeinfo->subtype && !g_ascii_strcasecmp(mimeinfo->subtype, "pgp-signature"))
+ if (mimeinfo->subtype && (!g_ascii_strcasecmp(mimeinfo->subtype, "pgp-signature")
+ || !g_ascii_strcasecmp(mimeinfo->subtype, "x-pkcs7-signature")
+ || !g_ascii_strcasecmp(mimeinfo->subtype, "pkcs7-signature")))
stockp = STOCK_PIXMAP_MIME_PGP_SIG;
else if (mimeinfo->subtype && !g_ascii_strcasecmp(mimeinfo->subtype, "pdf"))
stockp = STOCK_PIXMAP_MIME_PDF;
content_type = procmime_get_content_type_str(mimeinfo->type,
mimeinfo->subtype);
- tip = g_strjoin("\n", content_type,
- to_human_readable((goffset)mimeinfo->length), NULL);
+#if GTK_CHECK_VERSION(2,12,0)
+ tip = g_strconcat("<b>", _("Type:"), " </b>", content_type,
+ "\n<b>", _("Size:"), " </b>",
+ to_human_readable((goffset)mimeinfo->length), NULL);
+#else
+ tip = g_strconcat(_("Type:"), " ", content_type,
+ "\n", _("Size:"), " ",
+ to_human_readable((goffset)mimeinfo->length), NULL);
+#endif
g_free(content_type);
if (desc && *desc) {
gchar *tmp = NULL;
} else {
tmp = g_strdup(desc);
}
- tiptmp = g_strjoin("\n", tmp, tip, NULL);
+#if GTK_CHECK_VERSION(2,12,0)
+ tiptmp = g_strconcat(tip, "\n<b>",
+ prefs_common.attach_desc && mimeinfo->description ?
+ _("Description:") : _("Filename:"),
+ " </b>", tmp, NULL);
+#else
+ tiptmp = g_strconcat(tip, "\n",
+ prefs_common.attach_desc && mimeinfo->description ?
+ _("Description:") : _("Filename:"),
+ " ", tmp, NULL);
+#endif
g_free(tip);
tip = tiptmp;
g_free(tmp);
}
g_free(sigshort);
+#if GTK_CHECK_VERSION(2,12,0)
+ gtk_widget_set_tooltip_markup(button, tip);
+#else
CLAWS_SET_TIP(button, tip);
+#endif
g_free(tip);
gtk_widget_show_all(button);
gtk_drag_source_set(button, GDK_BUTTON1_MASK|GDK_BUTTON3_MASK,
static void icon_list_clear (MimeView *mimeview)
{
- GList *child;
+ GList *child, *orig;
GtkAdjustment *adj;
- child = gtk_container_get_children(GTK_CONTAINER(mimeview->icon_vbox));
- for (; child != NULL; child = g_list_next(child)) {
+ orig = gtk_container_get_children(GTK_CONTAINER(mimeview->icon_vbox));
+ for (child = orig; child != NULL; child = g_list_next(child)) {
gtkut_container_remove(GTK_CONTAINER(mimeview->icon_vbox),
GTK_WIDGET(child->data));
}
- g_list_free(child);
+ g_list_free(orig);
mimeview->icon_count = 0;
adj = gtk_layout_get_vadjustment(GTK_LAYOUT(mimeview->icon_scroll));
gtk_adjustment_set_value(adj, adj->lower);
{
GtkRequisition size;
- g_return_if_fail(mimeinfo != NULL);
+ cm_return_if_fail(mimeinfo != NULL);
while (mimeinfo != NULL) {
if (mimeinfo->type != MIMETYPE_MULTIPART)
mimeview_save_as(mimeview);
else if (!strcmp(cmd, "sc://display_as_text"))
mimeview_display_as_text(mimeview);
+#ifndef G_OS_WIN32
else if (!strcmp(cmd, "sc://open_with"))
mimeview_open_with(mimeview);
+#endif
else if (!strcmp(cmd, "sc://open"))
mimeview_launch(mimeview, NULL);
else if (!strcmp(cmd, "sc://select_attachment") && data != NULL) {