2011-01-13 5 views
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バイト)までしか動作しません。
誰でも知っていますか?extended mouse modeを有効にする方法はありますか? は私がマウスモードを変更するには、この方法を試してみましたが、それはうまくいきませんでした:あなたはのxtermの拡張マウスモードを有効にする方法は?

# 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"; ### 

答えて

2

どのバージョンを使用していますか? changelogによれば、拡張マウスモードが最近追加された(バージョン262)。あなたのコードはxterm 266、perl 5.10で私のために働いていました。私はいくつかの簡単な戦略(ロケールサポートを無効にするLANG=C xtermxterm +lc)でそれを壊すことができませんでした。

+0

これは動作します(xterm v268) - マウスを動かすと(クリックせずに)結果が表示されます。しかし、私はKDEのKonsoleを使っていると言いましたが、そこではまだ動作しません。 –

2

拡張マウスモード1005を使用しないことをお勧めします。通常の(X10)エンコーディングと区別することは不可能で、リリースイベントに関連するボタンを特定できないという問題があります。

端末がサポートしている場合は代わりに、私はSGRのエンコーディングを使用して、お勧めしたい、モード1006

は、端末のマウスエンコーディングのインとアウトにも私の最近のブログ記事のエントリーを参照してください:

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

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

関連する問題