Apa yang menyebabkan penyimpangan dalam perintah pindah jendela wmctrl

13

Tentang wmctrl

Dengan wmctrl(tidak diinstal secara default), kita dapat memperoleh informasi di windows, id mereka, geometri mereka, pid milik mereka dll. Kita juga dapat memindahkan atau mengubah ukuran windows dengan beberapa perintah. Namun, dalam beberapa hal, perilakunya tampaknya tidak logis. Pertanyaan saya adalah tentang memindahkan windows dengan wmctrl:

Mendapatkan informasi

Ketika saya menjalankan perintah:

wmctrl -lG

Saya mendapatkan (ao) informasi berikut tentang jendela pada gambar di bawah ini:

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

Dalam kolom 3-5, informasi geometri memberi tahu kita koordinat x / y dan lebar / tinggi.

Memindahkan / mengubah ukuran jendela

Ketika saya meletakkan koordinat ini dalam wmctrlperintah untuk memindahkan / mengubah ukuran jendela, itu seharusnya tidak melakukan apa-apa, karena koordinatnya tidak berubah:

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

Deviasi

Namun, gambar di bawah ini menunjukkan jendela dipindahkan ke bawah (tepatnya 28px). Saya berasumsi alasannya adalah bahwa perintah wmctrl pindah jendela dihitung dengan area kerja (layar minus panel tinggi), sedangkan wmctrl -lGperintah dihitung dengan ukuran layar total . Namun demikian, masih 4px tidak dapat dijelaskan (panelnya 24px tinggi).

Meskipun penyimpangan dapat dikompensasi dalam skrip, fakta bahwa saya tidak mengerti penyebabnya tidak memuaskan, jadi pertanyaannya adalah:

Apa sebenarnya penyebab dari penyimpangan ini?


Memindahkan jendela dengan koordinat yang tepat pada output wmctrl -lGseharusnya tidak memindahkan jendela, tetapi ia melakukannya

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Yakub Vlijm
sumber
Solusi "fudgy" saya adalah menyimpan koordinat saat ini, pindah ke koordinat tersebut, dapatkan koordinat baru, kurangi koordinat yang disimpan untuk mendapatkan perbedaan. Kemudian terapkan perbedaan pada koordinat asli dan pindah ke koordinat yang disesuaikan. Ini lebih mudah daripada kedengarannya.
WinEunuuchs2Unix

Jawaban:

18

Apa yang terjadi adalah bahwa wmctrl mengembalikan geometri jendela di dalam dekorasi (yaitu tidak termasuk bilah judul dan batas) tetapi menggunakan posisi jendela yang lebih besar untuk bergerak.

(Beberapa jalur output perintah dihapus: xdotoolmungkin tidak diinstal)

$ 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

Perintah selanjutnya meminta jendela yang menarik dan mengembalikan jendela induk yang mencakup semua dekorasi dan bervariasi tergantung pada tema jendela yang digunakan.

$ xdotool selectwindow
25166060

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

Seperti yang Anda lihat, ini jendela yang berbeda; posisi X mulai 2px ke kiri (702-2) dan lebar total lebih besar dengan 4px (900 + 2 + 2) karena batas kanan juga 2px. Y lebih tinggi (di atas batas atas, jika ada, dan bilah judul); tingginya lebih besar karena semua itu ditambah batas bawah.

wmctrl memindahkan jendela induk ke posisi [X, Y] yang diinginkan dari jendela anak; lebar dan tinggi diterapkan dengan benar pada anak, seperti yang ditunjukkan pada "sebelum & sesudah" di bawah ini.

$ 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

Edit: info tambahan.

Geometri desktop, Viewport & 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 memberi komentar

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Daxx
sumber
Ini sepertinya jawaban yang sangat bagus! Saya akan melihat detailnya malam ini.
Jacob Vlijm
untuk pemahaman saya, output dari xdotool selectwindowadalah 25166060, tetapi apa langkah untuk sampai 0x18000ec? Saya mencoba konversi dari heksadesimal, tetapi tampaknya bukan itu.
Jacob Vlijm
Output dari xdotool getwindowgeometry 0x18000ecmengembalikan ID jendela desimal 25166060 (induk). Saya hanya memasukkan nilai hex 0x18000ec untuk menunjukkan bahwa itu bukan 0x04000040 (anak). Ngomong-ngomong, saya hanya menjalankan kembali seluruh tes dengan angka yang lebih mudah dengan harapan Anda tidak melihat. Lihat revisi edit sebelumnya jika Anda berada di tengah-tengah sesuatu.
Daxx
2
@JacobVlijm, xproptampaknya menunjukkan bantalan dekorasi: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6dan _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Mungkin membantu untuk memeriksa.
user.dz
Apakah mungkin bahwa xdotool selectwindowperintah berperilaku berbeda pada KDE dan Unity? Output dari xdotool selectwindowperintah mengacu ke jendela yang persis sama (-id) dan (dengan demikian) xdotool getwindowgeometrymenampilkan data yang sama wmctrl -lG. The xpropperintah Namun, seperti yang disarankan oleh menunjukkan @Sneetsher _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0, yang persis apa yang saya diukur secara manual, dan membuktikan esensi jawaban Anda benar, dan itu adalah jawaban yang sempurna untuk pertanyaan saya. Saya terkesan dengan ketelitian Anda. Terima kasih!
Jacob Vlijm
0

Saya memiliki masalah yang sama dan dapat menemukan solusi.


Situasi

Situasi saya didasarkan pada Mate 16.04 dengan Compiz diinstal (yang mengaktifkan manajer jendela gtk)

Saya menggunakan skrip yang terhubung ke binding-kunci untuk menempatkan windows di tempat yang telah ditentukan. Skrip ini gagal jika saya tidak menggunakan opsi yang dimaksimalkan.


Analisis

Masalahnya dapat dihidupkan dan dimatikan dengan menyalakan dan dekorasi jendela di pengaturan (compiz).


Penanganan masalah

Dekorasi jendela dapat dinyalakan dan dimatikan menggunakan python untuk jendela tertentu (menggunakan keybindings nyaman untuk menggunakan jendela aktif).

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

Kemudian Anda dapat mematikan dekorasi jendela, memindahkan jendela, dan menghidupkan dekorasi jendela.

Sextus Empiricus
sumber