linux – GtkFileChooserDialog の検索を無効にするには?

arch-linux firefox gtk linux

gtk3アプリ(firefoxなど)でファイルを開いたり保存したりすると、文字をチップした後に不要な検索機能が発生します

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

新しい不要な動作: dと入力すると検索処理が開始され、システムのどこかにある/home/myuser/Downloads/somestuff/DETLEFFや他のファイルが表示されるようになりました

Gtk3FileChooser

旧態依然とした生産的な行動に戻るにはどうすればいいのか?

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

  27  None  2016-01-30


ベストアンサー

お目当ての機能は「typeahead」と呼ばれるもので、GtkFileChooserDialogでは無効化されています。AURからgtk3-typeaheadを実行すると、以前の動作に戻ります

パッケージ作者の は、GTK+ で typeahead を無効にすることはハードコードされている と述べており、バグレポート にも記載されています。”バグではありません。タイプアヘッド検索の削除は非常に意図的なものでした

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

19  Markus  2016-02-04


Updated answer:

2019年現在、私はその後、ArchのAURリポジトリを使用することに飛びついています(それでも私のDebianシステム上で)。これは FreeBSD でも小さな (やや些細な) パッチで行いました。これは “switch to 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 に apt-get build-dep が必要な -dev パッケージを正常に取得できるように deb-src 行を書かなければなりません

私の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ツリーのひとつ上の.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 に依存することもありません


Original answer:

GTK3の人たちがこの動作をハードコード化して、再コンパイルせずに元に戻す方法がないと決めたからです

しかし、typeaheadはUbuntuで配布されているgtk3にパッチバックされていました

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

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

7  Wyatt8740  2017-02-09


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

以前の行動の方がずっと良かったような気がします 🙂

5  Andrew Olney  2017-09-20


Debian の場合: 以下の短いスクリプトは、make install よりも (パッチを適用した) 正規の debian-package を作成してインストールします。パッチは こちら から引用しています。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);

0  spawn  2020-02-15


この答えでは昔のような動作にはなりませんが、再帰的な検索を行うかマウスを使用しなければならないという主な問題を解決してくれます

gtkfilechooserwidget.c のコードを調べてみると、スラッシュを含むパスを入力し始めると、オートコンプリート(emacs ivy のように)と再帰検索を無効にして、インタラクティブなファイルリストを表示して選択できることがわかりました

例えば、./, ../, ~/, / と入力しても問題ありません

0  demon36  2020-03-25


タイトルとURLをコピーしました