+#!/bin/sh
+#$Id: snom.pl,v 1.1 2006-05-21 11:53:53 simigern Exp $
+
+PATH=/opt/csw/bin:/opt/local/bin:/usr/bin:/bin exec perl -w -x "$0" "$@"
+
+#!perl
+
+use Glib qw/TRUE FALSE/;
+use Gtk2 '-init';
+use Gtk2::Gdk::Keysyms;
+use strict;
+
+use LWP::UserAgent;
+my $ua = LWP::UserAgent->new;
+
+#set_locale Gtk2;
+
+sub snom_key(@) {
+ (my $key) = @_;
+ $key='%23' if ($key eq '#');
+ my $req = HTTP::Request->new(GET => "http://${ARGV[0]}/command.htm?key=${key}");
+ $ua->request($req);
+}
+
+sub snom_number(@) {
+ (my $number) = @_;
+ my $req = HTTP::Request->new(GET => "http://${ARGV[0]}/command.htm?number=${number}");
+ $ua->request($req);
+}
+
+if (!defined($ARGV[0])) {
+ print STDERR "Usage: ${0} snom.phone.address\n";
+ exit 1
+}
+
+my $window = Gtk2::Window->new('toplevel');
+$window->set_title("snom");
+$window->signal_connect(delete_event => \&CloseAppWindow);
+$window->signal_connect(destroy => sub { Gtk2->main_quit; });
+my $kphandler = $window->signal_connect(key_press_event => \&KBDInput);
+$window->set_border_width(15);
+$window->set_resizable(FALSE);
+
+my $keypad = Gtk2::Table->new(4, 3, 1);
+$keypad->set_row_spacings(2);
+$keypad->set_col_spacings(2);
+my %key = ();
+my $n = 0;
+foreach my $i (1, 2, 3, 4, 5, 6, 7, 8, 9, '*', 0, '#') {
+ $key{$i} = Gtk2::Button->new(" ${i} ");
+ $key{$i}->signal_connect(clicked => \&KeyPressed, $i);
+ $keypad->attach_defaults($key{$i}, (($n)%3), (($n)%3)+1, int(($n)/3), int((($n)/3)+1));
+ $key{$i}->show();
+ $n++;
+}
+$keypad->show();
+
+my $fkeys = Gtk2::Table->new(6, 2, 1);
+$fkeys->set_row_spacings(2);
+$fkeys->set_col_spacings(2);
+$n = 0;
+foreach my $i qw(Redial Settings Directory Help Menu snom _ _ Conference Transfer Hold DND) {
+ if ($i ne '_') {
+ $key{$i} = Gtk2::Button->new("${i}");
+ $key{$i}->signal_connect(clicked => \&KeyPressed, $i);
+ $fkeys->attach_defaults($key{$i}, (($n)%2), (($n)%2)+1, int(($n)/2), int((($n)/2)+1));
+ $key{$i}->show();
+ }
+ $n++;
+}
+$fkeys->show();
+
+my $pkeys = Gtk2::Table->new(6, 2, 1);
+$pkeys->set_row_spacings(2);
+$pkeys->set_col_spacings(2);
+$n = 0;
+foreach my $i qw(P7 P1 P8 P2 P9 P3 P10 P4 P11 P5 P12 P6) {
+ $key{$i} = Gtk2::Button->new("${i}");
+ $key{$i}->signal_connect(clicked => \&KeyPressed, $i);
+ $pkeys->attach_defaults($key{$i}, (($n+1)%2), (($n+1)%2)+1, int($n/2), int($n/2)+1);
+ $key{$i}->show();
+ $n++;
+}
+$pkeys->show();
+
+my $softkeys = Gtk2::Table->new(1, 4);
+$softkeys->set_col_spacings(6);
+$n = 0;
+foreach my $i qw(F1 F2 F3 F4) {
+ $key{$i} = Gtk2::Button->new("${i}");
+ $key{$i}->signal_connect(clicked => \&KeyPressed, $i);
+ $softkeys->attach_defaults($key{$i}, $n, $n+1, 0, 1);
+ $key{$i}->show();
+ $n++;
+}
+$softkeys->show();
+
+my $navi = Gtk2::Table->new(3, 5);
+$n = 0;
+foreach my $i qw(_ _ ^ _ _ X < _ > OK _ _ V _ _) {
+ if ( $i ne '_' ) {
+ $key{$i} = Gtk2::Button->new("${i}");
+ $key{$i}->signal_connect(clicked => \&KeyPressed, $i);
+ $navi->attach_defaults($key{$i}, (($n)%5), (($n)%5)+1, int(($n)/5), int((($n)/5)+1));
+ $key{$i}->show();
+ }
+ $n++;
+}
+$navi->show();
+
+my $output = Gtk2::Table->new(2, 3);
+$output->set_row_spacings(2);
+$output->set_col_spacings(2);
+$n = 0;
+foreach my $i qw(- + _ Mute Speaker Headset) {
+ if ( $i ne '_' ) {
+ $key{$i} = Gtk2::Button->new("${i}");
+ $key{$i}->signal_connect(clicked => \&KeyPressed, $i);
+ $output->attach_defaults($key{$i}, (($n)%3), (($n)%3)+1, int(($n)/3), int((($n)/3)+1));
+ $key{$i}->show();
+ }
+ $n++;
+}
+$output->show();
+
+my $special= Gtk2::Table->new(1, 2);
+$special->set_col_spacings(2);
+$n = 0;
+foreach my $i qw(Record Retrieve) {
+ $key{$i} = Gtk2::Button->new("${i}");
+ $key{$i}->signal_connect(clicked => \&KeyPressed, $i);
+ $special->attach_defaults($key{$i}, $n, $n+1, 0, 1);
+ $key{$i}->show();
+ $n++;
+}
+$special->show();
+
+my $display = Gtk2::Entry->new();
+$display->signal_connect(activate => \&DialNumber);
+my $kph_blocked = FALSE;
+#$display->signal_connect(focus_in_event => \&DisplayMouseOver, TRUE);
+$display->signal_connect(enter_notify_event => \&DisplayMouseOver, TRUE);
+#$display->signal_connect(focus_out_event => \&DisplayMouseOver, FALSE);
+$display->signal_connect(leave_notify_event => \&DisplayMouseOver, FALSE);
+$display->show();
+
+my $dispbox = Gtk2::VBox->new(0, 5);
+$dispbox->pack_start($display, 0, 0, 0);
+$dispbox->pack_start($softkeys, 0, 0, 0);
+$dispbox->pack_start($navi, 0, 0, 0);
+$dispbox->show();
+
+my $outbox = Gtk2::VBox->new(0, 0);
+$outbox->pack_end($output, 0, 0, 0);
+$outbox->show();
+
+my $specialbox = Gtk2::VBox->new(0, 0);
+$specialbox->pack_end($special, 0, 0, 0);
+$specialbox->show();
+
+my $ubox = Gtk2::HBox->new(0, 30);
+$ubox->pack_start($outbox, 0, 0, 0);
+$ubox->pack_start($dispbox, 0, 0, 0);
+$ubox->pack_start($specialbox, 0, 0, 0);
+$ubox->show();
+
+
+my $kbbox = Gtk2::HBox->new(0, 30);
+$kbbox->pack_start($keypad, 1, 1, 0);
+$kbbox->pack_start($fkeys, 0, 0, 0);
+$kbbox->show();
+
+my $kvbox = Gtk2::VBox->new(0, 5);
+$kvbox->pack_end($kbbox, 0, 0, 0);
+$kvbox->show();
+
+my $lbox = Gtk2::HBox->new(0, 30);
+$lbox->pack_start($kvbox, 1, 1, 0);
+$lbox->pack_start($pkeys, 0, 0, 0);
+$lbox->show();
+
+my $mainbox = Gtk2::VBox->new(0,5);
+$mainbox->pack_start($ubox, 0, 0, 0);
+$mainbox->pack_start($lbox, 0, 0, 0);
+$mainbox->show();
+
+$window->add($mainbox);
+$window->show();
+
+# Gtk2 event loop
+Gtk2->main;
+
+# Should never get here
+exit( 0 );
+
+
+sub KeyPressed
+{
+ my ($button, $text) = @_;
+ foreach my $i (1, 2, 3, 4, 5, 6, 7, 8, 9, '*', 0, '#',
+ 'F1', 'F2', 'F3', 'F4',
+ 'P1', 'P2', 'P3', 'P4', 'P5', 'P6',
+ 'P7', 'P8', 'P9', 'P10', 'P11', 'P12') {
+ if ($i eq $text) {
+ snom_key($i);
+ return;
+ }
+ }
+
+ snom_key("REDIAL") if ( $text eq "Redial" );
+ snom_key("SETTINGS") if ( $text eq "Settings" );
+ snom_key("F_ADR_BOOK") if ( $text eq "Directory" );
+ snom_key("HELP") if ( $text eq "Help" );
+ snom_key("MENU") if ( $text eq "Menu" );
+ snom_key("SNOM") if ( $text eq "snom" );
+ snom_key("CONFERENCE") if ( $text eq "Conference" );
+ snom_key("TRANSFER") if ( $text eq "Transfer" );
+ snom_key("F_R") if ( $text eq "Hold" );
+ snom_key("DND") if ( $text eq "DND" );
+
+ snom_key("MUTE") if ( $text eq "Mute" );
+ snom_key("SPEAKER") if ( $text eq "Speaker" );
+ snom_key("HEADSET") if ( $text eq "Headset" );
+
+ snom_key("CANCEL") if ( $text eq "X" );
+ snom_key("ENTER") if ( $text eq "OK" );
+ snom_key("UP") if ( $text eq "^" );
+ snom_key("DOWN") if ( $text eq "V" );
+ snom_key("LEFT") if ( $text eq "<" );
+ snom_key("RIGHT") if ( $text eq ">" );
+
+ snom_key("F_REC") if ( $text eq "Record" );
+ snom_key("F_RETRIEVE") if ( $text eq "Retrieve" );
+
+ snom_key("VOLUME_UP") if ( $text eq "+" );
+ snom_key("VOLUME_DOWN") if ( $text eq "-" );
+}
+
+sub DialNumber
+{
+ my ($entry) = @_;
+ snom_number($entry->get_text());
+}
+
+sub DisplayMouseOver
+{
+ my ($widget, $event, $active) = @_;
+
+ if ($active) {
+ $widget->grab_focus();
+ if (!$kph_blocked) {
+ $window->signal_handler_block($kphandler);
+ $kph_blocked=TRUE;
+ }
+ } else {
+ $key{OK}->grab_focus();
+ if ($kph_blocked) {
+ $window->signal_handler_unblock($kphandler);
+ $kph_blocked=FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+sub KBDInput
+{
+ my ($widget, $event) = @_;
+
+ my $keyval = $event->keyval;
+ foreach my $i (1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 'F1', 'F2', 'F3', 'F4') {
+ if ($keyval == $Gtk2::Gdk::Keysyms{$i}) {
+ snom_key($i);
+ return TRUE;
+ }
+ }
+
+ if ($keyval == $Gtk2::Gdk::Keysyms{Return}) {snom_key("ENTER"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{KP_Enter}) {snom_key("ENTER"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{Escape}) {snom_key("CANCEL"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{Left}) {snom_key("LEFT"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{KP_Left}) {snom_key("LEFT"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{Right}) {snom_key("RIGHT"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{KP_Right}) {snom_key("RIGHT"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{Up}) {snom_key("UP"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{KP_Up}) {snom_key("UP"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{Down}) {snom_key("DOWN"); return TRUE;}
+ if ($keyval == $Gtk2::Gdk::Keysyms{KP_Down}) {snom_key("DOWN"); return TRUE;}
+ return TRUE;
+}
+
+### Callback function to close the window
+sub CloseAppWindow
+{
+ $window->destroy;
+ return TRUE;
+}
+
+
+# END EXAMPLE PROGRAM