Se eu quiser abrir ou salvar um arquivo em um aplicativo gtk3 (por exemplo, Firefox), recebo uma função de pesquisa indesejada após digitar um caractere.
Comportamento antigo e produtivo: digitar d
me dá o primeiro arquivo começando com d
, digitar de
me dá o primeiro arquivo com de
.
Comportamento novo e indesejado: a digitação d
inicia um processo de pesquisa e fornece a mim /home/myuser/Downloads/somestuff/DETLEFF
ou algum outro arquivo em algum lugar do sistema.
Como posso voltar ao comportamento antigo e produtivo?
Meu sistema: archliux64, Gtk3: 3.18.6, gerenciador de janelas: fluxbox
Responder1
O recurso que você está procurando é chamado de "typeahead" e está desabilitado no GtkFileChooserDialog
. gtk3-typeahead
do AUR restaura o comportamento anterior.
O autor do pacotediz que desativar a digitação antecipada está codificadoem GTK+ e em umrelatório de errofoi declarado: "Não é um bug; a remoção da pesquisa por digitação antecipada foi muito intencional."
Observe que agora há alguma conclusão de tabulação (parcialmente quebrada) no campo nome/endereço, imitando o comportamento do shell.
Responder2
Resposta atualizada:
A partir de 2019, comecei a usarRepositório AUR do Arch(Masainda no meu sistema Debian). Eu também fiz isso no FreeBSD, agora, com um patch pequeno (um tanto trivial). Esta NÃO é uma resposta "mudar para Arch".
Foi um pouco difícil de configurar no início, mas a essência disso é que você pode de fato compilar makepkg
o programa do Arch e usá-lo para compilar repositórios AUR no Debian. Fiz assim (embora possa ter esquecido algumas dependências):
Minha resposta antiga ainda está presente após o separador próximo ao fundo.
1) Edifício 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) Preparação para compilar os fontes GTK3:
Agora, para construir e instalar o gtk3-typeahead
. Para obter todas as dependências de compilação (debian), que são mais ou menos iguais às do Arch, você deve primeiro ter uma deb-src
linha em seu sources.list para que possa buscar com sucesso os pacotes apt-get build-dep
necessários .-dev
My sources.list
contém a seguinte linha para fazer isso. Altere a linha com base no seu lançamento e no servidor mais próximo.
deb-src http://ftp.us.debian.org/debian/ sid main contrib
3) Edifício gtk3-typeahead
:
Então, você pode executar o seguinte para construir 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
Depois de fazer isso, os binários serão compactados em um .tar.gz
arquivo um nível acima da árvore git. No meu exemplo, este seria o into
diretório.
Para instalá-lo:
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"
Isso é altamente programável e um pouco menos complicado do que lidar com meus scripts antigos, na minha humilde opinião. Também não depende mais do debian.
Resposta original:
Já se passou um ano e isso ainda me incomoda, já que o pessoal do GTK3 decidiu codificar esse comportamento, sem ter como revertê-lo sem recompilar.
No entanto, o typeahead foi corrigido novamente no gtk3 conforme distribuído no Ubuntu.
O Ubuntu também fez com que o seletor de arquivos exigisse um clique duplo para escolher um arquivo, em vez de exigir apenas um único clique se o arquivo já estivesse selecionado. Se você concordar em corrigir o código-fonte gtk3,Eu fiz um patch que funciona a partir do gtk+ 3.22.7combinando os patches do Ubuntu e atualizando-os para uma versão mais atual do GTK.
Adicionalmente,Eu fiz um roteiropara o meu sistema debian, que baixa automaticamente o código-fonte da versão mais recente no gerenciador de pacotes, corrige-o e compila-o. Funciona corretamente no Debian Sid e também deve funcionar bem para outras distros Debian.
Responder3
No Debian instável, você pode obter a funcionalidade de digitação antecipada pressionando ctrl-l
quando a janela estiver aberta (l para antecipação), mas apenas para diálogos de abertura de arquivo, não para diálogos de salvamento de arquivo. Para caixas de diálogo de salvamento de arquivo, ctrl-l
apenas destacará o nome do arquivo a ser salvo. Para navegar de forma mais inteligente, você pode digitar ~
, /
, .
nas combinações corretas para obter seu diretório inicial, diretório atual ou um caminho de diretório da raiz. Além disso, pressionar a tecla de seta para trás pode desmarcar o nome e manter o cursor na caixa para não perder o nome atual (como ocorreria em uma operação "Salvar como").
Parece que o comportamento antigo era muito melhor :)
Responder4
Para Debian: o pequeno script a seguir cria e instala um pacote debian regular (corrigido) que pode ser preferido a make install. O patch é retirado deaquicom o primeiro bloco removido, pois pode causar problemas. Eu testei com sucesso no 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
Armazene isso como 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);