Откройте окно приложения на том же экране, где оно было запущено

Я использую настройку двойного экрана. Ubuntu 14.10 / Unity. Каждый экран имеет свой собственный лаунчер / тире. Приложения по умолчанию, такие как Firefox, Nautilus, Terminal & amp; Thunderbird появляется на экране, где я использовал лаунчер. Итак, когда я использую панель запуска Firefox на правом экране, браузер открывается на правой стороне экрана. Так, как это должно быть.

Я хотел бы, чтобы такое поведение было с другим приложением, таким как Google Chrome. Я не могу найти правильное решение.

8
задан 30 January 2015 в 12:38

2 ответа

Перенаправление команды для запуска приложения

Большинство приложений открывает свое окно на экране, они инициировались от (или от Тире или от средства запуска). Некоторые приложения однако не делают, но они могут быть вынуждены к путем перенаправления команды для запуска приложения через сценарий ниже. Чтобы сделать это, необходимо будет отредактировать соответствие .desktop файл (средство запуска).

Установка кажется немного сложной, но если процедура выполнена ("Как использовать"), это не должно быть слишком трудно вообще.

Как это работает

  • Сценарий читает положение мыши в данный момент, Вы нажимаете средство запуска или выбираете приложение из Тире, и определяет, на который экран, который является (слева/справа).
  • Subsquently, это ожидает нового окна для появления, принадлежавшим приложению (pid), Вы запустили.
  • После того как окно появляется, оно проверяет, соответствует ли окно (экран-) положение мыши (экран-) исходное положение.
  • В противном случае это перемещает окно в экран, от которого Вы запустили приложение. В большинстве случаев действие будет на (очень) ранней стадии существования окна, таким образом, Вы даже не заметите его.

Проблема / решение

Существует одна оборотная сторона: если Вы заменяете .desktop основная команда файла командой для вызова этого сценария щелкнуть правой кнопкой "open with" не будет работать правильно. В случае webbrowser как Google Chrome, который не будет слишком большой проблемой. С другими приложениями простое решение состояло бы в том, чтобы добавить опцию открыть новое окно на текущем экране как ярлык (см. далее ниже).

<image>

Как использовать:

  • Сценарий использует обоих 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
    
  • Отредактируйте файл (две опции):

    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 fileis как пример:

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
ответ дан 30 January 2015 в 12:38

Единица использует Compiz в качестве создания менеджера, и это имеет все виды плагинов для этого вида материала. Для упрощения и длинная история, короткая, не смешивая в командной строке, установите менеджера по Настройкам Конфигурации Compiz (с sudo apt-get install compizconfig-settings-manager или через Центр программного обеспечения), и ищите Place Windows, удостоверьтесь, что это проверило

enter image description here

Под тем плагином будет несколько опций для Multi Output Mode. То, что Вы хотите, Use output device of focused window. Таким образом это поместит открытое окно файла везде, где Ваш файловый менеджер enter image description here

6
ответ дан 30 January 2015 в 12:38

Другие вопросы по тегам:

Похожие вопросы: