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
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 teclasCtrl
,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 quekey
, 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 utilizandorestore
en lugar de pasarle las coordenadasx
ey
. 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 dex
ey
, 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 unclic
, lo que se corresponde con unmousedown
, seguido de unmouseup
. 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 elclick
, 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 valoresleft
,top-left
,top
,top-right
,right
,bottom-left
,bottom
ybottom-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 sermouse-enter
,mouse-leave
,mouse-click
,focus
yblur
getwindowpid
da información sobre el PID de una determinada ventana.getwindowname
igualmente te devuelve el nombre de la ventanagetwindowgeomery
, te muestra la geometría de la venatanagetwindowfocus
, te devuelve elid
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 focoswindowmap
hace una ventana visiblewindowminimize
minimiza la ventanawindowraise
mueve una ventana a la parte superior de la pilawindowreparent
cambia el padre de una determinada ventanawindowclose
cierra una ventanawindowckill
cierra la venana y mata al cliente que controla la ventanawindowunmap
oculta la ventanaset_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 escritoriosget_desktop_viewport
da información sobre la posición de la vista.set_desktop_viewport
te permite mover la vistaset_dektop
puedes establecer el escritorio de usoget_dektop
para obtener el escritorio en el que te encuentrasset_desktop_for_window
te permite mover la ventana a un determinado escritorioget_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