如何在bash中获取MouseMove和MouseClick?

ian*_*ani 18 linux bash scripting events

我想知道如何在bash脚本中为我自己的简单OS事件获取MouseClick和MouseMove事件.

请告诉我如何获得这些活动.

nin*_*alj 32

xterm终端仿真器定义了一些控制序列以进行鼠标跟踪,您可以在文档ctlseqs中的鼠标跟踪部分中了解有关它们的更多信息,以便进行xterm分发.如果你安装了xterm,你可能会有一个副本或类似的路径./usr/share/doc/xterm/ctlseqs.txt.gz

在X Window系统上运行的大多数终端仿真器(例如: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"
Run Code Online (Sandbox Code Playgroud)

然后,您将按下按钮获得一堆字符,请参阅ctlseqsconsole_codes(4)了解详细信息.然后,您可以禁用鼠标跟踪:

echo -e "\e[?1000l"
Run Code Online (Sandbox Code Playgroud)

不幸的是,以前的鼠标报告模式只能处理最多223(255 - 32)的坐标,或者在某些情况下95(127 - 32).因此,有一些新的开关可以更改报告鼠标坐标的格式:

  • 1006 - >报告为十进制值(xterm,许多其他终端模拟器,但不是urxvt)
  • 1015 - >以十进制值的形式报告(urxvt,xterm,其他终端仿真器,某些应用程序发现解析起来很复杂)
  • 1005 - >报告回编码为utf-8(xterm,urxvt,以多种方式破解)

应用程序的一个好策略是启用鼠标报告,然后(可选地请求urxvt 1015模式然后)请求SGR 1006模式.应用程序应处理新旧鼠标报告响应,以继续处理终端仿真器而不支持新模式.

有关新报告模式的更多信息,请访问:

  • 很好的答案,几年后对扩展进行了很好的编辑。真的很感激!:) (2认同)
  • ```echo -e "\e[?1000l"``` - 正是我需要停止在终端中跟踪我的鼠标坐标!谢谢 (2认同)
  • 你没有说如何捕获和解析事件,那是工作的 50% (2认同)

NVR*_*VRM 12

基于这里给出的宝贵信息,并经过一些挖掘。

我们可以捕捉鼠标按下和释放、滚轮移动和侧面、中间点击(滚轮点击)和位置。没有右键。

以下只是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"; 
  }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 感谢您将这一点拼写出来。对于阅读文档的我来说,按钮的实际编码并不明显。 (3认同)

tin*_*ino 8

捷径

我制作了一个脚本来使命令行光标在鼠标单击时移动

  1. 启用 xterm 鼠标跟踪报告
  2. 设置 readline 绑定以使用点击生成的转义序列

可以在这里找到: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
Run Code Online (Sandbox Code Playgroud)
  • 鼠标点击的样子\e[<0;3;21M和一个释放\e[<0;3;212x(从左)和22y(从上) 在哪里
  • 鼠标滚起来: \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
Run Code Online (Sandbox Code Playgroud)

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"'
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

链接


The*_*ndr 2

bash 不知道任何有关鼠标或鼠标点击的信息。默认情况下没有光标或类似的东西。

您可以安装“通用鼠标服务器”。看看这个: http: //www.linuxfromscratch.org/blfs/view/6.3/general/gpm.html 例如,在控制台内使用复制和粘贴。也许您可以使用这些工具来处理您的 bash 脚本。

...但是:bash-shell 没有本机鼠标支持