snom frontend
authorsimigern <simigern>
Sun, 21 May 2006 11:53:53 +0000 (11:53 +0000)
committersimigern <simigern>
Sun, 21 May 2006 11:53:53 +0000 (11:53 +0000)
snom.pl [new file with mode: 0755]

diff --git a/snom.pl b/snom.pl
new file mode 100755 (executable)
index 0000000..283b398
--- /dev/null
+++ b/snom.pl
@@ -0,0 +1,300 @@
+#!/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
Impressum, Datenschutz