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

Posted

技术标签:

【中文标题】Python:告诉 X 为应用程序保留屏幕空间【英文标题】:Python: tell X to reserve screen space for application 【发布时间】:2011-05-10 11:21:59 【问题描述】:

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

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

谢谢, 本杰明

【问题讨论】:

【参考方案1】:

经过一番研究,我找到了使用 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 查询 Display() 并随后创建一个窗口对象,该对象是一个抽象模型,以引用 X 显示的窗口。更改此模型的属性后,我们可以 Display()。 sync() 以应用更改。预留空间的方法是change_property(),其中根据Freedesktop.org Standards传递一系列参数。

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()

注意:保持创建窗口对象的同一 Display() 实例很重要,以便更改窗口属性,因此将其存储到变量中。

【讨论】:

【参考方案2】:

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

【讨论】:

我说的是屏幕上的物理空间……你呢? 啊——屏幕空间,我真的不知道如何处理这个:(对不起,伙计

以上是关于Python:告诉 X 为应用程序保留屏幕空间的主要内容,如果未能解决你的问题,请参考以下文章

垂直定位 UIBarButtonItem(对于 iPhone X)

是否为 OPC UA 地址空间中的应用程序级节点 ID 保留了 951 到 1999 的范围?

编译 UWP 应用程序时出错:“Windows 命名空间的使用被保留。”

从 iPhone 主屏幕重新打开时,如何在 jQuery Mobile 应用程序上缓存并保留上次访问的页面?

将屏幕空间转换为世界空间以在 python 中创建点云

如何告诉 proguard 保留枚举常量和字段