Python: скажите X, чтобы зарезервировать место на экране для приложения - PullRequest
5 голосов
/ 10 мая 2011

Я пытаюсь решить вопрос о резервировании места на экране для приложения с помощью X Window Manager (т.е. платформы Linux). Я видел, эта проблема решена и решена для Gtk , и я задал тот же вопрос в , используя Qt Поскольку никто не ответил на вопрос, связанный с Qt (на который я также обращался на других форумах), я решил обобщить свой вопрос:

Есть ли универсальный, pythonic способ сказать X зарезервировать место на экране для приложения?

Спасибо
Benjamin

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

После некоторых исследований я нашел решение, используя Python-Xlib .

В коде, который генерирует окно, можно получить идентификатор окна, который является ссылкой для окна в X. В зависимости от используемого набора графического интерфейса способ получения этого идентификатора может отличаться. Qt4 предоставляет QWidget.winId(), Gtk + 2 имеет свои собственные средства для резервирования места для окна, и я не пробовал с Gtk + 3, но мне сказали, что должен быть атрибут window_id.

Поскольку вызов X для резервирования пространства для окна может быть выполнен только после отображения окна, в большинстве случаев необходимо будет выполнить запрос после того, как был введен основной цикл событий.

Пример ниже показывает пример случая с Qt4, использующим PyQt4. Чтобы получить окно после его отображения, поток запускается до того, как QApplication входит в его основной цикл, и этот поток продолжает опрашивать X, пока ему не удастся «захватить» окно. В следующем примере пространство зарезервировано в верхней части экрана с высотой, эквивалентной высоте QWidget, для которой мы резервируем пространство.

def fix_window(self):
        set = False
        while set == False:
            try:
                window = myXwindow.Window(self.parent().winId())
                if window != None:
                    height = self.parent().height()
                    window.reserve_space(0, 0, height, 0)
                    set = True
                else:
                    self.sleep(1)
            except:
                raise

В приведенном выше примере myXwindow - это пользовательский модуль, использующий Python-Xlib. Ниже приводится содержимое модуля, где Xlib запрашивает X для Display () и затем создает объект окна, который является абстрактной моделью для ссылки на наше окно, отображаемое X. После изменения атрибутов этой модели мы можем отобразить (). sync (), чтобы применить изменения. Для резервирования места используется метод change_property(), при котором ряд аргументов передается в соответствии со стандартами Freedesktop.org .

Окно класса (объект):

def __init__(self, windowID):

    self._display = Display()
    self._window = self._display.create_resource_object('window', windowID)

def reserve_space(self, left=0, right=0, top=0, bottom=0):

    LEFT    = left
    RIGHT   = right
    TOP     = top
    BOTTOM  = bottom

    self._window.change_property(self._display.intern_atom('_NET_WM_STRUT'),
                                self._display.intern_atom('CARDINAL'),
                                32, [LEFT, RIGHT, TOP, BOTTOM])
    self._display.sync()

Примечание: важно сохранить тот же экземпляр Display (), который создал объект окна, для изменения свойств окна, поэтому он сохраняется в переменной.

0 голосов
/ 10 мая 2011

Хм, я не уверен, что вы можете. Ваша ОС резервирует страницу в памяти для пользовательских процессов. Процесс может malloc () пространство памяти, но это будет в пределах зарезервированных кусков, предоставленных ядром для адресного пространства текущего процесса. Будете ли вы подавать заявку как дочерний процесс? или выполнение нового экземпляра?

...