起動したのと同じ画面でアプリケーションウィンドウを開く


8

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

Google Chromeなどの他のアプリケーションでその動作を希望します。適切な解決策を見つけることができないようです。

回答:


5

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

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

設定は少し複雑に見えますが、手順(「使用方法」)に従っていれば、それほど難しくないはずです。

使い方

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

問題/解決策

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

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

      • 行を見つけます:

        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)

ありがとうございます。起動時にランチャーにあるGoogle Chromeの2番目のアイコンに気づきました。
Digiplace 2015年

6

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

ここに画像の説明を入力してください

そのプラグインの下にはいくつかのオプションがありますMulti Output Mode。あなたが欲しいのはUse output device of focused windowです。したがって、ファイルマネージャがどこにあっても、開いているファイルウィンドウを配置します ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.