Как отключить поиск GtkFileChooserDialog?

Если я хочу открыть или сохранить файл в приложении gtk3 (например, Firefox), я получаю нежелательную функцию поиска после подсказки персонажа.

Старое и продуктивное поведение: печатать d дает мне первый файл, начинающийся с d набрав de дает мне первый файл с de,

Новое и нежелательное поведение: печатать d начинает процесс поиска и дает мне /home/myuser/Downloads/somestuff/DETLEFF или какой-то другой файл где-то в системе.

Пример:

Как я могу вернуться к старому и продуктивному поведению?

Моя система: archliux64, Gtk3: 3.18.6, менеджер окон: fluxbox

3 ответа

Функция, которую вы ищете, называется "typeahead" и отключена в GtkFileChooserDialog, gtk3-typeahead из AUR восстанавливает предыдущее поведение.

Автор пакета говорит, что отключение typeahead жестко закодировано в GTK+, и в отчете об ошибке было сказано: "Это не ошибка; удаление поиска с опережением было очень намеренным".

Обратите внимание, что теперь в поле имени / адреса есть некоторое (частично нарушенное) завершение табуляции, имитирующее поведение оболочки.

Обновленный ответ:

С 2019 года я перешел к использованию AUR-репозитория Arch (но все еще в моей системе Debian). Я также сделал это на FreeBSD, теперь с небольшим (несколько тривиальным) патчем. Это НЕ ответ "переключиться на арку".

Сначала было немного трудно настроить, но суть в том, что вы можете скомпилировать Arch makepkg запрограммируйте и используйте его для компиляции репозиториев AUR в Debian. Я сделал это так (хотя, возможно, я забыл некоторые зависимости):

Мой старый ответ все еще присутствует после разделителя внизу.

1) Здание makepkg:

sudo apt-get install bsdtar # pacman depends on bsdtar (libarchive) these days
git clone git://projects.archlinux.org/pacman.git
cd pacman
./configure --sysconfdir=/etc --localstatedir=/var --prefix=/opt/arch # Put built program outside of the usual '/usr/local' when installed to avoid conflicts
make
sudo make install # Install pacman/makepkg

# Make a directory pacman expects to exist to dodge makepkg errors
sudo mkdir -p /var/cache/pacman/pkg

2) Подготовка к компиляции источников GTK3:

Теперь для сборки и установки gtk3-typeahead, Чтобы получить все зависимости (debian) для сборки, которые более или менее совпадают с зависимостями Arch, вы должны сначала иметь deb-src строка в вашем sources.list, чтобы apt-get build-dep удастся получить необходимые -dev пакеты.

мой sources.list содержит следующую строку, чтобы сделать это. Измените строку в зависимости от вашего выпуска и ближайшего сервера.

deb-src http://ftp.us.debian.org/debian/ sid main contrib

3) Здание gtk3-typeahead:

Затем вы можете запустить следующее, чтобы построить gtk3-typeahead:

sudo apt-get update
sudo apt-get build-dep 'gtk+3.0' # install gtk3 build dependencies

mkdir /path/to/put/arch/git/repo/into
cd /path/to/put/arch/git/repo/into
git clone https://aur.archlinux.org/gtk3-typeahead.git gtk3-typeahead
cd gtk3-typeahead

# Tack onto configure script arguments so that libraries overwrite the official
# Debian ones in /usr/lib/x86_64-linux-gnu, instead of installing to /usr/lib. 
# CHANGE THIS APPROPRIATELY IF RUNNING 32-BIT (or some other architecture like POWER/MIPS)
sed '/\-\-sysconfdir=/a\
        --libdir=/usr/lib/x86_64-linux-gnu \\' PKGBUILD > PKGBUILD2
mv PKGBUILD2 PKGBUILD

# temporarily add archlinux programs to PATH so we can use 'makepkg'
PATH="/opt/arch/bin:""$PATH"

# Don't check pacman dependencies, since our dependency libraries weren't
# installed via pacman like makepkg expects!
makepkg --nodeps

После этого двоичные файлы будут упакованы в .tar.gz архивировать один уровень выше дерева мерзавца. В моем примере это было бы into каталог.

Чтобы установить это:

TARBALLPATH="$(readlink -f gtk3-typeahead-*.tar.gz | sort | tail -n 1)" # get full path to tarball of most recent build, if multiple are available
cd /
bsdtar xf "$TARBALLPATH"

Это очень хорошо подходит для написания сценариев, и, по моему скромному мнению, это немного менее требовательно, чем работа со старыми сценариями. Это также больше не зависит от Debian.


Оригинальный ответ:

Это был год, и это до сих пор меня раздражает, так как ребята из GTK3 решили жестко закодировать это поведение без возможности отменить его без перекомпиляции.

Однако typeahead был исправлен обратно в gtk3, как он был распространен в Ubuntu.

Ubuntu также заставил средство выбора файлов требовать двойной щелчок для выбора файла, вместо того, чтобы требовать только один щелчок, если файл уже был выбран. Если у вас все в порядке с исправлениями исходного кода gtk3, я сделал патч, который работает с gtk+ 3.22.7, комбинируя патчи ubuntu и обновляя их до более новой версии GTK.

Кроме того, я создал скрипт для своей системы Debian, который автоматически загружает исходный код для последней версии в диспетчере пакетов, исправляет его и компилирует. Правильно работает на Debian Sid и должен нормально работать и на других дистрибутивах Debian.

В нестабильном Debian вы можете получить функциональность typeahead, нажав ctrl-l когда окно открыто (l для просмотра вперед), но только для диалогов открытия файлов, а не диалогов сохранения файлов. Для диалогов сохранения файла, ctrl-l выделит только имя файла, который будет сохранен. Для более разумной навигации вы можете набрать ~, /,. в правильных комбинациях, чтобы получить ваш домашний каталог, текущий каталог или путь к каталогу от root. Также нажатие клавиши со стрелкой назад может отменить выбор имени и удерживать курсор в поле, чтобы не потерять текущее имя (как это происходит в операции "Сохранить как").

Похоже, что старое поведение было намного лучше:)

Хотя этот ответ не возвращает вам точное старое поведение, он решает основную проблему, заключающуюся в необходимости либо выполнять рекурсивный поиск, либо использовать мышь.

Изучив код в gtkfilechooserwidget.c, я узнал, что если вы начнете вводить путь, содержащий косую черту, он покажет вам интерактивный список файлов, из которого можно выбрать автозаполнение (как в emacs ivy) и с отключенным рекурсивным поиском.

так, например, вы можете начать вводить ./, ../, ~/ или же / и это будет просто работать.

Для Debian: следующий короткий сценарий создает и устанавливает (пропатченный) обычный пакет debian, который может быть предпочтительнее make install. Патч берется отсюда с удалением первого блока, поскольку, как сообщается, он вызывает проблемы. Я успешно протестировал его на Debian 10 Buster.

#!/usr/bin/env bash
set -e

# provide the patch path
path_patch=typeahead.patch

sudo apt-get build-dep libgtk-3-dev
apt-get source libgtk-3-dev
cd $(find gtk* -maxdepth 0 -type d)
patch gtk/gtkfilechooserwidget.c < "$path_patch"
debuild -b  -us -uc  --no-pre-clean
cd ..
sudo dpkg -i libgtk-3-0_*.deb
# do not update (dist-upgrade)
sudo apt-mark hold libgtk-3-0

Сохраните это как typeahead.patch:

@@ -1399,12 +1405,6 @@
           return TRUE;
         }
     }
-  else if (gtk_search_entry_handle_event (GTK_SEARCH_ENTRY (priv->search_entry), (GdkEvent *)event))
-    {
-      if (priv->operation_mode != OPERATION_MODE_SEARCH)
-        operation_mode_set (impl, OPERATION_MODE_SEARCH);
-      return TRUE;
-    }

   if (GTK_WIDGET_CLASS (gtk_file_chooser_widget_parent_class)->key_press_event (widget, event))
     return TRUE;
@@ -2427,7 +2427,7 @@
 {
   GtkFileChooserWidgetPrivate *priv = impl->priv;

-  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), -1);
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), MODEL_COL_NAME);

   gtk_tree_view_column_set_sort_column_id (priv->list_name_column, MODEL_COL_NAME);
   gtk_tree_view_column_set_sort_column_id (priv->list_time_column, MODEL_COL_TIME);
@@ -4338,6 +4338,7 @@
   gtk_tree_view_set_model (GTK_TREE_VIEW (priv->browse_files_tree_view),
                            GTK_TREE_MODEL (priv->browse_files_model));
   update_columns (impl, FALSE, _("Modified"));
+  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->browse_files_tree_view), TRUE);
   file_list_set_sort_column_ids (impl);
   set_sort_column (impl);
   profile_msg ("    gtk_tree_view_set_model end", NULL);
@@ -7098,10 +7099,6 @@
 {
   GList *l, *files, *files_with_info, *infos;
   GFile *file;
-  gboolean select = FALSE;
-
-  if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (impl->priv->search_model), NULL) == 0)
-    select = TRUE;

   files = NULL;
   files_with_info = NULL;
@@ -7129,8 +7126,6 @@
   g_list_free_full (infos, g_object_unref);

   gtk_stack_set_visible_child_name (GTK_STACK (impl->priv->browse_files_stack), "list");
-  if (select)
-    gtk_widget_grab_focus (impl->priv->browse_files_tree_view);
 }

 /* Callback used from GtkSearchEngine when the query is done running */
@@ -7427,6 +7422,7 @@
   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->recent_model),
                                         GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
                                         GTK_SORT_DESCENDING);
+  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->browse_files_tree_view), TRUE);
 }

 typedef struct
@@ -7444,7 +7440,7 @@

   gtk_tree_view_set_model (GTK_TREE_VIEW (priv->browse_files_tree_view),
                            GTK_TREE_MODEL (priv->recent_model));
-  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), -1);
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->browse_files_tree_view), MODEL_COL_NAME);

   gtk_tree_view_column_set_sort_column_id (priv->list_name_column, -1);
   gtk_tree_view_column_set_sort_column_id (priv->list_time_column, -1);
Другие вопросы по тегам