无法更改“净”“宽”“支柱”“部分属性”

2024-05-17 10:11:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在屏幕上为用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()

电话是这样的:

^{pr2}$

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

升级版: Here是我的xprop输出。我的WM是Compiz。在


Tags: coreimportdatalencookietypeconnectionstruct
2条回答

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

我认为这里的错误是ChangeProperty()参数data_len是属性数据data中由format给定大小的元素数目,而不是字节数。在

对我有用的稍作修改的代码:

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

我上传了一个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是屏幕每个边缘上要保留的像素数,顺序是。在这里,条的大小被保留在屏幕的顶部,而其他边则不受影响。在
  • _NET_WM_STRUT_PARTIAL还提供了另外四对,每一对都是支柱的开始和结束位置(它们不需要占据整个边缘)。在

在这个例子中,我们将顶部起点设置为当前监视器的x坐标,并将顶端设置为与监视器宽度相同的值。最终的结果是只在当前监视器上保留空间。在

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

(全文见参考要点)

相关问题 更多 >