Archive for the ‘Desarrollos’ Category.

Implementando soporte para Xinerama en Superkb

Desde hace tiempo, Alfredo observó el problema. Incluso, hay un screenshot en la sección de bloopers (al final de la sección de Pantallazos) donde se ve una pantalla doble con un teclado muy bonito. Pero, ¿por qué es eso un blooper?

Para pintar el teclado, Superkb le pregunta a X el tamaño de la pantalla, y pinta el teclado aprovechando al máximo la pantalla, según el tamaño que se le reporta.

El problema

Para X, una tarjeta dual con dos monitores, es en realidad un solo “display”, de modo que Superkb no logra percatarse de la existencia de dos monitores, y aunque el screenshot se ve perfecto, la realidad es muy distinta. (Disculpen ustedes mi falta de pulso.)


(Superkb sin soporte para Xinerama: A la izquierda, el screenshot, a la derecha, las pantallas reales)

Nótese que en este caso, el problema se agrava debido a que cada monitor tiene una resolución distinta, de modo que no sólo el teclado se ve partido, sino que además una parte se pierde.

¿Cómo se podría resolver el problema? El problema dejaría de existir si Superkb tuviera la capacidad de conocer la cantidad de monitores existentes y la resolución de cada uno, y pintar varios teclados a la vez, uno por monitor.

XINERAMA

En una configuración de doble monitor, para X.org, se sigue tratando de un único “display”, es sólo que un conjunto de pixeles se asignan al primer monitor y otro conjunto de pixeles se asignan al segundo monitor.

Xinerama es una librería que, en esencia, cuenta con sólo una función, llamada XineramaQueryScreens. Aunque en realidad son 4 funciones, las tres restantes sólo se usan para consultar la versión, disponibilidad y compatibilidad de Xinerama como extensión de X.

Con esta función le pregunto a X.org cuántos monitores hay y qué pixeles se mapean a cada uno de los monitores, y me contesta en un arreglo de estructuras XineramaScreenInfo.

Por ejemplo, en la PC que se usó para el screenshot, esta es la información que regresa:

screen_number = 0
x_org = 0
y_org = 0
width = 1024
height = 768

screen_number = 1
x_org = 1024
y_org = 0
width = 1280
height = 1024

Con esta información, Superkb sólo se limita a pintar los teclados en sus correspondientes coordenadas: un teclado entre 0-1023 x 0-767 y otro en 1024-2303 x 0-1023. El screenshot queda un poco diferente, y tal vez no se vea del todo bien. Pero ya en pantalla se ve como se espera.


(Superkb con soporte para Xinerama: A la izquierda, el screenshot, a la derecha, las pantallas reales)

Debido esto, hubo que convertir el pixmap y la ventana de Superkb, en un arreglo de pixmaps y ventanas. (No, no puedo usar un mismo pixmap para todas las ventanas, porque pueden ser monitores de diferente resolución).

En conclusión: para el tiempo que duré con conocimiento del bug y sin arreglarlo (desde la versión 0.10), creo que hice una tormenta con un vaso de agua. El cambio fue relativamente fácil de implementar.

… y todo para Xinerama se desprecie en favor de Xrandr. ;-)

Superkb 0.16

Una nota rápida para anunciar Superkb 0.16.

La bitácora de cambios:

  • Algunos bichos corregidos, reportados por gcc -Wextra.
  • Reescrito el código de dibujado de textos mediante Xft.
  • Corregida una condición de carrera en el procesamiento de los eventos de X.

Sobre Xft, la migración se realizó para aprovechar la funcionalidad de antialias que provee Xft, en comparación con Xlib. En Debian Sid, por algún motivo renderea igual la versión 0.15 que la 0.16, pero en Ubuntu Feisty se nota la diferencia en la calidad del texto.

Sobre la condición de carrera, se trata de un bug espantoso que podía volver inutilizable Superkb. Significa que el mismo código en la misma distribución en diferentes PC, podría funcionar para una persona y para otra no.

No hay pantallazos por el momento.

Para los diversos recursos del proyecto (descargas y demás), visita la página de Superkb en este mismo blog.

audiosum 0.2

Ok, audiosum ha sido un excelente conejillo de indias para aprender Git, GNU Autoconf y GNU Automake. Los dos últimos me parecen demasiado confusos todavía, pero ahí la llevo.

Y se han hecho varios cambios, principalmente:

  • Se corrigió un horrible bug donde los archivos que se abrían no se cerraban, tipo memory leak, pero de descriptores.
  • Se añadió una opción, -b, para indicar que sólo se desea la firma de una parte del archivo (dado en porcentaje). Si se usa -b sin un valor, imprime sólo el tamaño del audio del archivo.
  • Se añadió una opción, -a, para indicar qué algoritmo de hash usar, como md5, sha1, etc.
  • Mejores mensajes de ayuda.
  • Se incluye audiodup, un script para encontrar duplicados más cómodamente.

El script audiodup trabaja de manera eficiente:

  1. Genera una lista de archivos a analizar, según las rutas indicadas.
  2. (Primera etapa) Descarta los archivos no duplicados según su tamaño.
  3. (Segunda etapa) Descarta los archivos no duplicados según el primer 2% del contenido.
  4. (Tercera etapa) Descarta los archivos no duplicados según el contenido completo.
  5. Los archivos restantes son duplicados. Se agrupan y se presentan.

Ejemplo de uso de audiodup, para buscar mp3 duplicados en $HOME y /mnt/music:

audiodup $HOME /mnt/music

Ejemplo de uso de audiodup, usando sha1 y que revise el 5% en la segunda etapa:

audiodup -a sha1 -b 5 $HOME /mnt/music

Descarga en .tar.gz: audiosum-0.2.tar.gz

audiosum 0.1

Me complace anunciar formalmente la liberación de audiosum 0.1.

Audiosum es una herramienta que permite calcular la firma MD5 para un archivo MP3, pero ignorando la metainformación (etiquetas ID3v1, ID3v2, Lyrics3v1 y Lyrics3v2). En este momento no existe soporte para OGG.

Audiosum surge de la idea de buscar duplicados de audio cuando los archivos difieren únicamente en sus etiquetas. Por ejemplo, en el siguiente ejemplo, existen cuatro archivos cuya firma MD5 es diferente, por lo que son diferentes. Sin embargo, su parte de audio es idéntica. Cuando audiosum muestra la firma MD5 del audio, uniq los detecta por lo que tranquilamente podemos borrar una de las copias de estos archivos.

alvarezp@alvarezp-laptop:~$ md5sum (algunos archivos)
d662def56360c1ba71975fe0858651df  other/music/ALEX UBAGO - QUE PIDES TU.mp3
4e91970580b0355b3aa7e711416d50ba  other/music/Alex Ubago.- Vuelve.mp3
07894b351ae9df4a3c8ca487169e1524  DCIM/iPod_Control/Music/F00/ASFP.mp3
82db5ed3ffe951aba19cdd2d38cbea01  other/music/no doubt - bath water.mp3

alvarezp@alvarezp-laptop:~$ find -iname "*.mp3" | audiosum | sort | uniq -D -w 41
003c6b41 36d2a24f44413f4a4ab3282e7cea1649 [I3v1] [I3v2] [----] [----] ./other/music/ALEX UBAGO - QUE PIDES TU.mp3
003c6b41 36d2a24f44413f4a4ab3282e7cea1649 [I3v1] [----] [----] [----] ./other/music/Alex Ubago.- Vuelve.mp3
0058f7a4 17df577141ae1db6384309e2e3cbe2c6 [I3v1] [I3v2] [----] [----] ./DCIM/iPod_Control/Music/F00/ASFP.mp3
0058f7a4 17df577141ae1db6384309e2e3cbe2c6 [I3v1] [----] [----] [----] ./other/music/no doubt - bath water.mp3

El primer valor que se imprime es el tamaño del audio procesado. El segundo valor es la firma MD5.

Obsérvese cómo a audiosum no se le proveen los archivos por la línea de comando sino por la entrada estándar. Se puede incluir tee audiosum.out antes de sort para que las firmas se almacenen en un archivo de texto antes de ser ordenadas. El comando uniq -D -w 41 es el que se encarga de dejar únicamente los duplicados, considerando los primeros 41 caracteres.

Descarga en .tar.gz: audiosum-0.1.tar.gz

Para compilar:

#Instalar la librería mhash.
apt-get install libmhash-dev #para Ubuntu

#Descargar el archivo audiosum-0.1.tar.gz.
wget http://alvarezp.ods.org/blog/files/audiosum-0.1.tar.gz

#Descomprimir el paquete.
tar xvzf audiosum-0.1.tar.gz
cd audiosum-0.1

#Configurar y crear
./configure && make

#Instalar
sudo make install

Ejemplos de uso de audiosum:

find -iname "*.mp3" | audiosum
find -iname "*.mp3" | audiosum > audiosum.out
find -iname "*.mp3" | audiosum | tee audiosum.out
find -iname "*.mp3" | audiosum | sort | uniq -D -w 41

Saludos.

Superkb 0.15

En Superkb 0.15 se realizaron dos cambios mayores y varias correcciones. El primer cambio se explica mejor con unos pantallazos:


DRAWKB_PAINTING_MODE: FULL SHAPE, FLAT_KEY o BASE_OUTLINE_ONLY.

Se han añadido dos modos nuevos para dibujar las teclas: FULL_SHAPE, donde se hace uso de toda la geometría de las teclas, proveída por el X Window System para simular la tecla completa; y FLAT_KEY, similar al modo original pero donde la tecla se dibuja plana, sólo su espacio base, lo que permite dibujar iconos y letras más grandes que en los demás modos, pero con menor detalle de las teclas.

El segundo cambio se alcanza a ver en los pantallazos: el código para dibujar los nombres de las teclas fue reestructurado en su totalidad, con el objetivo de que se maneje un tamaño diferente para cada renglón. Por ejemplo, en las Thinkpad, las teclas de función son más pequeñas, lo que sacrificaba el espacio de los iconos. El programa ahora es mucho tiene mejores criterios para escoger los tamaños de letra.

Los cambios menores fueron:

  • SUPERKEY_REPLAY queda habilitado por defecto.
  • SUPERKEY_RELEASE_CANCELS queda deshabilitado por defecto.
  • Los colores por defecto quedaron como en los screenshots.
  • Opción de depuración (superkb -d).
  • Otras correcciones.

Los enlaces:

Superkb 0.14

Después de mucho trabajo, quedó liberada la versión 0.14 de Superkb.

Las dos noticias son:

  • SUPERKEY_RELEASE_CANCELS: Si se configura en 0, los atajos se ejecutan aunque se suelte la tecla Super. Esto permite una mejor interacción. Yo mismo estaba harto del otro mecanismo.
  • Paquete para Ubuntu: Este paquete viene precompilado y teóricamente bastaría con dpkg -i superkb_0.14_i386.deb para ser instalado.

Continue reading ‘Superkb 0.14’ »

Superkb… ¿para Windows? (qliner hotkeys)

Creo que el 2008 comenzó con el pie derecho para Superkb. Trataré de no ponerme sentimental mientras explico.

Hace unos meses, jmedina se tomó un tiempo para instalar Superkb. Me dio algunas ideas para mejorar el programa y creí que ahí había quedado todo. Sin embargo, me acaba de enviar un enlace que encontró:


http://www.qliner.com/hotkeys/

Pantallazo de qliner hotkeys

Continue reading ‘Superkb… ¿para Windows? (qliner hotkeys)’ »

Pantallazos de Superkb 0.12

Superkb 0.12 con algunos “feedback handlers” configurados (con agradecimientos a Alfredo por el de Mumbles).

Superkb con xmessage Superkb con OSD Superkb con notify-send de libnotify (paquete libnotify-bin de Ubuntu) Superkb con Mumbles