web-dev-qa-db-ja.com

i3のフローティングウィンドウでプログラムを開く

フローティングウィンドウでプログラムを開きたいのですが。私は試した exec emacsclient -c ; floating enable、しかしそれはフロートの前にアクティブであったウィンドウを新しいウィンドウではなく作成しました。

4
Toothrot

これは、私がGalculatorアプリケーションに対して行った方法です。

〜/ .config/i3/config

for_window [class="Galculator" instance="galculator"] floating enable

Class = "..."とinstance = "..."の内容を確認するには、ターミナルでxpropと入力し、フロートさせたいウィンドウをクリックします。情報は、WM_CLASS(STRING)= "galculator"、 "Galculator"の下のどこかにあります。インスタンスは左側のもので、クラスは右側です。

3
HubbleT

現在フォーカスされているウィンドウをi3でフロートさせる適切な方法は、実行することです

i3-msg floating enable

これは、config行が行うことです。

今問題はそれですi3-msgは、ウィンドウがフォーカスされる前に実行されます(フォーカスを取得する場合でも)。 Peter O.は over here PIDに基づいてウィンドウにフォーカスを合わせる方法を説明します。これをそのまま使用できます。

our_application &
pid="$!"

# Wait for the window to open and grab its window ID
winid=''
while : ; do
    winid="`wmctrl -lp | awk -vpid=$pid '$3==pid {print $1; exit}'`"
    [[ -z "${winid}" ]] || break
done

# Focus the window we found
wmctrl -ia "${winid}"

# Make it float
i3-msg floating enable > /dev/null;

# Move it to the center for good measure
i3-msg move position center > /dev/null;

# Wait for the application to quit
wait "${pid}";

Nota bene:

  • アプリケーションが単独でフォーカスを取得する場合は、それが発生するのを待つだけで十分な場合があります。現在フォーカスされているウィンドウを特定する方法については こちら を参照してください。
  • 作業はしませんでしたが、スクリプトを拡張して、フォーカスを変更前の状態に戻すことができるはずです。
  • wmctrlは、すべてのウィンドウのPIDを常に把握できるわけではありません。たとえば、ImageMagickのdisplayのリストには、常にPID 0が含まれています。ウィンドウのタイトルを使用する変更されたアプローチについては、 ここ を参照してください。
  • 上記のソリューションの顕著な部分をスクリプトでラップすると、次のようなものを書くことができるはずです

    exec our_command; grab_focus; floating enable
    

    i3構成で。

3
Raphael

まとめたいと思います HubbleTs post その他の汚い回避策 追加情報:


[〜#〜] tldr [〜#〜]:ショートカット定義に&& i3-msg "[id=$(xdotool getactivewindow)] floating enable"を追加します(xdotoolが必要です)。例えば。 bindsym $mod+button exec program && i3-msg "[id=$(xdotool getactivewindow)] floating enable"


all ウィンドウのルールを設定して、i3-config内で設定できる、またはi3-msgを使用して同等に送信できる基準のリストに一致させることができます。

構文はfor_window [ criteria ] commandです。あなたはそれについてもっと読むことができます ここ 。単一のウィンドウでのみ機能させる場合は、基準の一意性を確保できます。

ありません

クラス

ウィンドウクラス(WM_CLASSの2番目の部分)を比較します。特別な値focusedを使用して、現在フォーカスされているウィンドウと同じウィンドウクラスを持つすべてのウィンドウに一致させます。

インスタンス

ウィンドウインスタンス(WM_CLASSの最初の部分)を比較します。特別な値focusedを使用して、現在フォーカスされているウィンドウと同じウィンドウインスタンスを持つすべてのウィンドウに一致させます。

しかし、titleidのようにもっと:

タイトル

X11ウィンドウのタイトルを比較します(フォールバックとしての_NET_WM_NAMEまたはWM_NAME)。特別な値__focused__を使用して、現在フォーカスされているウィンドウと同じウィンドウタイトルを持つすべてのウィンドウを一致させます。

id

たとえばxwininfoを介して取得できるX11ウィンドウIDを比較します。

emacsclientをコマンドラインプログラムとすると、次のように追加できます。

for_window [ title="uniquetitle" ] floating enable

あなたのi3設定にあなたの好きなターミナルを開いてください

termite -e emacsclient -t uniquetitle

フローティングモードで直接開きます。

コマンドラインプログラムではなく、タイトルオプションがない場合は、他の基準や、 (xdotoolおよびi3-msgを使用):

bindsym $mod+button exec program && xdotool getactivewindow set_window --name uniquetitle

以下の汚れ

bindsym $mod+t exec program && i3-msg "[id=$(xdotool getactivewindow)] floating enable"
1
Suuuehgi