key maintenance

For those who care about things like GPG keys, I generated a new GPG key today. My old key wasn't compromised, but it's been around for a long time and is full of lots of old subkeys and my old name and stuff. I've signed my new key with my old key and set the expiry for my old key to tomorrow (I've not revoked it — should I?).

Update: it turns out that everyone in Debian is now generating 4096 RSA+RSA keys (Debian instructions). May as well be future proof, so I've revoked the key from this afternoon and generated another one. Thanks to Sjoerd for the tip.

I've pushed the keys to the keyserver, but for reference:

pub   4096R/4EE4E30F 2009-09-22 [expires: 2011-09-22]
      Key fingerprint = 5ED7 A3C0 F83A D937 300B  DA54 82EC F846 4EE4 E30F

uid                  Danielle Madeley <danielle@madeley.id.au>
uid                  Danielle Madeley <danielle.madeley@collabora.co.uk>

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.9 (GNU/Linux)

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
=Nihe
-----END PGP PUBLIC KEY BLOCK-----

Please don't sign a key from someone you aren't sure is the real person, yadda yadda.

quick and dirty icon theme viewer

So very often I find myself trying to find the name of an icon in the icon theme, and I end up having to search through my icon theme with a combination of find and eog. Usually I miss the icon on my first pass through.

Today I cracked, and decided to hammer together a quick and dirty viewer and searcher for the icon theme which looks something like this:

icon theme viewer
It's written in PyGTK and so far only has the single feature of 'Search' (this is my 90% case). It could be a lot more advanced if people wanted to hack on it: it could select themes, show whether an icon is in this theme or a parent theme, what sizes are available, etc. I will certainly accept patches!

Hopefully other people find this useful too. Source code is here.

GTK+ client-side-windows and threading

Some people (including me) had noticed that recent Empathy's video calling was breaking with recent GTK+ builds. Some people (not including me) were smart enough to work out the bug was related to client-side-windows.

In CSW-enabled GTK+, calls to GDK_WINDOW_XID() — the function with returns the XID of a GdkWindow — implicitly makes a call to gdk_window_ensure_native() before retrieving the XID. It does this so that there is a window on the X server to return the XID for, and thus ideally no one's application will break under CSW. The problem in Empathy was that the first call to GDK_WINDOW_XID() happened in a thread, which in the olden days would have been harmless, but now it can magically result in your window being allocated server side.

The fix for Empathy (and maybe your program to) is to call gdk_window_ensure_native() as soon as the widget is realized. In Empathy we're calling GDK_WINDOW_XID(), because we don't want to depend on GTK+ 2.18, which looks a lot like this.

Creative Commons Attribution-ShareAlike 2.5 Australia
This work by Danielle Madeley is licensed under a Creative Commons Attribution-ShareAlike 2.5 Australia.