无法更改_NET_WM_STRUT_PARTIAL属性

时间:2012-11-19 14:11:31

标签: python x11 xcb ewmh

我想在屏幕上为我用Python编写的Gtk应用程序保留一些空间。我写过这个函数:

import xcb, xcb.xproto
import struct
def reserve_space(xid, data):
    connection = xcb.connect()
    atom_cookie = connection.core.InternAtom(True, len("_NET_WM_STRUT_PARTIAL"), 
        "_NET_WM_STRUT_PARTIAL")
    type_cookie = connection.core.InternAtom(True, len("CARDINAL"), "CARDINAL")
    atom = atom_cookie.reply().atom
    atom_type = type_cookie.reply().atom
    data_p = struct.pack("I I I I I I I I I I I I", *data)
    strat_cookie = connection.core.ChangeProperty(xcb.xproto.PropMode.Replace, xid,
        atom, xcb.xproto.Atom.CARDINAL, 32, len(data_p), data_p)
    connection.flush()

这个电话看起来像这样:

utils.reserve_space(xid, [0, 60, 0, 0, 0, 0, 24, 767, 0, 0, 0, 0])

不幸的是,它不起作用。我的代码中的错误在哪里?

UPD: Here是我的xprop输出。我的WM是Compiz。

2 个答案:

答案 0 :(得分:2)

我上传了一个gist,演示了如何在当前监视器的顶部指定一个可能是任务栏的支柱。它可能有助于解释其中一些。

我要点的要点如下:

 window = gtk.Window()
 window.show_all()
 topw = window.get_toplevel().window
 topw.property_change("_NET_WM_STRUT","CARDINAL",32,gtk.gdk.PROP_MODE_REPLACE,
      [0, 0, bar_size, 0])
 topw.property_change("_NET_WM_STRUT_PARTIAL","CARDINAL",32,gtk.gdk.PROP_MODE_REPLACE,
      [0, 0, bar_size, 0, 0, 0, 0, 0, x, x+width, 0, 0])

我发现支柱的论点起初很混乱,所以这里有一个解释,希望更清楚:

我们设置_NET_WM_STRUT,旧机制以及_NET_WM_STRUT_PARTIAL但窗口管理器如果支持后者则忽略前者。数组中的数字如下:

  • 0, 0, bar_size, 0是按照 left right top 的顺序在屏幕的每个边缘保留的像素数>,底部。这里栏的大小保留在屏幕顶部,其他边缘保持不变。
  • _NET_WM_STRUT_PARTIAL还提供了另外四对,每一对都是支柱的起点和终点位置(它们不需要占据整个边缘)。

在该示例中,我们将顶部开始设置为当前监视器的x坐标,将顶端设置为相同的值加上监视器的宽度。最终结果是仅在当前监视器上保留空间。

请注意,相对于屏幕指定了坐标(即所有监视器一起)。

(参见完整背景的引用要点)

答案 1 :(得分:0)

更改为使用ChangePropertyChecked(),然后检查结果会产生BadLength异常。

我认为这里的错误是ChangeProperty()参数data_lenformat给出的大小的元素数,而不是属性数据{{中的字节数。 1}}。

稍微修改过的代码对我有用:

data