如何使用python-xlib管理我的应用程序窗口?

时间:2011-05-30 08:25:19

标签: python linux window x11 xlib

我想找到一个linux范围(在它使用X11的方式)方式来控制我的应用程序的窗口几何,我用Python编程。我的所有研究都指向使用python-xlib,这恰好记录得非常糟糕。

我想要达到的目标是:

  • 在屏幕上定义窗口的位置
  • 定义最小和最大尺寸
  • 启用/禁用窗口调整大小
  • 为窗口保留屏幕空间
  • 保持窗口在上方/下方
  • 跳过或不跳过任务栏(又名窗口列表)
  • 设置窗口装饰/未装饰
  • 设置窗口标志(正常,弹出,对话,启动,停靠,忽略)

注意:我不想创建使用Xlib,而是想告诉X如何使用某些GUI库(例如PyQt)创建的窗口。

我该怎么做呢?我意识到这个问题是一个很大的问题:你是否至少知道如何抓住我的窗户?我可以在模块中找到答案吗?

编辑: nm的答案提供了很多资源,还有another Q&A on Unix StackExchange提供了一个关于如何控制X显示的应用程序窗口的一个很好的示例。

2 个答案:

答案 0 :(得分:2)

您需要知道的第一个关键字是ICCCM。您需要熟悉ICCCM手册(请参阅http://tronche.com/gui/x/icccm/)和相同的FreeDesktop扩展(请参阅http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html)。至于你的问题

  

我怎么能抓住我的窗户?

我不太明白。你调用create_window,该函数返回你的Window对象。或者你的意思是其他什么?

答案 1 :(得分:0)

昨天刚发现这个,我认为与使用各种 xdotoolwmctrlgtktkinter 来移动窗口相比,它很棒:

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 获取窗口 ID,则需要在调用 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)