From 1828bccbcf44a620c3582732b456b0bf001f24f0 Mon Sep 17 00:00:00 2001 From: Alexander Schwinn Date: Mon, 30 Mar 2020 00:30:05 +0200 Subject: [PATCH] exo-icon-view: Extend selection on shift+drag (Bug #7526) --- exo/exo-icon-view.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/exo/exo-icon-view.c b/exo/exo-icon-view.c index bd1d77f8..13412433 100644 --- a/exo/exo-icon-view.c +++ b/exo/exo-icon-view.c @@ -2347,6 +2347,11 @@ exo_icon_view_motion_notify_event (GtkWidget *widget, if (icon_view->priv->doing_rubberband) { + if ((event->state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) + icon_view->priv->ctrl_pressed = TRUE; + if ((event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) + icon_view->priv->shift_pressed = TRUE; + exo_icon_view_update_rubberband (widget); if (icon_view->priv->layout_mode == EXO_ICON_VIEW_LAYOUT_ROWS) @@ -3121,6 +3126,8 @@ exo_icon_view_stop_rubberbanding (ExoIconView *icon_view) if (G_LIKELY (icon_view->priv->doing_rubberband)) { icon_view->priv->doing_rubberband = FALSE; + icon_view->priv->ctrl_pressed = FALSE; + icon_view->priv->shift_pressed = FALSE; gtk_grab_remove (GTK_WIDGET (icon_view)); gtk_widget_queue_draw (GTK_WIDGET (icon_view)); @@ -3167,9 +3174,24 @@ exo_icon_view_update_rubberband_selection (ExoIconView *icon_view) if (G_UNLIKELY (item->selected != selected)) { - changed = TRUE; - item->selected = selected; - exo_icon_view_queue_draw_item (icon_view, item); + /* extend */ + if (icon_view->priv->shift_pressed && !icon_view->priv->ctrl_pressed) + { + if (!item->selected) + { + changed = TRUE; + item->selected = TRUE; + } + } + /* add/remove */ + else + { + changed = TRUE; + item->selected = selected; + } + + if (changed) + exo_icon_view_queue_draw_item (icon_view, item); } if (item->selected) -- 2.25.1