diff options
| author | Victor Kareh <[email protected]> | 2026-04-02 13:38:49 -0400 |
|---|---|---|
| committer | Victor Kareh <[email protected]> | 2026-05-04 09:44:19 -0400 |
| commit | 4d63a91c0ad9da7bc851df1bd8700737de2ec17f (patch) | |
| tree | 29f0ad8112f96df1799943d48e65f2d9054fe472 /src | |
| parent | bd3658c2d4a24f2841ba1cdb1fa9aeff490df74f (diff) | |
| download | engrampa-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.c | 34 | ||||
| -rw-r--r-- | src/fr-window.c | 5 |
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; |
