web-dev-qa-db-ja.com

i3:指定したワークスペースで起動時間が長いプログラムを起動する方法

私のi3スタートアップファイルで、プログラムを起動するデスクトップを具体的に構成することはできますか?ただし、一般的には、そのプログラムをデスクトップに割り当てずに、デスクトップで1回だけ起動します。

別のワークスペースへの変更を伴う解決策が存在することを認識していますが、これには大きな問題が残ります。「インスタントでない」起動時間を持つプログラムがあるとすぐに、そのプログラムは最後のワークスペースに表示されます希望するワークスペースに切り替えてください。

具体的には、この現在のスタートアップファイルでは、ワークスペース9にatom(これは私を気にするプログラム))の割り当てに関連する回避策を実行しましたが、現時点では問題ありませんが、ロングラン:

assign [class="Atom"] $workspace9
exec atom

exec --no-startup-id i3-msg 'workspace $workspace9; exec 
/usr/bin/urxvt'
#exec --no-startup-id i3-msg 'workspace $workspace9; exec /usr/bin/atom'
exec --no-startup-id i3-msg 'workspace $workspace1; exec /usr/bin/urxvt'

atomのコメント付き呼び出しを希望の方法で実行し、割り当てメソッドをすべて破棄したいと思います。

私は実際には関連性があるとは思いませんが念のため:Archに基づいたManjaro-Linuxを実行します。

編集:次のコードスニペットは機能しますが、atomを最後に開いてデスクトップでセッションを開始することを制限するため、この質問は開いたままにしておきます。

#assign [class="Atom"] $workspace9
#exec atom

exec --no-startup-id i3-msg 'workspace $workspace9; exec 
/usr/bin/urxvt'
exec --no-startup-id i3-msg 'workspace $workspace1; exec /usr/bin/urxvt'
exec --no-startup-id i3-msg 'workspace $workspace9; exec /usr/bin/atom'

また、atomと同じ動作を示す場合、異なるワークスペースで開始する複数のプログラムを許可しないという重大な欠点もあります。

6
tillyboy

ウィンドウが表示されるまで待ってから、元のワークスペースに送信します。

#!/bin/bash

activeworkspace=$(i3-msg -t get_workspaces | jq -c '.[] | select(.focused) | .name' --raw-output)
atom &
windowname=atom
xprop -spy -root _NET_ACTIVE_WINDOW | \
  while read line ; do 
      if xprop WM_CLASS -id ${line##* } | grep -q $windowname ; then
          i3-msg move "[con_id=\"${line##* }\"]" $activeworkspace
          exit
      fi
  done
  • 最初にアクティブなワークスペースを取得し、jqを例として使用します
  • バックグラウンドでプログラムを実行します:atom &
  • xprop -spyを使用して、「プロパティの変更イベントを探して、ウィンドウのプロパティを永久に調べます」。
  • while read lineを使用して、すべての新しいアクティブウィンドウを操作します
  • xprop WM_CLASSでそれらのWM_CLASSを取得し、bash ${line##* }でwindowidを抽出します
  • grep $windownameでフィルタリング
  • i3-msg move ..でウィンドウを元のワークスペースに移動します

アクティブなワークスペースに留まる必要があり、このワークスペースのウィンドウがフォーカスされます。

新しいatomウィンドウの開始と移動の間にフォーカスされる複数のatomウィンドウがある場合、それは機能しません。この場合、 WM_CLASSの代わりにNET_WM_PID atomを探します。

1
ctx

コメントアウトされた呼び出しは、起動通知をサポートするアプリケーションで機能します-実際、 ユーザーズガイド の「ワークスペース3でiceweaselを開始する(一度)」の例ほぼ同じexecコマンドがあります:

exec --no-startup-id i3-msg 'workspace 3; exec iceweasel; workspace 1'

ただし、Atom は起動通知 をサポートしていないようなので、assignメソッドを使い続ける必要があります。

0
Wieland

特定のワークスペースで常に特定のプログラム(Atomなど)を開いておきたい場合は、 i3 User Documentation で説明されているクラス割り当て機能を使用できます。

ターミナルからxpropを実行し、ウィンドウ(Firefoxなど)をクリックして、それが属するクラスを確認します。 WM_CLASS(STRING)を探します。

その後、.configファイルに次の行を入れるだけで簡単です。

assign [class="Firefox"] 2 

(デフォルト)$Mod + Shift + rを使用してインスタンスを再起動することを忘れないでください

これで、Firefoxは、いつどこで実行したかに関係なく、常にワークスペース2で開きます。 Atomでも同じことができます。これにより、自由にデスクトップを起動できます。

0
Try431