複数のChromeウィンドウ(3〜5)を使用しており、それぞれに多くのタブが開いています。[起動時]> [中断した場所から続行]設定を使用しています。問題は、クロムを起動すると、現在のワークスペースですべてのウィンドウが開いていることです(4つのワークスペースを使用しています)。私がする必要があるのは、各ウィンドウを特定のワークスペースに移動することです。ウィンドウのタイトルは常に異なる可能性があるため(フォーカスされているタブに応じて)、IDでウィンドウを選択する必要があります。ウィンドウを常に手動で適切な職場に移動するのは少し面倒です。
これは私のwmctrl -l
コマンドの出力です:
wmctrl -l
0x01e00002 0 posuk13-PCSPEC XdndCollectionWindowImp
0x01e00005 0 posuk13-PCSPEC unity-launcher
0x01e00008 0 posuk13-PCSPEC unity-panel
0x01e0000b 0 posuk13-PCSPEC unity-dash
0x01e0000c 0 posuk13-PCSPEC Hud
0x0300000a 0 posuk13-PCSPEC Desktop
0x04400001 0 posuk13-PCSPEC Inbox - [email protected] - Gmail - Google Chrome
0x04400039 0 posuk13-PCSPEC How to move Chrome windows using wmctrl? - Ask Ubuntu - Google Chrome
0x0440003a 0 posuk13-PCSPEC YouTube - Google Chrome
0x0440003b 0 posuk13-PCSPEC Online regex tester and debugger: JavaScript, Python, PHP, and PCRE - Google Chrome
そして、YouTubeウィンドウをワークスペース#2に移動する必要があるとしましょう。次のコマンドが機能します。
wmctrl -r YouTube -e 0,2000,0,-1,-1
また、これは動作します:
wmctrl -r 0x0440003a -i -e 0,2000,0,-1,-1
しかし、問題は、再起動するたびにウィンドウIDが異なり、タブを切り替えるたびにタイトルが異なることです。そのIDの一部(最後の3〜4桁)でウィンドウを選択する方法はありますか(再起動直後にウィンドウを起動すると最後の2〜3桁は常に同じである)、またはリストの7番目のウィンドウ?これが必要な理由は、必要なすべてのアプリケーション(Chrome、Apache、SublimeText ...)を起動し、特定の職場に移動するスクリプトを作成することです(電子メール/ Facebook用に1つ、音楽用に1つ、仕事用)。
PS:システムの休止状態の使用を提案しないでください-いくつかの ドライバーの問題 のため、私にとっては選択肢ではありません
PS2:Ubuntu 15.04を使用しています
ウィンドウが常に(起動時に)同じ時系列順に(コメントで述べたように)作成される場合、特定のプロパティを使用できますコマンドの出力wmctrl -l
:リストには、常にウィンドウが作成された順にリストされます。
つまり、常に同じ順序で再作成された(たとえば)3つのウィンドウがある場合、最初にChrome
に属するウィンドウをフィルターで除外し、次に表示される順序でウィンドウを「マーク」することができます。 (ed)wmctrl
の出力。
Chrome
ウィンドウを除外する方法アプリケーションに属するウィンドウを識別するには、次のコマンドを使用する必要があります。
wmctrl -lp
また、ウィンドウが属するpidも表示されます。通常、これはsinglepidです。ただし、Chrome
の場合、いくつかあります。手順は、プログラム的には次のとおりです。
次を実行してChrome
のPIDを見つけます。
pgrep chrome
コマンドを実行します:
wmctrl -lp
ウィンドウごとに、ウィンドウが属するpidを解析し、pgrep chrome
の出力(リスト)で一致するものを探します
これにより、Chrome
に属するウィンドウのリストが作成されます。前述のように、それらの識別はリスト内の順序です。その後、ウィンドウID(実行したwmctrl -lp
の出力の行の最初の文字列)を解析するだけで完了です。
その後、通常のコマンドを使用して、ウィンドウを目的のワークスペースに移動します。
これが機能するかどうかをテストするためのサンプルスクリプトとして(python、what other :))
#!/usr/bin/env python3
import subprocess
# get the list of pids of chrome
pids = [p for p in subprocess.check_output(["pgrep", "chrome"]).decode("utf-8").splitlines()]
# get the list of windows
windows = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()]
# filter out the windows of chrome, parse their window-id
matches = [w[0] for w in windows if w[2] in pids]
print(matches)
# raise the window
subprocess.Popen(["wmctrl", "-ia", matches[0]])
この例では、3つのChrome
ウィンドウを開き、説明どおりに閉じて、Chrome
を再度開きました。
matches[0]
(最終行)で、リストの最初のウィンドウを上げるようにしました:
['0x05600001', '0x05600039', '0x0560003a']
次回の実行時に、ウィンドウIDが変更されました。
['0x05800001', '0x05800039', '0x0580003a']
ただし、ウィンドウは常に(同じ)順序で作成されるため(実際には)、リスト内の順序は変わりません。したがって、スクリプトの最後の行:
subprocess.Popen(["wmctrl", "-ia", matches[0]])
alwaysは同じ(最初の)ウィンドウをレイズし、
subprocess.Popen(["wmctrl", "-ia", matches[1]])
常に2番目を上げます。
Raise-コマンドをmove-コマンドに置き換えると、スクリプトが機能します。
そのため、Pythonを使用して問題を解決できました。これは私の最初のPythonスクリプトであり、完璧ではないことに注意してください。
#!/usr/bin/python
import subprocess
foo=subprocess.check_output(["wmctrl", "-lx"]) #list windows with WM_CLASS
def f1(foo=foo): return iter(foo.splitlines())
list=list(f1());
gloop=0 #google loop - to count google windows
sloop=0 #sublime loop - to count sublime windows (currently only one, but I might add more in future)
google = [ ["0", "0"], ["2000", "0"], ["2000", "2000"], ["2000", "0"] ] #google windows positioning
sublime = [ ["2000", "0"] ] #sublime windows positioning
for s in list:
if (s[14:20]=='Google'):
#print "Google"
windowid=s[0:10]
windowpos="0,"+google[gloop][0]+","+google[gloop][1]+",-1,-1"
subprocess.call(["wmctrl", "-r", windowid, "-i", "-e", windowpos]);
gloop+=1
if (s[14:20]=='sublim'):
#print "Sublime_text"
windowid=s[0:10]
windowpos="0,"+sublime[sloop][0]+","+sublime[sloop][1]+",-1,-1"
subprocess.call(["wmctrl", "-r", windowid, "-i", "-e", windowpos]);
sloop+=1