2
#!/usr/bin/env perl
use warnings;
use 5.012; 
use Term::ReadKey;

sub getch {
    my $c = ReadKey 0;
    if ( $c eq "\e" ) {
        my $c = ReadKey 0.10;
        if ( $c eq '[' ) {
            my $c = ReadKey 0;
            if ( $c eq 'M' ) {   
                my $event_type = ord( ReadKey 0 ) - 32;
                my $x = ord( ReadKey 0 ) - 32;
                my $y = ord( ReadKey 0 ) - 32;
                return $x, $y;
} } } }

binmode STDIN, ':encoding(utf-8)' or die $!;
ReadMode 'ultra-raw';

# enter_mouse_mode
binmode STDIN, ':raw' or die $!;
print "\e[?1003h"; # sets   SET_ANY_EVENT_MOUSE  mode

my( $x, $y  ) = getch();

# leave_mouse_mode
binmode STDIN, ':encoding(utf-8)' or die $!;
print "\e[?1003l"; # cancels SET_ANY_EVENT_MOUSE mode

ReadMode 'restore';
say "x = $x";
say "y = $y";

此脚本最多只能使用 223 列宽( 223 + 32 -> 1 字节)。
有谁知道,如何启用扩展鼠标模式?我试图以这种方式更改鼠标模式,但它不起作用:

# enter_mouse_mode
binmode STDIN, ':utf8' or die $!;
print "\e[?1003h";
print "\e[?1005h"; ###

my( $x, $y  ) = getch();

# leave_mouse_mode
binmode STDIN, ':encoding(utf-8)' or die $!;
print "\e[?1003l";
print "\e[?1005l"; ###
4

2 回答 2

2

您使用的是哪个版本的 xterm?根据changelog,最近添加了扩展鼠标模式(版本 262)。您的代码适用于 xterm 266、perl 5.10。我无法用一些简单的策略来打破它(LANG=C xterm禁用xterm +lc语言环境支持)。

于 2011-04-02T20:41:00.640 回答
2

我建议不要使用扩展鼠标模式,1005。无法与常规(X10)编码区分开来,并且仍然存在无法分辨释放事件涉及哪个按钮的问题。

相反,我建议您的终端是否支持它,使用 SGR 编码,模式 1006。

另请参阅我最近关于终端鼠标编码的来龙去脉的博客文章:

http://leonards-code.blogspot.co.uk/2012/04/wide-mouse-support-in-libvterm.html

使用 SGR 编码的好处是您可以尝试启用它,但您不需要知道它是否成功;从终端返回的字节告诉你这一点。然而,您永远不会知道扩展 (UTF-8) 模式是否已成功启用,但您需要知道这一点才能正确解释返回的字节。

于 2012-04-21T22:54:18.430 回答