Cosa causa la deviazione nel comando di spostamento della finestra di wmctrl


13

Informazioni su wmctrl

Con wmctrl(non installato per impostazione predefinita), possiamo ottenere informazioni su Windows, il loro ID, la loro geometria, il pid a cui appartengono, ecc. Inoltre, possiamo spostare o ridimensionare le finestre con diversi comandi. Tuttavia, per alcuni aspetti, il suo comportamento non sembra logico. La mia domanda riguarda lo spostamento di Windows tramite wmctrl:

Ottenere informazioni

Quando eseguo il comando:

wmctrl -lG

Ottengo (ao) le seguenti informazioni sulla finestra nelle foto seguenti:

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

Nella colonna 3-5, le informazioni sulla geometria ci dicono le coordinate x / y e la larghezza / altezza.

Spostare / ridimensionare la finestra

Quando inserisco queste coordinate nel wmctrlcomando per spostare / ridimensionare una finestra, non dovrebbe fare nulla, poiché le coordinate sono invariate:

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

Deviazione

Tuttavia, le immagini sottostanti mostrano che la finestra viene spostata verso il basso (28 pixel per la precisione). Ho ipotizzato che il motivo fosse che il comando di wmctrl spostamento della finestra era calcolato con l' area di lavoro (schermo meno l'altezza del pannello), mentre il wmctrl -lGcomando era calcolato con la dimensione totale dello schermo . Quindi ancora 4px è inspiegabile (il pannello è alto 24px).

Sebbene la deviazione possa benissimo essere compensata negli script, il fatto che non capisca la causa non è soddisfacente, quindi la domanda è:

Qual è esattamente la causa di questa deviazione?


Lo spostamento di una finestra con le coordinate esatte nell'output di wmctrl -lGnon dovrebbe spostare la finestra, ma lo fa

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


La mia soluzione "fudgy" era salvare le coordinate correnti, spostarle su quelle coordinate, ottenere le nuove coordinate, sottrarre le coordinate salvate per ottenere le differenze. Quindi applicare le differenze alle coordinate originali e spostarsi sulle coordinate modificate. È più facile di quanto sembri.
WinEunuuchs2Unix

Risposte:


18

Quello che sta succedendo è che wmctrl sta restituendo la geometria della finestra all'interno delle decorazioni (cioè non includendo la barra del titolo e i bordi) ma sta usando la posizione della finestra più grande per lo spostamento.

(Alcune righe di output dei comandi rimosse: xdotoolpotrebbero non essere installate)

$ 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

Il comando successivo richiede la finestra di interesse e restituisce la finestra principale che include tutte le decorazioni e varia a seconda del tema della finestra in uso.

$ xdotool selectwindow
25166060

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

Come puoi vedere, è una finestra diversa; la posizione X inizia 2px a sinistra (702-2) e la larghezza totale è maggiore di 4px (900 + 2 + 2) perché anche il bordo destro è 2px. Y è più alto (sopra l'eventuale bordo superiore e la barra del titolo); l'altezza è maggiore a causa di tutto ciò oltre al bordo inferiore.

wmctrl sposta la finestra padre nella posizione desiderata [X, Y] della finestra figlio; larghezza e altezza sono applicate correttamente al bambino, come mostrato nella sezione "prima e dopo" di seguito.

$ 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

Modifica: informazioni aggiuntive.

Geometria del desktop, Viewport e Workarea

$ 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

Ri: suggerimento @Sneetsher nei commenti

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4

Sembra un'ottima risposta! Guarderò nei suoi dettagli stasera.
Jacob Vlijm,

per la mia comprensione, l'output di xdotool selectwindowè 25166060, ma qual è il passo da compiere 0x18000ec? Ho provato la conversione da esadecimale, ma sembra non esserlo.
Jacob Vlijm,

L'output da xdotool getwindowgeometry 0x18000ecrestituisce l'ID della finestra decimale di 25166060 (padre). Ho appena inserito il valore esadecimale di 0x18000ec per mostrare che non era 0x04000040 (il bambino). A proposito, ho appena ripetuto l'intero test con numeri più facili nella speranza che non stavi guardando. Vedi la precedente revisione di modifica se eri nel mezzo di qualcosa.
Daxx,

2
@JacobVlijm, xpropsembra mostrare un'imbottitura decorativa: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6e _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Può aiutare a controllare.
user.dz

È possibile che il xdotool selectwindowcomando si comporti diversamente su KDE e Unity? L'output del xdotool selectwindowcomando si riferisce esattamente alla stessa finestra (-id) e (quindi) xdotool getwindowgeometrygenera gli stessi dati di wmctrl -lG. Il xpropcomando di tuttavia, come suggerito da spettacoli @Sneetsher _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0, che è esattamente quello che ho misurato manualmente, e dimostra l'essenza della vostra risposta è corretta, ed è la risposta perfetta alla mia domanda. Sono colpito dalla tua completezza. Grazie!
Jacob Vlijm,

0

Ho avuto lo stesso problema e ho trovato una soluzione alternativa.


Situazione

La mia situazione si basa su Mate 16.04 con Compiz installato (che attiva il gestore di finestre gtk)

Sto usando uno script collegato a combinazioni di tasti per posizionare le finestre in luoghi predefiniti. Questo script fallisce se non sto usando l'opzione ingrandita.


Analisi

Il problema potrebbe essere attivato e disattivato attivando e delle decorazioni delle finestre nelle impostazioni (compiz).


Soluzione

Le decorazioni delle finestre possono essere attivate e disattivate usando Python per una finestra specifica (usando le combinazioni di tasti è conveniente usare la finestra attiva).

#!/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()

Quindi puoi disattivare le decorazioni delle finestre, spostare la finestra e attivare le decorazioni delle finestre.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.