summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2026-04-02 13:38:49 -0400
committerVictor Kareh <[email protected]>2026-05-04 09:44:19 -0400
commit4d63a91c0ad9da7bc851df1bd8700737de2ec17f (patch)
tree29f0ad8112f96df1799943d48e65f2d9054fe472 /src
parentbd3658c2d4a24f2841ba1cdb1fa9aeff490df74f (diff)
downloadengrampa-4d63a91c0ad9da7bc851df1bd8700737de2ec17f.tar.bz2
engrampa-4d63a91c0ad9da7bc851df1bd8700737de2ec17f.tar.xz
fixed wrong drag&drop activation when in single click mode
when calling the parent button_press_event function a button released event could be emitted, in that case stop the drag&drop action. Backported from https://gitlab.gnome.org/GNOME/file-roller/-/commit/279b76d6 Fixes #547
Diffstat (limited to 'src')
-rw-r--r--src/eggtreemultidnd.c34
-rw-r--r--src/fr-window.c5
2 files changed, 24 insertions, 15 deletions
diff --git a/src/eggtreemultidnd.c b/src/eggtreemultidnd.c
index 28fda8e..38ccf50 100644
--- a/src/eggtreemultidnd.c
+++ b/src/eggtreemultidnd.c
@@ -41,10 +41,10 @@ typedef struct
gint x;
gint y;
guint motion_notify_handler;
- guint button_release_handler;
guint drag_data_get_handler;
GSList *event_list;
gboolean pending_event;
+ gboolean button_released;
} EggTreeMultiDndData;
GType
@@ -178,10 +178,6 @@ stop_drag_check (GtkWidget *widget)
g_signal_handler_disconnect (widget, priv_data->motion_notify_handler);
priv_data->motion_notify_handler = 0;
}
- if (priv_data->button_release_handler) {
- g_signal_handler_disconnect (widget, priv_data->button_release_handler);
- priv_data->button_release_handler = 0;
- }
}
static gboolean
@@ -193,6 +189,13 @@ egg_tree_multi_drag_button_release_event (GtkWidget *widget,
GSList *l;
priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING);
+ if (priv_data == NULL)
+ return FALSE;
+
+ priv_data->button_released = TRUE;
+
+ if (! priv_data->pending_event)
+ return FALSE;
for (l = priv_data->event_list; l != NULL; l = l->next)
gtk_propagate_event (widget, l->data);
@@ -282,6 +285,9 @@ egg_tree_multi_drag_motion_event (GtkWidget *widget,
priv_data = g_object_get_data (G_OBJECT (widget), EGG_TREE_MULTI_DND_STRING);
+ if (! priv_data->pending_event)
+ return FALSE;
+
if (gtk_drag_check_threshold (widget,
priv_data->x,
priv_data->y,
@@ -407,10 +413,12 @@ egg_tree_multi_drag_button_press_event (GtkWidget *widget,
!gtk_tree_selection_path_is_selected (selection, path) ||
event->button != 1);
+ /* calling the parent the button_release event could be emitted */
+ priv_data->button_released = FALSE;
if (call_parent)
(GTK_WIDGET_GET_CLASS (tree_view))->button_press_event (widget, event);
- if (gtk_tree_selection_path_is_selected (selection, path))
+ if (! priv_data->button_released && gtk_tree_selection_path_is_selected (selection, path))
{
priv_data->pressed_button = event->button;
priv_data->x = (gint) event->x;
@@ -430,15 +438,6 @@ egg_tree_multi_drag_button_press_event (GtkWidget *widget,
NULL);
}
- if (priv_data->button_release_handler == 0)
- {
- priv_data->button_release_handler =
- g_signal_connect (G_OBJECT (tree_view),
- "button_release_event",
- G_CALLBACK (egg_tree_multi_drag_button_release_event),
- NULL);
- }
-
if (priv_data->drag_data_get_handler == 0)
{
priv_data->drag_data_get_handler =
@@ -449,6 +448,7 @@ egg_tree_multi_drag_button_press_event (GtkWidget *widget,
}
}
+ priv_data->button_released = FALSE;
gtk_tree_path_free (path);
/* We called the default handler so we don't let the default handler run */
return TRUE;
@@ -465,5 +465,9 @@ egg_tree_multi_drag_add_drag_support (GtkTreeView *tree_view)
"button_press_event",
G_CALLBACK (egg_tree_multi_drag_button_press_event),
NULL);
+ g_signal_connect (G_OBJECT (tree_view),
+ "button_release_event",
+ G_CALLBACK (egg_tree_multi_drag_button_release_event),
+ NULL);
}
diff --git a/src/fr-window.c b/src/fr-window.c
index d1ce30c..110367b 100644
--- a/src/fr-window.c
+++ b/src/fr-window.c
@@ -4153,6 +4153,11 @@ file_list_drag_begin (GtkWidget *widget,
if (window->priv->activity_ref > 0)
return FALSE;
+ if (window->priv->path_clicked != NULL) {
+ gtk_tree_path_free (window->priv->path_clicked);
+ window->priv->path_clicked = NULL;
+ }
+
g_free (window->priv->drag_destination_folder);
window->priv->drag_destination_folder = NULL;