Если я хочу открыть или сохранить файл в приложении gtk3 (например, Firefox), то после нажатия символа я получаю нежелательную функцию поиска.
Старое и продуктивное поведение: ввод текста d
дает мне первый файл, начинающийся с d
, ввод текста de
дает мне первый файл с de
.
Новое и нежелательное поведение: при вводе текста d
запускается процесс поиска, который выдает мне /home/myuser/Downloads/somestuff/DETLEFF
или какому-либо другому файлу где-то в системе.
Как мне вернуться к старому и продуктивному поведению?
Моя система: archliux64, Gtk3: 3.18.6, оконный менеджер: fluxbox
решение1
Функция, которую вы ищете, называется «typeahead» и отключена в GtkFileChooserDialog
. gtk3-typeahead
из AUR восстанавливает предыдущее поведение.
Автор пакетаговорит, что отключение опережающего ввода жестко запрограммированов GTK+ и вотчет об ошибкебыло заявлено: «Это не ошибка; удаление поиска с опережением ввода было вполне преднамеренным».
Обратите внимание, что теперь в поле имени/адреса есть некоторая (частично неработающая) функция автодополнения с помощью клавиши Tab, имитирующая поведение оболочки.
решение2
Обновленный ответ:
С 2019 года я перешел на использованиеAUR-репозиторий Arch(Новсе еще на моей системе Debian). Я также сделал это на FreeBSD, теперь, с небольшим (довольно тривиальным) патчем. Это НЕ ответ "перейти на Arch".
Сначала было немного сложно настроить, но суть в том, что вы можете скомпилировать makepkg
программу Arch и использовать ее для компиляции репозиториев 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
архив на один уровень выше дерева git. В моем примере это будет каталог 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.
решение3
В нестабильной версии Debian вы можете получить функциональность опережающего ввода, нажав , ctrl-l
когда окно открыто (l для опережающего ввода), но только для диалогов открытия файлов, а не для диалогов сохранения файлов. Для диалогов сохранения файлов ctrl-l
будет выделено только имя файла, который нужно сохранить. Для более разумной навигации вы можете ввести ~
, /
, .
в правильных комбинациях, чтобы получить домашний каталог, текущий каталог или путь к каталогу из root. Также нажатие клавиши со стрелкой назад может отменить выбор имени и оставить курсор в поле, чтобы вы не потеряли текущее имя (как это произошло бы при операции «Сохранить как»).
Похоже, старое поведение было намного лучше :)
решение4
Для 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);