Как получить размер панели задач и положение с Python

Я разрабатываю модуль с Python, и я хотел бы выяснить способ получить разрешение монитора минус панель задач без любого взаимодействия с пользователем и предпочтительно способом, который не вмешивается в визуальный интерфейс. Если я могу просто получить размер панели задач и положение, я могу просто вычесть его из разрешения монитора легко. Однако я, может казаться, не нахожу путь.

В Windows я могу использовать win32api модуль и использование GetMonitorInfo получить разрешение монитора. Однако я должен все же выяснить некоторый способ сделать это в Ubuntu или Linux в целом. Если бы у Вас также есть способ сделать это в macOS, который был бы хорош знать также, но не необходим для этого вопроса.

Я хотел бы поддерживать как можно больше настольных сред, но я понимаю, как трудный это должно было бы сделать так, так как у каждого может быть их собственное решение. Рассматривая это, я предпочел бы запускаться с этих настольных сред:

  • KDE
  • XFCE
  • Gnome
  • Корица

Если бы это требует, чтобы некоторые внешние программы получили его, я предпочел бы использовать что-то, что идет с настольной средой или операционной системой.

3
задан 10 March 2019 в 08:50

1 ответ

Я хотел бы выяснить способ получить разрешение монитора минус панель задач без любого взаимодействия с пользователем и предпочтительно способом, который не вмешивается в визуальный интерфейс.

Это - то, что спросили, и я буду фокусироваться на этом через этот ответ на основе того, что я нашел. Получение размера панели задач и положения было исходной идеей, но как был обсужден в комментариях, это будет трудно реализовать, не зная большую информацию - какая панель или прикрепление работают, сделайте они имеют _NET_WM_STRUT набор свойств, сделайте они выставляют ту информацию через базу данных GSettings или другие методы. Я уверен, что это не невозможно, но довольно трудно.

Свойство NET_WORKAREA

Согласно спецификациям для корневого окна, _NET_WORKAREA определяется как так:

_NET_WORKAREA, x, y, ширина, КАРДИНАЛ/32 высоты

Это свойство MUST быть установленным Менеджером окон после вычисления рабочей области для каждого рабочего стола. Содержит геометрию для каждого рабочего стола. Эти конфигурации указаны относительно области просмотра на каждом рабочем столе и указывают область, которая полностью содержится в области просмотра. Рабочая область ДОЛЖНА использоваться настольными приложениями для размещения значков на рабочем столе соответственно.

Менеджер окон ДОЛЖЕН вычислить это пространство путем взятия текущей страницы минус место, занятое прикреплением и окнами панели, как обозначено _NET_WM_STRUT или _NET_WM_STRUT_PARTIAL набором свойств на клиентских окнах.

Существует несколько моментов, которых необходимо отметить:

  • Менеджер окон, который совместим с этими спецификациями, должен установить это свойство, таким образом, на настольных средах как XFCE, Волнистый попугайчик, Единица, GNOME, KDE - который находится в любой официальной разновидности Ubuntu, которая не использует экспериментального менеджера окон, будет иметь этот набор свойств; другими словами, это будет работать над поддерживаемыми рабочими столами
  • Это вычисляет доступную ширину и высоту, но также и где смещения начинаются относительно крайнего левого угла целого дисплея (в случае двойного экрана, верхний левый угол Вашего крайнего левого экрана будет начальной точкой),
  • _NET_WM_STRUT или _NET_WM_STRUT_PARTIAL свойства, которые установлены прикреплениями и панелями. Это означает, что, если панель или прикрепление не устанавливают его, они будут в основном вести себя как нормальное окно, которое просто находится, прежде всего, другие (и создание пользователей потенциально annoyed1). Тем не менее это достаточно хорошо для нас. Я протестировал это свойство на Корице, LXQt и XFCE сверху Ubuntu 18.04. Во всех экземплярах прикрепления и панели правильно сообщили менеджеру окон своей области распорки. Это означает, _NET_WORKAREA будет работать на Вас в 99% случаев.

Это свойство может быть запрошено в оболочке через xprop утилита по корневому окну.

$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3120, 974, 0, 32, 3120, 974

Это - вывод с моей установкой парного монитора, с двумя мониторами, выровненными вдоль вершины, прикрепления и верхней панели. Если Вы замечаете, что только первые четыре значения являются значительными, и другие четыре повторяются. Особенно интересный 3120 и 974. Это - значение, которым мы интересуемся. Первые два говорят нам, где рабочий стол уехал, большая часть угла запускается. Моя верхняя панель поднимает 32 точки, следовательно рабочий стол уехал, большая часть угла запускается полностью слева со смещением вниз 32 точки. Смещение от нижней части обычно не имеет значения для окон - они заполнят рабочую область, это доступно.

Если я поместил прикрепление на правую сторону основного монитора, Вы заметите, что ширина уменьшилась, но высота имеет:

$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018

Изменение в высоте является 44 точками. Добавьте еще 32 (размер окна верхней панели) к этому, и Вы доберетесь 1050 точно геометрия моего рабочего стола (отметьте 3120, до того, когда не было никакого прикрепления к размеру, таким образом, полная настольная ширина использовалась):

$ xprop -root _NET_DESKTOP_GEOMETRY
_NET_DESKTOP_GEOMETRY(CARDINAL) = 3120, 1050

Python и xprop

xprop команда выше идет с большинством рабочих столов и принадлежит x11-utils пакету, поэтому при предназначении для главных находящихся в Debian систем необходимо иметь его в наличии в большинство раз. То, что я сделал бы, использовать подпроцесс Python и использовать также subprocess.check_output() или subprocess.run() управляйте и проанализируйте вывод через re модуль.

>>> import re,subprocess
>>> out = subprocess.check_output(['xprop','-root','_NET_WORKAREA'])
>>> workarea_tokens = re.split('=|,',out.decode())
>>> workarea_tokens[1:5]
[' 0', ' 32', ' 3059', ' 1018']

Python и Gdk

Альтернатива (и обычно мой предпочтительный путь) должна была бы использовать библиотеку Gdk, которая тесно связана с другими библиотеками проекта GNOME. При разработке использования настольного приложения Gtk Вы уже имеете необходимые инструменты в наличии, итак, почему бы не использовать их? Хитрая часть - то, что необходимо вычислить рабочую область для каждого отдельного монитора.

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

display = Gdk.Display().get_default()
for i in range(display.get_n_monitors()):
    monitor = display.get_monitor(i)
    w_area  = monitor.get_workarea()
    print(w_area.x, w_area.y,
          w_area.width, w_area.height)

Результат этой программы:

$ python3  display_area.py
1440 32 1619 1018
0 0 1440 900
# width of two monitors with dock on right adds up to _NET_WORKAREA
$ echo $((1619+1440))
3059
$ xprop -root _NET_WORKAREA
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018

Проблемы

Теперь, помните, что я упомянул, что у меня есть парные мониторы? Такая установка открывает всех из возможностей, но также и показывает определенные нечетные поведения.

# added xfce4-panel at the bottom of second screen, no change in height - 900
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 32 1619 1018
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 526, 32, 2533, 1018, 526, 32, 2533, 1018
# stopped xfce4-panel process, same height - 900
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 32 1619 1018
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 0, 32, 3059, 1018, 0, 32, 3059, 1018
# added xfce4-panel to the top of second monitor
$ python3 display_area.py ; xprop -root _NET_WORKAREA
1440 49 1619 1001
0 0 1440 900
_NET_WORKAREA(CARDINAL) = 0, 49, 3059, 1001, 0, 49, 3059, 1001

Помните, что я имею панель и прикрепление на одном экране, и добавил для тестов xfce4-panel на другом экране. Ошибочные результаты с Gdk состоят в том, что вторая рабочая область монитора не стала измененной. xprop также ошибочные числа, о которых сообщают - в первом выводе 526 точки смещения слева были просто не верны. В последнем выводе, однако, увеличилось вертикальное смещение, который был хорошей вещью - дополнительная ширина, добавленная xfce4-panel должен быть добавлен к общему количеству, и вероятно что помогает, то, что мои два монитора выровненные наверху.

Другими словами, если Ваше приложение будет планированием определения области без прикреплений и панелей, то эти методы будут работать лучше всего с единственной установкой монитора. В установке парного монитора - результаты могли потенциально быть непоследовательными. Обратите внимание, что я использую Метагородской Менеджер окон, и ошибочность могла быть приписана этому. Однако у меня нет способа протестировать другой WM с установкой парного монитора в данный момент, таким образом, я оставлю этот раздел как неокончательный.

TODO (когда-нибудь)

  • пример libx11 в C или Python

  • тестирование парного монитора с альтернативным менеджером окон

  • найдите местоположения панели и прикрепление


Сноски

1 Функция, не зарегистрированная, зависит от количества пользователя терпения.

2
ответ дан 1 December 2019 в 16:50

Другие вопросы по тегам:

Похожие вопросы: