Получить размер окна в оболочке


18

Я хотел бы получить размер текущего окна из сценария оболочки ...

На самом деле сказать особо нечего ... Я бы предпочел использовать wmctrl.

Ответы:


23
wmctrl -lG

Даст вам что-то вроде:

oli@bert:~$ wmctrl -lG
0x0384c0d5 -1 1590 1030 330  170  bert N/A
0x01200023 -1 0    0    3840 1200 bert x-nautilus-desktop
0x01000003 -1 3840 2352 1920 24   bert Bottom Expanded Edge Panel
0x01000028 -1 0    2352 1920 24   bert Bottom Expanded Edge Panel
0x0500003e  0 676  252  1404 1015 bert Chromium
0x02e00021  0 3860 160  1361 1084 bert Liferea
0x02000047  0 6650 940  506  683  bert Social broadcast messages
0x04600004  0 4546 460  1263 833  bert oli@bert: ~

С этим вы можете grepи cutвниз на них, так что вы останетесь со значениями геометрии (столбцы 3-6).

Чтобы процитировать man-страницу, вы точно понимаете, что это за столбцы:

-l

Список окон, управляемых менеджером окон. Для каждого окна выводится одна строка, причем строка разбивается на колонки, разделенные пробелами. Первый столбец всегда содержит идентификатор окна в виде шестнадцатеричного целого числа, а второй столбец всегда содержит номер рабочего стола (-1 используется для обозначения прикрепленного окна). Если указана опция -p, следующий столбец будет содержать PID для окна в виде десятичного целого числа. Если указана опция -G, то будут следовать четыре целочисленных столбца: x-offset, y-offset, width и height. Следующий столбец всегда содержит имя клиентского компьютера. Остальная часть строки содержит заголовок окна (возможно, с несколькими пробелами в заголовке).


Я буду использовать это!
Аллан

1
Мне нравится, как ваш компьютер называется bert :)
drnessie

5

Я полагаю, что wmctrl не имеет возможности напрямую найти идентификатор активного окна.
Если кто-то знает, как это сделать, мне интересно знать ...
Тем не менее, вот пара сценариев, которые распечатывают размер активного окна.

Это: wmctrl + xdotool ... (без использования sed).

id=$(xdotool getactivewindow)
wmctrl -lpG | while read -a a; do w=${a[0]}; if (($((16#${w:2}))==id)) ; then echo -n "${a[5]} ${a[6]}"; break; fi; done

Это: xwininfo + xdotool + sed

xwininfo это часть x11-utils

set $(xwininfo -id $(xdotool getactivewindow) \
|sed -n -e "s/^ \+Width: \([0-9]\+\).*/\1/p" \
        -e "s/^ \+Height: \([0-9]\+\).*/\1/p")
echo -n "$1 $2"

2

Используйте xpropили xwininfo. Оба приходят по умолчанию, установка не требуется

Примеры использования:

Обе команды превращают курсор в квадрат / крест, чтобы позволить выбрать конкретное окно.

$ xprop _NET_WM_OPAQUE_REGION                                                          
_NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 984, 377


$ xwininfo | awk -F ':' '/Width/ || /Height/{print $2}'                         
 984
 377

В качестве альтернативы можно указать окно в командной строке в форме XID

$ xprop _NET_WM_OPAQUE_REGION -id 83886090                                             
_NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 984, 377

$ xwininfo -id 83886090 | awk -F ':' '/Width/ || /Height/{print $2}'            
 984
 377

Другие посты, где они были использованы

В частности xwininfo, я активно использовал его для скриптов, например, в следующих вопросах AskUbuntu:


Он обычный, добавь пример;)
AB

Добавил их через год;) Но лучше позже, чем никогда, верно?
Сергей Колодяжный

0

Сценарии оболочки не знают или не заботятся об окнах. В лучшем случае они запускаются в терминале (который может отображаться или не отображаться в окне). Если вы хотите получить ширину и высоту терминала в символах, используйте утилиту stty.


2
Конечно, скрипт оболочки может как-то запрашивать у X клиентов их геометрию? Иначе, как будут написаны X-приложения?
djeikyb

@djeikyb они написаны, чтобы быть X-клиентами и общаться с X-сервером. Сценарии оболочки запускаются в оболочке, которая может или не может быть запущена в среде, которая даже имеет X-сервер, и не должна заботиться о X.
psusi

2
Понятно, да. Но есть обходные пути! Используя wmctrl, пакет из репозитория, вы можете перемещать, изменять размеры, минимизировать и даже изменять рабочее пространство!
Drnessie

По логике @ psusi, окружение рабочего стола не должно существовать. В конце концов, это просто огромная коллекция скриптов, которые взаимодействуют с программным обеспечением, написанным для X.
andyn

0

Я нашел tput colsработать довольно хорошо!


2
Спасибо за ваш вклад. Я предлагаю улучшить ваш ответ: объясните, что он делает, измените команду, чтобы получить количество строк. Может быть, показать, как использовать результаты в сценарии оболочки. - Смотрите лучшие ответы в качестве примеров.
Гюнтберт

Судя по упоминанию OP wmctrl, мы говорим не о консоли, а о графических окнах среды.
Andyn

0

Получил 3 экрана, это выводит 3 строки с размерами:

xrandr | grep '*' | cut -d'*' -f1 | cut -d ' ' -f4
/* OUTPUT *
* 3840x2160
* 1920x1080
* 1920x1080
***********/
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.