ฉันพยายามใช้wmctrl
คำสั่งสลับ แต่มันไม่ทำงานในการตั้งค่า Ubuntu ของฉัน การสลับจะสลับใน แต่ไม่สลับ (ฉันคิดว่าอาจเป็นเพราะฉันใช้สภาพแวดล้อมเดสก์ท็อป GNOME ซึ่งwmctrl
AFAIK ใช้งานไม่ได้)
อย่างไรก็ตามหลังจากการค้นคว้ามากมายและหาวิธีเขียนโค้ดที่เหมาะสมใน bash ฉันได้สร้างคำสั่งเดียวที่ใช้wmctrl
คำสั่งภายในเลเยอร์ของตรรกะเพื่อสลับสถานะ 'อยู่ด้านบนสุด' อย่างมีประสิทธิภาพบนเดสก์ท็อป GNOME ปัจจุบัน ฉันโพสต์คำตอบนี้บน Ask Unix / Linux แต่คิดว่าฉันจะโพสต์ไว้ที่นี่ด้วยในกรณีที่มีใครมีปัญหาเดียวกัน
นี่คือคำสั่ง:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
จะตรวจสอบคุณสมบัติสถานะหน้าต่างที่ใช้งานอยู่ "_NET_WM_STATE" โดยใช้xprops
และหากมีข้อความ "ข้างต้น" ที่หมายถึงตัวเลือก 'อยู่ด้านบนเสมอ' จะเปิดใช้งานอยู่ จากนั้นมันก็จะรันwmctrl
คำสั่งด้วยพารามิเตอร์add
หรือremove
ตามความเหมาะสม
การแยกคำสั่ง (แต่ละคำสั่งถูกแทรกลงในถัดไปแทนที่■
ตัวยึดตำแหน่ง):
รับรหัสหน้าต่างที่ใช้งานอยู่:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
รับสถานะหน้าต่างจากการxprop
ใช้ id:
xprop -id $(■) _NET_WM_STATE
ตรวจสอบว่าสถานะมี "ABOVE" ระบุว่าหน้าต่างถูกตั้งค่าเป็น "always on top":
[[ $(■) =~ "ABOVE" ]]
ส่งคืน "ลบ" หากเป็นจริงมิฉะนั้นส่งคืน "เพิ่ม":
■ && echo "remove" || echo "add"
รันwmctrl
คำสั่งโดยใช้ค่าที่ส่งคืนเป็นพารามิเตอร์:
wmctrl -r :ACTIVE: -b $(■),above
ส่งสิ่งทั้งหมดเพื่อbash
ให้คุณสามารถใช้การทดแทนคำสั่ง${ ... }
การประเมินค่า bash boolean [[ ... ]]
และตัวดำเนินการจับคู่ regex =~
:
bash -c '■'
ขั้นตอนสุดท้ายนี้โดยเฉพาะฉันใช้เวลานานมากในการคิด จนกว่าฉันจะรู้ว่าแป้นพิมพ์ลัดไม่ได้ทำงานในการทุบตีตามค่าเริ่มต้นฉันไม่รู้ว่าทำไมคำสั่งทำงานในคอนโซลขณะที่ฉันทดสอบพวกเขา แต่ล้มเหลวอย่างเงียบ ๆ เมื่อทำงานโดยตรงเป็นแป้นพิมพ์ลัด มันทำให้ฉันติดกำแพงนานหลายปี!
หมายเหตุ: เนื่องจากคุณต้องการอัญประกาศรอบคำสั่งที่คุณส่งไปยังทุบตีฉันจึงต้องระวังเมื่อเขียนคำสั่งที่ฉันไม่เคยไปลึกมากกว่าหนึ่งระดับ (ใช้เครื่องหมายคำพูดคู่) การซ้อนสตริงในเครื่องหมายคำพูดจะต้องมีแบ็กสแลชที่สับสนจำนวนมากเพื่อหนีจากเครื่องหมายคำพูด