The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changes 12
Clui/FileSelect.pm 11
Clui.pm 2930
META.yml 11
examples/audio_stuff 711
py/TermClui.py 217
6 files changed (This is a version diff) 4162
@@ -1,4 +1,5 @@
-20130999 1.68 handle Haiku's \eO[ABCD] arrow-keys
+20130999 1.69 
+20130703 1.68 handle Haiku's \eO[ABCD] arrow-keys
 20130323 1.67 Home and End work in sub ask; bug fixes in sub ask_password
 20120905 1.66 ask_filename strips trailing space after filename-completion
 20120327 1.65 also ask_filename introduced
@@ -8,7 +8,7 @@
 #########################################################################
 
 package Term::Clui::FileSelect;
-$VERSION = '1.68';
+$VERSION = '1.69';
 import Term::Clui(':DEFAULT','back_up');
 require Exporter;
 @ISA = qw(Exporter);
@@ -8,7 +8,7 @@
 #########################################################################
 
 package Term::Clui;
-$VERSION = '1.68';   # handle Haiku's \eO[ABCD] arrow-keys
+$VERSION = '1.69';   # handle Haiku's \eO[ABCD] arrow-keys
 my $stupid_bloody_warning = $VERSION;  # circumvent -w warning
 require Exporter;
 @ISA = qw(Exporter);
@@ -391,7 +391,7 @@ sub endwin {
 # ----------------------- size handling ----------------------
 
 my ($maxcols, $maxrows); my $size_changed = 1;
-my ($otherlines, @otherlines, $notherlines);
+my @OtherLines;  # 20131002 $otherlines, $notherlines no longer global
 
 sub check_size {
 	if (! $size_changed) { return; }
@@ -405,9 +405,8 @@ sub check_size {
 	}
 	$maxcols = $maxcols || 80; $maxcols--;
 	$maxrows = $maxrows || 24;
-	if ($notherlines) {
-		@otherlines = &fmt($otherlines);
-		$notherlines = scalar @otherlines;
+	if (@OtherLines) {
+		@OtherLines = &fmt(join("\n",@OtherLines));
 	}
 	$size_changed = 0;
 }
@@ -444,7 +443,7 @@ sub ask { my ($question, $default) = @_;
 	my $nol = &display_question($question);
 
 	my $i = 0; my $n = 0; my @s = (); # cursor position, length, string
-	if ($default) {
+	if (defined $default) {
 		&speak("$question, default is $default");
 		$default =~ s/\t/	/g;
 		@s = split(q{}, $default); $n = scalar @s; $i = $[;
@@ -531,9 +530,8 @@ sub choose {  my $question = shift; local @list = @_;  # @list must be local
 
 	&initscr(mouse_mode=>1, speakup_silent=>1);
 	&size_and_layout(0);
-	@otherlines = &fmt($otherlines);
-	$notherlines = scalar @otherlines;
-	my $speaktext = join(' ',$list[$this_cell],'. ',@otherlines);
+	@OtherLines = &fmt($otherlines);
+	my $speaktext = join(' ',$list[$this_cell],'. ',@OtherLines);
 	if (wantarray) {
 		$#marked = $#list;
 		if ($firstlinelength < $maxcols-30) {
@@ -560,7 +558,7 @@ sub choose {  my $question = shift; local @list = @_;  # @list must be local
 			&up(1); &clrtoeol(); &endwin(); $clue_has_been_given = 0;
 			return wantarray ? () : undef;
 		}
-		my $speaktext = join(' ',$list[$this_cell],'. ',@otherlines);
+		my $speaktext = join(' ',$list[$this_cell],'. ',@OtherLines);
 		&speak("choose, $speaktext");
 	}
 	&wr_screen();
@@ -614,11 +612,12 @@ sub choose {  my $question = shift; local @list = @_;  # @list must be local
 			$this_cell--; &wr_cell($this_cell+1); &wr_cell($this_cell); 
 			&speak($list[$this_cell]);
 		} elsif ((($c eq "j") || ($c == $KEY_DOWN)) && ($irow < $nrows)) {
-			$mid_col = $icol[$this_cell] + 0.5 * length($list[$this_cell]);
-			$left_of_target = 1000;
+			my $mid_col = $icol[$this_cell] + 0.5 * length($list[$this_cell]);
+			my $left_of_target = 1000;
 			for ($inew=$this_cell+1; $inew < $#list; $inew++) {
 				last if $icol[$inew] < $mid_col;	# skip rest of row
 			}
+			my $new_mid_col = 0;
 			for (; $inew < $#list; $inew++) {
 				$new_mid_col = $icol[$inew] + 0.5*length($list[$inew]);
 				last if $new_mid_col >= $mid_col;		# we've reached it
@@ -630,11 +629,12 @@ sub choose {  my $question = shift; local @list = @_;  # @list must be local
 			&wr_cell($iold); &wr_cell($this_cell);
 			&speak($list[$this_cell]);
 		} elsif ((($c eq "k") || ($c == $KEY_UP)) && ($irow > 1)) {
-			$mid_col = $icol[$this_cell] + 0.5*length($list[$this_cell]);
-			$right_of_target = 1000;
+			my $mid_col = $icol[$this_cell] + 0.5*length($list[$this_cell]);
+			my $right_of_target = 1000;
 			for ($inew=$this_cell-1; $inew > 0; $inew--) {
 				last if $irow[$inew] < $irow[$this_cell];	# skip rest of row
 			}
+			my $new_mid_col = 0;
 			for (; $inew > 0; $inew--) {
 				last unless $icol[$inew];
 				$new_mid_col = $icol[$inew] + 0.5*length($list[$inew]);
@@ -731,12 +731,12 @@ sub layout { my @list = @_;
 	return $irow;
 }
 sub wr_screen {
-	my $i;
-	for ($i=$[; $i<=$#list; $i++) {
+	for (my $i=$[; $i<=$#list; $i++) {
 		&wr_cell($i) unless $i==$this_cell;
 	}
+	my $notherlines = scalar @OtherLines;
 	if ($notherlines && ($nrows+$notherlines) < $maxrows) {
-		&puts("\r\n", join("\r\n", @otherlines), "\r");
+		&puts("\r\n", join("\r\n", @OtherLines), "\r");
 	}
 	&wr_cell($this_cell);
 }
@@ -983,9 +983,10 @@ sub edit {	my ($title, $text) = @_;
 		system $ENV{EDITOR} || "vi"; # should also look in ~/db/choices.db
 	} elsif ($argc == 2) {
 		# must create tmp file with title embedded in name
-		$tmpdir = '/tmp';
-		($safename = $title) =~ s/[\W_]+/_/g;
-		$file = "$tmpdir/$safename.$$";
+		my $tmpdir = '/tmp';
+		my $safename = $title;
+		$safename =~ s/[\W_]+/_/g;
+		my $file = "$tmpdir/$safename.$$";
 		if (!open(F,">$file")) {&sorry("can't open $file: $!\n");return q{};}
 		print F $text; close F;
 		$editor = $ENV{EDITOR} || "vi"; # should also look in ~/db/choices.db
@@ -1225,19 +1226,19 @@ sub speak {  my ($text, $wait) = @_;
 sub display_question {   my $question = shift; my %options = @_;
 	# used by &ask and &confirm, but not by &choose ...
 	&check_size();
-	my ($firstline, @otherlines);
+	my ($firstline, $otherlines);  # 20131002 @otherlines => $otherlines
 	if ($options{nofirstline}) {
-		@otherlines = &fmt($question);
+		@OtherLines = &fmt($question);
 	} else {
 		($firstline,$otherlines) = split(/\r?\n/, $question, 2);
-		@otherlines = &fmt($otherlines);
+		@OtherLines = &fmt($otherlines);
 		if ($firstline) { &puts("$firstline "); }
 	}
-	if (@otherlines) {
-		&puts("\r\n", join("\r\n", @otherlines), "\r");
+	if (@OtherLines) {
+		&puts("\r\n", join("\r\n", @OtherLines), "\r");
 		&goto(1 + length $firstline, 0);
 	}
-	return scalar @otherlines;
+	return scalar @OtherLines;
 }
 sub erase_lines {  # leaves cursor at beginning of line $_[$[]
 	&goto(0, $_[$[]); print TTY "\e[J";
@@ -1370,9 +1371,9 @@ The application needs no modification.
 
 There is an equivalent Python3 module,
 with (as far as possible) the same calling interface, at
-http://cpansearch.perl.org/src/PJB/Term-Clui-1.68/py/TermClui.py
+http://cpansearch.perl.org/src/PJB/Term-Clui-1.69/py/TermClui.py
 
-This is Term::Clui.pm version 1.68
+This is Term::Clui.pm version 1.69
 
 =head1 WINDOW-SIZE
 
@@ -1672,6 +1673,6 @@ which were in turn based on some even older curses-based programs in I<C>.
 
 There is an equivalent Python3 module,
 with (as far as possible) the same calling interface, at
-http://cpansearch.perl.org/src/PJB/Term-Clui-1.68/py/TermClui.py
+http://cpansearch.perl.org/src/PJB/Term-Clui-1.69/py/TermClui.py
 
 =cut
@@ -1,7 +1,7 @@
 # http://module-build.sourceforge.net/META-spec-current.html
 #XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
 name:         Term-Clui
-version:      1.68
+version:      1.69
 version_from: Clui.pm
 installdirs:  site
 requires:
@@ -253,8 +253,8 @@ sub copy_dvd {
 	#	if (! rmdir $tmp_mnt) { warn "can't rmdir $tmp_mnt: $!\n"; }
 	#	return 0;
 	#}
-	#system "ls -lR $tmp_mnt/*";
 
+	warn "$dvdbackup -v -M -o $tmp_mnt -i /dev/cdrom\n";
 	system "$dvdbackup -v -M -o $tmp_mnt -i /dev/cdrom";  # uses libdvdcss!
 	# discover the DVD's title
 	my $dh; opendir($dh, $tmp_mnt) or die "can't opendir $tmp_mnt: $!";
@@ -265,20 +265,23 @@ sub copy_dvd {
 	if (1 != scalar @ds) {
 		warn "directories @ds found in $tmp_mnt/ , using $title\n";
 	}
-	mkdir "$tmp_mnt/$title/AUDIO_TS";
+	if (! mkdir "$tmp_mnt/$title/AUDIO_TS") {
+		warn " can't mkdir $tmp_mnt/$title/AUDIO_TS\n";
+	}
 	
     # mkisofs -dvd-video -o i1.img d1/NAQOYQATSI/
     # growisofs -dvd-compat -Z /dev/sr0=i1.img
-
 	# suppress line-feeds in the progress-bar (on stderr) ...
 	system "$mkisofs -gui -r -J -T -dvd-video -allow-limited-size"
-	 ." -V Video_DVD -o $tmpfile $tmp_mnt/$title"
+	 ." -V Video_DVD -o $tmpfile '$tmp_mnt/$title'"
 	 ." 2>&1 | perl -pe 's/\$/\\e[K\\e[A/'";
+	# quotes 20130611, but should use the list form of system
 	#system "umount $tmp_mnt";
 	print "\n";
 	if ($eject) { system $eject; }
 	# if (! rmdir $tmp_mnt) { warn "can't rmdir $tmp_mnt: $!\n"; }
-	use File::Path; File::Path::remove_tree("$tmp_mnt");
+	use File::Path; File::Path::remove_tree($tmp_mnt);
+	unlink $tmp_mnt;
 	system "ls -l $tmpfile";
 	# to be fussy, could  mount -o loop $tmpfile  and check it's OK ...
 	if (! -s $tmpfile) { warn " the iso fs was empty :-(\n"; return; }
@@ -294,6 +297,7 @@ sub copy_dvd {
 	}
 	if (!unlink $tmpfile) { warn "can't unlink $tmpfile: $!\n"; }
 }
+
 sub dvd_size {
 	if (!$mediainfo) {
 		# could try some other program ?
@@ -648,9 +652,9 @@ sub changedir {
 	my $newdir = select_file(-Path=>$ENV{PWD}, -Directory=>1);
 	return unless $newdir;
 	if (! -d $newdir) { sorry("$newdir is not a directory"); return; }
-	if (! chdir $newdir) { sorry("can't chdir to $newdir: \!"); return; }
+	if (! chdir $newdir) { sorry("can't chdir to $newdir: $!"); return; }
 	# assertively rename *.WAV->*.wav, *.MID->*.mid, *.MP3->*.mp3
-	if (! opendir (D, '.')) { sorry("can't opendir $newdir: \!"); return; }
+	if (! opendir (D, '.')) { sorry("can't opendir $newdir: $!"); return; }
 	my @allfiles = grep { !/^\./ } readdir(D);
 	closedir D;
 	my $oldname;
@@ -61,12 +61,12 @@ from http://cpansearch.perl.org/src/PJB/Term-Clui-1.67/py/TermClui.py
 and put it in your PYTHONPATH.  TermClui.py depends on Python3.
 
 TermClui.py is a translation into Python3 of the Perl CPAN Modules
-Term::Clui and Term::Clui::FileSelect.  This is version 1.67
+Term::Clui and Term::Clui::FileSelect.  This is version 1.69
 '''
 import re, sys, select, signal, subprocess, os, random
 import termios, fcntl, struct, stat, time, dbm
 
-VERSION = '1.67'
+VERSION = '1.69'
 
 def _which(s):
     for d in os.getenv('PATH').split(':'):
@@ -266,6 +266,21 @@ def _getch():
             return _KEY_NPAGE 
         if (c == 'Z'):
             return _KEY_BTAB 
+        if (c == 'O'):   # 1.68 Haiku wierdness, inherited from an old Suse
+            c = _getc_wrapper(0)
+            if (c == 'A'):
+                return _KEY_UP    # 1.68
+            if (c == 'B'):
+                return _KEY_DOWN  # 1.68
+            if (c == 'C'):
+                return _KEY_RIGHT # 1.68
+            if (c == 'D'):
+                return _KEY_LEFT  # 1.68
+            if (c == 'F'):
+                return _KEY_END   # 1.68
+            if (c == 'H'):
+                return _KEY_HOME  # 1.68
+            return c
         if (c == '['):
             c = _getc_wrapper(0)
             if (c == 'A'):