#!/usr/bin/perl
use warnings;
use strict;
use Gtk2 -init;
my $password= 'q';
my $message="Type password to quit";
my $typed="";
my $gdkwin;
my $mw = new Gtk2::Window('popup');
$mw->set_position('center');
my $vbox = Gtk2::VBox->new(0,5);
$mw->add($vbox);
my $msg_w_markup = Gtk2::Label->new();
$msg_w_markup->set_justify('left');
$msg_w_markup->set_markup("
$message");
$vbox->pack_start($msg_w_markup,0,0,4);
my $typed_w_markup = Gtk2::Label->new();
$typed_w_markup->set_justify('left');
$typed_w_markup->set_alignment(0, 0.5);
$typed_w_markup->set_markup("
$typed");
$vbox->pack_start($typed_w_markup,0,0,4);
$mw->add_events( [ qw(key_press_mask) ]);
$mw->signal_connect('key_press_event', \&do_keypress);
#$mw->signal_connect('realize', sub { $mw->window->move(50,40); });
# must define gdkwin after it is mapped
$mw->signal_connect('map', sub { $gdkwin = $mw->window ; do_grab(); });
$mw->show_all;
Gtk2->main;
sub do_grab()
{
my $grabstatus= Gtk2::Gdk->keyboard_grab(
$gdkwin, 1 ,Gtk2::Gdk::X11->get_server_time($gdkwin) );
if($grabstatus ne "success")
{
$msg_w_markup->set_text("keyboard grab failed");
}
}
sub do_ungrab()
{
Gtk2::Gdk->keyboard_ungrab(Gtk2::Gdk::X11->get_server_time($gdkwin));
}
sub do_keypress(@)
{
my ($widget,$event)=@_;
my $kv = $event->keyval;
my $kn = Gtk2::Gdk->keyval_name($kv);
if($kn =~ /Return|Enter/){
if($typed eq $password) {
do_ungrab();
Gtk2->main_quit;
}else{
$typed="";
}
}elsif(length($kn) == 1 && $kn =~ /[[:print:]]/){
$typed .= $kn;
}
my $showtyped=$typed;
if(length($showtyped) > 30){
$showtyped=substr($showtyped,0,30);
}
$typed_w_markup->set_markup("
$showtyped");
}