Compiz “экранируют граничные действия привязки” как, но без Compiz

Я хочу использовать инструмент для выполнения command (или script) когда мышь поражает край экрана, но без Compiz. То, что такое инструмент, похоже "граничных действий" на Compiz? Compiz не поддерживается на моем ноутбуке, таким образом, я ищу другое решение.

Я хочу выполнить команды, когда пораженный край экрана, связанного с мышью + кнопки, как Compiz, функционирует, но без Compiz. Я попробовал Brightside, но он не поддерживает край к командам выполнения, только углы.

2
задан 26 September 2017 в 15:17

1 ответ

Можно использовать xinput --query-state $XID или xdotool getmouselocation получить положение мыши. Функция задиры xdotool getmouselocation --shell опция, с этим и eval можно присвоить значения переменным без потребности сократить любой объем производства в частях, например:

$ eval $(xdotool getmouselocation --shell)
$ echo $X, $Y
604, 778

С этим мы можем создать a while цикл, который постоянно тестирует на требуемое значение, например:

while :;
do
  eval $(xdotool getmouselocation --shell)
  (( $X <= 20 )) && break
  sleep .1
done

Это будет работать до $X 20 или меньше, и протестируйте каждые 100 миллисекунд. Я рекомендую создать сценарий для Вашей точной ситуации из этого, чего-то вроде этого:

#!/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

Я создал некоторые граничные области как примеры, они запускают и заканчивают 200 пкс от углов и покрывают область в 20 пкс от края для моего экрана на 1279x1023 пкс – необходимо будет скорректировать их к потребностям. Если Вам нужно меньше областей, просто удаляют или комментируют другие. Команды, которые Вы хотите выполнить, входят if пункты в, в то время как функция. Для предотвращения множественных вызовов при отъезде мыши в граничной области, можно использовать sleep, break или просто тест, работает ли рассматриваемая команда уже.

2
ответ дан 2 December 2019 в 03:36

Другие вопросы по тегам:

Похожие вопросы: