2011-01-13 43 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? 我試圖改變鼠標模式的這種方式,但它沒有工作:如何啓用擴展鼠標模式?

# 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

您正在使用什麼版本的xterm的?根據changelog,最近增加了擴展鼠標模式(版本262)。你的代碼適用於xterm 266,perl 5.10。我無法用幾個簡單的策略來破解它(LANG=C xterm,xterm +lc以禁用語言環境支持)。

+0

它現在可以工作(xterm v268) - 我在移動鼠標(不點擊)時已經獲得了結果。但是我忘了提及我正在使用KDE的Konsole,但它仍然無法工作。 – 2011-04-16 09:10:57

2

我建議不要使用擴展鼠標模式,1005。它不可能與常規(X10)編碼區分開來,並且它仍然存在無法分辨發佈事件涉及哪個按鈕的問題。

相反,我建議,如果你的終端支持它,使用SGR編碼模式1006

參見我最近的博客條目上終端鼠標編碼的來龍去脈:

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

使用SGR編碼的好處是你可以嘗試啓用它,但你不需要知道它是否成功;從終端返回的字節告訴你這一點。而您永遠不會知道擴展(UTF-8)模式是否已成功啓用,但您需要知道這一點才能正確解釋返回的字節。