Question

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

Ce script ne fonctionne que jusqu'à 223 colonnes de large (223 + 32 -> 1 octet).
Quelqu'un sait-il, comment activer le mode souris étendu ? J'ai essayé de changer le mode de la souris cette façon, mais ça n'a pas marché:

# 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"; ###
Était-ce utile?

La solution

Quelle version de xterm utilisez-vous? Selon le changelog , le mode de souris étendu a été ajouté récemment (version 262) . Votre code a fonctionné pour moi avec xterm 266, perl 5.10. Je n'ai pas pu rompre avec quelques stratégies simples (LANG=C xterm, xterm +lc pour désactiver le support des paramètres régionaux).

Autres conseils

Je recommande pas d'utiliser le mode souris étendu, 1005. Il est impossible de distinguer régulière (X10) codant pour, et il souffre encore le problème que vous ne pouvez pas dire quel bouton est impliqué dans un événement de sortie.

Au lieu de cela, je vous suggère si vos supports terminaux, en utilisant le codage de SGR, le mode 1006.

Voir aussi mon entrée récente post de blog sur les tenants et les aboutissants de codages de souris dans un terminal:

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

L'avantage d'utiliser le codage SGR est que vous pouvez essayer de l'activer, mais vous ne savez pas besoin de si elle a réussi; les octets renvoyés du terminal vous dire ceci. Alors, vous ne saurez jamais si étendu le mode (UTF-8) a été activé avec succès, mais vous devez savoir afin d'interpréter correctement les octets renvoyés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top