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

Python:告诉X为应用程序保留屏幕空间,python,x11,Python,X11,我试图解决为使用X Window Manager(即Linux平台)的应用程序保留屏幕空间的问题。我已经看过了,我问过了。由于没有人对Qt特定的问题做出反应(我也在其他论坛上讨论过这个问题),我想我应该概括一下我的问题: 有没有一种通用的、类似Python的方法来告诉X为应用程序保留屏幕空间? 谢谢, 本杰明:嗯,我不知道你能不能。操作系统在内存中为用户进程保留一页。进程可能需要malloc()内存空间,但这将在内核为当前进程地址空间提供的保留块内。您是否将应用程序作为子进程进行分叉?或者执行一

我试图解决为使用X Window Manager(即Linux平台)的应用程序保留屏幕空间的问题。我已经看过了,我问过了。由于没有人对Qt特定的问题做出反应(我也在其他论坛上讨论过这个问题),我想我应该概括一下我的问题:

有没有一种通用的、类似Python的方法来告诉X为应用程序保留屏幕空间? 谢谢,

本杰明:嗯,我不知道你能不能。操作系统在内存中为用户进程保留一页。进程可能需要malloc()内存空间,但这将在内核为当前进程地址空间提供的保留块内。您是否将应用程序作为子进程进行分叉?或者执行一个新实例?

经过一些研究,我找到了使用的解决方案

在生成窗口的代码中,可以获取窗口ID,这是X上窗口的参考。根据使用的GUI工具包,获取此ID的方法可能会有所不同。Qt4提供,Gtk+2有自己的方法为窗口保留空间,我没有尝试使用Gtk+3,但我被告知应该有一个
window\u 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以获取Display(),然后创建一个window对象,该对象是一个抽象模型,用于引用X显示的窗口。更改此模型的属性后,我们可以Display().sync()以应用更改。保留空间的方法是
change\u property()


注意:重要的是要保留创建窗口对象的Display()的相同实例,以便更改窗口属性,从而将其存储到变量中。

我说的是屏幕上的物理空间。。。是吗?啊,屏幕空间,我真的不知道该怎么做:(对不起,伙计
class Window(object):
   
    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()