pabluk's blog... IPv6 ready!
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
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!
Hi! this is my personal web site and weblog about my projects, news related to free and open source software, internet and sometimes about real life ;)
about 4 years ago
hola tengo este mismo problema que describis, pro no se bien como hacer lo que decis, soy principiante en ubuntu aunque tengo conocimientos de programacion, no de c, si me puedes ayudar te estare agradecido, mi msn es yeyecastro@hotmail.com desde ya muchas gracias
about 4 years ago
Yo tambien tuve ese mismo problema pero después de compilar conky (lo compilé para tener soporte para audacious). Entonces intenté solucionar eso cambiando el valor de la variable own_window_type (creo que había colocado desktop). El caso es que tampoco sirvió y volví a compilar, pero todo siguió igual. Hasta que me dió por mirar el man de conky y me di cuenta que tenia todavía “desktop” en own_window_type y la cambié a “override”. Ese fué el santo remedio.