Подтвердить что ты не робот

Как получить MouseMove и MouseClick в bash?

Мне интересно, как получить события MouseClick и MouseMove в сценариях bash для моих собственных простых событий ОС.

Скажите, пожалуйста, как получить эти события.

4b9b3361

Ответ 1

Эмулятор терминала xterm определяет некоторые контрольные последовательности для отслеживания мыши, вы можете узнать больше о них в разделе Отслеживание мыши в документе ctlseqs для распределения xterm. Если у вас установлен xterm, вы, вероятно, будете иметь копию в /usr/share/doc/xterm/ctlseqs.txt.gz или аналогичный путь.

Большинство эмуляторов терминалов, работающих в X Window System (например, Konsole, gnome-terminal, eterm,...), понимают по крайней мере некоторые из этих управляющих последовательностей. Если вы хотите использовать их непосредственно на одном из виртуальных терминалов Linux, вам, вероятно, придется запустить gpm(8).

Существует несколько контрольных последовательностей для включения и отключения сообщений о движении мыши:

  • 9 → Отчеты мыши X10 для совместимости с X10 xterm, сообщает о нажатии кнопки.
  • 1000 → Отчеты мыши X11, отчеты о нажатии и отпускании кнопок.
  • 1001 → выделить отчетность, полезную для отображения основных моментов мыши.
  • 1002 → отчет о движении кнопок, движение отчетов при нажатии кнопки.
  • 1003 → все отчеты о движении, сообщает обо всех движениях.

Управляющая последовательность 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). Таким образом, есть несколько новых переключателей для изменения формата, в котором сообщаются координаты мыши:

  • 1006 → отчитаться как десятичные значения (xterm, многие другие эмуляторы терминала, но не urxvt)
  • 1015 → отчитываться как десятичные значения (urxvt, xterm, другие эмуляторы терминалов, некоторые приложения находят это сложным для синтаксического анализа)
  • 1005 → отчет обратно закодирован как utf-8 (xterm, urxvt, разбит несколькими способами)

Хорошей стратегией для приложения было бы включить отображение мыши, затем (необязательно запросить режим urxvt 1015 и затем) запросить режим SGR 1006. Приложение должно обрабатывать как новые, так и устаревшие ответы на сообщения мыши, чтобы продолжить работу с эмуляторами терминалов без поддержки новых режимов.

Дополнительная информация о новых режимах отчетности:

Ответ 2

bash ничего не знает о мыши или щелчках мыши. По умолчанию нет курсора или что-то в этом роде.

Вы можете установить "Общий мышь для мыши общего назначения". Посмотрите на это: http://www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html например, для копирования и вставки в консоль. Возможно, вы можете использовать инструменты для работы с вашим bash - script.

... но вообще: нет поддержки встроенной мыши для bash -shell

Ответ 3

Короткий путь

Я создал скрипт для перемещения командной строки при нажатии мыши :

  1. Включить отчеты об отслеживании мыши xterm
  2. Установите привязки readline, чтобы использовать escape-последовательность, генерируемую щелчками

Его можно найти здесь: 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
}

ссылки

Ответ 4

вы можете использовать xdotool для событий mousemove и mouseclick. xdotool - инструмент, который подделывает клавиатуру и мышь. установите его, набрав, sudo apt-get install xdotool. Используя xdotool, вы можете автоматизировать почти все, что вы делаете, используя клавиатуру и мышь.

Ответ 5

Вы можете использовать команду "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 в оболочку.

Ответ 6

На основании ценной информации, приведенной здесь, и после небольшого количества копаний.

Мы можем поймать нажатия и спуски мыши, движение колеса и боковые, средний щелчок (щелчок колеса) и позиции. Нет щелчка правой кнопкой мыши.

Ниже приведен только пример в 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"; 
  }
}

enter image description here