Відкрийте вікно програми на тому ж екрані, де і де було запущено


8

Я використовую подвійну настройку екрана. Ubuntu 14.10 / Unity. У кожного екрана є своя пускова установка / тире. Програми за замовчуванням, такі як Firefox, nautilus, terminal & thunderbird з'являються на екрані, де я використовував пускову установку. Отже ... коли я використовую пускову панель для Firefox на правому екрані, браузер відкриється на правому боковому екрані. Як має бути.

Мені б хотілося, щоб така поведінка була з іншими програмами, такими як Google Chrome. Я не можу знайти правильне рішення.

Відповіді:


5

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

Більшість програм відкриває вікно на екрані, з якого вони були ініційовані (або з Dash, або з запуску). Однак деякі програми цього не роблять, але їх можна змусити перенаправити команду для запуску програми за допомогою скрипту, наведеного нижче. Для цього вам потрібно буде відредагувати відповідний .desktopфайл ( панель запуску).

Установка здається дещо складною, але якщо дотримуватися процедуру ("Як користуватися"), вона взагалі не повинна бути занадто складною.

Як це працює

  • Сценарій читає положення миші в момент натискання на пусковий панель або вибору програми з Dash і визначає, на якому екрані це (зліва / справа).
  • Окрім того, він чекає, коли з’явиться нове вікно, яке належить запущеній програмі (pid).
  • Після появи вікна він перевіряє, чи відповідає положення вікна (екрана) початковому положенню миші (екрана).
  • Якщо ні, то він переміщує вікно на екран, з якого запущено програму. У більшості випадків дія буде на (дуже) ранній стадії існування вікна, тому ви навіть цього не помітите.

Випуск / рішення

Є один недолік: якщо замінити головну команду .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
    
  • Відредагуйте файл (два варіанти):

    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 на панелі запуску, коли вона відкрита.
Digiplace

6

Unity використовує Compiz як менеджер композицій, і він має всілякі плагіни для подібних матеріалів. Щоб зробити його легким та довгим, не заплутавшись у командному рядку, встановіть диспетчер налаштувань Compiz Config (з sudo apt-get install compizconfig-settings-managerпрограмним забезпеченням або через Центр програмного забезпечення) та шукайте Place Windows, чи перевіряється

введіть тут опис зображення

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.