[pygtk] porting from pygtk to pygi - weird problem with pixbufs

Giuseppe Penone giuspen at gmail.com
Wed Jul 18 21:12:56 WST 2012


Hi,
I'm co-author of the app x-tile (graphical windows tiling) which is
currently in pygtk but is already fully ported to pygi (even if not public
yet).

The problem is that the pixbufs (windows icons) are rendered properly in
pygtk but are not in pygi (the icons are sometimes partially rendered,
sometimes not at all, if you click F5 to refresh the list many times you
can see it clearly).

the involved (pygtk) function is:

def get_icon(win):
    """   this returns a gtk.gdk.pixbuf of the windows icon
          converts argb into rgba in the process   """
    get_property("_NET_WM_ICON", win, glob.XA_CARDINAL)
    if not glob.ret_pointer : return None
    w = glob.ret_pointer[0]
    h = glob.ret_pointer[1]
    s = w*h
    buff = ""
    i = 0
    while i<s:
        argb = glob.ret_pointer[i+2]
        i += 1
        buff = buff + ("%c" % ((argb >> 16) & 0xff))
        buff = buff + ("%c" % ((argb >> 8) & 0xff))
        buff = buff + ("%c" % (argb & 0xff))
        buff = buff + ("%c" % ((argb >> 24) & 0xff))
    pxbuf = gtk.gdk.pixbuf_new_from_data(buff, gtk.gdk.COLORSPACE_RGB,
True, 8, w, h, w*4)
    return pxbuf

that ported to pygi becomes:

def pixbuf_destroy_fn(pixbuf, data):
    """Function called when there are no more references of pixbuf"""
    del pixbuf

def get_icon(win):
    """   this returns a Gdk.pixbuf of the windows icon
          converts argb into rgba in the process   """
    get_property("_NET_WM_ICON", win, glob.XA_CARDINAL)
    if not glob.ret_pointer : return None
    w = glob.ret_pointer[0]
    h = glob.ret_pointer[1]
    s = w*h
    buff = ""
    i = 0
    while i<s:
        argb = glob.ret_pointer[i+2]
        i += 1
        buff = buff + ("%c" % ((argb >> 16) & 0xff))
        buff = buff + ("%c" % ((argb >> 8) & 0xff))
        buff = buff + ("%c" % (argb & 0xff))
        buff = buff + ("%c" % ((argb >> 24) & 0xff))
    pxbuf = GdkPixbuf.Pixbuf.new_from_data(buff,
                                           GdkPixbuf.Colorspace.RGB,
                                           True,
                                           8,
                                           w,
                                           h,
                                           w*4,
                                           pixbuf_destroy_fn, None)
    return pxbuf

If anybody has some hints please help us.
Everybody can run the app easily from source cloning:

hg clone https://giuspen@code.google.com/p/giuspen-x-tile/ hg_x-tile
cd hg_x-tile
./x-tile

and see the correct functionality

doing

hg update pygi
./x-tile

you run the pygi version, and can switch back to pygtk with

hg update default
./x-tile

Cheers,
Giuseppe.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.daa.com.au/pipermail/pygtk/attachments/20120718/b4286483/attachment.html>


More information about the pygtk mailing list