3

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 です。

4

2 に答える 2

0

ChangePropertyChecked() を使用するように変更し、結果を確認すると、BadLength 例外が発生します。

ChangeProperty()ここでのバグは、パラメーターがプロパティ data のバイト数ではなく、 でdata_len指定されたサイズの要素数であることだと思います。formatdata

私のために働くわずかに修正されたコード:

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()
于 2013-02-20T15:42:54.263 に答える