2011-01-13 3 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 xterm, xterm +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) 모드가 성공적으로 활성화되었는지는 알 수 없지만 반환 된 바이트를 올바르게 해석하려면이 사실을 알아야합니다.

관련 문제