Compiz “ações de vinculação de borda de tela” como, mas sem o Compiz

0

Desejo usar uma ferramenta para executar command (ou script ) quando o mouse atingir a borda da tela, mas sem o Compiz. Qual é a ferramenta é como de "ações de bordas" Compiz? O Compiz não é compatível com meu laptop, então estou procurando outra solução.

Eu desejo executar comandos quando atingido a borda da tela associada aos botões do mouse +, como a função Compiz, mas sem o Compiz. Eu tentei Brightside, mas não suporta borda para executar comandos, apenas cantos.

por NicolasSmith 26.09.2017 / 13:30

1 resposta

1

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.

    
por dessert 02.10.2017 / 16:11