Você pode usar xinput --query-state $XID
ou xdotool getmouselocation
para obter a posição do mouse. O recurso badass de xdotool getmouselocation
é sua opção --shell
, com isso e eval
você pode atribuir os valores a variáveis sem a necessidade de cortar qualquer saída em partes, por exemplo:
$ eval $(xdotool getmouselocation --shell)
$ echo $X, $Y
604, 778
Com isso, podemos criar um loop while
que testa constantemente o valor desejado, por exemplo:
while :;
do
eval $(xdotool getmouselocation --shell)
(( $X <= 20 )) && break
sleep .1
done
Isso será executado até que $X
seja 20 ou menos e teste a cada 100 milissegundos. Eu recomendo criar um script para sua situação exata, algo assim:
#!/bin/bash
id=9 # device XID, run xinput without any option to get a list of devices and their IDs
interval=.01 # sleep interval between tests in seconds
# edge areas
# to display the current mouse coordinates run xdotool getmouselocation
# syntax: x_min x_max y_min y_max
e1=(200 1079 0 20)
e2=(1259 1279 200 823)
e3=(200 1079 1003 1023)
e4=(0 20 200 823)
while :; do
eval $(xdotool getmouselocation --shell)
if ( [ ${#e1[@]} -ne 0 ] && (( $X >= ${e1[0]} && $X <= ${e1[1]} && $Y >= ${e1[2]} && $Y <= ${e1[3]} )) ); then
# your commands for edge area e1
echo "Your mouse was detected inside the monitored area no. 1 at $X, $Y."
sleep 2
fi
if ( [ ${#e2[@]} -ne 0 ] && (( $X >= ${e2[0]} && $X <= ${e2[1]} && $Y >= ${e2[2]} && $Y <= ${e2[3]} )) ); then
# your commands for edge area e2
echo "Your mouse was detected inside the monitored area no. 2 at $X, $Y."
sleep 2
fi
if ( [ ${#e3[@]} -ne 0 ] && (( $X >= ${e3[0]} && $X <= ${e3[1]} && $Y >= ${e3[2]} && $Y <= ${e3[3]} )) ); then
# your commands for edge area e3
echo "Your mouse was detected inside the monitored area no. 3 at $X, $Y."
sleep 2
fi
if ( [ ${#e4[@]} -ne 0 ] && (( $X >= ${e4[0]} && $X <= ${e4[1]} && $Y >= ${e4[2]} && $Y <= ${e4[3]} )) ); then
# your commands for edge area e4
echo "Your mouse was detected inside the monitored area no. 4 at $X, $Y."
sleep 2
fi
sleep $interval
done
Eu criei algumas áreas de borda como exemplos, aquelas que começam e terminam 200px dos cantos e cobrem a área dentro de 20px da borda para a minha tela de 1279x1023px - você precisará ajustá-las às suas necessidades. Se você precisar de menos áreas, basta excluir ou comentar as outras. Os comandos que você deseja executar estão nas cláusulas if
dentro da função while. Para evitar várias chamadas ao deixar o mouse dentro da área de borda, você pode usar sleep
, break
ou apenas testar se o comando em questão já está em execução.