From a3855c1d747b03a5ce93a0f9a233d20aa2260540 Mon Sep 17 00:00:00 2001 From: simigern Date: Sun, 21 May 2006 11:53:53 +0000 Subject: [PATCH] snom frontend --- snom.pl | 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100755 snom.pl diff --git a/snom.pl b/snom.pl new file mode 100755 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 -- 2.39.5