Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t改变部分性质_Python_X11_Xcb_Ewmh - Fatal编程技术网

Python Can';t改变部分性质

Python Can';t改变部分性质,python,x11,xcb,ewmh,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_PARTIA

我想在屏幕上为用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:
是我的xprop输出。我的WM是Compiz

更改为使用ChangePropertyChecked(),然后检查结果会出现BadLength异常

我认为这里的错误在于
ChangeProperty()
参数
data\u len
是属性数据
数据中
格式
给定大小的元素数,而不是字节数

对我适用的代码稍加修改:

def reserve_space(xid, data):
    connection = xcb.connect()
    atom_cookie = connection.core.InternAtom(False, len("_NET_WM_STRUT_PARTIAL"),
        "_NET_WM_STRUT_PARTIAL")
    atom = atom_cookie.reply().atom
    data_p = struct.pack("12I", *data)
    strat_cookie = connection.core.ChangePropertyChecked(xcb.xproto.PropMode.Replace, xid,
        atom, xcb.xproto.Atom.CARDINAL, 32, len(data_p)/4, data_p)
    strat_cookie.check()
    connection.flush()
我上传了一个演示如何为任务栏指定当前监视器顶部的支柱的示例。这可能有助于解释其中的一些原因

我的要点如下:

 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])
一开始,我发现这些夸夸其谈的论点令人困惑,所以我希望下面的解释更清楚:

我们设置了
\u NET\u WM\u struct
、旧机制以及
\u NET\u WM\u struct\u PARTIAL
,但如果窗口管理器支持后者,则忽略前者。数组中的数字如下所示:

  • 0,0,bar\u size,0
    是沿屏幕每个边缘保留的像素数,按左、右、上、下的顺序排列。在这里,条形图的大小保留在屏幕的顶部,而其他边缘则单独保留
  • \u NET\u WM\u struct\u PARTIAL
    还提供了另外四对,每对都是支柱的起点和终点位置(它们不需要占据整个边缘)
在本例中,我们将顶部起点设置为当前监视器的x坐标,将顶部终点设置为相同的值加上监视器的宽度。最终结果是仅在当前监视器上保留空间

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


(完整内容请参见参考要点)

您能在通话前后打印
xprop-id[xid]吗?您使用的窗口管理器是什么?请注意,对于InternAtom,仅使用\u if\u exists=FALSE可能是一个好主意,因此,如果此客户端在WM之前启动(或任何其他实习生为“\u NET\u WM\u struct\u PARTIAL”的客户端),则此方法会按预期工作