ひよこになりたい

Programming Server Network Security and so on

Ubuntu+Gnome(Wayland)でターミナルウインドウの表示・非表示のキーバインドを設定する

過去、Macのターミナルをキー入力一つで表示・非表示するスクリプトを書いたのですが、最近久々にメイン端末をUbuntuにしたのでこちらでも同じようにターミナルの表示・非表示をコマンド一つで実行できるようにしてみました。

以前の記事は以下です。

zipsan.hatenablog.jp

ターミナルだけではなく、ブラウザやエディタなど別のWindowも操作できます。

前提

以下の環境を使用します。

  • Ubuntu 22.04 LTS Desktop
  • Gnome 42.9 (wayland)
  • 標準のターミナル(gnome-terminal-server)

Gnome-Extensionを入れる

まずははじめにWindowを操作するためにGnome Extensionを入れます。

入れるextensionはこちらです。

extensions.gnome.org

https://github.com/ickyicky/window-calls

Gnomeのいつからか、ディスプレイサーバープロトコルXorgからwaylandに変更されており、セキュリティ上の理由からXorgで使用可能だった xdotool コマンドによる操作が一部できなくなってしまっています。

現在の状態でもxdotoolによって操作できるウインドウもあるみたいですが、Gnome-Terminalは操作することができませんでした。

そこで、上記の拡張機能を追加することで、 gdbus を経由して各種操作を行えるようにします。

Toggleスクリプトを書く

extensionを入れたらgdbus経由でウインドウの操作ができるようになるため、スクリプトを組んでトグル操作ができるコマンドを作ります。

以下が今回記述したスクリプトです。

#!/bin/bash

GDBUS_RESULT=`gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/Windows --method org.gnome.Shell.Extensions.Windows.List | cut -c 3- | rev | cut -c4- | rev`

W_ID_LIST=`echo ${GDBUS_RESULT} | jq -c '.[] | select (.in_current_workspace == true and .wm_class == "gnome-terminal-server") | .id'`

W_FOCUS_LIST=`echo ${GDBUS_RESULT} | jq -c '.[] | select (.in_current_workspace == true and .wm_class == "gnome-terminal-server") | .focus'`

for W_ID in ${W_ID_LIST}; do
    if [[ "${W_FOCUS_LIST}" == *true* ]]; then
        # if it containes at lease one focus == true
        # all hide
        gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/Windows --method org.gnome.Shell.Extensions.Windows.Minimize ${W_ID}
    else
        # show
        gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/Windows --method org.gnome.Shell.Extensions.Windows.Activate ${W_ID}
    fi
done

gnome-terminal-server の部分を変更することで他のウインドウにも適用できます。

適当にいい感じの場所に置いておいてください。

bash ./toggle_terminal.sh  # ターミナルがフォーカス状態なので非表示になる

sleep 3; toggle_terminal.sh # フォーカスを別のウインドウに移すと、3秒後スクリプトによって最前面に表示される

このスクリプトでは、ウインドウの状態(フォーカスされているかどうか)によって表示・非表示が切り替わります。複数ウインドウにも対応しており、すべてのターミナルが同時に表示・非表示されます。

設定からキーバインドに割り当てる

さて、次は上記で作成したスクリプトキーバインドに割り当て、キー入力一つで切り替わるようにしたいです。

Gnomeの設定から、キーボード→キーボードショートカットで設定できます。

キーバインド設定の場所

カスタムショートカットが一番下にあります。

キーバインド設定

/path/to/toggle_terminal.sh をご自身のスクリプトのパスに置き換えてください。

今回は、私がいつも使っている Alt+` に割り当てました。

(Option) Gnomeのデフォルトキーバインドを無効化する

もし、設定したいキー入力がGnomeによって使われてしまっている場合、上記の設定だけでは使うことができません。 Alt+`Gnomeのウインドウ選択機能に使われてしまっていたため、使用することができませんでした。

この場合は、dconfでGnomeの挙動を書き換えてしまいます。一例として `Alt+` の場合の編集方法を記載しておきます。

apt install dconf-editor でdconf-editorを入れ起動します。

/org/gnome/desktop/wm/keybindings/ を開き switch-group の設定を編集します。 Use default valueを無効にし、Custom value似次のように記載します(空にはできないようなので割り当てるバインドは何でもOKです)

['<Ctrl><Shift><Super>Above_Tab', '<Ctrl><Shift><Alt>Above_Tab']

こちらの記事を参考にさせていただきました。

Gnome環境でAlt+`を入力切替に割り当てたい

以上で設定終了です。