Cách xác định xem cửa sổ được tối đa hóa hoặc thu nhỏ từ tập lệnh bash


11

Tôi có một tập lệnh bash di chuyển các cửa sổ của tôi từ màn hình bên trái sang màn hình bên phải trong thiết lập màn hình kép. Hiện tại cách nó hoạt động là đạp xe qua các id cửa sổ được đưa ra xdotool search --onlyvisible --maxdepth 2 --class ""và sau đó di chuyển chúng sang bên phải theo chiều rộng màn hình. Nó đã hoạt động ... trừ khi cửa sổ được đề cập là tối đa hóa hoặc thu nhỏ.

Vì vậy, những gì cần thiết là một cách để kiểm tra trạng thái hiện tại của cửa sổ. Tôi đã tìm thấy một câu trả lời cung cấp cách thêm và xóa các bit đó, nhưng đâu là cách để kiểm tra xem chúng đã được đặt chưa?

Nếu không thể thực hiện thông qua xdotool , có thể sử dụng lại id cửa sổ được cung cấp bởi lệnh được đề cập ở trên.


bạn cũng có thể nhìn vào devilspiecái nào được thiết kế để thực hiện chính xác loại công việc cửa sổ này. Vì vậy, không cần phải mã hóa lại, chỉ cần cấu hình
Ciprian Tomoiagă

Câu trả lời:


11

Lấy thông tin về trạng thái cửa sổ

Bạn có thể lấy thông tin (và nhiều hơn nữa) từ lệnh:

xprop -id <window_id>

Để có được những gì bạn đang tìm kiếm cụ thể:

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

Đầu ra sẽ như sau:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

trên một cửa sổ được tối đa hóa (h + v) và thu nhỏ cùng một lúc, hoặc chỉ

_NET_WM_STATE(ATOM) =

(hoặc không có đầu ra nào cả) nếu không có trường hợp nào trong số đó là trường hợp.

vui hơn

Tất nhiên, sử dụng nhiều ngôn ngữ khác nhau, bạn có thể sử dụng Wnck , như trong đoạn trích python bên dưới. (đoạn trích từ cửa sổ-shuffler ). Đoạn mã xuất ra một danh sách, hiển thị tên cửa sổ + Truehoặc False(được thu nhỏ).

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

Đầu ra trông như:

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

Lưu ý

  • xpropsẽ xử lý cả hex (như đầu ra từ vd wmctrl) và thập phân (như đầu ra từ vd xdotool) như nhau, ví dụ như sử dụng:

    xprop -id 111371626
    

    hoặc là

    xprop -id 0x06a3656a
    
  • Phương pháp sẽ không hoạt động trên Wayland!


1
Đề xuất tuyệt vời +1. Như một bình luận, tôi đã thử nó (trong Linux, X11) và nhận được kết quả hơi khác nhau. Khi một cửa sổ không bị ẩn cũng không được tối đa hóa, _NET_WM_STATE(ATOM)không, như trong câu trả lời, sẽ xuất hiện với một giá trị trống. Thay vào đó, nó không có trong đầu ra.
John1024

@ John1024 À, cảm ơn! sẽ thêm nó vào câu trả lời.
Jacob Vlijm

Trên hệ thống của tôi, nó được hiển thị trong cả hai trường hợp, ngay cả khi trống.
v010dya

Tôi muốn thêm id cửa sổ đó có thể được cung cấp dưới dạng số chính xác, vì vậy không cần phải chuyển đổi thành hex. Chỉ trong trường hợp này sẽ giúp ai đó.
v010dya

@ v010dya Cảm ơn! Xem câu trả lời cập nhật.
Jacob Vlijm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.