Como posso abrir uma janela em um monitor diferente?

9

Até agora, com vários monitores, tenho arrastado janelas manualmente. Existe uma maneira de abrir uma janela em uma tela específica em uma configuração de cabeça dupla? (Não confunda com vários monitores do servidor X.)

Algo como: SCREEN=2 firefoxou open-in-screen 2 firefox.

Se isso importa, meu ambiente é o KDE usando o gerenciador de janelas KWin. As regras da janela do KWin podem corresponder apenas a algumas propriedades, como título, mas não foi possível encontrar uma variável de ambiente como filtro.

A exibição secundária estende a tela principal:

$ xrandr -q
Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 32767 x 32767
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
   1600x900       60.1*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+1600+0 (normal left inverted right x axis y axis) 477mm x 268mm
   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  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   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)
Lekensteyn
fonte
2
Normalmente, eu sugiro usar kstartisso, mas parece que kstartapenas suporta a definição de uma área de trabalho específica, mas não uma tela na qual o aplicativo deve ser iniciado. Provavelmente vale um relatório de erros da WISHLIST em bugs.kde.org .
Elias Probst
Ótima dica kstart, eu também queria saber disso. O comando é: kstart --desktop $N firefoxonde $Nestá um número entre 1 e o número total de áreas de trabalho virtuais .
Lekensteyn
Em relação ao kstart, também há um relatório de bug no bugs.kde.org solicitando esse recurso.
Elias Probst
Que estranho, eu vi um post sobre o wmctrl hoje cedo, mas não tive a chance de testá-lo. Por que foi excluído?
Lekensteyn
Nenhuma idéia sobre a postagem wmctrl, não a vi.
Elias Probst

Respostas:

5

Não, você não pode fazer isso diretamente. Na arquitetura X, os dois monitores físicos que você vê não são discerníveis pelos aplicativos. Você só pode contornar essa abstração, determinando quais áreas da área de trabalho visível correspondem a qual monitor e, em seguida, coloque as janelas no deslocamento correto.

Os kits de ferramentas sensíveis oferecem suporte a uma -geometryopção, que permite que seu aplicativo solicite a colocação em uma posição específica. Se você não tiver essa opção disponível, poderá usar wmctrlum X Window Manager compatível com EWMH / NetWM para mover e redimensionar janelas já existentes (consulte wmctrl (1), você precisa de opções -re -e). Uso devilspiepara forçar o posicionamento de algumas janelas e, é claro, o gerenciador de janelas de sua escolha pode ter suas próprias instalações para forçar o posicionamento da janela.

devilspiepermite aplicar determinadas ações nas janelas X e pode usar as propriedades da janela X para discernir diferentes janelas e aplicativos. A regra principal para você seria geometry "<width>x<height>+<xoffset>+<yoffset>".

No entanto, você sempre precisa fazer os cálculos de quando e onde outro monitor físico se inicia. Mas isso não é muito difícil e xrandrmostra como e onde ele usa monitores na forma de "<width>x<height>+<xoffset>+<yoffset>em cada linha, com um nome de saída.

Não existe uma maneira fácil de enganar, porque as implementações podem (e fazem!) Variar. wmctrlgeralmente funciona no título da janela para identificar o alvo. devilspietambém pode se referir à sua classe, mas não conheço nenhum kit de ferramentas que permita especificar uma classe X windows, mas não sua geometria.

É claro que você sempre pode iniciar duas xephyrinstâncias e fazer uma preencher a tela esquerda e a outra a tela direita e, em seguida, endereçar as telas por DISPLAYmeio da variável de ambiente, mas essa solução tem outras desvantagens.

Em teoria, a autoridade para controlar o posicionamento da janela é o gerenciador de janelas. Conseqüentemente, se você deseja coisas que seu gerenciador de janelas não pode, será hacky e também é a razão pela qual não há uma maneira genérica de fazer isso.

No entanto, se o seu caso de uso concreto é o emulador do Android ... que é muito diferente de pedir a opção de especificar SCREEN=n fooappno shell, então devilspiepode ser o que você está procurando. Dica: achei melhor identificar aplicativos por sua classe de janela.

Bananguin
fonte
Obrigado por explicar por que esse não é um recurso fácil. O KWin também possui regras de janela que forçam o posicionamento em uma tela diferente (que é o que eu uso agora). Embora não haja nenhum recurso padrão para SCREEN=x app, é possível adicionar uma propriedade de janela dessa maneira para que possa ser filtrada pelo KWin?
precisa saber é o seguinte
Em teoria, sim, mas não conheço nenhuma solução existente para isso. Eu acho que você não pode adicionar propriedades, mas pode alterar as propriedades existentes, então você pode simplesmente adicionar alguma string à classe de janela que o kwin pode detectar.
Bananguin
Concedi a recompensa a você, porque a SE concederia a resposta mais votada, enquanto sua resposta descreve melhor os problemas. As respostas atuais ainda não são satisfatórias.
precisa saber é o seguinte
4

Esta é uma solução específica para o gerenciador de janelas. É assim que se faz com o kwin, que é o gerenciador de janelas padrão do KDE.

Se você clicar com o botão direito do mouse na barra de título do aplicativo e selecionar mais configurações -> configurações especiais de aplicativo.

Vá para a guia Correspondência de janelas. Clique no botão Detectar propriedades da janela. Em seguida, com o cursor do mouse, clique na janela principal do aplicativo. Ele selecionará a classe da janela, etc., e também obterá informações sobre o posicionamento da janela, etc.

Em seguida, clique na guia Tamanho e Posição. Clique na caixa Posição e tamanho da caixa e caixa suspensa à direita de ambas e defina para lembrar.

Então clique ok.

Da próxima vez que você executar o aplicativo, ele deverá ter o mesmo tamanho e o mesmo monitor.

Eu uso isso no KDE para abrir meu terminal uRxvt no meu monitor esquerdo em uma configuração de 3 monitores e funciona sempre.

Boa sorte.

rking
fonte
É assim que eu faço agora, eu esperava que houvesse uma maneira mais direta de usar envvars.
precisa saber é o seguinte
Esta é a resposta correta para um usuário do KDE KWin.
iLikeDirt 24/09
3

Isso depende de como os monitores duplos estão configurados.

Se você estiver usando o XINERAMA para fazer com que os dois monitores pareçam um para o X, use a -geometryopção para solicitar que os aplicativos apareçam em um local específico. Se você tiver os monitores configurados como telas diferentes, utilizará o DISPLAYpara isso.

Experimente estes:

$ DISPLAY=0.0 xterm &
$ DISPLAY=0.1 xterm &

Se seus monitores forem da tela 0 e 1, isso deverá gerar um xterm em cada monitor.

Casey
fonte
2
Eu já tentei isso, mas essa configuração não se aplica a mim, uma tela está posicionada à esquerda da outra. Vou atualizar minha pergunta.
Lekensteyn
1
Você já tentou usar a opção de geometria para aplicativos compatíveis? Dar uma coordenada x> 1600 deve posicionar o aplicativo no segundo espaço de monitores. Você também pode tentar isso fora do kwin (apenas para ver se funciona), como na minha experiência, o kwin e -geometrynem sempre funciona corretamente.
casey
Casey, o aplicativo que estou tentando posicionar não suporta essa opção (android emulator, com base no QEMU). O programa é aberto onde está localizado o cursor do mouse.
Lekensteyn
2

Eu vim através deste método que faz uso de xdotool, xprop, e wmctrl.

Aqui está o que o script abaixo fará:

  1. Encontre a janela ativa
  2. Obtenha seu estado maximizado e lembre-se dele
  3. Remover maximização
  4. Obtenha sua geometria
  5. Calcular a nova posição
  6. Mova isso
  7. Maximizar com base no estado anterior
  8. Levante
  9. Aqui está um script que faz isso:

roteiro

Isso moverá a janela ativa para o outro monitor. Ele só pode lidar com um lado a lado, também conhecido como. horizontal, configuração de monitores.

wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`

wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`

new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
  new_x=0
fi

xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
  wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi

xdotool windowraise $wid

Fonte: Xubuntu - movendo janelas entre monitores

slm
fonte
Isso só funciona depois que um aplicativo foi aberto, não exatamente o que estou procurando (provavelmente uma combinação de teclas poderia ser adicionada para isso). Se não me engano, isso sempre posiciona uma janela no lado esquerdo de um monitor?
precisa saber é o seguinte
@Lekensteyn - Sim, o objetivo desta solução é iniciar o appX e executar esse cmd para movê-lo. Não tenho monitores duplos 8- (por isso não tenho como testar isso, simplesmente o encontrei e forneci os detalhes aqui para você avaliar. É uma opção e provavelmente pode ser adaptada, mas é uma solução "bruta" em sua atual
slm
@Lekensteyn - esta solução não é muito diferente do seu SCREEN=2 appXconceito, exceto que é appX; sleep 1; moveWindow.sh.
slm
@Lekensteyn - também usei devilspie, xdotool, etc. para fazer exatamente as mesmas coisas (dentro de uma única janela), este A complementa o outro, pois mostra os detalhes, onde o outro apenas explica as abordagens possíveis, mas não mostra detalhes reais da implementação.
slm
Será mais como app & sleep 1; moveWindow.shos programas não se destacam. No entanto, não considero isso uma melhoria sobre o uso das regras de janela do KWin. +1 pelos seus esforços.
precisa saber é o seguinte
0

Teve um problema semelhante. Encontrou o seguinte:

  1. Clique com o botão direito do mouse na barra de título da janela e selecione "Mais ações" -> "Configurações do Gerenciador de janelas".
  2. Lá, escolha "Foco" na coluna à esquerda.
  3. Alterna a opção "A tela ativa segue o mouse".

Se nenhum outro padrão for especificado, as janelas aparecerão na tela ativa no momento. Com o procedimento descrito acima, a posição do mouse define esta tela ativa.

BiberBb
fonte
Certo, mas isso não funciona se eu quiser manter o cursor na tela atual. Eu acho que essa é a opção padrão, mas nem todos os programas a respeitam.
Lekensteyn