回答:
ほとんどのアプリケーションは、(Dashまたはランチャーから)開始された画面でウィンドウを開きます。ただし、一部のアプリケーションはそうではありませんが、以下のスクリプトを使用してアプリケーションを実行するコマンドをリダイレクトすることにより、強制することができます。そのためには、対応する.desktop
ファイル(ランチャー)を編集する必要があります。
設定は少し複雑に見えますが、手順(「使用方法」)に従っていれば、それほど難しくないはずです。
欠点が1つあり.desktop
ます。ファイルのメインコマンドをこのスクリプトを呼び出すコマンドに置き換えた場合、右クリックの[ プログラムから開く ]が正しく機能しません。Google Chromeのようなウェブブラウザの場合は、それほど大きな問題にはなりません。他のアプリケーションでの簡単な解決策は、現在の画面に新しいウィンドウを開くオプションをショートカットとして追加することです(以下を参照)。
スクリプトはとの両方wmctrl
を使用しますxautomation
:
sudo apt-get install xautomation
sudo apt-get install wmctrl
ディレクトリ~/bin
がまだない場合は作成します。
スクリプトを空のファイルにコピーし、open_oncurrent
(拡張子なしで)として保存します~/bin
対応する.desktop
ファイルをから/usr/share/applications
にコピーします~/.local/share/applications
。
cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
でローカルコピーを開きます~/.local/share/applications
。
gedit ~/.local/share/applications/google-chrome.desktop
ファイルを編集します(2つのオプション):
ランチャーのメインコマンドを変更するには:
行を見つけます:
Exec=/usr/bin/google-chrome-stable %U
に変更
Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
オプションをショートカットとして追加するには(上の画像のように):
行を見つけます:
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
それを次のように置き換えます。
X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
次に、ファイルの最後に次のセクションを追加します。
[New window on this screen Shortcut Group]
Name=New window on this screen
Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
TargetEnvironment=Unity
同様に、ソリューションを他のアプリケーションに適用できます。.desktop
ファイルで使用するコマンドの構文は、次の例のようになります。
Exec=/bin/bash -c "open_oncurrent <command>"
例外に対処する方法に関する小さな追加説明がスクリプトにあります。
#!/usr/bin/env python3
import subprocess
import sys
import time
import getpass
t = 0; user = getpass.getuser(); application = sys.argv[1]
"""
In most cases, the command to run an application is the same as the process
name. There are however exceptions, to be listed below, if you use these appli-
cations i.c.w. this script. Just add an item to the list in the format:
["<command>", "<process_name>"],
"""
exceptions = [
["/usr/bin/google-chrome-stable", "chrome"],
]
try:
procname = [app[1] for app in exceptions if app[0] == application][0]
except IndexError:
procname = application
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
# initial position of the mouse (click position)
start_pos = int(get("xmousepos").strip().split()[0])
# x- position of right side of the screen
x_res = [int(s.split("x")[0]) for s in get("xrandr").split() if s.endswith("+0+0")][0]
# current windows
start_windows = get("wmctrl -l")
# open application
subprocess.call(["/bin/bash", "-c", application+"&"])
while t < 30:
procs = get("ps -u "+user).splitlines()
new = [w for w in get("wmctrl -lpG").splitlines() if not w.split()[0] in start_windows]
match = sum([[line for line in procs if w.split()[2] in line and procname[:15] in line] for w in new], [])
if len(match) == 1:
data = new[0].split(); curr_pos = int(data[3]); compare = (start_pos > x_res, curr_pos > x_res)
if compare[0] == compare[1]:
pass
else:
if compare[0] == True:
data[3] = str(int(data[3])+x_res)
else:
data[3] = str(int(data[3])-x_res)
cmd1 = "wmctrl -r "+data[0]+" -b remove,maximized_vert,maximized_horz"
cmd2 = "wmctrl -ir "+data[0]+" -e 0,"+(",").join(data[3:7])
for cmd in [cmd1, cmd2]:
subprocess.Popen(["/bin/bash", "-c", cmd])
break
t = t + 1
time.sleep(0.5)
UnityはCompizを作曲マネージャーとして使用します。これには、この種のもののためのあらゆる種類のプラグインがあります。コマンドラインをいじらずに簡単で長いストーリーを短くするには、Compiz Config Settings Managerをインストールし(sudo apt-get install compizconfig-settings-manager
Software Center を使用またはそれを介して)、を探してPlace Windows
、チェックされていることを確認します
そのプラグインの下にはいくつかのオプションがありますMulti Output Mode
。あなたが欲しいのはUse output device of focused window
です。したがって、ファイルマネージャがどこにあっても、開いているファイルウィンドウを配置します