Lançar aplicativo em um monitor específico

4

Eu tenho o Ubuntu 14.04 e dois monitores. Quando abro aplicativos, preciso que alguns deles estejam no monitor principal e outros no secundário.
No momento, os aplicativos sempre abrem no monitor principal.

Eu tenho ícones de traço apenas em um monitor (esquerdo), por isso não consigo iniciar aplicativos usando o cursor ou a configuração de janela ativa do Compiz.

    
por Fiona 29.04.2015 / 12:27

2 respostas

2

A solução abaixo funciona da seguinte maneira:

  1. Pressione uma combinação de teclas
  2. O primeiro aplicativo que inicia dentro de 15 segundos será iniciado na tela 1

ou:

  1. Pressione uma combinação de teclas (nother)
  2. O primeiro aplicativo que inicia dentro de 15 segundos será iniciado na tela 2

Em outras palavras: você precisará de duas combinações de teclas para garantir que uma nova janela de aplicativo apareça na primeira ou na segunda tela.

Como configurar

O script usa xdotool e wmctrl :

sudo apt-get install xdotool
sudo apt-get install wmctrl

Então:

  1. Copie o script abaixo em um arquivo vazio, salve-o como preferred_screen (sem extensão) em ~/bin . Crie o diretório, se necessário.
  2. Torne o script executável
  3. Na seção principal, defina a resolução horizontal da tela esquerda (eu já configurei para você para 1600)
  4. Se você acabou de criar o diretório ~bin , execute em um terminal:

    source ~/.profile
    
  5. Teste-execute o script executando em uma janela de terminal o comando:

    preferred_screen 1
    

    Agora abra um aplicativo (qualquer), ele deve abrir na primeira tela

    Repita o passo com o comando:

    preferred_screen 2
    

    agora o aplicativo deve ser aberto na segunda tela.

  6. Se tudo funcionar bem, adicione os dois comandos a duas combinações de teclas diferentes: Escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione os comandos:

    preferred_screen 1
    preferred_screen 2
    

O script

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

#--- enter the horizontal resolution of the left screen below
left_width = 1600
#---

target_screen = int(sys.argv[1])
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8")

def new_window(left_width):
    w_list1 = get(["wmctrl", "-lG"]).splitlines()
    while True:
        time.sleep(1)
        w_list2 = get(["wmctrl", "-lG"]).splitlines()
        new = [w.split() for w in w_list2 if not w in w_list1]
        if len(new) != 0:
            data = new[0]
            pos = 1 if int(data[2]) < left_width else 2
            coords = data[2:4]
            w_id = data[0]
            return [w_id, pos, coords]
            break

subject = new_window(left_width)
if not int(subject[1]) == target_screen:
    move = -left_width if target_screen == 1 else left_width - int(subject[2][0])
    subprocess.Popen(["xdotool", "windowmove", subject[0], str(int(subject[2][0])+move), subject[2][1]])

Explicação

Invadir o processo de inicialização em si não pareceu uma solução limpa para mim nessa situação, então a solução abaixo funciona em uma base "acidental" (somente quando você o chama de uma combinação de teclas).

Se o script for chamado, ele espera por 15 segundos para que uma nova janela apareça e a move para a tela direita ou esquerda (se ainda não estiver na tela de segmentação) e, em seguida, termina. Após 15 segundos, termina de qualquer maneira para evitar a execução infinita se nenhuma janela aparecer.

Nota

O script assume que as telas são top-alinhadas. Se houver uma grande diferença, o script pode precisar de alguns ajustes para evitar que as janelas "colidam" na borda da outra tela.

    
por Jacob Vlijm 30.04.2015 / 15:42
2

Aqui está uma ideia para um script de inicialização ou pelo menos um script que pode ser vinculado a um atalho para abrir o Windows pela primeira vez:

Etapa 1

Descubra a largura e a altura da sua janela raiz. Isso pode ser feito com

xwininfo -root | awk '/Width/,/Height/ {print}'

ou

xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print }

Exemplos de saídas estão abaixo

$ xwininfo -root | awk '/Width/,/Height/ {print}'                           
  Width: 1366
  Height: 768
$ xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print}'                                                      
_NET_DESKTOP_GEOMETRY(CARDINAL) = 1366, 768

Etapa 2

Instale wmctrl com sudo apt-get install wmctrl

Esta ferramenta permite alterar algumas das propriedades do Windows, referindo-se ao seu ID hexadecimal ou o título da janela. Eu expliquei como funciona em outra pergunta que eu vou linkar mais tarde aqui

Etapa 3 Crie este script na sua pasta ~/bin ou em algum lugar que faça parte do seu caminho. Você também pode vincular o caminho completo a esse script para criar um atalho .desktop . Observe que, como minha tela é 1366 x 768, eu uso 1300 como meu deslocamento x no lado direito. Adapte o script de acordo com suas especificações na etapa 1. Observe que, se você tiver janelas duplicadas, isso poderá ser interrompido, portanto, isso é bom principalmente para iniciar duas janelas de programas pela primeira vez

#!/bin/sh
# Author: Serg Kolo
# Description: Send two different applications to different windows
set -x

LEFT=$(zenity --entry --text="What to put on the left?")
RIGHT=$(zenity --entry --text="What to put on the right?")

$LEFT &
$RIGHT &
sleep 1

if [ $? -eq 0 ]; then
    # Get title of the left window
    LEFT_TITLE="$(wmctrl -l | grep -i $LEFT | awk '{$1=$2=$3="";print}')"
    # Get title of the right window
    RIGHT_TITLE="$(wmctrl -l | grep -i $RIGHT | awk '{$1=$2=$3="";print }')"
printf "THIS IS A TEST %s",$LEFT_TITLE
printf "THIS IS A TEST 2 %s",$RIGHT_TITLE
    wmctrl -r $LEFT_TITLE -e 0,0,0,600,600

    sleep 0.5

    wmctrl -r $RIGHT_TITLE -e 0,1300,0,600,600

fi

Agora, você pode adaptar esse script para se comportar como um inicializador em apenas uma janela e especificar se deseja que ele esteja no lado direito ou esquerdo. Vou trabalhar nessa idéia um pouco mais tarde no dia, mas a ideia básica é novamente, usar dois popups e se for a instrução. Outra ideia que tenho é usar o awk para extrair informações relevantes de um único popup. Vou editar minha resposta assim que eu completar os scripts

Editar

E aqui está o lançador da janela única; digite programname,L para o canal esquerdo e programname,R para o canal certo

#!/bin/sh

# set -x
PROG=$(zenity --entry --text="Program,L or R ?")

NAME=$(echo $PROG | cut -d ',' -f1)
SIDE=$(echo $PROG | cut -d ',' -f2)
$NAME &
sleep 1

if [ $? -eq 0 ] 
then

    TITLE=$( wmctrl -l | grep -i $NAME| awk '{$1=$2=$3=""; print}' )

    sleep 0.5
if [ $SIDE = "L" ];then
    wmctrl -r $TITLE -e 0,0,0,600,600
else
    wmctrl -r $TITLE -e 0,1300,0,600,600
fi

fi
    
por Sergiy Kolodyazhnyy 29.04.2015 / 20:06