web-dev-qa-db-ja.com

起動された場所と同じ画面でアプリケーションウィンドウを開く

デュアルスクリーンセットアップを使用しています。 Ubuntu 14.10/Unity。各画面には独自のランチャー/ダッシュがあります。 Firefox、nautilus、ターミナル、Thunderbirdなどのデフォルトアプリケーションは、ランチャーを使用した画面に表示されます。そのため、右側の画面でFirefoxのランチャーを使用すると、右側の画面でブラウザーが開きます。あるべきです。

Google Chromeのような他のアプリケーションでその動作が欲しいです。適切な解決策が見つからないようです。

8
Digiplace

コマンドをリダイレクトしてアプリケーションを実行する

ほとんどのアプリケーションは、(Dashまたはランチャーから)開始された画面でウィンドウを開きます。ただし、一部のアプリケーションはサポートしていませんが、コマンドをリダイレクトして以下のスクリプトを介してアプリケーションを実行することにより、強制することができます。そのためには、対応する.desktopファイル(ランチャー)を編集する必要があります。

セットアップは少し複雑に見えますが、手順(「使用方法」)に従えば、それほど難しくないはずです。

使い方

  • スクリプトは、ランチャーをクリックするか、Dashからアプリケーションを選択した時点でマウスの位置を読み取り、どの画面にあるか(左/右)を判断します。
  • その後、起動したアプリケーション(pid)が所有する新しいウィンドウが表示されるまで待機します。
  • ウィンドウが表示されると、ウィンドウ(画面)の位置がマウス(画面)の初期位置と一致するかどうかを確認します。
  • そうでない場合は、アプリケーションを起動した画面にウィンドウを移動します。ほとんどの場合、アクションはウィンドウの存在の(非常に)初期段階にあるため、気付くことすらありません。

問題/解決策

欠点が1つあります。.desktopファイルのmainコマンドをこのスクリプトを呼び出すコマンドに置き換えた場合、右クリック"open with"は機能しません正しく。 Google ChromeのようなWebブラウザーの場合は、それほど大きな問題にはなりません。他のアプリケーションでは、簡単な解決策は、新しいウィンドウを開くオプションを追加することです現在の画面上ショートカットとして(以下を参照)。

<image>

使い方:

  • スクリプトはwmctrlxautomationの両方を使用します。

    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つのオプション):

    1. ランチャーのmainコマンドを変更するには:

      • 行を見つけます:

        Exec=/usr/bin/google-chrome-stable %U
        
      • に変更する

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. オプションをショートカットとして追加するには(上の画像のように):

      • 行を見つけます:

        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)
5
Jacob Vlijm

UnityはCompizを作曲マネージャーとして使用し、この種のもの用のあらゆる種類のプラグインを備えています。コマンドラインをいじらずに簡単かつ長いストーリーにするために、Compiz Config Settings Managerをインストールし(Sudo apt-get install compizconfig-settings-managerまたはSoftware Center経由)、Place Windowsを探して、チェックされていることを確認します

enter image description here

そのプラグインの下にはMulti Output Modeのいくつかのオプションがあります。必要なのはUse output device of focused windowです。したがって、ファイルマネージャが存在するすべての場所にファイルウィンドウを開きます enter image description here

6