สิ่งที่ทำให้ค่าเบี่ยงเบนในคำสั่งย้ายหน้าต่าง wmctrl


13

เกี่ยวกับ wmctrl

ด้วยwmctrl(ไม่ได้ติดตั้งโดยค่าเริ่มต้น) เราสามารถรับข้อมูลเกี่ยวกับ windows, รหัสของพวกเขา, รูปทรงเรขาคณิต, pid ที่เป็นของ ฯลฯ เรายังสามารถย้ายหรือปรับขนาดหน้าต่างด้วยคำสั่งต่าง ๆ อย่างไรก็ตามในบางประเด็นพฤติกรรมของมันดูเหมือนจะไม่สมเหตุสมผล คำถามของฉันเกี่ยวกับการย้าย windows โดยwmctrl:

กำลังรับข้อมูล

เมื่อฉันเรียกใช้คำสั่ง:

wmctrl -lG

ฉันได้รับ (ao) ข้อมูลต่อไปนี้เกี่ยวกับหน้าต่างในรูปภาพด้านล่าง:

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

ในคอลัมน์ 3-5 ข้อมูลเรขาคณิตบอกพิกัด x / y และความกว้าง / ความสูง

การย้าย / ปรับขนาดหน้าต่าง

เมื่อฉันวางพิกัดเหล่านี้ในwmctrlคำสั่งเพื่อย้าย / ปรับขนาดหน้าต่างมันไม่ควรทำอะไรเลยเนื่องจากพิกัดไม่เปลี่ยนแปลง:

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

การเบี่ยงเบน

อย่างไรก็ตามรูปภาพด้านล่างแสดงหน้าต่างถูกเลื่อนลง (28px เพื่อความแม่นยำ) ผมถือว่าเหตุผลก็คือว่าwmctrl หน้าต่างย้ายคำสั่งคำนวณกับพื้นที่ทำงาน (หน้าจอสูงแผงลบ) ในขณะที่wmctrl -lGคำสั่งคำนวณกับขนาดหน้าจอทั้งหมด จากนั้นยังคงไม่ได้อธิบาย 4px อย่างไรก็ตาม (แผงควบคุมคือ 24px สูง)

แม้ว่าส่วนเบี่ยงเบนสามารถชดเชยได้ดีในสคริปต์ความจริงที่ว่าฉันไม่เข้าใจสาเหตุไม่พอใจดังนั้นคำถามคือ:

อะไรคือสาเหตุของการเบี่ยงเบนนี้


การย้ายหน้าต่างด้วยพิกัดที่แน่นอนในผลลัพธ์ของwmctrl -lGไม่ควรย้ายหน้าต่าง แต่จะทำเช่นนั้น

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


โซลูชัน "fudgy" ของฉันคือการบันทึกพิกัดปัจจุบันย้ายไปยังพิกัดเหล่านั้นรับพิกัดใหม่ลบพิกัดที่บันทึกไว้เพื่อรับความแตกต่าง จากนั้นใช้ความแตกต่างกับพิกัดดั้งเดิมและเลื่อนไปที่พิกัดที่ปรับ ง่ายกว่าที่คิด
WinEunuuchs2Unix

คำตอบ:


18

สิ่งที่เกิดขึ้นคือ wmctrl ส่งคืนเรขาคณิตของหน้าต่างในการตกแต่ง (เช่นไม่รวมแถบชื่อเรื่องและเส้นขอบ) แต่ใช้ตำแหน่งหน้าต่างที่ใหญ่ขึ้นสำหรับการย้าย

(ลบบรรทัดคำสั่งบางบรรทัดออก: xdotoolอาจไม่ได้ติดตั้ง)

$ 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

คำสั่งถัดไปแจ้งให้หน้าต่างที่สนใจและส่งกลับหน้าต่างหลักซึ่งรวมถึงการตกแต่งทั้งหมดและแตกต่างกันไปขึ้นอยู่กับชุดรูปแบบหน้าต่างที่ใช้งานอยู่

$ xdotool selectwindow
25166060

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

อย่างที่คุณเห็นมันเป็นหน้าต่างอื่น ตำแหน่ง X เริ่มต้นที่ 2px ไปทางซ้าย (702-2) และความกว้างทั้งหมดมีขนาดใหญ่ขึ้น 4px (900 + 2 + 2) เนื่องจากขอบด้านขวาเป็น 2px Y สูงกว่า (เหนือขอบบนหากมีและแถบชื่อเรื่อง); ความสูงนั้นใหญ่กว่าเนื่องจากทั้งหมดนั้นบวกกับขอบด้านล่าง

wmctrl ย้ายหน้าต่างหลักไปยังตำแหน่ง [X, Y] ที่ต้องการของหน้าต่างลูก ความกว้างและความสูงถูกนำไปใช้อย่างถูกต้องกับเด็กดังที่แสดงใน "ก่อน & หลัง" ด้านล่าง

$ 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

แก้ไข: ข้อมูลเพิ่มเติม

รูปทรงเรขาคณิตของเดสก์ท็อปวิวพอร์ตและพื้นที่ทำงาน

$ 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 เคล็ดลับในความคิดเห็น

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

ดูเหมือนว่าคำตอบที่ยอดเยี่ยม! ฉันจะดูรายละเอียดในคืนนี้
Jacob Vlijm

สำหรับความเข้าใจของฉันผลลัพธ์ของxdotool selectwindowคือ25166060แต่ขั้นตอนที่จะได้รับ0x18000ecคืออะไร ฉันลองใช้การแปลงจากเลขฐานสิบหก แต่ดูเหมือนจะไม่เป็นเช่นนั้น
Jacob Vlijm

เอาต์พุตจากxdotool getwindowgeometry 0x18000ecส่งคืน ID หน้าต่างทศนิยมของ 25166060 (พาเรนต์) ฉันแค่ป้อนค่าเลขฐานสิบหกของ 0x18000ec เพื่อแสดงว่ามันไม่ใช่ 0x04000040 (ลูก) โดยวิธีการที่ฉันเพิ่งวิ่งทดสอบทั้งหมดด้วยตัวเลขที่ง่ายขึ้นในความหวังว่าคุณไม่ได้มอง ดูการแก้ไขการแก้ไขก่อนหน้านี้หากคุณอยู่ตรงกลางของบางสิ่ง
Daxx

2
@JacobVlijm, xpropดูเหมือนจะแสดงช่องว่างภายในตกแต่ง: และ_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6 _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6มันอาจช่วยในการตรวจสอบ
user.dz

เป็นไปได้ไหมว่าxdotool selectwindowคำสั่งนั้นทำงานแตกต่างกันใน KDE และ Unity ผลลัพธ์ของxdotool selectwindowคำสั่งหมายถึงตรงหน้าต่างเดียวกัน (-id) และ (จึง) เอาท์พุทข้อมูลเช่นเดียวกับxdotool getwindowgeometry คำสั่ง แต่เป็นข้อเสนอแนะโดยแสดงให้เห็น @Sneetsher ซึ่งเป็นสิ่งที่ผมวัดด้วยตนเองและพิสูจน์ให้เห็นสาระสำคัญของคำตอบของคุณถูกต้องและมันก็เป็นคำตอบที่สมบูรณ์คำถามของฉัน ฉันประทับใจในความละเอียดถี่ถ้วนของคุณ ขอบคุณ! wmctrl -lGxprop_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
Jacob Vlijm

0

ฉันมีปัญหาเดียวกันและสามารถหาวิธีแก้ปัญหาได้


สถานการณ์

สถานการณ์ของฉันขึ้นอยู่กับ Mate 16.04 ที่ติดตั้ง Compiz (ซึ่งเปิดใช้งานตัวจัดการหน้าต่าง gtk)

ฉันกำลังใช้สคริปต์ที่เชื่อมต่อกับการผูกคีย์เพื่อวางหน้าต่างในสถานที่ที่กำหนดไว้ล่วงหน้า สคริปต์นี้ล้มเหลวหากฉันไม่ได้ใช้ตัวเลือกที่ขยายใหญ่สุด


การวิเคราะห์

ปัญหาสามารถเปิดและปิดโดยการเปิดและตกแต่งหน้าต่างในการตั้งค่า (compiz)


วิธีแก้ปัญหา

การตกแต่งหน้าต่างสามารถเปิดและปิดได้โดยใช้ไพ ธ อนสำหรับหน้าต่างที่ระบุ

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

จากนั้นคุณสามารถปิดการตกแต่งหน้าต่างย้ายหน้าต่างและเปิดการตกแต่งหน้าต่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.