Как управлять окном моего приложения с помощью python-xlib?

#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 возвращает объект класса Python Window , который должен содержать низкоуровневый дескриптор окна, он же 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)