Sobre wmctrl
Com wmctrl
(não instalado por padrão), podemos obter informações sobre janelas, seu ID, sua geometria, o pid ao qual pertencem etc. Também podemos mover ou redimensionar janelas com vários comandos. No entanto, em alguns aspectos, seu comportamento não parece lógico. Minha pergunta é sobre mover janelas por wmctrl
:
Obtendo informações
Quando executo o comando:
wmctrl -lG
Recebo (ao) as seguintes informações sobre a janela na (s) foto (s) abaixo:
0x04200085 0 746 443 468 205 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
Na coluna 3-5, as informações da geometria indicam as coordenadas x / y e a largura / altura.
Mover / redimensionar a janela
Quando coloco essas coordenadas no wmctrl
comando para mover / redimensionar uma janela, ela não deve fazer nada, pois as coordenadas permanecem inalteradas:
wmctrl -ir 0x04200085 -e 0,746,443,468,205
Desvio
No entanto, as figuras abaixo mostram que a janela é movida para baixo (28px para ser mais preciso). Presumi que o motivo era o comando de wmctrl
movimentação da janela calculado com a área de trabalho (tela menos a altura do painel), enquanto o wmctrl -lG
comando foi calculado com o tamanho total da tela . No entanto, ainda 4px é inexplicável (o painel tem 24px de altura).
Embora o desvio possa muito bem ser compensado em scripts, o fato de eu não entender a causa não é satisfatório, então a questão é:
Qual é exatamente a causa desse desvio?
Mover uma janela com as coordenadas exatas na saída de wmctrl -lG
não deve mover a janela, mas sim
fonte
Respostas:
O que está acontecendo é que o wmctrl está retornando a geometria da janela dentro das decorações (ou seja, não incluindo a barra de título e as bordas), mas está usando a posição maior da janela para a movimentação.
(Algumas linhas de saída do comando removidas:
xdotool
podem não estar instaladas)O próximo comando solicita a janela de interesse e retorna a janela pai, que inclui todas as decorações e varia de acordo com o tema da janela em uso.
Como você pode ver, é uma janela diferente; a posição X começa 2px à esquerda (702-2) e a largura total é maior em 4px (900 + 2 + 2) porque a borda direita também é 2px. Y é mais alto (acima da borda superior, se houver, e da barra de título); a altura é maior por causa de tudo isso mais a borda inferior.
wmctrl move a janela pai para a posição desejada [X, Y] da janela filho; largura e altura são aplicadas corretamente à criança, conforme mostrado no "antes e depois" abaixo.
Editar: informações adicionais.
Geometria da área de trabalho, janela de visualização e área de trabalho
https://github.com/jordansissel/xdotool
Re: @Sneetsher dica nos comentários
fonte
xdotool selectwindow
é25166060
, mas qual é o passo a ser alcançado0x18000ec
? Eu tentei a conversão de hexadecimal, mas parece que não é isso.xdotool getwindowgeometry 0x18000ec
retorna o ID da janela decimal de 25166060 (pai). Acabei de inserir o valor hexadecimal de 0x18000ec para mostrar que não era 0x04000040 (o filho). A propósito, eu apenas refiz o teste inteiro com números mais fáceis, na esperança de que você não estivesse olhando. Consulte a revisão de edição anterior se você estiver no meio de algo.xprop
parece mostrar o preenchimento da decoração:_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6
e_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6
. Pode ajudar a verificar.xdotool selectwindow
comando se comporte de maneira diferente no KDE e no Unity? A saída doxdotool selectwindow
comando refere-se exatamente à mesma janela (-id) e, portanto,xdotool getwindowgeometry
gera os mesmos dados quewmctrl -lG
. Noxprop
entanto, o comando, conforme sugerido por @Sneetsher_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
, mostra exatamente o que eu medi manualmente e prova que a essência da sua resposta está correta e é a resposta perfeita para a minha pergunta. Estou impressionado com sua minúcia. Obrigado!Eu tive o mesmo problema e consegui encontrar uma solução alternativa.
Situação
Minha situação é baseada no Mate 16.04 com o Compiz instalado (que ativa o gerenciador de janelas gtk)
Estou usando um script conectado a combinações de teclas para colocar janelas em locais predefinidos. Este script falhará se eu não estiver usando a opção maximizada.
Análise
O problema pode ser ativado e desativado ativando e decorando a janela nas configurações (compiz).
Gambiarra
As decorações da janela podem ser ativadas e desativadas usando python para uma janela específica (usando combinações de teclas, é conveniente usar a janela ativa).
Em seguida, você pode desativar as decorações de janelas, movê-las e ativar as decorações de janelas.
fonte