1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
package Gtk::Keybinding;
use strict;
use integer;
use Exporter ();
use constant TRUE => 1;
use constant FALSE => 0;
use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
use vars qw(@modifiers);
#define ShiftMask (1<<0)
#define LockMask (1<<1)
#define ControlMask (1<<2)
#define Mod1Mask (1<<3)
#define Mod2Mask (1<<4)
#define Mod3Mask (1<<5)
#define Mod4Mask (1<<6)
#define Mod5Mask (1<<7)
use constant MOD_SHIFT => 1 << 0;
use constant MOD_LOCK => 1 << 1;
use constant MOD_CTRL => 1 << 2;
use constant MOD_1 => 1 << 3;
use constant MOD_2 => 1 << 4;
use constant MOD_3 => 1 << 5;
use constant MOD_4 => 1 << 6;
use constant MOD_5 => 1 << 7;
use constant MOD_CAPSLOCK => MOD_LOCK;
use constant MOD_ALT => MOD_1;
use constant MOD_META => MOD_1;
use constant MOD_NUMLOCK => MOD_2;
use constant MOD_SCRLOCK => MOD_5;
use constant MOD_ALTGR => MOD_3;
use constant MOD_WM => MOD_4;
@modifiers =
qw(
MOD_SHIFT
MOD_LOCK
MOD_CTRL
MOD_1
MOD_2
MOD_3
MOD_4
MOD_5
MOD_CAPSLOCK
MOD_ALT
MOD_META
MOD_NUMLOCK
MOD_SCRLOCK
MOD_ALTGR
MOD_WM
);
@ISA = qw(Exporter);
@EXPORT = ();
@EXPORT_OK = (@modifiers);
%EXPORT_TAGS = (
modifiers => \@modifiers
);
$VERSION = 0.01_03;
sub make_map (@)
{
my $callback;
CALLBACK_CLOSURE:
{
my %map;
foreach my $map_entry (@_)
{
my $key = $map_entry->{key} || ord( $map_entry->{str} );
my $mod = $map_entry->{mod};
my $func = $map_entry->{func};
$map{$key} ||= {};
$map{$key}{$mod} = $func;
}
$callback =
sub
{
my $widget = $_[0];
my $event = $_[1];
my $keynum = $event->{keyval};
my $modval = $event->{state};
$map{$keynum}
&& $map{$keynum}{$modval}
&& return $map{$keynum}{$modval}->($widget, $event);
return FALSE;
};
};
return $callback;
}
__END__
|