O que causa o desvio no comando de movimentação da janela wmctrl

9

Sobre o wmctrl

Com wmctrl (não instalado por padrão), podemos obter informações sobre janelas, seu id, sua geometria, o pid a que pertencem etc. Também podemos mover ou redimensionar janelas com vários comandos. No entanto, em alguns aspectos, seu comportamento parece não ser lógico. Minha pergunta é sobre mover janelas por wmctrl :

Obtendo informações

Quando eu executo o comando:

wmctrl -lG

Eu recebo (a.o.) as seguintes informações sobre a janela na (s) imagem (s) abaixo:

0x04200085  0 746  443  468  205  jacob-System-Product-Name Niet-opgeslagen document 1 - gedit

Na coluna 3-5, as informações de geometria nos informam as coordenadas x / y e a largura / altura.

Movendo / redimensionando a janela

Quando eu coloco essas coordenadas no comando wmctrl para mover / redimensionar uma janela, ela não deve fazer nada, já que as coordenadas não mudam:

wmctrl -ir 0x04200085 -e 0,746,443,468,205

Desvio

No entanto, as imagens abaixo mostram que a janela foi movida para baixo (28px para ser preciso). Presumi que o motivo era que o comando wmctrl movimentação da janela foi calculado com a área de trabalho (tela menos altura do painel), enquanto o comando wmctrl -lG calculado com o > tamanho total da tela . Então ainda 4px é inexplicável no entanto (o painel é 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

    
por Jacob Vlijm 22.01.2015 / 17:27

2 respostas

14

O que está acontecendo é que wmctrl está retornando a geometria da janela dentro das decorações (ou seja, não incluindo a barra de título e bordas), mas está usando a posição da janela maior para o movimento.

(Algumas linhas de saída de comando foram removidas: xdotool pode não estar instalado)

$ 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 inicia 2px para a esquerda (702-2) e a largura total é maior para 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; a largura e a altura são aplicadas corretamente à criança, conforme mostrado no "antes & 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 do ambiente de trabalho, Viewport & amp; Workarea

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

link

Re: @Setsetsher 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
    
por Daxx 30.01.2015 / 08:49
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 associações de teclas para colocar janelas em locais predefinidos. Este script falha se eu não estiver usando a opção maximizada.

Análise

O problema pode ser ativado e desativado ao ligar e das decorações das janelas nas configurações (compiz).

Solução alternativa

As decorações das janelas podem ser ativadas e desativadas usando python para uma janela específica (usando atalhos de teclado é 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()

Você pode desativar as decorações das janelas, mover a janela e ativar as decorações das janelas.

    
por Martijn Weterings 31.05.2017 / 20:01