Мне нужен инструмент, чтобы получить ширину и высоту произвольного окна.
В идеале этот инструмент должен вычитать размер строки меню Ubuntu.
источник
Мне нужен инструмент, чтобы получить ширину и высоту произвольного окна.
В идеале этот инструмент должен вычитать размер строки меню Ubuntu.
Из вашего собственного ответа я понимаю, что вы ищете удобный инструмент с графическим интерфейсом, поэтому:
Как объяснено ниже в "Объяснении", оба wmctrl
и xdotool
возвращают немного неправильный размер окна.
Скрипт (индикатор) ниже покажет как «реальный» размер, так и чистый размер окна на панели.
#!/usr/bin/env python3
import signal
import gi
gi.require_version('AppIndicator3', '0.1')
gi.require_version('Gtk', '3.0')
import subprocess
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
# ---
# uncomment either one of two the lines below; the first one will let the user
# pick a window *after* the indicator started, the second one will pick the
# currently active window
# ---
window = get(["xdotool", "selectwindow"])
# window = get(["xdotool", "getactivewindow"])
class Indicator():
def __init__(self):
self.app = 'test123'
iconpath = "unity-display-panel"
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.indicator.set_label(" ...Starting up", self.app)
# the thread:
self.update = Thread(target=self.show_seconds)
# daemonize the thread to make the indicator stopable
self.update.setDaemon(True)
self.update.start()
def create_menu(self):
menu = Gtk.Menu()
# separator
menu_sep = Gtk.SeparatorMenuItem()
menu.append(menu_sep)
# quit
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
menu.append(item_quit)
menu.show_all()
return menu
def show_seconds(self):
sizes1 = None
while True:
time.sleep(1)
sizes2 = self.getsize(window)
if sizes2 != sizes1:
GObject.idle_add(
self.indicator.set_label,
sizes2, self.app,
priority=GObject.PRIORITY_DEFAULT
)
sizes1 = sizes2
def getsize(self, window):
try:
nettsize = [int(n) for n in get([
"xdotool", "getwindowgeometry", window
]).splitlines()[-1].split()[-1].split("x")]
except AttributeError:
subprocess.Popen(["notify-send", "Missing data", "window "+window+\
" does not exist\n(terminating)"])
self.stop()
else:
add = [l for l in get(["xprop", "-id", window]).splitlines() if "FRAME" in l][0].split()
add = [int(n.replace(",", "")) for n in add[-4:]]
xadd = add[0]+add[1]; yadd = add[2]+add[3]
totalsize = [str(s) for s in [nettsize[0]+add[0]+add[1], nettsize[1]+add[2]+add[3]]]
displ_sizes = ["x".join(geo) for geo in [[str(s) for s in nettsize], totalsize]]
string = " "+displ_sizes[0]+" / "+displ_sizes[1]
return string+((25-len(string))*" ")
def stop(self, *args):
Gtk.main_quit()
Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
Скрипт должен быть установлен xdotool:
sudo apt-get install xdotool
Скопируйте скрипт в пустой файл, сохраните его как getwindowsize.py
Тестовый запуск скрипта из окна терминала командой:
python3 /path/to/getwindowsize.py
Сценарий выбирает сфокусированное окно для динамического отображения размера окна сети (как в выводе обоих wmctrl
и xdotool
) и реального размера окна, включая декораторы и т. Д.
Если вы закроете целевое окно, индикатор покажет сообщение:
Если все работает нормально, добавьте его к сочетанию клавиш: выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте команду:
python3 /path/to/getwindowsize.py
... немного неверно
Вы упоминаете:
В идеале этот инструмент должен вычитать размер строки меню Ubuntu
Полная история такова, что оба wmctrl -lG
и xdotool getwindowgeometry
возвращают размер окна без строки меню или, как это объясняется в этом ответе :
Что происходит, так это то, что wmctrl возвращает геометрию окна внутри украшений (т.е. не включая строку заголовка и границы)
Чтобы получить информацию правильно, мы можем запустить
xprop -id <window_id> | grep FRAME
Это будет выводить как:
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
Здесь мы получаем значения, которые нам нужно добавить к размеру окна, как вывод wmctrl
и xdotool
слева, справа, сверху и снизу окна.
Другими словами, в этом случае, если a wmctrl
показывает размер 200x100, реальный размер составляет 200x128.
Как предполагает OP, пользователь также может выбрать окно после запуска индикатора, заменив:
window = get(["xdotool", "getactivewindow"])
по:
window = get(["xdotool", "selectwindow"])
В сценарии любая из этих строк может быть раскомментирована.
getactivewindow
наselectwindow
, поэтому , когда скрипт запускается вы выбираете с помощью курсора в окно , чтобы получить размеры от. Я считаю это поведение намного более удобным. 2) Я загрузил код для вставки Ubuntu , так что его проще настроить: просто скачайте и сохраните как getwindowsize.pyВы можете использовать,
wmctrl -lG
чтобы получить список всех открытых окон в таблице в формате:Пример вывода может выглядеть так:
источник
Я нашел
xwininfo -all
по адресу /unix/14159/how-do-i-find-the-window-dimensions-and-position-accurately-inc включая-decoration .Это работает, но я все еще открыт для более удобных решений => инструмент GUI в реальном времени.
источник
xwininfo
. Возможно, вас заинтересует сценарий, который я написал - он использует,xwininfo
но с всплывающим графическим интерфейсом, смотрите его ниже.Можно попробовать:
Предполагая, что gnome-panel - это имя процесса панели инструментов Ubuntu, но кто знает.
(может потребовать
sudo apt-get install xdotool
)Для импровизированного графического интерфейса, который можно улучшить, чтобы отобразить только самое необходимое:
Он изменит указатель на крестик xprop, затем вы нажмете на окно, и он напечатает информацию xprop в диалоге GTK.
источник
xwininfo и его преимущества
Большая проблема с
wmctrl
и вxdotool
том , что эти средства должны быть установлены - они не на Ubuntu по умолчанию . Тем не менее, Ubuntu поставляется сxwininfo
. Это простой инструмент, который предоставляет информацию о выбранном пользователем окне.Простым использованием было бы ввести
xwininfo | awk '/Width/||/Height/'
(обратите внимание, чтоawk
это используется для фильтрации выходных данных) в терминале, и когда ваш курсор изменится, чтобыx
выбрать любое окно GUI, которое вам нравится, и оно отобразит свою информацию. Например:Итак, преимущества:
На шаг впереди xwininfo - отображение свойств активного окна
Конечно, если у вас терминал открыт 24/7, как у меня,
xwininfo
это все, что вам нужно. Некоторые пользователи могут предпочесть использование сочетания клавиш. Приведенный ниже скрипт (предназначенный для привязки к сочетанию клавиш) позволяет отображать графическое всплывающее окно с информацией о текущем активном окне. Как видно на скриншоте, он отображает заголовок окна, информацию о ширине и высоте.Под капотом это не делает ничего особенно впечатляющего. Он использует информацию из
dbus
сервисаxwininfo
и помещает ее в простое всплывающее окно. Исходный код ниже. Помните, что применяются стандартные правила написания сценариев: убедитесь, что у него есть права на выполнение с помощью,chmod +x
а при привязке к сочетанию клавиш укажите полный путь к файлу сценария в качестве команды.Использование индикатора верхней панели Unity для информации.
При написании своего ответа я понял, что это будет очень полезная функция для включения в один из моих существующих проектов - индикатор Аятана. Этот индикатор позволяет отображать весь спектр информации об окнах GUI. В настоящее время все еще находится в стадии активной разработки. Функция информации о геометрии была добавлена в репозиторий github и находится на пути к моему личному PPA . И, конечно, он использует,
xwininfo
хотя и немного по-другому.источник