Aktualisierte Antwort:

Aktualisierte Antwort:

Wenn ich eine Datei in einer GTK3-App (z. B. Firefox) öffnen oder speichern möchte, erhalte ich nach dem Eintippen eines Zeichens eine unerwünschte Suchfunktion.

Altes und produktives Verhalten: Beim Eintippen derhalte ich die erste Datei, die mit beginnt d, beim Eintippen deerhalte ich die erste Datei mit de.

Neues und unerwünschtes Verhalten: Durch die Eingabe dwird ein Suchvorgang gestartet und ich /home/myuser/Downloads/somestuff/DETLEFFoder eine andere Datei irgendwo im System werden angezeigt.

Beispiel: Gtk3FileChooser

Wie kann ich zum alten und produktiven Verhalten zurückkehren?

Mein System: archliux64, Gtk3: 3.18.6, Fenstermanager: fluxbox

Antwort1

Die Funktion, nach der Sie suchen, heißt „Typeahead“ und ist in deaktiviert GtkFileChooserDialog. gtk3-typeaheadVom AUR wird das vorherige Verhalten wiederhergestellt.

Der Paketautorsagt, dass die Deaktivierung der Typeahead-Funktion fest codiert istin GTK+ und in einemFehlerberichtDort hieß es: „Das ist kein Fehler. Die Entfernung der Type-Ahead-Suche war durchaus beabsichtigt.“

Beachten Sie, dass es jetzt eine (teilweise defekte) Tab-Vervollständigung im Namens-/Adressfeld gibt, die das Verhalten der Shell nachahmt.

Antwort2

Aktualisierte Antwort:

Seit 2019 verwende ichArchs AUR-Repository(Aberimmer noch auf meinem Debian-System). Ich habe dies jetzt auch unter FreeBSD mit einem kleinen (ziemlich trivialen) Patch gemacht. Dies ist KEINE „Wechsel zu Arch“-Antwort.

Anfangs war die Einrichtung etwas schwierig, aber im Wesentlichen können Sie makepkgdas Programm von Arch tatsächlich kompilieren und es zum Kompilieren von AUR-Repositorys unter Debian verwenden. Ich habe es folgendermaßen gemacht (obwohl ich möglicherweise einige Abhängigkeiten vergessen habe):

Meine alte Antwort ist nach dem Trennzeichen weiter unten noch vorhanden.

1) Gebäude 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) Vorbereitung zum Kompilieren der GTK3-Quellen:

Nun zum Erstellen und Installieren gtk3-typeahead. Um alle (Debian-)Build-Abhängigkeiten abzurufen, die mehr oder weniger mit denen von Arch identisch sind, müssen Sie zunächst eine deb-srcZeile in Ihrer Quellenliste haben, damit apt-get build-depdie erforderlichen -devPakete erfolgreich abgerufen werden können.

sources.listDazu enthält meins die folgende Zeile. Ändern Sie die Zeile basierend auf Ihrer Version und dem nächstgelegenen Server.

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

3) Gebäude gtk3-typeahead:

Anschließend können Sie zum Erstellen Folgendes ausführen 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

Anschließend werden die Binärdateien in einem .tar.gzArchiv eine Ebene über dem Git-Baum gepackt. In meinem Beispiel wäre dies das intoVerzeichnis.

So installieren Sie es:

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"

Dies ist sehr skriptfähig und meiner bescheidenen Meinung nach etwas weniger kompliziert als der Umgang mit meinen alten Skripten. Es hängt auch nicht mehr von Debian ab.


Ursprüngliche Antwort:

Es ist ein Jahr her und das ärgert mich immer noch, seit die Leute von GTK3 beschlossen haben, dieses Verhalten fest einzucodieren, ohne dass es eine Möglichkeit gibt, es ohne Neukompilierung rückgängig zu machen.

Allerdings wurde Typeahead wieder in GTK3 gepatcht, wie es in Ubuntu verteilt wird.

Ubuntu hat außerdem dafür gesorgt, dass die Dateiauswahl einen Doppelklick erfordert, um eine Datei auszuwählen, anstatt nur einen Klick, wenn die Datei bereits ausgewählt war. Wenn Sie mit dem Patchen des GTK3-Quellcodes einverstanden sind,Ich habe einen Patch erstellt, der ab gtk+ 3.22.7 funktioniertKombinieren der Ubuntu-Patches und Aktualisieren auf eine aktuellere Version von GTK.

Zusätzlich,Ich habe ein Skript erstelltfür mein Debian-System, das den Quellcode für die neueste Version automatisch im Paketmanager herunterlädt, patcht und kompiliert. Läuft problemlos auf Debian Sid und sollte auch auf anderen Debian-Distributionen problemlos funktionieren.

Antwort3

Unter Debian Unstable können Sie die Typeahead-Funktion erhalten, indem Sie ctrl-lbei geöffnetem Fenster drücken (l für Lookahead), aber nur für Dialoge zum Öffnen von Dateien, nicht für Dialoge zum Speichern von Dateien. Bei Dialogen zum Speichern von Dateien ctrl-lwird nur der Name der zu speichernden Datei hervorgehoben. Um intelligenter zu navigieren, können Sie ~, /, .in den richtigen Kombinationen eingeben, um Ihr Home-Verzeichnis, Ihr aktuelles Verzeichnis oder einen Verzeichnispfad vom Stammverzeichnis zu erhalten. Auch durch Drücken der Zurück-Pfeiltaste können Sie den Namen abwählen und den Cursor im Feld behalten, sodass Sie den aktuellen Namen nicht verlieren (wie dies bei einem „Speichern unter“-Vorgang passieren würde).

Es scheint, dass das alte Verhalten viel besser war :)

Antwort4

Für Debian: das folgende kurze Skript erstellt und installiert ein (gepatchtes) reguläres Debian-Paket, das möglicherweise make install vorzuziehen ist. Der Patch stammt vonHierwobei der erste Block entfernt wurde, da er angeblich Probleme verursacht. Ich habe es erfolgreich auf Debian 10 Buster getestet.

#!/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

Speichern Sie dies als 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);

verwandte Informationen