Wmctrl window move komutundaki sapmaya ne sebep olur?


13

Wmctrl hakkında

İle wmctrl(varsayılan olarak yüklenmez), biz pencereler, onların kimliği, onların geometri hakkında bilgi alabilirsiniz, onlar Ayrıca vb aittir pid taşımak veya yeniden boyutlandırma çeşitli komutlar ile pencereler. Bununla birlikte, bazı açılardan, davranışı mantıklı görünmemektedir. Sorum hakkındadır hareketli pencereleri wmctrl:

Bilgi almak

Komutu çalıştırdığımda:

wmctrl -lG

Aşağıdaki resim (ler) deki pencere hakkında aşağıdaki bilgileri alıyorum:

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

3-5. Sütunda, geometri bilgileri bize x / y koordinatlarını ve genişliği / yüksekliği bildirir.

Pencereyi taşıma / yeniden boyutlandırma

Bu koordinatları bir pencereyi taşıma / yeniden boyutlandırmawmctrl komutuna koyduğumda , koordinatlar değişmediğinden hiçbir şey yapmamalı:

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

Sapma

Bununla birlikte, aşağıdaki resimler pencerenin aşağıya doğru hareket ettiğini göstermektedir (kesin olarak 28 piksel). Nedeni, wmctrl pencere hareket komutunun çalışma alanı (ekran eksi panel yüksekliği) wmctrl -lGile hesaplanırken , komutun toplam ekran boyutu ile hesaplandığı varsayılmıştır . Ancak yine de 4 piksel açıklanamaz (panel 24 piksel yüksekliğindedir).

Sapma komut dosyalarında çok iyi telafi edilebilse de, sebebini anlamadığım gerçeği tatmin edici değil, bu yüzden soru şu:

Bu sapmanın nedeni tam olarak nedir?


Çıktısında kesin koordinatları olan bir pencereyi wmctrl -lGtaşımak pencereyi hareket ettirmemeli,

resim açıklamasını buraya girin

resim açıklamasını buraya girin


Benim "fudgy" çözüm, mevcut koordinatları kaydetmek, bu koordinatlara taşımak, yeni koordinatları almak, farklılıkları almak için kaydedilen koordinatları çıkarmak oldu. Ardından farkları orijinal koordinatlara uygulayın ve ayarlanan koordinatlara geçin. Göründüğünden daha kolay.
WinEunuuchs2Unix

Yanıtlar:


18

Wmctrl, pencerenin süslemelerinin içindeki geometrisini döndürüyor (yani başlık çubuğu ve kenarlıklar dahil değil), ancak hareket için daha büyük pencere konumunu kullanıyor.

(Bazı komut çıkış satırları kaldırıldı: xdotoolyüklenmemiş olabilir)

$ 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

Bir sonraki komut, ilgili pencereyi ister ve tüm süslemeleri içeren ve kullanılan pencere temasına bağlı olarak değişen üst pencereyi döndürür.

$ xdotool selectwindow
25166060

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

Gördüğünüz gibi farklı bir pencere; X konumu 2 piksel sola başlar (702-2) ve toplam genişlik 4 piksel (900 + 2 + 2) daha büyüktür, çünkü sağ kenarlık da 2 pikseldir. Y daha yüksektir (varsa üst kenarlığın ve başlık çubuğunun üzerinde); yükseklik, tüm bunların yanı sıra alt kenarlık nedeniyle daha büyüktür.

wmctrl ana pencereyi alt pencerenin istenen [X, Y] konumuna taşır; genişlik ve yükseklik aşağıdaki "öncesi ve sonrası" bölümünde gösterildiği gibi çocuğa doğru şekilde uygulanır.

$ 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

Düzenleme: ek bilgi.

Masaüstü geometrisi, Viewport ve 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

Re: @Sneetsher yorumlarda ipucu

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

Bu mükemmel bir cevap gibi görünüyor! Bu gece ayrıntılarına bakacağım.
Jacob Vlijm

Benim anlayış için, çıkış xdotool selectwindowolduğunu 25166060, ancak almak için adım nedir 0x18000ec? Onaltılık dönüşüm denedim, ama öyle değil gibi görünüyor.
Jacob Vlijm

xdotool getwindowgeometry 0x18000ecGönderen çıktı 25166060 (üst) ondalık pencere kimliğini döndürür. 0x00000040 (alt öğe) olmadığını göstermek için 0x18000ec değerinin onaltılık değerini girdim. Bu arada, bakmamanızı umarak tüm testi daha kolay sayılarla yeniden çalıştırdım. Bir şeyin ortasındaysanız önceki düzenleme düzeltmesine bakın.
Daxx

2
@JacobVlijm, xpropdekorasyon dolgu gösteriyor gibi görünüyor: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6ve _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Kontrol etmek yardımcı olabilir.
user.dz

xdotool selectwindowKomutun KDE ve Unity'de farklı davranması mümkün mü ? xdotool selectwindowKomutun çıktısı tam olarak aynı pencereye (-id) ve (böylece) xdotool getwindowgeometryaynı veriyi çıkarır wmctrl -lG. xpropKomut Ancak @Sneetsher gösterileri önerdiği gibi _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0el ölçülmüş ve Cevabınız özü doğrudur kanıtlıyor ve bu benim soruya mükemmel cevap tam olarak ne olduğunu. Senin titizliğinden etkilendim. Teşekkürler!
Jacob Vlijm

0

Aynı sorunu vardı ve bir geçici çözüm bulabiliriz.


Durum

Durumum Compiz yüklü Mate 16.04'e (gtk pencere yöneticisini etkinleştiren) dayanıyor

Önceden tanımlanmış yerlere pencereleri yerleştirmek için anahtar bağlarına bağlı bir komut dosyası kullanıyorum. Maksimize edilmiş seçeneği kullanmıyorsam bu komut dosyası başarısız olur.


analiz

Sorun, ayarlarda (compiz) pencere süslemeleri açılarak ve açılıp kapatılabilir.


Geçici çözüm

Pencere süslemeleri, belirli bir pencere için python kullanılarak açılıp kapatılabilir (tuş bağlamalarını kullanarak etkin pencereyi kullanmak uygundur).

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

Ardından pencere dekorasyonlarını kapatabilir, pencereyi taşıyabilir ve pencere dekorasyonlarını açabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.