commit b2d8e263d1424145d8bdf97ebca2c1d7b5f479ba from: Oliver Lowe date: Fri Jan 2 07:20:05 2026 UTC delete drag and drop between summary and folder view Not sure it ever really worked *that* well, and the folderview is a big hack commit - d21031672beefdc05b76615346512c06d6cc62be commit + b2d8e263d1424145d8bdf97ebca2c1d7b5f479ba blob - ff8056081e163f6a672f4900d0f8b677bb65f741 blob + dd13ca8a62375d6936e8e8426d8aebbf6b4e6736 --- src/folderview.c +++ src/folderview.c @@ -184,36 +184,6 @@ static void folderview_startup_folder_cb(GtkAction *ac static void folderview_property_cb (GtkAction *action, gpointer data); -static gboolean folderview_drag_motion_cb(GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time, - FolderView *folderview); -static void folderview_drag_leave_cb (GtkWidget *widget, - GdkDragContext *context, - guint time, - FolderView *folderview); -static void folderview_drag_received_cb (GtkWidget *widget, - GdkDragContext *drag_context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - FolderView *folderview); -static void folderview_start_drag (GtkWidget *widget, gint button, GdkEvent *event, - FolderView *folderview); -static void folderview_drag_data_get (GtkWidget *widget, - GdkDragContext *drag_context, - GtkSelectionData *selection_data, - guint info, - guint time, - FolderView *folderview); -static void folderview_drag_end_cb (GtkWidget *widget, - GdkDragContext *drag_context, - FolderView *folderview); - static void folderview_create_folder_node (FolderView *folderview, FolderItem *item); static gboolean folderview_update_folder (gpointer source, @@ -251,12 +221,6 @@ static GtkActionEntry folderview_header_popup_entries[ {"FolderViewHeaderPopup/SetDisplayedColumns", NULL, N_("Set Displayed columns"), NULL, NULL, G_CALLBACK(folderview_header_set_displayed_columns_cb) } }; -GtkTargetEntry folderview_drag_types[] = -{ - {"claws-mail/internal", GTK_TARGET_SAME_APP, TARGET_DUMMY}, - {"text/uri-list", 0, TARGET_MAIL_URI_LIST} -}; - void folderview_initialize(void) { FolderViewPopup *fpopup; @@ -483,11 +447,6 @@ static GtkWidget *folderview_ctree_create(FolderView * folderview); g_signal_connect(G_OBJECT(ctree), "tree_select_row", G_CALLBACK(folderview_selected), folderview); - g_signal_connect(G_OBJECT(ctree), "start_drag", - G_CALLBACK(folderview_start_drag), folderview); - g_signal_connect(G_OBJECT(ctree), "drag_data_get", - G_CALLBACK(folderview_drag_data_get), - folderview); g_signal_connect_after(G_OBJECT(ctree), "tree_expand", G_CALLBACK(folderview_tree_expanded), @@ -500,23 +459,6 @@ static GtkWidget *folderview_ctree_create(FolderView * G_CALLBACK(folderview_col_resized), folderview); - /* drop callback */ - gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL & ~GTK_DEST_DEFAULT_HIGHLIGHT, - folderview_drag_types, 2, - GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_DEFAULT); - g_signal_connect(G_OBJECT(ctree), "drag_motion", - G_CALLBACK(folderview_drag_motion_cb), - folderview); - g_signal_connect(G_OBJECT(ctree), "drag_leave", - G_CALLBACK(folderview_drag_leave_cb), - folderview); - g_signal_connect(G_OBJECT(ctree), "drag_data_received", - G_CALLBACK(folderview_drag_received_cb), - folderview); - g_signal_connect(G_OBJECT(ctree), "drag_end", - G_CALLBACK(folderview_drag_end_cb), - folderview); - gtk_container_add(GTK_CONTAINER(scrolledwin), ctree); return ctree; @@ -529,23 +471,6 @@ void folderview_set_column_order(FolderView *foldervie FolderItem *sel_item = NULL, *op_item = NULL; GtkWidget *scrolledwin = folderview->scrolledwin; - if (folderview->drag_timer_id != 0) { - g_source_remove(folderview->drag_timer_id); - folderview->drag_timer_id = 0; - } - if (folderview->deferred_refresh_id != 0) { - g_source_remove(folderview->deferred_refresh_id); - folderview->deferred_refresh_id = 0; - } - if (folderview->scroll_timeout_id != 0) { - g_source_remove(folderview->scroll_timeout_id); - folderview->scroll_timeout_id = 0; - } - if (folderview->postpone_select_id != 0) { - g_source_remove(folderview->postpone_select_id); - folderview->postpone_select_id = 0; - } - if (folderview->selected) sel_item = folderview_get_selected_item(folderview); if (folderview->opened) @@ -618,14 +543,7 @@ FolderView *folderview_create(MainWindow *mainwin) gtk_widget_show_all(scrolledwin); - folderview->target_list = gtk_target_list_new(folderview_drag_types, 2); folderview_list = g_list_append(folderview_list, folderview); - - folderview->drag_timer_id = 0; - folderview->deferred_refresh_id = 0; - folderview->scroll_timeout_id = 0; - folderview->postpone_select_id = 0; - return folderview; } @@ -1443,7 +1361,6 @@ static void folderview_update_node(FolderView *folderv GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree); GtkStyle *style = NULL, *prev_style; FolderItem *item; - GdkRGBA black = { 0, 0, 0, 1 }; GdkPixbuf *xpm, *openxpm; static GdkPixbuf *searchicon; gboolean mark = FALSE; @@ -2489,26 +2406,6 @@ static void folderview_property_cb(GtkAction *action, prefs_folder_item_open(item); } -static void folderview_recollapse_nodes(FolderView *folderview, GtkCMCTreeNode *node) -{ - GSList *list = NULL; - GSList *done = NULL; - GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree); - - for (list = folderview->nodes_to_recollapse; list != NULL; list = g_slist_next(list)) { - if (!gtkut_ctree_node_is_parent(GTK_CMCTREE_NODE(list->data), node) - && list->data != node) { - gtk_cmctree_collapse(ctree, GTK_CMCTREE_NODE(list->data)); - done = g_slist_append(done, GTK_CMCTREE_NODE(list->data)); - } - } - for (list = done; list != NULL; list = g_slist_next(list)) { - folderview->nodes_to_recollapse = g_slist_remove(folderview->nodes_to_recollapse, - list->data); - } - g_slist_free(done); -} - void folderview_move_folder(FolderView *folderview, FolderItem *from_folder, FolderItem *to_folder, gboolean copy) { @@ -2616,92 +2513,6 @@ static gint folderview_clist_compare(GtkCMCList *clist return g_utf8_collate(item1->name, item2->name); } -static void drag_state_stop(FolderView *folderview) -{ - if (folderview->drag_timer_id) - g_source_remove(folderview->drag_timer_id); - folderview->drag_timer_id = 0; - folderview->drag_node = NULL; -} - -static gboolean folderview_defer_expand(FolderView *folderview) -{ - if (folderview->drag_node) { - folderview_recollapse_nodes(folderview, folderview->drag_node); - if (folderview->drag_item->collapsed) { - gtk_cmctree_expand(GTK_CMCTREE(folderview->ctree), folderview->drag_node); - folderview->nodes_to_recollapse = g_slist_append - (folderview->nodes_to_recollapse, folderview->drag_node); - } - } - folderview->drag_item = NULL; - folderview->drag_timer_id = 0; - return FALSE; -} - -static void drag_state_start(FolderView *folderview, GtkCMCTreeNode *node, FolderItem *item) -{ - /* the idea is that we call drag_state_start() whenever we want expansion to - * start after 'prefs_common.hover_time' msecs. if we want to cancel expansion, - * we need to call drag_state_stop() */ - drag_state_stop(folderview); - /* request expansion */ - if (0 != (folderview->drag_timer_id = g_timeout_add - (prefs_common.hover_timeout, - (GSourceFunc)folderview_defer_expand, - folderview))) { - folderview->drag_node = node; - folderview->drag_item = item; - } -} - -static void folderview_start_drag(GtkWidget *widget, gint button, GdkEvent *event, - FolderView *folderview) -{ - GdkDragContext *context; - - cm_return_if_fail(folderview != NULL); - if (folderview->selected == NULL) return; - if (folderview->nodes_to_recollapse) - g_slist_free(folderview->nodes_to_recollapse); - folderview->nodes_to_recollapse = NULL; - context = gtk_drag_begin_with_coordinates(widget, folderview->target_list, - GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_DEFAULT, button, event, - -1, -1); - gtk_drag_set_icon_default(context); -} - -static void folderview_drag_data_get(GtkWidget *widget, - GdkDragContext *drag_context, - GtkSelectionData *selection_data, - guint info, - guint time, - FolderView *folderview) -{ - FolderItem *item; - GList *sel; - if (info == TARGET_DUMMY) { - sel = GTK_CMCLIST(folderview->ctree)->selection; - if (!sel) - return; - - item = gtk_cmctree_node_get_row_data - (GTK_CMCTREE(folderview->ctree), - GTK_CMCTREE_NODE(sel->data)); - if (item) { - gchar *source = NULL; - gchar *name = folder_item_get_identifier(item); - source = g_strdup_printf ("FROM_OTHER_FOLDER%s", name); - g_free(name); - gtk_selection_data_set(selection_data, - gtk_selection_data_get_target(selection_data), 8, - source, strlen(source)); - } - } else { - g_warning("unknown info %d", info); - } -} - static gboolean folderview_update_folder(gpointer source, gpointer userdata) { FolderUpdateData *hookdata; @@ -2765,293 +2576,8 @@ static gboolean folderview_dnd_scroll_cb(gpointer data return TRUE; } -static gboolean folderview_drag_motion_cb(GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time, - FolderView *folderview) -{ - gint row, column; - FolderItem *item = NULL, *src_item = NULL; - GtkCMCTreeNode *node = NULL; - gboolean acceptable = FALSE; - GtkAdjustment *pos = gtk_scrolled_window_get_vadjustment( - GTK_SCROLLED_WINDOW(folderview->scrolledwin)); - int height = (int)gtk_adjustment_get_page_size(pos); - int total_height = (int)gtk_adjustment_get_upper(pos); - int vpos = (int)gtk_adjustment_get_value(pos); - int offset = prefs_common.show_col_headers ? 24:0; - int dist; +static void free_info(gpointer stuff, gpointer data) { g_free(stuff); } - if (gtk_cmclist_get_selection_info - (GTK_CMCLIST(widget), x - offset, y - offset, &row, &column)) { - GtkWidget *srcwidget; - - if (y > height - (48 - offset) && height + vpos < total_height) { - dist = -(height - (48 - offset) - y); - folderview->scroll_value = 1.41f * (1+(dist / 6)); - } else if (y < 72 - (24 - offset) && y >= 0) { - dist = 72 - (24 - offset) - y; - folderview->scroll_value = -1.41f * (1+(dist / 6)); - } else { - folderview->scroll_value = 0; - } - if (folderview->scroll_value != 0 && folderview->scroll_timeout_id == 0) { - folderview->scroll_timeout_id = - g_timeout_add(30, folderview_dnd_scroll_cb, - folderview); - } - - node = gtk_cmctree_node_nth(GTK_CMCTREE(widget), row); - item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(widget), node); - src_item = folderview->summaryview->folder_item; - - srcwidget = gtk_drag_get_source_widget(context); - if (srcwidget == summary_get_main_widget(folderview->summaryview)) { - /* comes from summaryview */ - /* we are copying messages, so only accept folder items that are not - the source item, are no root items and can copy messages */ - if (item && item->folder && folder_item_parent(item) != NULL && src_item && - src_item != item && FOLDER_CLASS(item->folder)->copy_msg != NULL && - FOLDER_TYPE(item->folder) != F_UNKNOWN) - acceptable = TRUE; - } else if (srcwidget == folderview->ctree) { - /* comes from folderview */ - /* we are moving folder items, only accept folders that are not - the source items and can copy messages and create folder items */ - if (item && item->folder && src_item && src_item != item && - FOLDER_CLASS(item->folder)->copy_msg != NULL && - FOLDER_CLASS(item->folder)->create_folder != NULL && - ((FOLDER_TYPE(item->folder) != F_UNKNOWN && FOLDER_TYPE(src_item->folder) != F_UNKNOWN) - || item->folder == src_item->folder)) - acceptable = TRUE; - } else { - /* comes from another app */ - /* we are adding messages, so only accept folder items that are - no root items and can copy messages */ - if (item && item->folder && folder_item_parent(item) != NULL - && FOLDER_CLASS(item->folder)->add_msg != NULL && - FOLDER_TYPE(item->folder) != F_UNKNOWN) - acceptable = TRUE; - } - } - - if (acceptable || (src_item && src_item == item)) - drag_state_start(folderview, node, item); - - if (acceptable) { - g_signal_handlers_block_by_func - (G_OBJECT(widget), - G_CALLBACK(folderview_selected), folderview); - gtk_cmctree_select(GTK_CMCTREE(widget), node); - g_signal_handlers_unblock_by_func - (G_OBJECT(widget), - G_CALLBACK(folderview_selected), folderview); - gdk_drag_status(context, - (gdk_drag_context_get_actions(context) == GDK_ACTION_COPY ? - GDK_ACTION_COPY : GDK_ACTION_MOVE) , time); - } else { - if (folderview->opened) - gtk_cmctree_select(GTK_CMCTREE(widget), folderview->opened); - gdk_drag_status(context, 0, time); - } - - return acceptable; -} - -static void folderview_drag_leave_cb(GtkWidget *widget, - GdkDragContext *context, - guint time, - FolderView *folderview) -{ - drag_state_stop(folderview); - folderview->scroll_value = 0; - gtk_cmctree_select(GTK_CMCTREE(widget), folderview->opened); -} - -static void free_info (gpointer stuff, gpointer data) -{ - g_free(stuff); -} - -void folderview_finish_dnd(const gchar *data, GdkDragContext *drag_context, - guint time, FolderItem *item) -{ - GList *list, *tmp; - GSList *msglist = NULL; - list = uri_list_extract_filenames(data); - if (!(item && item->folder && folder_item_parent(item) != NULL - && FOLDER_CLASS(item->folder)->add_msg != NULL)) - { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - debug_print("item doesn't fit\n"); - return; - } - if (!list) { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - debug_print("list is empty\n"); - return; - } - for (tmp = list; tmp != NULL; tmp = tmp->next) { - MsgFileInfo *info = NULL; - - if (file_is_email((gchar *)tmp->data)) { - info = g_new0(MsgFileInfo, 1); - info->msginfo = NULL; - info->file = (gchar *)tmp->data; - msglist = g_slist_prepend(msglist, info); - debug_print("file is a mail\n"); - } else { - debug_print("file isn't a mail\n"); - } - } - if (msglist) { - msglist = g_slist_reverse(msglist); - folder_item_add_msgs(item, msglist, FALSE); - g_slist_foreach(msglist, free_info, NULL); - g_slist_free(msglist); - gtk_drag_finish(drag_context, TRUE, FALSE, time); - } else { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - } - list_free_strings_full(list); -} - -static void folderview_drag_received_cb(GtkWidget *widget, - GdkDragContext *drag_context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - FolderView *folderview) -{ - gint row, column; - FolderItem *item = NULL, *src_item; - GtkCMCTreeNode *node; - int offset = prefs_common.show_col_headers ? 24:0; - - folderview->scroll_value = 0; - - if (info == TARGET_DUMMY) { - drag_state_stop(folderview); - const gchar *ddata = (const gchar *)gtk_selection_data_get_data(data); - if ((gchar *)strstr(ddata, "FROM_OTHER_FOLDER") != ddata) { - /* comes from summaryview */ - if (gtk_cmclist_get_selection_info - (GTK_CMCLIST(widget), x - offset, y - offset, &row, &column) == 0) - return; - - node = gtk_cmctree_node_nth(GTK_CMCTREE(widget), row); - item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(widget), node); - src_item = folderview->summaryview->folder_item; - - if (item && item->no_select) { - alertpanel_error(_("The destination folder can only be used to " - "store subfolders.")); - return; - } - /* re-check (due to acceptable possibly set for folder moves */ - if (!(item && item->folder && item->path && !item->no_select && - src_item && src_item != item && FOLDER_CLASS(item->folder)->copy_msg != NULL)) { - return; - } - - switch (gdk_drag_context_get_selected_action(drag_context)) { - case GDK_ACTION_COPY: - summary_copy_selected_to(folderview->summaryview, item); - gtk_drag_finish(drag_context, TRUE, FALSE, time); - break; - case GDK_ACTION_MOVE: - case GDK_ACTION_DEFAULT: - default: - if (FOLDER_CLASS(src_item->folder)->remove_msg == NULL) - summary_copy_selected_to(folderview->summaryview, item); - else - summary_move_selected_to(folderview->summaryview, item); - gtk_drag_finish(drag_context, TRUE, TRUE, time); - } - } else { - /* comes from folderview */ - char *source; - gboolean folder_is_normal = TRUE; - gboolean copy = (GDK_ACTION_COPY == - gdk_drag_context_get_selected_action(drag_context)); - - source = (char *)gtk_selection_data_get_data(data) + 17; - if (gtk_cmclist_get_selection_info - (GTK_CMCLIST(widget), x - offset, y - offset, &row, &column) == 0 - || *source == 0) { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - return; - } - node = gtk_cmctree_node_nth(GTK_CMCTREE(widget), row); - item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(widget), node); - src_item = folder_find_item_from_identifier(source); - - folder_is_normal = - src_item != NULL && - src_item->stype == F_NORMAL && - !folder_has_parent_of_type(src_item, F_OUTBOX) && - !folder_has_parent_of_type(src_item, F_DRAFT) && - !folder_has_parent_of_type(src_item, F_QUEUE) && - !folder_has_parent_of_type(src_item, F_TRASH); - if (!item || !src_item || !folder_is_normal) { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - return; - } - - folderview_move_folder(folderview, src_item, item, copy); - gtk_drag_finish(drag_context, TRUE, TRUE, time); - } - folderview->nodes_to_recollapse = NULL; - } else if (info == TARGET_MAIL_URI_LIST) { - if (gtk_cmclist_get_selection_info - (GTK_CMCLIST(widget), x - offset, y - offset, &row, &column) == 0) - return; - - node = gtk_cmctree_node_nth(GTK_CMCTREE(widget), row); - if (!node) { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - debug_print("no node\n"); - return; - } - item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(widget), node); - if (!item) { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - debug_print("no item\n"); - return; - } - folderview_finish_dnd(gtk_selection_data_get_data(data), - drag_context, time, item); - } -} - -static void folderview_drag_end_cb(GtkWidget *widget, - GdkDragContext *drag_context, - FolderView *folderview) -{ - drag_state_stop(folderview); - folderview->scroll_value = 0; - g_slist_free(folderview->nodes_to_recollapse); - folderview->nodes_to_recollapse = NULL; -} - -void folderview_register_popup(FolderViewPopup *fpopup) -{ - GList *folderviews; - - for (folderviews = folderview_list; folderviews != NULL; folderviews = g_list_next(folderviews)) { - FolderView *folderview = folderviews->data; - GtkActionGroup *factory; - - factory = create_action_group(folderview, fpopup); - g_hash_table_insert(folderview->popups, fpopup->klass, factory); - } - g_hash_table_insert(folderview_popups, fpopup->klass, fpopup); -} - void folderview_unregister_popup(FolderViewPopup *fpopup) { GList *folderviews; blob - f53c22b56556b0d7b3dcbd0b530677d25ece941d blob + d446bd45917e9d7f1b6dc93e85398a5069fda99d --- src/folderview.h +++ src/folderview.h @@ -69,12 +69,6 @@ struct _FolderView gint folder_update_callback_id; gint folder_item_update_callback_id; - /* DND states */ - GSList *nodes_to_recollapse; - guint drag_timer_id; /* timer id */ - FolderItem *drag_item; /* dragged item */ - GtkCMCTreeNode *drag_node; /* drag node */ - GtkTargetList *target_list; /* DnD */ FolderColumnState col_state[N_FOLDER_COLS]; gint col_pos[N_FOLDER_COLS]; @@ -134,15 +128,11 @@ void folderview_move_folder (FolderView *folderview, FolderItem *to_folder, gboolean copy); -void folderview_register_popup (FolderViewPopup *fpopup); void folderview_unregister_popup (FolderViewPopup *fpopup); void folderview_update_search_icon (FolderItem *item, gboolean matches); void folderview_set_column_order (FolderView *folderview); -void folderview_finish_dnd (const gchar *data, - GdkDragContext *drag_context, - guint time, - FolderItem *item); + void folderview_close_opened (FolderView *folderview, gboolean dirty); void folderview_remove_item(FolderView *folderview, blob - 5b714e07687d521334c8cafd91a66e4a843db4c8 blob + d851eec71687aa85fcec1fe446520673afd08d80 --- src/imap_gtk.c +++ src/imap_gtk.c @@ -99,9 +99,7 @@ static FolderViewPopup imap_popup = }; void imap_gtk_init(void) -{ - folderview_register_popup(&imap_popup); -} +{ } static void add_menuitems(GtkUIManager *ui_manager, FolderItem *item) { blob - 0eae0a81092673e679e9d0d3b0187bab93a15fa5 blob + b93a8de02b32944258664e6c70c5faf458d1ecc1 --- src/mh_gtk.c +++ src/mh_gtk.c @@ -73,9 +73,7 @@ static FolderViewPopup mh_popup = }; void mh_gtk_init(void) -{ - folderview_register_popup(&mh_popup); -} +{ } static void add_menuitems(GtkUIManager *ui_manager, FolderItem *item) { blob - 9fe6840cbeb78063e7c7c729f3c3e88af7388e58 blob + 202c27f90948d88038df5403a9174178971c3b48 --- src/summaryview.c +++ src/summaryview.c @@ -269,34 +269,6 @@ static void summary_score_clicked (GtkWidget *button, static void summary_locked_clicked (GtkWidget *button, SummaryView *summaryview); -static void summary_start_drag (GtkWidget *widget, - int button, - GdkEvent *event, - SummaryView *summaryview); -static void summary_drag_data_get (GtkWidget *widget, - GdkDragContext *drag_context, - GtkSelectionData *selection_data, - guint info, - guint time, - SummaryView *summaryview); -static void summary_drag_data_received(GtkWidget *widget, - GdkDragContext *drag_context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - SummaryView *summaryview); -static gboolean summary_drag_motion_cb(GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time, - SummaryView *summaryview); -static void summary_drag_end(GtkWidget *widget, - GdkDragContext *drag_context, - SummaryView *summaryview); - /* custom compare functions for sorting */ static gint summary_cmp_by_mark (GtkCMCList *clist, gconstpointer ptr1, @@ -5253,28 +5225,6 @@ static GtkWidget *summary_ctree_create(SummaryView *su G_CALLBACK(summary_tree_collapsed), summaryview); - g_signal_connect(G_OBJECT(ctree), "start_drag", - G_CALLBACK(summary_start_drag), - summaryview); - g_signal_connect(G_OBJECT(ctree), "drag_data_get", - G_CALLBACK(summary_drag_data_get), - summaryview); - g_signal_connect(G_OBJECT(ctree), "drag_end", - G_CALLBACK(summary_drag_end), - summaryview); - - gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL & ~GTK_DEST_DEFAULT_HIGHLIGHT, - summary_drag_types, 3, - GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_DEFAULT); - - g_signal_connect(G_OBJECT(ctree), "drag_data_received", - G_CALLBACK(summary_drag_data_received), - summaryview); - - g_signal_connect(G_OBJECT(ctree), "drag_motion", - G_CALLBACK(summary_drag_motion_cb), - summaryview); - g_object_set (G_OBJECT(ctree), "has-tooltip", TRUE, NULL); g_signal_connect(G_OBJECT(ctree), "query-tooltip", G_CALLBACK(tooltip_cb), @@ -5828,188 +5778,6 @@ static void summary_locked_clicked(GtkWidget *button, summary_sort_by_column_click(summaryview, SORT_BY_LOCKED); } -static void summary_start_drag(GtkWidget *widget, gint button, GdkEvent *event, - SummaryView *summaryview) -{ - GdkDragContext *context; - - cm_return_if_fail(summaryview != NULL); - cm_return_if_fail(summaryview->folder_item != NULL); - cm_return_if_fail(summaryview->folder_item->folder != NULL); - - if (summaryview->selected == NULL) return; - - context = gtk_drag_begin_with_coordinates(widget, summaryview->target_list, - GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_DEFAULT, button, event, - -1, -1); - gtk_drag_set_icon_default(context); -} - -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, - guint info, - guint time, - SummaryView *summaryview) -{ - if (info == TARGET_MAIL_URI_LIST) { - GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree); - GList *cur; - MsgInfo *msginfo; - gchar *mail_list = NULL, *tmp1, *tmp2; - - for (cur = GTK_CMCLIST(ctree)->selection; - cur != NULL && cur->data != NULL; cur = cur->next) { - msginfo = gtk_cmctree_node_get_row_data - (ctree, GTK_CMCTREE_NODE(cur->data)); - tmp2 = procmsg_get_message_file(msginfo); - if (!tmp2) continue; - if (msginfo->subject) { - gchar *san_subject = g_strdup(msginfo->subject); - gchar *dest = NULL; - subst_for_filename(san_subject); - dest = g_strdup_printf("%s%s%s.%d.txt", - get_tmp_dir(), - G_DIR_SEPARATOR_S, - san_subject, msginfo->msgnum); - g_free(san_subject); - san_subject = g_filename_from_utf8(dest, -1, NULL, NULL, NULL); - if (!san_subject) { - g_warning("failed to convert encoding of file name: %s", dest); - } else { - g_free(dest); - dest = san_subject; - } - if (copy_file(tmp2, dest, TRUE) < 0) { - g_warning("summary_drag_data_get: can't copy %s to %s", - tmp2, dest); - } - g_free(tmp2); - tmp2 = dest; - } - tmp1 = g_filename_to_uri(tmp2, NULL, NULL); - g_free(tmp2); - tmp2 = g_strconcat(tmp1, "\r\n", NULL); - g_free(tmp1); - tmp1 = tmp2; - - if (!mail_list) { - mail_list = tmp1; - } else { - tmp2 = g_strconcat(mail_list, tmp1, NULL); - g_free(mail_list); - g_free(tmp1); - mail_list = tmp2; - } - } - - if (mail_list != NULL) { - gtk_selection_data_set(selection_data, - gtk_selection_data_get_target(selection_data), 8, - mail_list, strlen(mail_list)); - g_free(mail_list); - } - } else if (info == TARGET_DUMMY) { - if (GTK_CMCLIST(summaryview->ctree)->selection) - gtk_selection_data_set(selection_data, - gtk_selection_data_get_target(selection_data), 8, - "Dummy-Summaryview", - strlen("Dummy-Summaryview")+1); - } else if (info == TARGET_MAIL_CM_PATH_LIST) { - /* content: folder_item_identifier\nmsgid1\nmsgid2\nmsgid3 */ - - GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree); - GList *cur; - MsgInfo *msginfo; - gchar *path_list = NULL; - - /* identifier */ - if(GTK_CMCLIST(ctree)->selection != NULL) { - msginfo = gtk_cmctree_node_get_row_data(ctree, GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->selection->data)); - if(msginfo && msginfo->folder) - path_list = folder_item_get_identifier(msginfo->folder); - } - - if (path_list != NULL) { - for (cur = GTK_CMCLIST(ctree)->selection; - cur != NULL && cur->data != NULL && path_list != NULL; cur = cur->next) { - gchar *tmp; - - msginfo = gtk_cmctree_node_get_row_data(ctree, GTK_CMCTREE_NODE(cur->data)); - if(!msginfo) - continue; - tmp = path_list; - path_list = g_strconcat(path_list, "\n", (msginfo->msgid ? msginfo->msgid : "unknown"), NULL); - g_free(tmp); - } - - if (path_list != NULL) { - gtk_selection_data_set(selection_data, - gtk_selection_data_get_target(selection_data), 8, - path_list, strlen(path_list)); - g_free(path_list); - } - } else { - g_warning("summary_drag_data_get: no folder item identifier"); - } - } -} - -static gboolean summary_drag_motion_cb(GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - guint time, - SummaryView *summaryview) -{ - FolderItem *item = summaryview->folder_item; - if (!(item && item->folder && folder_item_parent(item) != NULL - && FOLDER_CLASS(item->folder)->add_msg != NULL)) { - gdk_drag_status(context, 0, time); - return FALSE; - } else if (gtk_drag_get_source_widget(context) == - mainwindow_get_mainwindow()->folderview->ctree) { - /* no folders */ - gdk_drag_status(context, 0, time); - return FALSE; - } else if (gtk_drag_get_source_widget(context) == - summaryview->ctree) { - /* not from same folder */ - gdk_drag_status(context, 0, time); - return FALSE; - } else { - gdk_drag_status(context, GDK_ACTION_COPY, time); - return TRUE; - } -} - -static void summary_drag_data_received(GtkWidget *widget, - GdkDragContext *drag_context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - SummaryView *summaryview) -{ - if (info == TARGET_MAIL_URI_LIST) { - FolderItem *item = summaryview->folder_item; - if (!item) { - gtk_drag_finish(drag_context, FALSE, FALSE, time); - return; - } else { - folderview_finish_dnd(gtk_selection_data_get_data(data), - drag_context, time, item); - } - } -} - - /* custom compare functions for sorting */ static gint summary_cmp_by_date(GtkCMCList *clist, blob - 49281071a207154175bbc7eef9b050b78d68e308 blob + c6ff6b07e30298895e5ff7679c76139d8918da52 --- src/summaryview.h +++ src/summaryview.h @@ -69,8 +69,6 @@ typedef enum #include "folder.h" #include "gtk/gtksctree.h" -extern GtkTargetEntry summary_drag_types[3]; - struct _SummaryColumnState { SummaryColumnType type;