O que causa o desvio no comando mover da janela wmctrl

13

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 wmctrlcomando 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 -lGcomando 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 -lGnão deve mover a janela, mas sim

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Jacob Vlijm
fonte
Minha solução "fudgy" era salvar as coordenadas atuais, mover para essas coordenadas, obter as novas coordenadas, subtrair as coordenadas salvas para obter as diferenças. Em seguida, aplique as diferenças nas coordenadas originais e vá para as coordenadas ajustadas. É mais fácil do que parece.
WinEunuuchs2Unix

Respostas:

18

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: xdotoolpodem não estar instaladas)

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x04000040
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

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.

$ xdotool selectwindow
25166060

$ xdotool getwindowgeometry 0x18000ec
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

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.

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

$ wmctrl -ir 0x04000040 -e 0,702,23,900,950   # <----- "MOVE/RESIZE" *****

$ wmctrl -lG
0x04000040  0 704  46   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 702,23 (screen: 0)    <----- Desired [X,Y] applied to parent
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 704,46 (screen: 0)
  Geometry: 900x950               <----- Desired [W,H] applied to child

Editar: informações adicionais.

Geometria da área de trabalho, janela de visualização e área de trabalho

$ wmctrl -d    # (KDE)
0  * DG: 1680x1050  VP: 0,0  WA: 0,0 1680x1015  Desktop 1
$ xdotool -v
xdotool version 3.20140217.1

https://github.com/jordansissel/xdotool

Re: @Sneetsher dica nos comentários

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Daxx
fonte
Parece uma excelente resposta! Vou dar uma olhada nos detalhes hoje à noite.
Jacob Vlijm
para meu entendimento, a saída de xdotool selectwindowé 25166060, mas qual é o passo a ser alcançado 0x18000ec? Eu tentei a conversão de hexadecimal, mas parece que não é isso.
precisa saber é o seguinte
A saída de xdotool getwindowgeometry 0x18000ecretorna 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.
Daxx
2
@JacobVlijm, xpropparece mostrar o preenchimento da decoração: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6e _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Pode ajudar a verificar.
usar o seguinte comando
É possível que o xdotool selectwindowcomando se comporte de maneira diferente no KDE e no Unity? A saída do xdotool selectwindowcomando refere-se exatamente à mesma janela (-id) e, portanto, xdotool getwindowgeometrygera os mesmos dados que wmctrl -lG. No xpropentanto, 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!
Jacob Vlijm
0

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).

#!/usr/bin/python
from gtk.gdk import *
import gtk.gdk
import time
import sys

w = gtk.gdk.get_default_root_window().get_screen().get_active_window()
w.set_decorations(0) #use 1 to turn on decorations
window_process_all_updates()
gtk.gdk.flush()

Em seguida, você pode desativar as decorações de janelas, movê-las e ativar as decorações de janelas.

Sextus Empiricus
fonte