10 my @pokinom_banner = (
11 " _/_/_/ _/_/ _/ _/ _/_/_/ _/ _/ _/_/ _/ _/",
12 " _/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/ _/_/ _/_/ ",
13 " _/_/_/ _/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ ",
14 " _/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/ _/ ",
15 "_/ _/_/ _/ _/ _/_/_/ _/ _/ _/_/ _/ _/ ",
18 my $version = "v0.0.1";
21 # 0 = clean UI; 1 = lots of scrolling junk; anything else = both (pipe to file)
26 my ($pressed_key) = @_;
27 if ($pressed_key eq 267) { qx($shut_down_action); }
28 elsif ($pressed_key eq 273) { # F9
29 $shut_down_when_done = $shut_down_when_done ?
0 : 1; }
32 my %being_deleted_thread;
33 my %rsync_worker_thread;
36 $ENV{USER
} = $rsync_username if ($rsync_username);
37 $ENV{RSYNC_PASSWORD
} = $rsync_password if ($rsync_password);
40 $display_thread->kill('TERM')->join;
41 die "Caught signal $_[0]";
44 # Preparations done; sleeves up!
46 # Make sure we have dirs to put our logs in:
48 ## my ($filename, $directory) = fileparse $_;
49 ## qx(mkdir -p $directory);
50 ## } ( $rsync_log_prefix, $interrupted_prefix );
52 ## # Find usable (i.e. mounted) sources
53 ## my @raw_mount_points = grep (s/\S+ on (.*) type .*/$1/, qx/mount/);
54 ## chomp @raw_mount_points;
55 ## my @sources = intersection @raw_mount_points, @usable_mount_points;
56 ## debug_print "SOURCES:\n";
57 ## debug_print @sources;
68 # Turn a path into a legal perl identifier:
69 sub make_key_from_path
{
71 ($path) =~ s/\/?(.*)\/?
/$1/g;
77 $source_roots{make_key_from_path
$_} = $_
81 'media_disk_1' => '15.20MB/s',
82 'media_disk_2' => '10.02MB/',
83 'media_disk_3' => '-',
84 'media_disk_4' => '242.73kB/s',
85 'media_disk_5' => '6.78MB/s',
86 'media_disk_6' => '-',
87 'media_disk_7' => '-',
101 'media_disk_1' => '951/2300',
102 'media_disk_2' => '217/352',
103 'media_disk_3' => 'Done',
104 'media_disk_4' => '16/223',
105 'media_disk_5' => '1854/1929',
106 'media_disk_6' => 'Wait',
107 'media_disk_7' => 'Done',
111 unless ($debug == 1) {
113 $display_thread = async
{
115 endwin
(); # Leave a usable terminal.
119 my $redraw_window_count = 0;
124 my $window_top = newwin
(24 - 8, 79, 0, 0);
125 my $window_center = newwin
(5, 79, 24 - 8, 0);
126 my $window_bottom = newwin
(3, 79, 24 - 3, 0);
127 $window_bottom->keypad(1);
128 $window_bottom->nodelay(1);
130 init_pair
1, COLOR_MAGENTA
, COLOR_BLACK
;
131 init_pair
2, COLOR_RED
, COLOR_BLACK
;
132 init_pair
3, COLOR_CYAN
, COLOR_BLACK
;
133 init_pair
4, COLOR_YELLOW
, COLOR_BLACK
;
134 my $MAGENTA = COLOR_PAIR
(1);
135 my $RED = COLOR_PAIR
(2);
136 my $CYAN = COLOR_PAIR
(3);
137 my $YELLOW = COLOR_PAIR
(4);
139 $window_top->attron($CYAN);
140 $window_top->box(0,0);
141 $window_top->addstr(0, 30, " P r o g r e s s ");
142 $window_top->attroff($CYAN);
143 $window_top->addstr(15, 1, "$version");
144 my $sources_format = "%-25s%-18s%-8s";
145 $window_top->attron(A_BOLD
);
146 $window_top->addstr(1, 12,
147 sprintf ($sources_format,
148 "Source Medium", "Speed", "To Do"));
149 $window_top->attroff(A_BOLD
);
153 $window_top->attron($CYAN);
154 $window_top->attron($RED) if $done{$source};
156 addstr
($line_number, 12,
157 sprintf($sources_format,
158 substr($source_roots{$source}, 0, 24),
159 substr($speeds{$source}, 0, 17),
160 substr($progress_ratios{$source}, -8, 8)));
162 $window_top->addstr($line_number, 1,
163 sprintf($sources_format, "", "", "", ""));
164 $window_top->attroff($RED);
165 $window_top->attroff($CYAN);
166 } sort (keys %source_roots);
169 $window_center->addstr($line_number, 2, $_);
172 $window_center->move(0, 0);
174 $window_bottom->box(0,0);
175 $window_bottom->attron(A_BOLD
);
178 sprintf ("[F3]: Turn off now.%54s",
179 $shut_down_when_done ?
"Turning off when done. [F9]: Stay on."
180 : "Staying on. [F9]: Turn off when done."));
181 $window_bottom->attroff(A_BOLD
);
183 $window_top->noutrefresh();
184 $window_bottom->noutrefresh();
185 $window_center->noutrefresh(); # Last window gets the cursor.
187 if (++ $redraw_window_count > 5) {
188 $redraw_window_count = 0;
192 act_on_keypress
($window_bottom->getch());
193 if (! grep(/0/, values %done) && $shut_down_when_done) {
194 qx ($shut_down_action);