web-dev-qa-db-ja.com

GtkFileChooserDialog検索を無効にする方法は?

Gtk3アプリ(Firefoxなど)でファイルを開いたり保存したりしたい場合、文字を傾けた後に不要な検索機能が表示されます。

古い生産的な動作:dと入力すると、dで始まる最初のファイルが表示され、deと入力すると、deで最初のファイルが表示されます。

新しい不要な動作:dと入力すると、検索プロセスが開始され、/home/myuser/Downloads/somestuff/DETLEFFまたはシステム内のどこかにある他のファイル。

例:Gtk3FileChooser

どうすれば古くて生産的な行動に戻すことができますか?

私のシステム:archliux64、Gtk3:3.18.6、windowmanager:fluxbox

25
gj13

探している機能は「typeahead」と呼ばれ、GtkFileChooserDialogでは無効になっています。 gtk3-typeahead AURから、以前の動作を復元します。

パッケージの作者 先行入力の無効化はハードコーディングされていると言う GTK +と バグレポート それは次のように述べられています:「これはバグではありません。先行入力検索の削除は非常に重要でした意図的です。」

シェルの動作を模倣した名前/アドレスフィールドにいくつかの(部分的に壊れた)タブ補完があることに注意してください。

19
Markus

更新された回答:

2019年の時点で、私は ArchのAURリポジトリ を使用することにしました(しかしはまだ私のDebianシステムにあります)。 FreeBSDでも、小さな(やや些細な)パッチを使ってこれを行いました。これは「Archへの切り替え」の答えではありません。

最初はセットアップが少し難しかったですが、その要点は、実際にArchのmakepkgプログラムをコンパイルし、それを使用してDebianでAURリポジトリをコンパイルできることです。私はこれをそのように行いました(いくつかの依存関係を忘れていたかもしれませんが):

私の古い答えは、下部近くのセパレーターの後にまだ存在しています。

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をビルドしてインストールします。 Archのものとほぼ同じであるすべての(debian)ビルド依存関係を取得するには、最初にsources.listにdeb-src行を入れて、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

これを行った後、バイナリはgitツリーの1レベル上の.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の人々がこの動作をハードコーディングすることを決定したので、1年が経ちましたが、これはまだ私を悩ませています。再コンパイルせずに元に戻す方法はありません。

ただし、typeaheadは、Ubuntuで配布されているgtk3にパッチで戻されました。

Ubuntuはまた、ファイルがすでに選択されている場合にシングルクリックだけでなく、ファイルチューザーでファイルを選択するためにダブルクリックを必要とするようにしました。 gtk3ソースコードにパッチを当てても問題がない場合は、 gtk + 3.22.7の時点で機能するパッチを作成しました ubuntuパッチを組み合わせて、GTKの最新バージョンに更新します。

さらに、 私はスクリプトを作成しました 私のdebianシステムでは、パッケージマネージャーの最新バージョンのソースを自動的にダウンロードし、パッチを適用してコンパイルします。 Debian Sidで正しく動作し、他のDebianディストリビューションでも問題なく動作するはずです。

7
Wyatt8740

Debian不安定版では、ウィンドウが開いているときに(先読みの場合はl)、ctrl-lを押すことで先行入力機能を取得できますが、ファイルを開くダイアログの場合のみで、ファイルの保存ダイアログは表示されません。ファイル保存ダイアログの場合、ctrl-lは保存するファイルの名前のみを強調表示します。よりインテリジェントな方法でナビゲートするには、正しい組み合わせで~/.と入力して、ホームディレクトリ、現在のディレクトリ、またはルートからのディレクトリパスを取得します。また、戻る矢印キーを押すと、名前の選択を解除してカーソルをボックス内に保持できるため、現在の名前を失うことはありません(「名前を付けて保存」操作で発生する場合のように)。

古い振る舞いの方がはるかに良かったようです:)

4
Andrew Olney

この答えは正確な古い動作を取り戻すことはできませんが、再帰検索を実行するか、マウスを使用する必要があるという主な問題を解決します。

私は gtkfilechooserwidget.c のコードを調べて、スラッシュを含むパスを入力し始めると、オートコンプリート(emacs ivyのような)と再帰検索が無効になっています。

たとえば、./../~/または/そしてそれはうまくいくでしょう。

0
demon36

Debianの場合:次の短いスクリプトは、(パッチされた)通常のdebian-packageを作成してインストールします。これは、make installよりも優先される場合があります。パッチは ここ から取得され、問題が発生すると報告されているため、最初のブロックが削除されています。 Debian 10Busterでのテストに成功しました。

#!/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);
0
spawn