Como abrir um arquivo no mesmo display Estou trabalhando nele?

5

Conectei um LCD ao meu laptop. Quando tento abrir um arquivo no Nautilus, o aplicativo de destino é aberto na tela do meu laptop, em vez da segunda exibição (na qual a janela do nautilus está aberta).

Eu não quero alterar a exibição padrão. Desejo abrir as janelas na tela em que estou trabalhando. Se o meu gerenciador de arquivos estiver na tela do laptop, quero que os aplicativos sejam abertos na tela do laptop. Se meu gerenciador de arquivos estiver em exibição externa, espero abrir arquivos lá.

A saída de 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)
    
por Googlebot 16.04.2016 / 13:48

1 resposta

7

O comportamento que você descreve (abrindo a janela na tela atual) deve ser o comportamento padrão, no meu 14.04 é assim.

Devido a pequenas incompatibilidades com algumas combinações de driver gráfico / GPU, "peculiaridades" podem ocorrer em alguns casos. Se não houver nenhuma opção "limpa" disponível (correção), você poderá usar a solução alternativa abaixo.
Existe um script de segundo plano, procurando novas janelas para aparecer. No caso de existir uma nova janela, o script compara a posição da janela com a posição atual do mouse. Se o mouse e a nova janela não estiverem na mesma tela, a janela será movida usando o comando xdotool windowmove '.

Um script de segundo plano é uma má ideia?

Se você não precisa de um script de segundo plano, não o use.
Ao mesmo tempo: se adicionar funcionalidade importante e / ou poupar tempo, seria tolo não, se o script está bem organizado e, portanto, "baixo consumo de combustível ".

Como referência: tanto no meu laptop como no meu Desktop, eu constantemente corro pelo menos 5 scripts de background + ocasionalmente alguns adicionais para fins de teste, sem nenhum aviso.

O que é feito para economizar combustível:

  1. O script tem um ciclo de loop variável
    Uma vez por 10 segundos, o script verifica se a segunda tela está conectada. Caso contrário, o script pula o procedimento de verificação da janela inteira e verifica novamente após 10 segundos. Isso significa que o script somente atua se uma segunda tela for anexada. Quando uma segunda tela é conectada, em 10 segundos, o loop é alterado para um período de 2 segundos.
  2. Todas as ações (seguintes) que o script toma são condicionais
    por exemplo. a posição do mouse é somente verificada se houver novas janelas, etc.

Todos juntos, no meu sistema, eu não pude notar nem medir qualquer carga adicional, como resultado do script.

O script

#!/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

Como usar

  1. O script precisa dos dois wmctrl e xdotool . Executar em um terminal:

    sudo apt-get install xdotool wmctrl
    
  2. Copie o script em um arquivo vazio, salve-o como move_windows.py
  3. Teste- execute o script pelo comando:

    python3 /path/to/move_windows.py
    
  4. Se tudo funcionar conforme o esperado, adicione-o aos aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:

    /bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"
    
por Jacob Vlijm 17.04.2016 / 13:00