Как открыть файл на том же дисплее, на котором я с ним работаю?

Как открыть файл на том же дисплее, на котором я с ним работаю?

Я подключил LCD к своему ноутбуку. Когда я пытаюсь открыть файл в Nautilus, целевое приложение открывается на дисплее моего ноутбука, а не на втором дисплее (на котором открыто окно Nautilus).

Я не хочу менять дисплей по умолчанию. Я хочу открывать окна на том дисплее, на котором работаю. Если мой файловый менеджер находится на дисплее ноутбука, я хочу, чтобы приложения открывались на дисплее ноутбука. Если мой файловый менеджер находится на внешнем дисплее, я ожидаю открывать файлы там.

Выходxrandr

Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
eDP1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 256mm x 144mm
   1366x768       60.1*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+1366+0 (normal left inverted right x axis y axis) 527mm x 296mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x800       59.9  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1440x576i      50.1  
   1024x768       75.1     70.1     60.0  
   1440x480i      60.1     60.1  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

решение1

Описанное вами поведение (открытие окна на текущем экране)долженэто поведение по умолчанию. На моем 14.04 это так.

Из-за незначительной несовместимости с некоторыми комбинациями графического драйвера/GPU в некоторых случаях могут возникать «особенности». Если нет «чистого» варианта (исправления), вы можете использовать обходной путь ниже.
Он представляет собой фоновый скрипт, который ищет новые окна для появления. В случае, если новое окно существует, скрипт сравнивает положение окна с текущим положением мыши. Если и мышь, и новое окно не находятся на одном экране, окно перемещается с помощью команды windowmove` xdotool.

Плохая ли идея использовать фоновый скрипт?

Если вам не нужен фоновый скрипт, не используйте его.
В то же время: если он добавляет важную функциональность и/или экономит ваше время, было бы глупо этого не сделать,еслисценарий хорошо организован и поэтому «экономичен».

Для справки: и на моем ноутбуке, и на моем настольном компьютере я постоянно запускаюпо меньшей мере5 фоновых скриптов + иногда несколько дополнительных для целей тестирования, безлюбойуведомление.

Что делается для экономии топлива:

  1. Скрипт имеет переменный цикл цикла
    Раз в 10 секунд скрипт проверяет, подключен ли второй экран. Если нет, скрипт пропускает всю процедуру проверки окна и повторяет проверку через 10 секунд. Это означает, что скрипттолькодействует, если подключен второй экран. После подключения второго экрана в течение 10 секунд цикл изменяется на период 2 секунды.
  2. Все (следующие) действия, которые выполняет скрипт, являются условными.
    например, позиция мышитолькопровереноеслиесть новые окна и т.д.

В целом, в моей системе я не смог ни заметить, ни измеритьлюбойдополнительная нагрузка, как результат работы скрипта.

Сценарий

#!/usr/bin/env python3
import subprocess
import time

def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def screen_limit():
    screendata = [s for s in get("xrandr").split() if s.count("+") == 2]
    if len(screendata) == 2:
        return int([s.split("x")[0] for s in screendata if "+0+0" in s][0])

wd1 = get(["wmctrl", "-lG"])

t = 0
while True:
    time.sleep(2)
    # once per 10 seconds, check for a second screen
    if t == 0: 
        while True:
            rightside = screen_limit()
            # if no second screen, skip the procedure
            if rightside == None:
                time.sleep(10)
            else:
                break
    wd2 = get(["wmctrl", "-lG"])
    # check for buggy wmctrl
    if all([wd2 != None, wd1 != None]):
        wins = [w.split() for w in wd2.splitlines()]
        # check for new windows
        relevant = [w for w in wins if not w[0] in wd1]
        if relevant:
            # if new windows appeared, see if they match the mouse pos
            mousepos = int(get([
                "xdotool", "getmouselocation"
                ]).split()[0].split(":")[1])
            for w in relevant:
                check = [mousepos < rightside, int(w[2]) < rightside]
                if check[0] != check[1]:
                    # if mouse and window are not on the same screen > move
                    if check[0] == False:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) + rightside), w[3]]                    
                    else:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) - rightside), w[3]]
                    subprocess.Popen(cmd)
    wd1 = wd2
    t = 0 if t == 10 else t
    t += 1

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

  1. Скрипту нужны оба wmctrlи xdotool. Запускаем в терминале:

    sudo apt-get install xdotool wmctrl
    
  2. Скопируйте скрипт в пустой файл, сохраните его какmove_windows.py
  3. Тест-запустите скрипт командой:

    python3 /path/to/move_windows.py
    
  4. Если все работает как надо, добавьте его в Startup Applications: Dash > Startup Applications > Add. Добавьте команду:

    /bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"
    

Связанный контент