Cara menentukan apakah jendela dimaksimalkan atau diminimalkan dari skrip bash

11

Saya memiliki skrip bash yang memindahkan windows saya dari layar kiri ke layar kanan dalam pengaturan dua layar. Saat ini cara kerjanya adalah bersepeda melalui id jendela yang diberikan oleh xdotool search --onlyvisible --maxdepth 2 --class ""dan kemudian memindahkannya ke kanan dengan lebar layar. Ini sudah berfungsi ... kecuali jendela yang dimaksud dimaksimalkan atau diminimalkan.

Jadi yang dibutuhkan adalah cara untuk memeriksa status jendela saat ini. Saya telah menemukan jawaban yang menyediakan cara untuk menambah dan menghapus bit-bit itu, tetapi di mana cara untuk memeriksa apakah sudah ditetapkan?

Jika tidak mungkin dilakukan melalui xdotool , harus dimungkinkan untuk menggunakan kembali id ​​jendela yang disediakan oleh perintah yang disebutkan di atas.

v010dya
sumber
Anda juga dapat melihat devilspieyang dirancang untuk melakukan pekerjaan jendela seperti ini. Jadi tidak perlu melakukan pengodean ulang, cukup konfigurasikan
Ciprian Tomoiagă

Jawaban:

11

Ambil info pada status jendela

Anda bisa mendapatkan info (dan banyak lagi) dari perintah:

xprop -id <window_id>

Untuk mendapatkan apa yang Anda cari secara spesifik:

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

Outputnya akan terlihat seperti:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

pada jendela yang dimaksimalkan (h + v) dan diminimalkan pada saat yang sama, atau adil

_NET_WM_STATE(ATOM) =

(atau tidak ada output sama sekali) jika tidak ada yang terjadi.

lebih menyenangkan

Tentu saja, dengan menggunakan berbagai bahasa, Anda dapat menggunakan Wnck , seperti dalam cuplikan python di bawah ini. (cuplikan dari window-shuffler ). Cuplikan menampilkan daftar, menampilkan nama jendela + salah satu Trueatau False(diminimalkan).

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

Outputnya seperti:

Wnck.Window - Classes - Wnck 3.0 - Mozilla Firefox , True
Postvak IN - [email protected] - Mozilla Thunderbird , True
Showtime , False
settingsexample.vala - Visual Studio Code , False
*Niet-opgeslagen document 1 - gedit , False
desktop_weather , False
Tilix: Standaard , False

NB

  • xpropakan menangani hex (sebagai output dari eg wmctrl) dan desimal (sebagai output dari eg xdotool) id yang sama-sama misalnya digunakan:

    xprop -id 111371626
    

    atau

    xprop -id 0x06a3656a
    
  • Metode tidak akan berfungsi di Wayland!

Yakub Vlijm
sumber
1
Saran luar biasa +1. Sebagai komentar, saya mencobanya (di Linux, X11) dan mendapat hasil yang sedikit berbeda. Ketika jendela tidak disembunyikan atau dimaksimalkan, _NET_WM_STATE(ATOM)tidak, seperti yang ditunjukkan dalam jawaban, muncul dengan nilai kosong. Sebaliknya, itu tidak ada dalam output sama sekali.
John1024
@ John1024 Ah, terima kasih! akan menambahkannya ke jawabannya.
Jacob Vlijm
Di sistem saya itu ditampilkan dalam kedua kasus, bahkan ketika kosong.
v010dya
Saya ingin menambahkan bahwa id jendela dapat diberikan sebagai angka cecimal, jadi tidak perlu mengkonversi ke hex. Kalau-kalau ini akan membantu seseorang.
v010dya
@ v010dya Terima kasih! Lihat jawaban yang diperbarui.
Jacob Vlijm