Мне интересно, как получить события MouseClick и MouseMove в сценариях bash для моих собственных простых событий ОС.
Скажите, пожалуйста, как получить эти события.
Мне интересно, как получить события MouseClick и MouseMove в сценариях bash для моих собственных простых событий ОС.
Скажите, пожалуйста, как получить эти события.
Эмулятор терминала xterm определяет некоторые контрольные последовательности для отслеживания мыши, вы можете узнать больше о них в разделе Отслеживание мыши в документе ctlseqs для распределения xterm. Если у вас установлен xterm, вы, вероятно, будете иметь копию в /usr/share/doc/xterm/ctlseqs.txt.gz
или аналогичный путь.
Большинство эмуляторов терминалов, работающих в X Window System (например, Konsole, gnome-terminal, eterm,...), понимают по крайней мере некоторые из этих управляющих последовательностей. Если вы хотите использовать их непосредственно на одном из виртуальных терминалов Linux, вам, вероятно, придется запустить gpm(8)
.
Существует несколько контрольных последовательностей для включения и отключения сообщений о движении мыши:
Управляющая последовательность CSI ? number h
для включения и CSI ? number l
для отключения. CSI - это ESC [
или символ 0x9b
. Таким образом, вы можете использовать их следующим образом:
echo -e "\e[?1000h"
Затем вы получите кучу символов при нажатии кнопки, подробнее см. ctlseqs или console_codes(4)
. Затем вы можете отключить отслеживание мыши с помощью:
echo -e "\e[?1000l"
К сожалению, предыдущие режимы сообщений мыши могут обрабатывать координаты до 223 (255-32) или в некоторых ситуациях 95 (127 - 32). Таким образом, есть несколько новых переключателей для изменения формата, в котором сообщаются координаты мыши:
Хорошей стратегией для приложения было бы включить отображение мыши, затем (необязательно запросить режим urxvt 1015 и затем) запросить режим SGR 1006. Приложение должно обрабатывать как новые, так и устаревшие ответы на сообщения мыши, чтобы продолжить работу с эмуляторами терминалов без поддержки новых режимов.
Дополнительная информация о новых режимах отчетности:
bash ничего не знает о мыши или щелчках мыши. По умолчанию нет курсора или что-то в этом роде.
Вы можете установить "Общий мышь для мыши общего назначения". Посмотрите на это: http://www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html например, для копирования и вставки в консоль. Возможно, вы можете использовать инструменты для работы с вашим bash - script.
... но вообще: нет поддержки встроенной мыши для bash -shell
Я создал скрипт для перемещения командной строки при нажатии мыши :
Его можно найти здесь: https://github.com/tinmarino/mouse_xterm/blob/master/mouse.sh
Xterm имеет функцию отслеживания мыши
echo -e "\e[?1000;1006;1015h" # Enable tracking
echo -e "\e[?1000;1006;1015l" # Disable tracking
\e[<0;3;21M
и релиз \e[<0;3;21
. Где 2
- это x (слева), а 22
- это y (сверху) \e[<64;3;21M
\e[<65;3;21M
C-v
после включения отслеживания мыши, чтобы увидеть, чтоReadline может вызвать обратный вызов bash
bind -x '"\e[<64;": mouse_void_cb' # Cannot be put in .inputrc
bind '"\C-h" : "$(date) \e\C-e\ef\ef\ef\ef\ef"' #Can be put in .inputrc
Readline может вызывать несколько функций
# Mouse cursor to begining-of-line before calling click callback
bind '"\C-98" : beginning-of-line'
bind -x '"\C-99" : mouse_0_cb'
bind '"\e[<0;": "\C-98\C-99"'
Обратный вызов Readline может изменить положение курсора (точки) с помощью переменной среды READLINE_POINT
bind -x '"\C-h" : xterm_test'
function xterm_test {
echo "line is $READLINE_LINE and point $READLINE_POINT"
READLINE_POINT=24 # The cursor position (0 for begining of command)
READLINE_LINE='coco' # The command line current content
}
вы можете использовать xdotool для событий mousemove и mouseclick. xdotool - инструмент, который подделывает клавиатуру и мышь. установите его, набрав, sudo apt-get install xdotool. Используя xdotool, вы можете автоматизировать почти все, что вы делаете, используя клавиатуру и мышь.
Вы можете использовать команду "xte" из пакета "xautomation".
apt-get install xautomation
В качестве примера можно отметить следующую команду:
xte 'mousemove 200 300'
Итак, указатель мыши перемещается на ширину 200 и высоту 300 экрана. В качестве другого примера мы имеем:
xte 'mouseclick 3'
которые нажимают правую кнопку мыши (1: левый клик, 2: средний щелчок, 3: правый клик). Кроме того, вы можете нажимать клавиши на клавиатуре через оболочку:
xte 'keydown Control_L' 'key c' 'keyup Control_L'
В этом примере отправьте ctrl + c в оболочку.
На основании ценной информации, приведенной здесь, и после небольшого количества копаний.
Мы можем поймать нажатия и спуски мыши, движение колеса и боковые, средний щелчок (щелчок колеса) и позиции. Нет щелчка правой кнопкой мыши.
Ниже приведен только пример в php, используемый как cli. Он скрывает движения, печатаемые на терминале, и корректно сбрасывает его при выходе.
Это достаточно многословно, чтобы быть адаптированным к любым языкам программирования, способным прочитать STDIN и распечатать на STDOUT, так что, безусловно, большой список из них!
#!/usr/bin/php
<?php
system("stty -icanon"); // Enable shell input
system("stty -echo"); // Disable characters printing
echo "\e[?1003h\e[?1015h\e[?1006h"; // Mouse trap all, urxvt, SGR1006
function shutdown(){ // Cleaning before quiting
echo "\e[?1000l"; // Disable mouse trap
system("stty echo"); // Enable back characters printing
exit; // Cleaned, quit
}
register_shutdown_function("shutdown"); // Handle regular END of script
declare(ticks = 1); // Allow posix signal handling
pcntl_signal(SIGINT,"shutdown"); // Catch SIGINT (CTRL+C)
$KEY = "";
while ($KEY = fread(STDIN,16)) {
$e = explode(";",explode("<",$KEY)[1]);
if ($e[0] === "0" && substr($e[2],-1) === "M"){
echo "BUTTON DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "0" && substr($e[2],-1) === "m"){
echo "BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "64"){
echo "WHEEL SCROLL UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "65"){
echo "WHEEL SCROLL DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "1" && substr($e[2],-1) === "M"){
echo "WHEEL BUTTON DOWN, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "1" && substr($e[2],-1) === "m"){
echo "WHEEL BUTTON UP, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
if ($e[0] === "35"){
echo "MOUSE MOVE, LINE ".substr($e[2],0,-1)." COLUMN ".$e[1]."\n";
}
}