#python #linux #window #x11 #xlib
#python #linux #окно #x11 #xlib
Вопрос:
Я хотел бы найти распространенный в Linux (поскольку он использует X11) способ управления геометрией окна моего приложения, которое я программирую с использованием Python. Все мои исследования указывают на использование python-xlib, который, оказывается, очень плохо документирован.
Чего я хотел бы достичь, так это:
- определите положение окна на экране
- определите минимальный и максимальный размер
- включить / отключить изменение размера окна
- зарезервируйте экранное пространство для окна
- сохранить окно выше / ниже
- пропускать или нет панель задач (она же список окон)
- установить окно, оформленное / недекорированное
- установите флаги окна (обычное, всплывающее, диалоговое, заставка, док-станция, игнорируется).
ПРИМЕЧАНИЕ: Я не хочу создавать с помощью Xlib, вместо этого я хочу указать X, что делать с окном, которое я создал с помощью некоторой библиотеки GUI (например, PyQt).
Как я могу это сделать? Я понимаю, что этот вопрос довольно важный: есть ли у вас хотя бы намеки на то, как я могу получить доступ к своему окну? Где в модуле я могу найти свои ответы?
Редактировать: ответ n.m. предоставил отличные ресурсы, а также есть еще один вопрос и ответ на Unix StackExchange, который предоставляет отличный пример того, как получить контроль над окном приложения, отображаемым X.
Ответ №1:
Первое ключевое слово, которое вам нужно знать, — ICCCM. Вы должны быть знакомы с руководством ICCCM (см.http://tronche.com/gui/x/icccm /) и расширений FreeDesktop к нему (см. http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html ). Что касается вашего вопроса
как я могу получить доступ к моему окну?
Я не совсем понимаю это. Вы вызываете create_window
, и функция возвращает ваш объект Window. Или вы имеете в виду что-то другое?
Комментарии:
1. Спасибо, я посмотрю документ. Под «получением доступа к окну» я подразумеваю: я хочу создать свое окно на Python, например, с помощью PyGI, PyQt, PyWx или Kivy, затем я хочу найти это окно среди тех, которыми управляет X, и сказать X, что это окно должно обрабатываться так, как я хочу, например. зарезервировали место на экране. Итак, я не хочу создавать окно с помощью xlib, я просто хочу сказать X Window Manager, что с ним делать. Я думаю, что получил несколько интересных подсказок из этого поста .
2. Ha! ICCM выглядит так, как мне было нужно для начала. Мне все еще нужна некоторая информация, касающаяся Python-xlib.
3.
create_window
возвращает объект класса PythonWindow
, который должен содержать низкоуровневый дескриптор окна, он же window ID (некоторое целое число) в нем. Вероятно, вам никогда не следует использовать этот дескриптор напрямую. Библиотека должна включать все необходимые службы в методыWindow
класса и, вероятно, в несколько других функций, которые принимаютWindow
объект в качестве аргумента.
Ответ №2:
Только вчера обнаружил это, и я думаю, что это потрясающе по сравнению с использованием множества xdotool
, wmctrl
gtk
и tkinter
для перемещения окон:
def x11_move_window(window_id_dec, x, y, width, height):
""" Use x11 library to move window From:
https://gist.github.com/chipolux/13963019c6ca4a2fed348a36c17e1277
"""
import Xlib.display
d = Xlib.display.Display()
window = d.create_resource_object('window', window_id_dec)
window.configure(x=x, y=y, width=width, height=height, border_width=0,
stack_mode=Xlib.X.Above)
d.sync()
Обратите внимание, что если вы использовали wmctrl
для получения своего идентификатора окна, вам необходимо преобразовать его из шестнадцатеричного в десятичный перед вызовом x11_move_window
:
window_id_hex =
os.popen('wmctrl -l | grep gone_fishing.png').read().strip().split()[0]
window_id_dec = int(window_id_hex, 16)