From e981906e97a78f85bf536996c00183a07f46b3a9 Mon Sep 17 00:00:00 2001 From: ToxicMushroom <32853531+ToxicMushroom@users.noreply.github.com> Date: Fri, 26 Jan 2024 02:03:32 +0100 Subject: [PATCH] nemo-dnd: Have the drag and drop text data not be uris but plain paths. Some programs get confused when presented with uris when they requested text typed data (even though the uris are just text...). See https://github.com/linuxmint/nemo/issues/3354. --- libnemo-private/nemo-dnd.c | 21 +++++++++++++++++---- libnemo-private/nemo-dnd.h | 3 ++- libnemo-private/nemo-icon-dnd.c | 3 +++ src/nemo-list-model.c | 3 +++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/libnemo-private/nemo-dnd.c b/libnemo-private/nemo-dnd.c index 5205a4aa6..44336073a 100644 --- a/libnemo-private/nemo-dnd.c +++ b/libnemo-private/nemo-dnd.c @@ -662,7 +662,7 @@ nemo_drag_default_drop_action_for_uri_list (GdkDragContext *context, the location and size of each icon relative to the cursor. */ static void -add_one_gnome_icon (const char *uri, int x, int y, int w, int h, +add_one_gnome_icon (const char *uri, const char *path_str, int x, int y, int w, int h, gpointer data) { GString *result; @@ -747,7 +747,7 @@ add_one_compatible_uri (const char *uri, int x, int y, int w, int h, gpointer da #endif static void -add_one_uri (const char *uri, int x, int y, int w, int h, gpointer data) +add_one_uri (const char *uri, const char *path_str, int x, int y, int w, int h, gpointer data) { GString *result; @@ -757,6 +757,17 @@ add_one_uri (const char *uri, int x, int y, int w, int h, gpointer data) g_string_append (result, "\r\n"); } +static void +add_one_path (const char *uri, const char *path_str, int x, int y, int w, int h, gpointer data) +{ + GString *result; + + result = (GString *) data; + + g_string_append (result, path_str); + g_string_append (result, "\r\n"); +} + /* Common function for drag_data_get_callback calls. * Returns FALSE if it doesn't handle drag data */ gboolean @@ -777,11 +788,13 @@ nemo_drag_drag_data_get (GtkWidget *widget, break; case NEMO_ICON_DND_URI_LIST: - case NEMO_ICON_DND_TEXT: result = g_string_new (NULL); (* each_selected_item_iterator) (add_one_uri, container_context, result); break; - + case NEMO_ICON_DND_TEXT: + result = g_string_new (NULL); + (* each_selected_item_iterator) (add_one_path, container_context, result); + break; default: return FALSE; } diff --git a/libnemo-private/nemo-dnd.h b/libnemo-private/nemo-dnd.h index ac519c97b..34db0cbed 100644 --- a/libnemo-private/nemo-dnd.h +++ b/libnemo-private/nemo-dnd.h @@ -98,7 +98,8 @@ typedef struct { } NemoDragInfo; -typedef void (* NemoDragEachSelectedItemDataGet) (const char *url, +typedef void (* NemoDragEachSelectedItemDataGet) (const char *url, + const char *path_str, int x, int y, int w, int h, gpointer data); typedef void (* NemoDragEachSelectedItemIterator) (NemoDragEachSelectedItemDataGet iteratee, diff --git a/libnemo-private/nemo-icon-dnd.c b/libnemo-private/nemo-icon-dnd.c index 91ea15527..24f1fc999 100644 --- a/libnemo-private/nemo-icon-dnd.c +++ b/libnemo-private/nemo-icon-dnd.c @@ -283,6 +283,7 @@ icon_get_data_binder (NemoIcon *icon, gpointer data) EelDRect world_rect; EelIRect widget_rect; char *uri; + char *path_str; NemoIconContainer *container; context = (IconGetDataBinderContext *)data; @@ -300,6 +301,7 @@ icon_get_data_binder (NemoIcon *icon, gpointer data) g_warning ("no URI for one of the iterated icons"); return TRUE; } + path_str = nemo_file_get_path (NEMO_FILE (icon->data)); widget_rect = eel_irect_offset_by (widget_rect, - container->details->dnd_info->drag_info.start_x, @@ -310,6 +312,7 @@ icon_get_data_binder (NemoIcon *icon, gpointer data) /* pass the uri, mouse-relative x/y and icon width/height */ context->iteratee (uri, + path_str, (int) widget_rect.x0, (int) widget_rect.y0, widget_rect.x1 - widget_rect.x0, diff --git a/src/nemo-list-model.c b/src/nemo-list-model.c index baa350c35..d5775f9c5 100644 --- a/src/nemo-list-model.c +++ b/src/nemo-list-model.c @@ -892,6 +892,7 @@ each_path_get_data_binder (NemoDragEachSelectedItemDataGet data_get, GtkTreeRowReference *row; GtkTreePath *path; char *uri; + char *path_str; GdkRectangle cell_area; GtkTreeViewColumn *column; @@ -914,8 +915,10 @@ each_path_get_data_binder (NemoDragEachSelectedItemDataGet data_get, &cell_area); uri = nemo_file_get_local_uri (file); + path_str = nemo_file_get_path (file); (*data_get) (uri, + path_str, 0, cell_area.y - info->model->details->drag_begin_y, cell_area.width, cell_area.height,