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

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

フローティングウィンドウでプログラムを開きたいです。私はそれを試しましたが、 exec emacsclient -c ; floating enable新しいウィンドウの代わりに以前にアクティブなウィンドウをフロートさせます。

答え1

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

~/.config/i3/config

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

class="..." および instance=".​​.." に何があるかを調べるには、次のように入力します。xprop端末で表示したいウィンドウをクリックしてください。この情報は、WM_CLASS(STRING)="instance", "Class" の下部にあります。

答え2

i3で現在フォーカスされたウィンドウをフローティングにする正しい方法は、次のことを実行することです。

i3-msg floating enable

これがコンフィギュレーションラインが実行するアクションです。

これで、問題はi3-msgウィンドウがフォーカスを受け取る前に実行されています(フォーカスがある場合でも)。 Peter O. 説明ここにあります。ウィンドウの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}";

気づく:

  • 適用される場合する焦点を合わせるだけで、これが起こるのを待つだけで十分です。バラよりここ現在焦点が合っているウィンドウを確認する方法を学びます。
  • まだ完了していませんが、スクリプトを展開して変更する前の位置にフォーカスを戻すことができるはずです。
  • wmctrlすべてのウィンドウのPIDを見つけることは必ずしも可能ではありません。displayたとえば、ImageMagickのリストには常にPID 0が含まれています。バラよりここウィンドウのタイトルを変更する方法。
  • 上記の解決策の重要な部分をスクリプトで包み込むと、次のような内容を作成できます。

    exec our_command; grab_focus; floating enable
    

    i3構成で。

答え3

まとめたいハッブル望遠鏡の後他の汚れた回避策に関する情報が追加されました。


全長DR&& i3-msg "[id=$(xdotool getactivewindow)] floating enable"ショートカット定義に追加します(必須xdotool)。例えばbindsym $mod+button exec program && i3-msg "[id=$(xdotool getactivewindow)] floating enable"


ルールを設定できます。みんなi3-configまたはそれに対応する設定で設定できる条件のリストと一致するウィンドウi3-msg

構文はですfor_window [ criteria ] commandここ。単一のウィンドウでのみ機能させるには、基準の一意性を確保できます。

持っているだけでなく

クラス

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

はい

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

titleしかし、次のようなものがありますid

タイトル

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"

答え4

termnmlの答えを少し調整すると私には効果的でした。これで、全体的な作業結果は次のようになります。

bindsym $mod+Shift+Return exec --no-startup-id urxvt --class floating
for_window [class="floating"] floating enabled

関連情報