Compiz & ldquo; действия с привязкой к экранам экрана & rdquo; но без Compiz

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

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

Ссылка: край экрана Compiz Ссылка: Brightside для Linux
0
задан 26 September 2017 в 15:17

3 ответа

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

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

С этим мы можем построить цикл 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

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

1
ответ дан 22 May 2018 в 18:06
  • 1
    Это именно то, чего я хочу, это работает, спасибо большое! – NicolasSmith 3 October 2017 в 21:23
  • 2
    Пожалуйста, я очень рад, что это сработало. :) – dessert 3 October 2017 в 21:26
  • 3
    Из этих команд я сделал script, чтобы закрыть активное окно, щелкнув правой кнопкой мыши по правому краю и откройте Firefox, щелкнув правой кнопкой мыши по верхнему краю: здесь – NicolasSmith 4 October 2017 в 21:35

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

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

С этим мы можем построить цикл 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

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

1
ответ дан 18 July 2018 в 06:12

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

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

С этим мы можем построить цикл 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

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

1
ответ дан 24 July 2018 в 18:32

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

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