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://leonerds-code.blogspot.co.uk/2012/04/wide-mouse-support-in-libvterm.html

SGR エンコーディングを使用する利点は、有効化を試みることができ、成功したかどうかを知る必要がないことです。端末から返されたバイトがこれを示しています。一方、拡張 (UTF-8) モードが正常に有効化されたかどうかはわかりませんが、返されたバイトを正しく解釈するには、これを知る必要があります。

于 2012-04-21T22:54:18.430 に答える