Python:告诉X为应用程序保留屏幕空间

时间:2011-05-10 11:21:59

标签: python x11

我正在尝试使用X Window Manager(即Linux平台)解决在屏幕上为应用程序保留空间的问题。我看到了this issue addressed and solved for Gtk,我问了提示the same question using Qt。由于没有人对Qt特定的问题做出反应(我也在其他论坛上提到过),我想我会概括我的问题:

是否有通用的pythonic方式告诉X为应用程序保留屏幕空间?

谢谢,
本杰明

2 个答案:

答案 0 :(得分:5)

经过一些研究后,我使用Python-Xlib找到了解决方案。

在生成窗口的代码中,可以获取窗口ID,这是X上窗口的参考。根据所使用的GUI工具包,获取此ID的方法可能会有所不同。 Qt4提供QWidget.winId(),Gtk + 2有自己的方法为窗口保留空间,我没有尝试使用Gtk + 3,但我被告知应该有window_id属性。

由于只有在显示窗口后才能调用X为窗口保留空间,因此在大多数情况下,在输入主事件循环后需要进行查询。

以下示例显示了使用PyQt4的Qt4的案例。为了在窗口显示后获取窗口,在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 for Display(),然后创建一个窗口对象,它是一个抽象模型,用于引用由X显示的窗口。更改此模型的属性后,我们可以显示()。 sync()以应用更改。保留空间的方法是change_property(),其中根据Freedesktop.org Standards传递一系列参数。

类Window(对象):

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()的相同实例非常重要,以便更改窗口属性,因此将其存储到变量中。

答案 1 :(得分:0)

嗯,我不确定你能不能。您的操作系统在内存中为用户进程保留一个页面。进程可以是malloc()内存空间,但这可以在内核为当前进程的地址空间提供的保留块中。您是否将该应用程序作为子进程分发?或执行新实例?