diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-05-26 10:57:24 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-05-26 10:57:24 +0000 |
commit | 48420a4ea6c0a4ccd8a52964c2415ccd1a2c5d92 (patch) | |
tree | 956bae78f424441db177bbd1d25791e82efdb313 | |
parent | a995a308a0ea0dbc92d14bb62d1fe1d1c87a355b (diff) |
improved DnD.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@291 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ChangeLog.ja | 8 | ||||
-rw-r--r-- | src/main.c | 1 | ||||
-rw-r--r-- | src/mimeview.c | 15 | ||||
-rw-r--r-- | src/summaryview.c | 116 | ||||
-rw-r--r-- | src/summaryview.h | 1 | ||||
-rw-r--r-- | src/utils.c | 11 | ||||
-rw-r--r-- | src/utils.h | 1 |
8 files changed, 129 insertions, 32 deletions
@@ -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(): リンク文字列の先頭の @@ -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, |