# A GTK based console program
#
# usage: gtkconsole [<callsign>] [<host> <port>]
-#
-# Copyright (c) 2001-6 Dirk Koopman G1TLH
#
-# $Id$
+# Copyright (c) 2006-2007 Dirk Koopman G1TLH
+#
+#
#
use strict;
-our $VERSION = '$Revision$';
-
our $root;
# search local then perl directories
BEGIN {
# root of directory tree for this system
- $root = "/spider";
+ $root = "/spider";
$root = $ENV{'DXSPIDER_ROOT'} if $ENV{'DXSPIDER_ROOT'};
}
use Screen;
-use vars qw(@modules $font);
+use vars qw(@modules $font);
@modules = (); # is the list of modules that need init calling
# on them. It is set up by each 'use'ed module
our $main; # the main screen
our $scr_width; # calculated screen dimensions
our $scr_height;
-our ($dx, $cmd, $ann, $wcy, $wwv); # scrolling list windows
+our ($dx, $cmd, $ann, $wcy, $wwv, $chat); # scrolling list windows
our $bot; # the cmd entry window
our $date; # the current date
+# other windows
+our $annwin; # the announcement window handle
+our $dxwin; # the dx spot window handle
+our $wwvwin; # wwv window handle
+our $wcywin; # wcy window handle
+our $chatwin; # chat window handle
+
+# wants
+our ($wantann, $wantdx, $wantwwv, $wantwcy, $wantchat) = (1, 1, 1, 1, 1);
+
+require "$root/local/DXVars.pm" if -e "$root/local/DXVars.pm";
+
+our ($version, $subversion, $build);
+require "$root/perl/Version.pm";
+
+our $VERSION = "$version.$subversion build $build";
+
# read in the user data
our $userfn = "$ENV{HOME}/.gtkconsole_data";
our $user = read_user_data();
our $call;
our $passwd;
-our $host;
+our $host = 'localhost';
our $port = 7300;
-#
+#
# read in gtkconsole file
#
Gtk2::Rc->set_default_files("$root/gtkconsole/gtkconsolerc", "$ENV{HOME}/.gtkconsolerc", ".gtkconsolerc");
Gtk2::Rc->reparse_all;
-
+
# sort out a callsign, host and port, looking in order
# 1. the command line
# 2. any defaults in the user data;
$port = shift @ARGV if @ARGV;
}
-unless ($call && $host) {
+unless ($call) {
+ $call = $main::myalias;
+}
+
+unless ($host) {
my $node = $user->{clusters}->{$user->{node}};
-
+
if ($node->{call} || $user->{call}) {
- $call = $node->{call} || $user->{call};
- $host = $node->{passwd};
$host = $node->{host};
- $port = $node->{port};
+ $port ||= $node->{port};
}
-}
-unless ($call && $host) {
- if (-e "$root/local/DXVars.pm") {
- require "$root/local/DXVars.pm";
- $call = $main::myalias;
- $call = $main::myalias; # for the warning
- }
- if (-e "$root/local/Listeners.pm") {
- require "$root/local/Listeners.pm";
- $host = $main::listen->[0]->[0];
- $port = $main::listen->[0]->[1];
+ unless ($host) {
+ if (-e "$root/local/Listeners.pm") {
+ require "$root/local/Listeners.pm";
+ $host = $main::listen->[0]->[0];
+ $port = $main::listen->[0]->[1];
+ $host ||= '127.0.0.1';
+ $host = "127.0.0.1" if !$host && ($host eq '0.0.0.0' || $host eq '::');
+ $port ||= 7300;
+ }
}
}
-unless ($host) {
- $host = $user->{clusters}->{$user->{node}}->{host};
- $port = $user->{clusters}->{$user->{node}}->{port};
-}
-
$call ||= '';
$host ||= '';
$port ||= '';
-die "You need a callsign ($call), a hostname($host) and a port($port) to proceed" unless $call && $host;
+die "You need a callsign ($call), a hostname($host) and a port($port) to proceed" unless $call && $host && $port;
#
# start of GTK stuff
gtk_create_main_screen();
-$main->set_title("gtkconsole $VERSION - DXSpider Console - $call \@ $host:$port");
+$main->set_title("DXSpider gtkconsole $VERSION - $call \@ $host:$port");
# connect and send stuff
my $sock = IO::Socket::INET->new(PeerAddr=>$host, PeerPort=>$port);
sendmsg('set/nobeep');
my $sock_helper = Gtk2::Helper->add_watch($sock->fileno, 'in', \&tophandler, $sock);
-
+
# the main loop
$main->show_all;
$bot->grab_focus;
{
my ($fd, $condx, $socket) = @_;
- my $offset = length $rbuf;
+ my $offset = defined $rbuf ? length $rbuf : 0;
my $l = sysread($socket, $rbuf, 1024, $offset);
if (defined $l) {
if ($l) {
Gtk2->main_quit;
}
1;
-
+
}
sub handlemsg
$dx->{lasttime} = $t;
}
$dx->add_data([$ts, @$ref[0,1,15,3,4,16], stim($ref->[2]) ]);
-
+ $dxwin->show_all;
}
sub handle_ann
my $self = shift;
my $ref = shift;
my ($t, $ts) = (time, '');
- my $s;
- $s = ref $ref ? join ', ',@$ref : $ref;
+# my $s;
+# $s = ref $ref ? (join ', ',@$ref) : $ref;
if (($ann->{lasttime}||0) != $t) {
$ts = tim($t);
$ann->{lasttime} = $t;
}
- chomp $s;
+# chomp $s;
$ann->add_data([$ts, @$ref[3,1,2]]);
+ $annwin->show_all;
}
sub handle_wcy
{
my $self = shift;
my $ref = shift;
- my $s;
- $s = ref $ref ? join ', ',@$ref : $ref;
+# my $s;
+# $s = ref $ref ? join ', ',@$ref : $ref;
- chomp $s;
+# chomp $s;
$wcy->add_data([tim(), @$ref[10,4,5,3,6,2,7,8,9,1] ]);
+ $wcywin->show_all;
}
sub handle_wwv
{
my $self = shift;
my $ref = shift;
+# my $s;
+# $s = ref $ref ? join ', ',@$ref : $ref;
+
+# chomp $s;
+ $wwv->add_data([tim(), @$ref[6,2,3,4,5,1] ]);
+ $wwvwin->show_all;
+}
+
+
+sub handle_chat
+{
+ my $self = shift;
+ my $ref = shift;
+ my ($t, $ts) = (time, '');
my $s;
- $s = ref $ref ? join ', ',@$ref : $ref;
+ $s = ref $ref ? (join ', ',@$ref) : $ref;
+
+ if (($ann->{lasttime}||0) != $t) {
+ $ts = tim($t);
+ $ann->{lasttime} = $t;
+ }
chomp $s;
- $wwv->add_data([tim(), @$ref[6,2,3,4,5,1] ]);
+ $chat->add_data([$ts, @$ref[3,1,2]]);
+ $chatwin->show_all;
}
sub read_user_data
{
my $u;
-
+
if (-e $userfn) {
my $fh = new IO::File $userfn;
my $s = undef;
}
unless ($u) {
print "$userfn missing or unreadable, starting afresh!\n";
-
+
$u = {
clusters => {
+ 'LOCAL' => {host => '127.0.0.1', port => 7300},
'GB7DJK' => {host => 'gb7djk.dxcluster.net', port => 7300},
'WR3D' => {host => 'wr3d.dxcluster.net', port => 7300},
'GB7BAA' => {host => 'gb7baa.dxcluster.net', port => 7300},
},
- node => 'GB7DJK',
+ node => 'LOCAL',
+ call => $main::myalias,
};
write_user_data($u);
}
sub write_user_data
{
my $u = shift;
-
+
my $fh = new IO::File ">$userfn";
if ($fh) {
my $dd = new Data::Dumper([ $u ]);
$dd->Indent(1);
- $dd->Terse(1);
$dd->Quotekeys(0);
+ $dd->Terse(1);
$fh->print($dd->Dumpxs);
$fh->close;
return 1;
}
+sub set_win
+{
+ my $var = shift;
+ $$var = shift;
+}
+
sub gtk_create_main_screen
{
$main = new Gtk2::Window('toplevel');
my $scr = $main->get_screen;
- $scr_width = int ($scr->get_width > 1280 ? 1280 : $scr->get_width) * 0.99;
- $scr_height = int $scr->get_height * 0.5;
+ $scr_width = $scr->get_width;
+ $scr_width = 700 if $scr_width > 700;
+ $scr_height = int ($scr->get_height * 0.66);
$main->set_default_size($scr_width, $scr_height);
$main->signal_connect('delete_event', sub { Gtk2->main_quit; });
}
],
},
+ _Screens => {
+ item_type =>'<Branch>',
+ children => [
+ _Dx => {
+ item_type => '<CheckMenuItem>',
+ callback => sub { set_win(\$wantdx, $@)},
+ },
+ _Announce => {
+ item_type => '<CheckItem>',
+ callback => sub { set_win(\$wantann, $@)},
+ },
+ _Chat => {
+ item_type => '<CheckItem>',
+ callback => sub { set_win(\$wantchat, $@)},
+ },
+ _WWV => {
+ item_type => '<CheckItem>',
+ callback => sub { set_win(\$wantwwv, $@)},
+ },
+ _WCY => {
+ item_type => '<CheckItem>',
+ callback => sub { set_win(\$wantwcy, $@)},
+ },
+ ],
+ },
_Help => {
item_type => '<Branch>',
},
];
-
+
my $menu = Gtk2::SimpleMenu->new(menu_tree => $menutree, default_callback => \&def_menu_callback, user_data => $user);
$vbox->pack_start($menu->{widget}, 0, 1, 0);
# a paned hbox is packed as the bottom of the vbox
- my $bhpane = Gtk2::HPaned->new;
- $vbox->pack_end($bhpane, 1, 1, 0);
+# my $bhpane = Gtk2::HPaned->new;
+# $vbox->pack_end($bhpane, 1, 1, 0);
# now create the lh and rh panes
- my $lhvpane = Gtk2::VPaned->new;
- my $rhvpane = Gtk2::VPaned->new;
- $bhpane->pack1($lhvpane, 1, 0);
- $bhpane->pack2($rhvpane, 1, 0);
+# my $lhvpane = Gtk2::VPaned->new;
+# my $rhvpane = Gtk2::VPaned->new;
+# $bhpane->pack1($lhvpane, 1, 0);
+# $bhpane->pack2($rhvpane, 1, 0);
- #
- # LEFT HAND SIDE
- #
- # The announce list
- $ann = Screen::List->new(fields =>[
- RxTime => 'tt',
- From => 'tt',
- To => 'tt',
- Announcement => 'ttlesslong',
- ],
- hint => 1,
- frame => 'Announcements',
- size => [$scr_width * 0.45, $scr_height * 0.33],
- );
-
- $lhvpane->pack1($ann->widget, 1, 0);
# The command list
- my $lhvbox = Gtk2::VBox->new(0, 1);
+# my $lhvbox = Gtk2::VBox->new(0, 1);
$cmd = Screen::List->new(fields => [
RxTime => 'tt',
Information => 'ttlong',
],
- size => [$scr_width * 0.45, $scr_height * 0.66],
+ size => [$scr_width, $scr_height * 0.66],
);
- $lhvbox->pack_start($cmd->widget, 1, 1, 0);
+ $vbox->pack_start($cmd->widget, 1, 1, 0);
# callsign and current date and time
$date->{tick} = Glib::Timeout->add(1000, \&updatetime, $date);
$hbox->pack_start( $calllabel, 0, 1, 0 );
$hbox->pack_end($date, 0, 1, 0);
- $lhvbox->pack_start($hbox, 0, 1, 0);
- $lhvbox->pack_start(Gtk2::HSeparator->new, 0, 1, 0);
+ $vbox->pack_start($hbox, 0, 1, 0);
+ $vbox->pack_start(Gtk2::HSeparator->new, 0, 1, 0);
# the bottom handler
$bot = new Gtk2::Entry;
$bot->set_editable(1);
$bot->signal_connect('activate', \&bothandler);
$bot->can_default(1);
- $lhvbox->pack_end($bot, 0, 1, 0);
- $lhvpane->pack2($lhvbox, 1, 0);
+ $vbox->pack_end($bot, 0, 1, 0);
+# $lhvpane->pack2($lhvbox, 1, 0);
$bot->grab_default;
#
- # RIGHT HAND SIDE
+ #
#
+ #
+ # The announce list
+ $annwin = new Gtk2::Window('toplevel');
+ $ann = Screen::List->new(fields =>[
+ RxTime => 'tt',
+ From => 'tt',
+ To => 'tt',
+ Announcement => 'ttlesslong',
+ ],
+ hint => 1,
+ frame => 'Announcements',
+ size => [$scr_width * 0.85, $scr_height * 0.25],
+ );
+ $annwin->add($ann->widget);
+# $annwin->show_all;
+
+ # The announce list
+ $chatwin = new Gtk2::Window('toplevel');
+ $chat = Screen::List->new(fields =>[
+ RxTime => 'tt',
+ From => 'tt',
+ To => 'tt',
+ Chat => 'ttlesslong',
+ ],
+ hint => 1,
+ frame => 'Chat',
+ size => [$scr_width * 0.85, $scr_height * 0.25],
+ );
+ $chatwin->add($chat->widget);
+# $annwin->show_all;
+
# DX window
+ $dxwin = new Gtk2::Window('toplevel');
$dx = Screen::List->new(fields => [
'RxTime' => 'tt',
'QRG' => 'qrg',
hint => 1,
frame => "DX Spots",
maxsize => 500,
- size => [$scr_width * 0.45, $scr_height * 0.45],
+ size => [$scr_width * 0.9, $scr_height * 0.25],
);
- $rhvpane->pack1($dx->widget, 1, 0);
+# $rhvpane->pack1($dx->widget, 1, 0);
+ $dxwin->add($dx->widget);
+# $dxwin->show_all;
# The wwv list
- my $rhvbox = Gtk2::VBox->new(0, 1);
+ $wwvwin = new Gtk2::Window('toplevel');
+ # my $rhvbox = Gtk2::VBox->new(0, 1);
$wwv = Screen::List->new( fields =>[
RxTime => 'tt',
From => 'tt',
policy => ['never', 'automatic'],
frame => 'WWV Data',
);
- $rhvbox->pack_start($wwv->widget, 1, 1, 0);
+ $wwvwin->add($wwv->widget);
+# $wwvwin->show_all;
+
+# $rhvbox->pack_start($wwv->widget, 1, 1, 0);
# The wcy list
+ $wcywin = new Gtk2::Window('toplevel');
$wcy = Screen::List->new(fields => [
RxTime => 'tt',
From => 'tt',
ExpK => 'int',
A => 'int',
R => 'int',
- SFI => 'int',
+ SFI => 'int',
SA => 'tt',
GMF => 'tt',
Aurora => 'tt',
- Hour => 'tt'
+ Hour => 'tt'
],
hint => 1,
policy => ['never', 'automatic'],
frame => 'WCY Data',
);
- $rhvbox->pack_start($wcy->widget, 1, 1, 0);
- $rhvbox->set_size_request($scr_width * 0.45, $scr_height * 0.33);
- $rhvpane->pack2($rhvbox, 1, 0);
+# $rhvbox->pack_start($wcy->widget, 1, 1, 0);
+# $rhvbox->set_size_request($scr_width * 0.45, $scr_height * 0.33);
+# $rhvpane->pack2($rhvbox, 1, 0);
+ $wcywin->add($wcy->widget);
+# $wcywin->show_all;
}