Я хочу использовать инструмент для запуска command (или script), когда мышь попадает на край экрана, но без Compiz. Какой инструмент похож на «действия краев» Compiz? Compiz не поддерживается на моем ноутбуке, поэтому я ищу другое решение.
Я хочу выполнить команды, когда нажимаем край экрана, связанный с кнопками мыши +, например, функцию Compiz, но без Compiz. Я попробовал Brightside, но он не поддерживает край для запуска команд, только углы.
Ссылка: край экрана Compiz Ссылка: Brightside для LinuxВы можете использовать 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 или просто проверить, запущена ли данная команда.
Вы можете использовать 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 или просто проверить, запущена ли данная команда.
Вы можете использовать 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 или просто проверить, запущена ли данная команда.