Abra a janela do aplicativo na mesma tela em que foi lançada

8

Estou usando uma configuração de tela dupla. Ubuntu 14.10 / Unity. Cada tela tem seu próprio iniciador / traço. Aplicativos padrão como Firefox, nautilus, terminal e thunderbird aparecem na tela em que usei o iniciador. Então ... quando eu uso o iniciador do Firefox na tela direita, o navegador é aberto na tela do lado direito. Como deveria ser.

Eu gostaria desse comportamento com outro aplicativo como o Google Chrome. Não consigo encontrar uma solução adequada.

Digiplace
fonte

Respostas:

5

Redirecionando o comando para executar um aplicativo

A maioria dos aplicativos abre sua janela na tela em que foram iniciados (no Dash ou no iniciador). No entanto, alguns aplicativos não o fazem, mas podem ser forçados a redirecionar o comando para executar o aplicativo através do script abaixo. Para fazer isso, você precisará editar o .desktoparquivo correspondente (iniciador).

A configuração parece um pouco complicada, mas se o procedimento for seguido ("Como usar"), não deverá ser muito difícil.

Como funciona

  • O script lê a posição do mouse no momento em que você clica no iniciador ou escolhe o aplicativo no Dash e determina em qual tela está (esquerda / direita).
  • Subseqüentemente, aguarda a nova janela aparecer, pertencente ao aplicativo (pid) que você iniciou.
  • Depois que a janela aparece, verifica se a posição da janela (tela) corresponde à posição inicial do mouse (tela).
  • Caso contrário, move a janela para a tela em que você iniciou o aplicativo. Na maioria dos casos, a ação estará em um estágio (muito) inicial da existência da janela, portanto você nem notará.

Problema / solução

Há uma desvantagem: se você substituir o comando principal.desktop do arquivo pelo comando para chamar esse script, o botão direito do mouse em "abrir com" não funcionará corretamente. No caso de um navegador da web como o Google Chrome, isso não será um problema muito grande. Com outros aplicativos, uma solução simples seria adicionar a opção de abrir uma nova janela na tela atual como um atalho (veja mais abaixo).

<image>

Como usar:

  • O script usa ambos wmctrle xautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • Crie um diretório ~/binse ele ainda não existir.

  • Copie o script para um arquivo vazio, salve-o como open_oncurrent(sem extensão) em~/bin

  • Torne executável (!)
  • Copie o .desktoparquivo correspondente de /usr/share/applicationspara ~/.local/share/applications:

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
    
  • Abra a cópia local em ~/.local/share/applications:

    gedit ~/.local/share/applications/google-chrome.desktop
    
  • Edite o arquivo (duas opções):

    1. Para alterar o comando principal do iniciador:

      • encontre a linha:

        Exec=/usr/bin/google-chrome-stable %U
        
      • mude para

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. Para adicionar a opção como um atalho (como na imagem acima):

      • encontre a linha:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
        
      • substitua-o por:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
        
      • Em seguida, adicione a seguinte seção ao final do arquivo:

        [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
        

Como usar com outros aplicativos:

Da mesma forma, você pode aplicar a solução a outros aplicativos. A sintaxe do comando a ser usado no .desktoparquivo é como o exemplo:

Exec=/bin/bash -c "open_oncurrent <command>"

Uma pequena explicação adicional sobre como lidar com exceções está no script.

O script

#!/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)
Jacob Vlijm
fonte
Obrigado, isso funciona. Percebo um segundo ícone do Google Chrome no iniciador quando aberto.
Digiplace 28/01
6

O Unity usa o Compiz como gerente de composição e possui todos os tipos de plugins para esse tipo de coisa. Para facilitar e encurtar a história, sem mexer na linha de comando, instale o Compiz Config Settings Manager (com sudo apt-get install compizconfig-settings-managerou via Software Center) e procure Place Windows, verifique se está marcado

insira a descrição da imagem aqui

Sob esse plugin, haverá várias opções para Multi Output Mode. O que você quer é Use output device of focused window. Assim, ele abrirá uma janela de arquivo aberta onde quer que seu gerenciador de arquivos esteja insira a descrição da imagem aqui

Sergiy Kolodyazhnyy
fonte