Мне интересно, как получить события 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;21MC-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";
}
}