aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--ChangeLog.ja8
-rw-r--r--src/main.c1
-rw-r--r--src/mimeview.c15
-rw-r--r--src/summaryview.c116
-rw-r--r--src/summaryview.h1
-rw-r--r--src/utils.c11
-rw-r--r--src/utils.h1
8 files changed, 129 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index f1be0f01..2e83d50a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2005-05-26
+
+ * src/main.c: app_will_exit(): cleanup tmp directory when exit.
+ * src/mimeview.c: fixed DnD of non-ascii filename.
+ * src/utils.[ch]: encode_uri(): new.
+ * src/summaryview.[ch]: use subject as the filename of droppend
+ messages. Added .eml as the extension.
+
2005-05-25
* src/textview.c: textview_write_link(): also skip non-ascii space
diff --git a/ChangeLog.ja b/ChangeLog.ja
index 4e173d7b..d8395b1a 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,3 +1,11 @@
+2005-05-26
+
+ * src/main.c: app_will_exit(): 終了時に tmp ディレクトリを消去。
+ * src/mimeview.c: 非 ASCII ファイル名の DnD を修正。
+ * src/utils.[ch]: encode_uri(): 新規。
+ * src/summaryview.[ch]: subject をドロップしたメッセージのファイル名
+ として使用するようにした。 .eml を拡張子として追加。
+
2005-05-25
* src/textview.c: textview_write_link(): リンク文字列の先頭の
diff --git a/src/main.c b/src/main.c
index dbb7766b..a3decf45 100644
--- a/src/main.c
+++ b/src/main.c
@@ -495,6 +495,7 @@ void app_will_exit(GtkWidget *widget, gpointer data)
g_free(filename);
/* delete temporary files */
+ remove_all_files(get_tmp_dir());
remove_all_files(get_mime_tmp_dir());
close_log_file();
diff --git a/src/mimeview.c b/src/mimeview.c
index 40d2fb14..b847e117 100644
--- a/src/mimeview.c
+++ b/src/mimeview.c
@@ -387,6 +387,9 @@ void mimeview_clear(MimeView *mimeview)
g_free(mimeview->file);
mimeview->file = NULL;
+
+ g_free(mimeview->drag_file);
+ mimeview->drag_file = NULL;
}
void mimeview_destroy(MimeView *mimeview)
@@ -948,9 +951,10 @@ static void mimeview_drag_begin(GtkWidget *widget, GdkDragContext *drag_context,
if (procmime_get_part(filename, mimeview->file, partinfo) < 0) {
g_warning(_("Can't save the part of multipart message."));
- g_free(filename);
} else
- mimeview->drag_file = filename;
+ mimeview->drag_file = encode_uri(filename);
+
+ g_free(filename);
gtk_drag_set_icon_default(drag_context);
}
@@ -971,14 +975,11 @@ static void mimeview_drag_data_get(GtkWidget *widget,
guint time,
MimeView *mimeview)
{
- gchar *uriname;
-
if (!mimeview->drag_file) return;
- uriname = g_strconcat("file://", mimeview->drag_file, NULL);
gtk_selection_data_set(selection_data, selection_data->target, 8,
- uriname, strlen(uriname));
- g_free(uriname);
+ mimeview->drag_file,
+ strlen(mimeview->drag_file));
}
static void mimeview_display_as_text(MimeView *mimeview)
diff --git a/src/summaryview.c b/src/summaryview.c
index 75d27b01..262c04f3 100644
--- a/src/summaryview.c
+++ b/src/summaryview.c
@@ -260,6 +260,9 @@ static void summary_column_clicked (GtkWidget *button,
static void summary_drag_begin (GtkWidget *widget,
GdkDragContext *drag_context,
SummaryView *summaryview);
+static void summary_drag_end (GtkWidget *widget,
+ GdkDragContext *drag_context,
+ SummaryView *summaryview);
static void summary_drag_data_get (GtkWidget *widget,
GdkDragContext *drag_context,
GtkSelectionData *selection_data,
@@ -763,6 +766,10 @@ void summary_clear_list(SummaryView *summaryview)
gtk_tree_path_free(summaryview->pressed_path);
summaryview->pressed_path = NULL;
}
+ if (summaryview->drag_list) {
+ g_free(summaryview->drag_list);
+ summaryview->drag_list = NULL;
+ }
gtk_tree_view_set_model(treeview, NULL);
gtk_tree_store_clear(summaryview->store);
@@ -3988,6 +3995,8 @@ static GtkWidget *summary_tree_view_create(SummaryView *summaryview)
g_signal_connect_after(G_OBJECT(treeview), "drag-begin",
G_CALLBACK(summary_drag_begin), summaryview);
+ g_signal_connect_after(G_OBJECT(treeview), "drag-end",
+ G_CALLBACK(summary_drag_end), summaryview);
g_signal_connect(G_OBJECT(treeview), "drag-data-get",
G_CALLBACK(summary_drag_data_get), summaryview);
@@ -4429,6 +4438,15 @@ static void summary_drag_begin(GtkWidget *widget, GdkDragContext *drag_context,
gtk_drag_set_icon_default(drag_context);
}
+static void summary_drag_end(GtkWidget *widget, GdkDragContext *drag_context,
+ SummaryView *summaryview)
+{
+ if (summaryview->drag_list) {
+ g_free(summaryview->drag_list);
+ summaryview->drag_list = NULL;
+ }
+}
+
static void summary_drag_data_get(GtkWidget *widget,
GdkDragContext *drag_context,
GtkSelectionData *selection_data,
@@ -4438,43 +4456,91 @@ static void summary_drag_data_get(GtkWidget *widget,
{
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
GList *rows, *cur;
- gchar *mail_list = NULL, *uri, *file;
+ gchar *mail_list = NULL;
+ gchar *file, *filename, *fs_filename, *tmp;
+ gint suffix = 0;
MsgInfo *msginfo;
GtkTreeIter iter;
- rows = gtk_tree_selection_get_selected_rows(summaryview->selection,
- NULL);
+ if (!summaryview->drag_list) {
+ rows = gtk_tree_selection_get_selected_rows
+ (summaryview->selection, NULL);
+
+ for (cur = rows; cur != NULL; cur = cur->next) {
+ gtk_tree_model_get_iter(model, &iter,
+ (GtkTreePath *)cur->data);
+ gtk_tree_model_get(model, &iter, S_COL_MSG_INFO,
+ &msginfo, -1);
+ file = procmsg_get_message_file(msginfo);
+ if (!file) continue;
+
+ if (msginfo->subject && *msginfo->subject != '\0') {
+ filename = g_strdup(msginfo->subject);
+ subst_for_filename(filename);
+ } else
+ filename = g_strdup(g_basename(file));
+ fs_filename = conv_filename_from_utf8(filename);
+
+ suffix = 0;
+ do {
+ if (suffix == 0)
+ tmp = g_strdup_printf
+ ("%s%c%s.eml", get_tmp_dir(),
+ G_DIR_SEPARATOR,
+ fs_filename);
+ else
+ tmp = g_strdup_printf
+ ("%s%c%s_(%d).eml",
+ get_tmp_dir(),
+ G_DIR_SEPARATOR, fs_filename,
+ suffix);
+
+ if (is_file_exist(tmp)) {
+ suffix++;
+ g_free(tmp);
+ } else
+ break;
+ } while (1);
+
+ if (copy_file(file, tmp, FALSE) < 0) {
+ g_warning("Can't copy '%s'\n", file);
+ } else {
+ gchar *uri;
+
+ uri = encode_uri(tmp);
+
+ if (!mail_list) {
+ mail_list = uri;
+ } else {
+ gchar *list_tmp;
- for (cur = rows; cur != NULL; cur = cur->next) {
- gtk_tree_model_get_iter(model, &iter,
- (GtkTreePath *)cur->data);
- gtk_tree_model_get(model, &iter, S_COL_MSG_INFO,
- &msginfo, -1);
- file = procmsg_get_message_file(msginfo);
- if (!file) continue;
- uri = g_strconcat("file://", file, NULL);
- g_free(file);
-
- if (!mail_list) {
- mail_list = uri;
- } else {
- file = g_strconcat(mail_list, "\n", uri, NULL);
- g_free(mail_list);
- g_free(uri);
- mail_list = file;
+ list_tmp = g_strconcat
+ (mail_list, "\n", uri, NULL);
+ g_free(mail_list);
+ g_free(uri);
+ mail_list = list_tmp;
+ }
+ }
+
+ g_free(tmp);
+ g_free(fs_filename);
+ g_free(filename);
+ g_free(file);
+ gtk_tree_path_free((GtkTreePath *)cur->data);
}
- gtk_tree_path_free((GtkTreePath *)cur->data);
+ g_list_free(rows);
+
+ summaryview->drag_list = mail_list;
}
- if (mail_list != NULL) {
+ if (summaryview->drag_list) {
gtk_selection_data_set(selection_data,
selection_data->target, 8,
- mail_list, strlen(mail_list));
- g_free(mail_list);
+ summaryview->drag_list,
+ strlen(summaryview->drag_list));
}
- g_list_free(rows);
}
diff --git a/src/summaryview.h b/src/summaryview.h
index 878c190c..2bb9f2d6 100644
--- a/src/summaryview.h
+++ b/src/summaryview.h
@@ -149,6 +149,7 @@ private:
gboolean can_toggle_selection;
gboolean on_drag;
GtkTreePath *pressed_path;
+ gchar *drag_list;
/* unthreading */
GSList *pos_list;
diff --git a/src/utils.c b/src/utils.c
index 3a931b44..e69a9fe2 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1517,6 +1517,17 @@ void decode_uri(gchar *decoded_uri, const gchar *encoded_uri)
*dec = '\0';
}
+gchar *encode_uri(const gchar *filename)
+{
+ gchar *uri;
+
+ uri = g_filename_to_uri(filename, NULL, NULL);
+ if (!uri)
+ uri = g_strconcat("file://", filename, NULL);
+
+ return uri;
+}
+
gint scan_mailto_url(const gchar *mailto, gchar **to, gchar **cc, gchar **bcc,
gchar **subject, gchar **body)
{
diff --git a/src/utils.h b/src/utils.h
index d2ef3348..79273d90 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -324,6 +324,7 @@ gchar *get_uri_path (const gchar *uri);
gint get_uri_len (const gchar *str);
void decode_uri (gchar *decoded_uri,
const gchar *encoded_uri);
+gchar *encode_uri (const gchar *filename);
gint scan_mailto_url (const gchar *mailto,
gchar **to,
gchar **cc,