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 wmctrl
perintah 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 -lG
perintah 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 -lG
seharusnya tidak memindahkan jendela, tetapi ia melakukannya
sumber
Jawaban:
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:
xdotool
mungkin tidak diinstal)Perintah selanjutnya meminta jendela yang menarik dan mengembalikan jendela induk yang mencakup semua dekorasi dan bervariasi tergantung pada tema jendela yang digunakan.
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.
Edit: info tambahan.
Geometri desktop, Viewport & Workarea
https://github.com/jordansissel/xdotool
Re: @Sneetsher memberi komentar
sumber
xdotool selectwindow
adalah25166060
, tetapi apa langkah untuk sampai0x18000ec
? Saya mencoba konversi dari heksadesimal, tetapi tampaknya bukan itu.xdotool getwindowgeometry 0x18000ec
mengembalikan 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.xprop
tampaknya menunjukkan bantalan dekorasi:_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6
dan_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6
. Mungkin membantu untuk memeriksa.xdotool selectwindow
perintah berperilaku berbeda pada KDE dan Unity? Output darixdotool selectwindow
perintah mengacu ke jendela yang persis sama (-id) dan (dengan demikian)xdotool getwindowgeometry
menampilkan data yang samawmctrl -lG
. Thexprop
perintah 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!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).
Kemudian Anda dapat mematikan dekorasi jendela, memindahkan jendela, dan menghidupkan dekorasi jendela.
sumber