วิธีการตรวจสอบว่าหน้าต่างถูกขยายใหญ่สุดหรือย่อเล็กสุดจากสคริปต์ทุบตี


11

ฉันมีสคริปต์ทุบตีที่ย้าย windows ของฉันจากหน้าจอด้านซ้ายไปยังหน้าจอด้านขวาในการตั้งค่าหน้าจอคู่ ขณะนี้วิธีการทำงานคือการวนรอบรหัสหน้าต่างที่กำหนดโดยxdotool search --onlyvisible --maxdepth 2 --class ""จากนั้นเลื่อนไปทางขวาตามความกว้างหน้าจอ ใช้งานได้แล้ว ... เว้นแต่ว่าหน้าต่างที่เป็นปัญหานั้นจะขยายใหญ่สุดหรือย่อเล็กสุด

ดังนั้นสิ่งที่จำเป็นคือวิธีตรวจสอบสถานะปัจจุบันของหน้าต่าง ฉันได้พบคำตอบที่ให้วิธีการเพิ่มและลบบิตเหล่านั้น แต่วิธีที่จะตรวจสอบว่าพวกเขาตั้งอยู่แล้ว?

ถ้ามันเป็นไปไม่ได้ที่จะทำผ่านxdotoolมันควรจะเป็นไปได้ที่จะใช้รหัสหน้าต่างใหม่โดยคำสั่งดังกล่าวข้างต้น


คุณยังสามารถดูdevilspieว่าหน้าต่างใดที่ถูกออกแบบมาเพื่อทำงานหน้าต่างชนิดนี้อย่างแท้จริง ดังนั้นไม่จำเป็นต้องทำการถอดรหัสใหม่เพียงกำหนดค่า
Ciprian Tomoiagă

คำตอบ:


11

ดึงข้อมูลเกี่ยวกับสถานะหน้าต่าง

คุณสามารถรับข้อมูล (และอีกมากมาย) จากคำสั่ง:

xprop -id <window_id>

เพื่อให้ได้สิ่งที่คุณกำลังมองหาโดยเฉพาะ:

xprop -id 0x04c00010 | grep "_NET_WM_STATE(ATOM)"

ผลลัพธ์จะมีลักษณะดังนี้:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

บนหน้าต่างที่ขยายใหญ่สุด (h + v) และย่อเล็กสุดในเวลาเดียวกันหรือเพียงแค่

_NET_WM_STATE(ATOM) =

(หรือไม่มีเอาต์พุตเลย) หากไม่มีในกรณีนี้

สนุกมาก

แน่นอนว่าการใช้ภาษาต่าง ๆ คุณสามารถใช้Wnckได้เช่นเดียวกับตัวอย่างงูหลามด้านล่าง (ตัวอย่างข้อมูลจากตัวแบ่งหน้าต่าง ) ตัวอย่างข้อมูลออกรายการโดยแสดงชื่อหน้าต่าง + อย่างใดอย่างหนึ่งTrueหรือFalse(ย่อเล็กสุด)

#!/usr/bin/env python3
import gi
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck


def get_winlist(scr=None, selecttype=None):
    """
    get the window list. possible args: screen, select_type, in case it is
    already fetched elsewhere. select type is optional, to fetch only
    specific window types.
    """
    if not scr:
        scr = Wnck.Screen.get_default()
        scr.force_update()
    windows = scr.get_windows()
    if selecttype:
        windows = [w for w in windows if check_windowtype(w, selecttype)]
    return windows

wlist = get_winlist()
for w in wlist:
    print(w.get_name(), ",", w.is_maximized())

ผลลัพธ์ดูเหมือนว่า:

Wnck.Window - Classes - Wnck 3.0 - Mozilla Firefox , True
Postvak IN - vlijm@planet.nl - Mozilla Thunderbird , True
Showtime , False
settingsexample.vala - Visual Studio Code , False
*Niet-opgeslagen document 1 - gedit , False
desktop_weather , False
Tilix: Standaard , False

NB

  • xpropจะจัดการทั้ง hex (เป็นเอาท์พุทจากเช่นwmctrl) และทศนิยม (เป็นเอาท์พุทจากเช่นxdotool) id ของเท่าเทียมกันเช่นใช้ทั้ง:

    xprop -id 111371626
    

    หรือ

    xprop -id 0x06a3656a
    
  • วิธีการจะไม่ทำงานบน Wayland!


1
ข้อเสนอแนะที่ยอดเยี่ยม +1 ในฐานะที่เป็นความคิดเห็นฉันพยายาม (ภายใต้ Linux, X11) และได้ผลลัพธ์ที่แตกต่างกันเล็กน้อย เมื่อหน้าต่างไม่ถูกซ่อนหรือขยายให้ใหญ่สุด_NET_WM_STATE(ATOM)จะไม่ปรากฏตามค่าที่ปรากฏในคำตอบ แต่มันไม่ได้อยู่ในผลลัพธ์เลย
John1024

@ John1024 อ้าขอบคุณ! จะเพิ่มลงในคำตอบ
Jacob Vlijm

ในระบบของฉันมันจะแสดงในกรณีใดกรณีหนึ่งแม้ว่าจะว่าง
v010dya

ฉันต้องการเพิ่มหมายเลขหน้าต่างที่สามารถกำหนดเป็นหมายเลข cecimal ดังนั้นไม่จำเป็นต้องแปลงเป็นเลขฐานสิบหก ในกรณีนี้จะช่วยให้ใครบางคน
v010dya

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