ฉันพยายามเริ่มต้นแอปพลิเคชันภายใน Ubuntu (xfce หรือ gnome) และผ่านทางบรรทัดคำสั่งและสงสัยว่ามีวิธีการทั่วไปในการกำหนดขนาดของหน้าต่างที่ระบุของแอพที่กำหนดที่กำลังทำงานอยู่หรือไม่
ฉันพยายามเริ่มต้นแอปพลิเคชันภายใน Ubuntu (xfce หรือ gnome) และผ่านทางบรรทัดคำสั่งและสงสัยว่ามีวิธีการทั่วไปในการกำหนดขนาดของหน้าต่างที่ระบุของแอพที่กำหนดที่กำลังทำงานอยู่หรือไม่
คำตอบ:
xdotool
นี้เป็นเรื่องง่ายที่จะทำอย่างไรถ้าคุณติดตั้งสิ่งที่ต้องการ จากนั้นคุณสามารถทำได้:
xdotool search --name "window name" windowsize 300 400
แทนที่ "ชื่อหน้าต่าง" ด้วยชื่อหรือ reg ex ปรากฏในชื่อหน้าต่าง (คุณยังสามารถค้นหาตามคลาสหน้าต่างและสิ่งอื่น ๆ ได้) และตัวเลขสองตัวที่ปรากฏหลังจาก windowsize คือความกว้างและความสูงตามลำดับ (นอกจากนี้คุณยังสามารถใช้เปอร์เซ็นต์เป็นต้น) ดูman xdotool
เมื่อติดตั้งแล้ว
หากคุณอยู่บน Lucid หรือก่อนหน้านี้ฉันขอแนะนำให้ไปที่เว็บไซต์ xdotoolเพื่อรับรุ่นที่ใหม่กว่า
ในการปรับขนาด Firefox ตัวอย่างเช่น:
xdotool search --name "Mozilla Firefox" windowsize 1024 768
ถ้าตัวจัดการหน้าต่างรองรับ Xlib นั่นก็คือ สิ่งนี้ใช้ Python เพื่อกำหนดขนาดของหน้าต่างเป็น 500x300:
WIDTH, HEIGHT = 500, 300
import Xlib
import Xlib.display
display = Xlib.display.Display()
root = display.screen().root
windowID = root.get_full_property(display.intern_atom('_NET_ACTIVE_WINDOW'), Xlib.X.AnyPropertyType).value[0]
window = display.create_resource_object('window', windowID)
window.configure(width = WIDTH, height = HEIGHT)
display.sync()
ส่วนที่ยากคือการรับ ID หน้าต่าง ในรหัสข้างต้นจะได้ ID ของหน้าต่างที่ใช้งานอยู่ หากคุณต้องการ ID อื่นคุณสามารถใช้สิ่งนี้เพื่อรับชื่อและควบคุม PID ของแต่ละหน้าต่างและเลือก ID ที่ถูกต้องโดยยึดตามสิ่งเหล่านั้น:
windowIDs = root.get_full_property(display.intern_atom('_NET_CLIENT_LIST'), Xlib.X.AnyPropertyType).value
for windowID in windowIDs:
window = display.create_resource_object('window', windowID)
name = window.get_wm_name() # Title
prop = window.get_full_property(display.intern_atom('_NET_WM_PID'), Xlib.X.AnyPropertyType)
pid = prop.value[0] # PID
print pid
ได้รับ<Xlib.protocol.request.GetProperty serial = 15, data = {'bytes_after': 0, 'property_type': 6, 'value': (32, array('I', [5810L])), 'sequence_number': 15}, error = None>
... ข้อเสนอแนะใด ๆ ที่จะแยก PID จริง?
name
แต่ผมสามารถทำวิธีแก้ปัญหาผ่านทาง
get_full_property
และทำ.value[0]
( value
เป็นอาร์เรย์ )
โดยเฉพาะกับ XFCE มีpyxfceซึ่งจะอนุญาตให้คุณทำเช่นนั้นโดยใช้ภาษาไพธ อน Pyxfce เป็น API ที่ช่วยให้คุณสื่อสารกับโปรแกรมจัดการหน้าต่างได้ หากต้องการใช้สิ่งนี้จากบรรทัดคำสั่งคุณจะต้องเตรียมสคริปต์ก่อน
ความสำคัญของการใช้ API ที่ใช้ X ซึ่งใช้ X window ID (เช่น python-xlib หรือ xdotools ที่กล่าวถึงในคำตอบอื่น) กับผู้อื่นที่ใช้สตริงที่ตรงกับชื่อหน้าต่าง (เช่น wmctrl) ขึ้นอยู่กับการใช้งานของคุณ ความสับสนระหว่างหน้าต่างซึ่งอาจมีคำหลักเหมือนกันในชื่อของตน
#!/bin/bash
#get window pid under mouse
xprop -id $(xwit -current -print | cut -d ":" -f 1) | grep _NET_WM_PID | cut -d "=" -f2 | cut -c 2-
ฉันพบว่า wmctrl เหมาะกับฉันที่สุด มันมีให้ในรูปแบบแพคเกจขนาดเล็กสำหรับ Ubuntu และ Raspbian และสำหรับ distros อื่น ๆ ด้วย