diff options
author | Alexandru Fazakas <alex.fazakas97@yahoo.com> | 2018-03-20 21:02:49 +0200 |
---|---|---|
committer | Alexandru Fazakas <alex.fazakas97@yahoo.com> | 2018-03-21 23:57:56 +0200 |
commit | 315d14585bf40188780d9433887a7b3681d28eb4 (patch) | |
tree | 02ba812b1b7f46508052d8179a81125102bc89dd | |
parent | e3c01df382ac41ed4657463b9d4d60a7e7dff4a3 (diff) | |
download | nautilus-315d14585bf40188780d9433887a7b3681d28eb4.tar.gz |
list-view: Make list view selection consistent
Selecting rows using CTRL/SHIFT with left click is different
to right click as GtkTreeView's default code does not support
SHIFT+CTRL selection.
We want consistency between the two behaviours.
We fixed this by replicating the left click behaviour in the
right click case. The GTK dependency is also bumped in order
to use GtkTreePath autocleanup.
-rw-r--r-- | meson.build | 2 | ||||
-rw-r--r-- | src/nautilus-list-view.c | 47 |
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); } |