#!/usr/bin/perl BEGIN { print "Loading Libraries.\n"; } use strict; use Gtk2 -init; use Gtk2::GladeXML; use Net::DBus::GLib; use Net::DBus::Dumper; BEGIN { print "Starting application.\n"; } print "Initializing Glade UI.\n"; my $gladexml = Gtk2::GladeXML->new('dialer.glade'); $gladexml->signal_autoconnect_from_package('main'); print "Initializing DBus connection\n"; my $bus = Net::DBus::GLib->system; my $device = $bus->get_service('org.freesmartphone.ogsmd'); print "Connecting to Network object.\n"; my $network = $device->get_object( '/org/freesmartphone/GSM/Device', 'org.freesmartphone.GSM.Network'); my $signal_level = $network->GetSignalStrength; my $calls = []; print "Connecting to Call object.\n"; my $call = $device->get_object( '/org/freesmartphone/GSM/Device', 'org.freesmartphone.GSM.Call'); my $status_entry = $gladexml->get_widget('status'); sub update_status { my $call_info = $calls->[0]->{status}; if($call_info eq 'incoming' || $call_info eq 'active') { $call_info .= " ($calls->[0]->{peer})"; } $status_entry->set_label("Signal: $signal_level Status: $call_info"); } update_status(); $call->connect_to_signal( 'CallStatus' => sub { my ($id, $status, $props) = @_; $props->{status} = $status; $calls->[$id] = $props; update_status(); } ); $network->connect_to_signal( 'SignalStrength' => sub { my ($level) = @_; $signal_level = $level; update_status(); } ); my $number_entry = $gladexml->get_widget('number'); my $font = Gtk2::Pango::FontDescription->from_string("Sans Bold 32"); $number_entry->modify_font($font); print "Theme: $ENV{GTK2_RC_FILES}\n"; Gtk2->main; sub gtk_main_quit { Gtk2->main_quit; } sub normalize_phonenumber { my $number = shift; $number =~ s/[-\s()]//g; $number =~ s/^(\d\d\d)(\d\d\d\d)$/\1-\2/; $number =~ s/^(\d\d\d)(\d\d\d)(\d\d+)$/(\1) \2-\3/; return $number; } sub number_press { my ($button) = @_; my $label = $button->child->get_label; $label =~ s/<[^>]+>//g; my $number = substr $label, 0, 1; if($calls->[0]->{status} eq 'active') { send_number($number); } my $text = $number_entry->get_text . $number; $number_entry->set_text(normalize_phonenumber($text)); } sub on_back_clicked { my $text = $number_entry->get_text; $text = substr $text, 0, -1; $number_entry->set_text(normalize_phonenumber($text)); } sub in_call { return ($calls->[0]->{status} eq 'active'); } sub on_clear_button_clicked { $number_entry->set_text(''); } sub send_number { my $number = shift; if(in_call()) { $call->SendDtmf($number); } else { $call->Initiate($number,'voice'); } } sub on_send_button_clicked { if(in_call()) { print "Hanging up\n"; $call->ReleaseAll(); } else { my $number = $number_entry->get_text; $number =~ s/[-\s()]//g; print "Sending '$number'\n"; send_number($number); } }