summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meson.build2
-rw-r--r--src/nautilus-list-view.c47
2 files changed, 44 insertions, 5 deletions
diff --git a/meson.build b/meson.build
index 99126aadb..cd3006932 100644
--- a/meson.build
+++ b/meson.build
@@ -79,7 +79,7 @@ glib = dependency('glib-2.0', version: glib_ver)
gmodule = dependency('gmodule-no-export-2.0', version: glib_ver)
gnome_autoar = dependency('gnome-autoar-0', version: '>= 0.2.1')
gnome_desktop = dependency('gnome-desktop-3.0', version: '>= 3.0.0')
-gtk = dependency('gtk+-3.0', version: '>= 3.22.26')
+gtk = dependency('gtk+-3.0', version: '>= 3.22.27')
selinux = []
if get_option('selinux')
selinux = dependency('libselinux', version: '>= 2.0')
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 30308aded..d8a4e9104 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -678,6 +678,8 @@ button_press_callback (GtkWidget *widget,
}
else
{
+ g_autoptr (GtkTreePath) cursor = NULL;
+ GList *selected_rows = NULL;
if (event->button == GDK_BUTTON_SECONDARY)
{
if (path_selected)
@@ -690,6 +692,45 @@ button_press_callback (GtkWidget *widget,
*/
call_parent = FALSE;
}
+ else if ((event->state & GDK_CONTROL_MASK) != 0)
+ {
+ /* If CTRL is pressed, we don't allow the parent
+ * class to handle it, since GtkTreeView doesn't
+ * do it as intended currently.
+ */
+ call_parent = FALSE;
+ if ((event->state & GDK_SHIFT_MASK) != 0)
+ {
+ /* This is the CTRL+SHIFT selection mode which
+ * we handleourselves, as the parent class would
+ * otherwise do an unexpected selection.
+ */
+ gtk_tree_view_get_cursor (tree_view, &cursor, NULL);
+ if (cursor != NULL)
+ {
+ gtk_tree_selection_select_range (selection, cursor, path);
+ }
+ else
+ {
+ gtk_tree_selection_select_path (selection, path);
+ }
+ }
+ else
+ {
+ gtk_tree_selection_select_path (selection, path);
+ }
+ selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL);
+
+ /* This unselects everything */
+ gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE);
+
+ /* So select it again */
+ for (GList *l = selected_rows; l != NULL; l = l->next)
+ {
+ gtk_tree_selection_select_path (selection, l->data);
+ }
+ g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free);
+ }
else if (on_expander)
{
/* If the right click happened on an expander, we should
@@ -698,6 +739,7 @@ button_press_callback (GtkWidget *widget,
gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE);
}
}
+
if ((event->button == GDK_BUTTON_PRIMARY || event->button == GDK_BUTTON_MIDDLE) &&
((event->state & GDK_CONTROL_MASK) != 0 || (event->state & GDK_SHIFT_MASK) == 0))
{
@@ -710,12 +752,9 @@ button_press_callback (GtkWidget *widget,
}
else if ((event->state & GDK_CONTROL_MASK) != 0)
{
- GList *selected_rows, *l;
-
call_parent = FALSE;
if ((event->state & GDK_SHIFT_MASK) != 0)
{
- GtkTreePath *cursor;
gtk_tree_view_get_cursor (tree_view, &cursor, NULL);
if (cursor != NULL)
{
@@ -736,7 +775,7 @@ button_press_callback (GtkWidget *widget,
gtk_tree_view_set_cursor (tree_view, path, NULL, FALSE);
/* So select it again */
- for (l = selected_rows; l != NULL; l = l->next)
+ for (GList *l = selected_rows; l != NULL; l = l->next)
{
gtk_tree_selection_select_path (selection, l->data);
}