Freedesktop specs y mi patch para Conky

Para los que no lo conocen se podría decir que Conky es un monitor de sistema, como gkrellm, nada más que este es un fork de Torsmo. Se lo puede utilizar para monitorear casi cualquier cosa, uso de CPU, memoria, tráfico de red, sockets, disco, mpd, etc. En esta imagen lo que está a la derecha es Conky. Hasta ahí todo muy bueno pero tengo el problema que si maximizo una aplicación me lo tapa o cuando el window manager mapea una ventana nueva a veces me lo tapa. Y es un perno, al menos para mí. Para solucionarlo probé cambiando el placement mode de mi window manager a Centered, Random, Smart y nada. Cambiar el tamaño del output device en Compiz tampoco, busqué si había alguna opción para que las ventanas solo se maximizaran hasta un tamaño máximo pero ni ahí. Tampoco era una solución que aparezca siempre encima de todas las ventanas, porque tapa el contenido de la ventana que queda debajo. En internet, incluida la web de Conky, no encontré nada, parece que a nadie le molesta :P Después me dí cuenta de que el comportamiento que yo quería es como el de los panels de Gnome, así que fui a ver la fuentes de Conky y para entender un poco tuve que consultar algunas especificaciones de freedesktop.org, en especial esta. Para bajar las fuentes y poder compilar Conky en Ubuntu hay que poner

sudo apt-get install build-essential
sudo apt-get build-dep conky
apt-get source conky
Después de un rato entendí que lo que había que hacer es setear una propiedad de la ventana de Conky que se llama _NET_WM_STRUT. Y bueno con mi conocimiento básico de C hice este patch
--- conky-1.5.1.orig/src/x11.c 2008-03-31 01:56:42.000000000 -0300
+++ conky-1.5.1/src/x11.c 2008-05-17 16:03:21.000000000 -0300
@@ -535,6 +535,38 @@
  return (long) color.pixel;
 }

+/ Reserve space at the borders of the desktop / +void set_strut(int window, int x, int y, int w, int h) +{ + Atom xa; + + xa = ATOM(_NET_WM_STRUT); + if (xa != None) { + int left = 0; + int right = 0; + int top = 0; + int bottom = 0; + + if (w < h) { + if (x <= display_width / 2) { + left = w; + } else { + right = w; + } + } else { + if (y <= display_height / 2) { + top = h; + } else { + bottom = h; + } + } + + CARD32 prop[4] = { left, right, top, bottom }; + XChangeProperty(display, window, xa, XA_CARDINAL, 32, + PropModeAppend, (unsigned char *) prop, 4); + } +} + void create_gc(void) { XGCValues values;

--- conky-1.5.1.orig/src/conky.c 2008-04-01 00:52:20.000000000 -0300 +++ conky-1.5.1/src/conky.c 2008-05-17 14:45:58.000000000 -0300 @@ -7208,6 +7208,7 @@ window.height = text_height + border_margin * 2 + 1; XResizeWindow(display, window.window, window.width, window.height); + set_strut(window.window, window.x, window.y, window.width, window.height); if (own_window) { set_transparent_background(window.window); }

Con eso funciona y queda solucionado mi problema!