note
Anonymous Monk
<p> Nope, the OP's approach is correct, just needs to fix the typos :) 90% of the way there.
<p> <strike>Has to find what exports GDK_SHIFT_MASK.</strike>
<p> Has to use <c> Gtk2->get_current_event </c> because the callback doesn't get an event object
<p> <b>update</b>: after some basic debugging
<spoiler>
<p> [href://http://gtk2-perl.sourceforge.net/doc/pod/Gtk2/Gdk/Event/Button.html|Gtk2::Gdk::Event::Button] isa [href://http://gtk2-perl.sourceforge.net/doc/pod/Gtk2/Gdk/Event.html|Gtk2::Gdk::Event] hasa [href://http://gtk2-perl.sourceforge.net/doc/pod/Gtk2/Gdk/Event.html#_modifiertype_event_|$modifiertype = $event->get_state] which are [href://http://gtk2-perl.sourceforge.net/doc/pod/Gtk2/Gdk/Event.html#flags_Gtk2_Gdk_Modif|flags Gtk2::Gdk::ModifierType] <c> #!/usr/bin/perl -w
use strict;
use diagnostics;
use Gtk2 -init;
my $mw = Gtk2::Window->new();
$mw->signal_connect( 'delete_event' => sub { Gtk2->main_quit; } );
my $button=Gtk2::Button->new_from_stock( 'gtk-add' );
$button->add_events( 'key-press-mask' );
$button->signal_connect(
'clicked' => sub {
use Data::Dump;
my $state = Gtk2->get_current_event->get_state ;
dd[ @_, $state ];
dd[ $state->as_arrayref ];
} );
$mw->add( $button );
$mw->show_all;
Gtk2->main;
__END__
[bless(do{\(my $o = 257)}, "Gtk2::Gdk::ModifierType")]
$ perl -MData::Dump -MGtk2 -e " dd [ \%Gtk2::Gdk::ModifierType:: ]
do {
my $a = [{ ISA => *Gtk2::Gdk::ModifierType::ISA }];
$a->[0]{ISA} = ["Glib::Flags"];
$a;
}
$ perl -MData::Dump -MGtk2 -e " dd [ \%Glib::Flags:: ]
do {
my $a = [
{
"(!=" => *Glib::Flags::(!=,
"(\"\"" => *Glib::Flags::("",
"(&" => *Glib::Flags::(&,
"()" => *Glib::Flags::(),
"(*" => *Glib::Flags::(*,
"(+" => *Glib::Flags::(+,
"(-" => *Glib::Flags::(-,
"(/" => *Glib::Flags::(/,
"(==" => *Glib::Flags::(==,
"(>=" => *Glib::Flags::(>=,
"(\@{}" => *Glib::Flags::(@{},
"(^" => *Glib::Flags::(^,
"(bool" => *Glib::Flags::(bool,
"(eq" => *Glib::Flags::(eq,
"(ne" => *Glib::Flags::(ne,
"(|" => *Glib::Flags::(|,
"__ANON__" => *Glib::Flags::__ANON__,
"all" => *Glib::Flags::all,
"as_arrayref" => *Glib::Flags::as_arrayref,
"BEGIN" => *Glib::Flags::BEGIN,
"bool" => *Glib::Flags::bool,
"eq" => *Glib::Flags::eq,
"ge" => *Glib::Flags::ge,
"intersect" => *Glib::Flags::intersect,
"ne" => *Glib::Flags::ne,
"new" => *Glib::Flags::new,
"OVERLOAD" => *Glib::Flags::OVERLOAD,
"sub" => *Glib::Flags::sub,
"union" => *Glib::Flags::union,
"xor" => *Glib::Flags::xor,
},
];
$a->[0]{"()"} = \1;
$a->[0]{"OVERLOAD"} = { dummy => 1 };
$a;
}
[
bless({}, "Gtk2::Button"),
bless(do{\(my $o = 257)}, "Gtk2::Gdk::ModifierType"),
]
[["shift-mask", "button1-mask"]]
</c>
</spoiler>
I figured it out, examples in [href://http://gtk2-perl.sourceforge.net/doc/pod/Glib.html|Glib], [href://http://gtk2-perl.sourceforge.net/doc/pod/Glib/Flags.html|Glib::Flags]
<c>
my $state = Gtk2->get_current_event->get_state ;
exit warn "How dare you shift" if $state * "shift-mask";
</c>
1003488
1003564
5