xdotool, simulando ratón y teclado

Simular entradas desde un teclado o movimientos del ratón es una herramienta que te puede resultar mas interesante de lo que te puedas imaginar. Problablemente, lo primero que se te pase por la cabeza al leer esto de falsas pulsaciones, es gastarle una broma a un amigo. Pero, tienes que ir mas allá. No solo se trata de simular que estás escribiendo, es decir, pulsando teclas, sino también, que estás moviendo el ratón, o que estás haciendo clic en algún lugar de la pantalla. Así, por ejemplo, puedes desplazar el puntero del ratón desde una parte a otra del escritorio con un simple atajo de teclado. Pero, además puedes utilizarlo para realizar test de funcionamiento de una aplicación, y comprobar de forma automatizada que la aplicación se comporta como esperas. ¿Como hacer esto? xdotool.

Así, en este artículo, encontrarás, que es xdotool, que puedes hacer con esta herramienta, y como puedes sacarle partido. Por supuesto, irás un poco mas allá que gastarle esa broma a tu amigo.

xdotool, simulando ratón y teclado

xdotool, simulando ratón y teclado

Como te decía en la introducción, xdotool, es una herramienta que te permite simular pulsaciones de teclas, movimientos de ratón o clics. Pero no solo esto, sino que también te permite buscar por ventanas, mover esas ventanas, redimensionarlas, ocultar o modificar sus propiedades.

Y aún va mas allá, porque si tu gestor de ventanas lo soporta, xdotool, es capaz de cambiar de escritorio, mover la ventana entre escritorios e incluso cambiar el número de escritorio.

Esto puede ser muy interesante en el caso de que utilices algún sistema de organización, en el que por ejemplo, tengas todas las aplicaciones de diseño en un escritorio, mientras que las de edición estén en otro. Así, cuando inicies una aplicación, en función de sus características, irán a un escritorio u otro.

Uso y funcionamiento

Indicarte que esta es una herramienta de terminal, con lo que necesitarás recurrir al terminal para poder utilizarla. Si todavía no te has hecho con el funcionamiento del terminal, pero estás interesado en mejorar tus habilidades con el mismo, te recomiendo le des un vistazo al tutorial sobre el terminal.

El uso de esta herramienta es tremendamente sencillo,

xdotool instrucción argumentos

Así tienes instrucciones para,

  • teclado
  • ratón
  • ventana
  • escritorio
  • varios

En cualquier caso, para sacarle mas productividad, es realmente interesante que tengas conocimientos de scripting. Por esta razón, te recomiendo le des un vistazo al tutorial sobre scripts en Bash, que seguro te será de gran ayuda.

xdotool y el teclado

Para trabajar o gestionar el teclado, tienes los siguientes comando o instrucciones,

  • key, te permite simular que has pulsado una tecla. Tiene algunas opciones como,
    • --window, para indicar a que ventana quieres mandar las pulsaciones
    • --clearmodifiers, para especificar que no quieres enviar modificadores de las teclas. Esto es las teclas Ctrl, Alt, etc.
    • --delay, te permite especificar el retraso en milisegundos entre pulsaciones. Por defecto está establecido en 12 milisegundos.
  • keydown, su comportamiento es exactamente igual que el anterior, pero solo envias la acción de pulsar una tecla.
  • keyup, igual que key, pero solo envías que has dejado de pulsar una tecla.
  • type, este último comando te permite enviar texto, no solo una pulsación de tecla.Esto te puede ser de utilidad para insertar texto de forma automática o al utilizar un atajo de teclado.

El ratón

Al igual que con el teclado xdotool también es capaz de gestionar el puntero del ratón o del touchpad. Y me refiero a gestionar, en el sentido de que es capaz de mover el puntero o enviar clics, de la misma forma que si lo estuvieras haciendo tu. Para trabajar con el puntero del ratón o del touchpad, tienes los siguientes comandos,

  • mousemove puedes mover el ratón a una coordenadas específicas en la pantalla. También puedes mover el puntero a una posición anterior utilizando restore en lugar de pasarle las coordenadas x e y. Tiene algunas opciones adicionales como,
    • --window, para indicar la posición relativa a la ventana
    • --screen, exactamente igual que la anterior, pero para el caso de que tengas varias pantallas. Si especificas la ventana, esta opción es ignorada.
    • --polar, en el caso de que quieras utilizar coordenadas polares, de forma que los parámetros que pasarás on el ángulo y la distancia, en lugar de x e y, respectivamente.
    • --sync, espera a reliazar la siquiente acción a que la primera se haya completado.
  • mouse_relative. Se comporta exactamente igual que el comando anterior, pero los movimientos son relativos a la posición actual. Permite las opciones --sync y --polar.
  • click, envía un clic, lo que se corresponde con un mousedown, seguido de un mouseup. Permite algunas opciones adicionales,
    • --repeat, especifica cuantas opciones hacce clic. Por defecto es 1, pero si quieres simular un doble clic, tienes que utilizar la opción --repeat 2.
    • --delay, indica el tiempo entre clicks,
    • --window, especifica la ventana a la que se envía los clicks.
  • mousedown, tiene el mismo comportamiento y opciones que el click, pero solo realiza la acción de pulsar.
  • mouseup, igual que el anterior, pero solo para dejar de pulsar.
  • getmouselocatioon, te devuelve la posición del puntero, coordenadas x e y, la pantalla y la ventana. Admite la opción --shell, que lo hace mas sencillo de utilizar en tus propios scritps.
  • behave_screen_edege, asocia una acción al hecho de que el ratón llegue a una esquina o borde de la pantalla. Así, puedes indicar que esquina o borde utilizando los valores left, top-left, top, top-right, right, bottom-left, bottom y bottom-right

Trabajando con ventanas

xdotool, además de gestionar el puntero del ratón y el teclado, también te permite trabajar con ventanas. Algunas de las opciones que tienes a tu disposición son las siguientes,

  • search te permite buscar una ventana por su título, nombre o clase, utilizando para ello una expresión regular. Las opciones son --class, --classname, --name, --maxdepth, --onlyvisible, --pid, --screen, --desktop, --N, --all, --any y --sync
  • selectwindow muestra el id de una ventana cuando haces sobre la misma.
  • bind te permite asociar una acción a un determinado evento, como puede ser mouse-enter, mouse-leave, mouse-click, focus y blur
  • getwindowpid da información sobre el PID de una determinada ventana.
  • getwindowname igualmente te devuelve el nombre de la ventana
  • getwindowgeomery, te muestra la geometría de la venatana
  • getwindowfocus, te devuelve el id de la ventana que tiene el foco.
  • windowsize establece las dimensiones de una ventana.
  • windowmove te permite mover la ventana a la posición que quieras.
  • windowfocus puedes indicar que ventana tiene el focos
  • windowmap hace una ventana visible
  • windowminimize minimiza la ventana
  • windowraise mueve una ventana a la parte superior de la pila
  • windowreparent cambia el padre de una determinada ventana
  • windowclose cierra una ventana
  • windowckill cierra la venana y mata al cliente que controla la ventana
  • windowunmap oculta la ventana
  • set_window te permite establecer determinadas propiedades de una ventana. Desde definir el nombre, la clase, el icono, etc-

Trabajando con el escritorio

Esta parte te permite realizar determinadas acciones refereidas al escritorio. Recuerda que en la mayoría de los escritorios Linux tienes la posibilidad de tener mas de un escritorio.

  • windowactivate activa una ventana y en el caso de que se encuentre en otro escritorio, la lleva al escritorio en el que te encuentres.
  • getactivewindow te indica cual es la ventana activa.
  • set_num_desktops, para establecer el número de escritorios.
  • get_num_desktops, indica el número de escritorios
  • get_desktop_viewport da información sobre la posición de la vista.
  • set_desktop_viewport te permite mover la vista
  • set_dektop puedes establecer el escritorio de uso
  • get_dektop para obtener el escritorio en el que te encuentras
  • set_desktop_for_window te permite mover la ventana a un determinado escritorio
  • get_desktop_for_window indica en que escritorio se encuentra una determinada ventana.

Otros comandos

  • exec te permite ejecutar un programa

Scripts

xdotool es capaz de leer una lista de instrucciones de la entrada o de un archivo, lo que te va a permitir encadenar comandos en un script de una forma relativamente sencilla.

Así es posible escribir un escribir un script que únicamente ejecute xdotool. Por ejemplo, el siguiente script te permite seleccionar una ventana y matar el proceso,

#!/usr/bin/xdotool
selectwindow
windowkill

Sobre la pila de ventanas

Algunos de los comandos que has visto, como pueden ser search, getactivewindow, selectwindow, getwindowfocus, etc, que te permiten seleccionar ventanas, imprimen el resultado a la salida normal. Sin embargo, este resultado es guardado en memoria para que lo puedas utilizar posteriormente.

Así cuando te refieres %@ te refieres al total de los resultados devueltos por estos comandos, mientras que %1, %2, %3,… se refiere al primer, segundo y tercer resultados respectivamente.

Ejemplos

Algunos ejemplos que seguro te resultarán de ayuda. Recordarte que estos ejemplos los puedes asociar a un atajo de teclado, de forma que al invocarlo se desencadene esa acción.

  • Puedes matar un determinado proceso seleccionando su ventana
xdotool selectwindow windowkill
  • Si quisieras impedir que el cursor salga de la vetana seleccionada. Para detenerlo ctrl+Z
ventana=$(xdotool selectwindow); xdotool behave $ventana mouse-leave mousemove --window $ventana --polar 0 0 
  • En el caso de que quieras mover el ratón al centro de la ventana en la que estás trabajando,
#!/bin/bash
geometry=$(xdotool getwindowgeometry $(xdotool getwindowfocus))
position=$(echo $geometry | grep -oP 'Position:\s\K[^,]*')
geometry=$(echo $geometry | grep -oP 'Geometry:\s\K.*')
width=$(echo $geometry | sed 's/x[0-9]*//g')
height=$(echo $geometry | sed 's/[0-9]*x//g')
xdotool mousemove $(($position+$(($width/2)))) $(($height/2))
  • Para realizar en atareao.es una búsqueda,
#!/bin/bash
wid=$(xdotool search --name "mozilla firefox")
xdotool windowfocus $wid
xdotool key "ctrl+t"
xdotool key "ctrl+l"
xdotool type "site:atareao.es $1"
xdotool key "Return"

Más información,

Imagen de portada de Luis VIllafranca en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *