add CTY-3304
[spider.git] / gtkconsole / gtkconsole
index c02f8075af3207c4e7745cdfded542f517464f88..d371f0c48d4478b034eb451f7c7a2d6b1414b7ae 100755 (executable)
@@ -3,23 +3,20 @@
 # 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$';
-$VERSION =~ s|[^\d\.]+||g;
-
 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'};
 }
 
@@ -32,7 +29,7 @@ use IO::File;
 
 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
@@ -45,27 +42,42 @@ our @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
 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;
@@ -78,37 +90,34 @@ if (@ARGV) {
        $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} || $main::myalias;
-               $host = $node->{passwd};
                $host = $node->{host};
-               $port = $node->{port};
+               $port ||= $node->{port};
        }
-}
 
-unless ($call && $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 eq '0.0.0.0';
-               $port ||= 7300;
+       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
@@ -116,7 +125,7 @@ die "You need a callsign ($call), a hostname($host) and a port($port) to proceed
 
 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);
@@ -128,7 +137,7 @@ sendmsg('set/page 500');
 sendmsg('set/nobeep');
 
 my $sock_helper = Gtk2::Helper->add_watch($sock->fileno, 'in', \&tophandler, $sock);
+
 # the main loop
 $main->show_all;
 $bot->grab_focus;
@@ -161,7 +170,7 @@ sub tophandler
 {
        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) {
@@ -176,7 +185,7 @@ sub tophandler
                Gtk2->main_quit;
        }
        1;
-       
+
 }
 
 sub handlemsg
@@ -246,7 +255,7 @@ sub handle_dx
                $dx->{lasttime} = $t;
        }
        $dx->add_data([$ts,  @$ref[0,1,15,3,4,16], stim($ref->[2]) ]);
-       
+       $dxwin->show_all;
 }
 
 sub handle_ann
@@ -254,39 +263,61 @@ 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;
 }
 
 
@@ -349,7 +380,7 @@ sub cldatetime
 sub read_user_data
 {
        my $u;
-       
+
        if (-e $userfn) {
                my $fh = new IO::File $userfn;
                my $s = undef;
@@ -362,7 +393,7 @@ sub read_user_data
        }
        unless ($u) {
                print "$userfn missing or unreadable, starting afresh!\n";
-               
+
                $u = {
                          clusters => {
                                                   'LOCAL' => {host => '127.0.0.1', port => 7300},
@@ -381,13 +412,13 @@ sub read_user_data
 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;
@@ -400,12 +431,19 @@ sub def_menu_callback
 
 }
 
+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; });
 
@@ -424,6 +462,31 @@ sub gtk_create_main_screen
                                                                                                        }
                                                                                  ],
                                                         },
+                                       _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>',
@@ -435,47 +498,31 @@ sub gtk_create_main_screen
                                                         },
 
                                   ];
-       
+
        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);
-
-       #
-       # 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],
-                                                       );
+#      my $lhvpane = Gtk2::VPaned->new;
+#      my $rhvpane = Gtk2::VPaned->new;
+#      $bhpane->pack1($lhvpane, 1, 0);
+#      $bhpane->pack2($rhvpane, 1, 0);
 
-       $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
@@ -485,23 +532,55 @@ sub gtk_create_main_screen
        $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',
@@ -516,12 +595,15 @@ sub gtk_create_main_screen
                                                        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',
@@ -535,9 +617,13 @@ sub gtk_create_main_screen
                                                          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',
@@ -545,18 +631,20 @@ sub gtk_create_main_screen
                                                                                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;
 }