# 
# 
# To apply this patch:
# STEP 1: Chdir to the source directory.
# STEP 2: Run the 'applypatch' program with this patch file as input.
#
# If you do not have 'applypatch', it is part of the 'makepatch' package
# that you can fetch from the Comprehensive Perl Archive Network:
# http://www.perl.com/CPAN/authors/Johan_Vromans/makepatch-x.y.tar.gz
# In the above URL, 'x' should be 2 or higher.
#
# To apply this patch without the use of 'applypatch':
# STEP 1: Chdir to the source directory.
# If you have a decent Bourne-type shell:
# STEP 2: Run the shell with this file as input.
# If you don't have such a shell, you may need to manually create
# the files as shown below.
# STEP 3: Run the 'patch' program with this file as input.
#
# These are the commands needed to create/delete files/directories:
#
touch 't/canvas.t'
chmod 0775 't/canvas.t'
#
# This command terminates the shell and need not be executed manually.
exit
#
#### End of Preamble ####

#### Patch data follows ####
diff -up '/usr/local/src/Tk-804.027/MANIFEST' '/home/e/eserte/work/svk-checkouts/Tk/MANIFEST'
Index: ./MANIFEST
--- ./MANIFEST	Thu Apr  8 13:16:50 2004
+++ ./MANIFEST	Thu Nov  2 22:51:40 2006
@@ -1833,6 +1833,7 @@ t/browseentry-subclassing.t
 t/browseentry.t
 t/browseentry2.t
 t/button.t
+t/canvas.t
 t/create.t
 t/cursor.t
 t/dash.t
diff -up '/usr/local/src/Tk-804.027/MANIFEST.SKIP' '/home/e/eserte/work/svk-checkouts/Tk/MANIFEST.SKIP'
Index: ./MANIFEST.SKIP
--- ./MANIFEST.SKIP	Sat Dec 13 19:13:25 2003
+++ ./MANIFEST.SKIP	Sat Nov  4 14:45:19 2006
@@ -74,7 +74,6 @@ pTk/default\.h$
 pTk/exWinHandle\.c$
 pTk/img\.h$
 pTk/imgBMP\.c$
-pTk/imgGIF\.c$
 pTk/imgInit\.c$
 pTk/imgInt\.h$
 pTk/imgObj\.c$
@@ -207,6 +206,7 @@ pTk/tkGrab\.c$
 pTk/tkGrid\.c$
 pTk/tkImage\.c$
 pTk/tkImgBmap\.c$
+pTk/tkImgGIF\.c$
 pTk/tkImgPPM\.c$
 pTk/tkImgPhoto\.c$
 pTk/tkImgUtil\.c$
diff -up '/usr/local/src/Tk-804.027/Text/Text.pm' '/home/e/eserte/work/svk-checkouts/Tk/Text/Text.pm'
Index: ./Text/Text.pm
Prereq:  1.18 
--- ./Text/Text.pm	Wed Mar 17 21:33:56 2004
+++ ./Text/Text.pm	Sat Nov  4 14:52:55 2006
@@ -20,7 +20,8 @@ use strict;
 use Text::Tabs;
 
 use vars qw($VERSION);
-$VERSION = sprintf '4.%03d', q$Revision: #24 $ =~ /\D(\d+)\s*$/;
+#$VERSION = sprintf '4.%03d', q$Revision: #24 $ =~ /\D(\d+)\s*$/;
+$VERSION = '4.025';
 
 use Tk qw(Ev $XS_VERSION);
 use base  qw(Tk::Clipboard Tk::Widget);
@@ -275,7 +276,12 @@ sub ButtonRelease2
  my $Ev = $w->XEvent;
  if (!$Tk::mouseMoved)
   {
-   Tk::catch { $w->insert($Ev->xy,$w->SelectionGet) }
+   Tk::catch
+    {
+     $w->mark('set','insert',$Ev->xy);
+     $w->insert($Ev->xy,$w->SelectionGet);
+     $w->focus if ($w->cget('-state') eq "normal");
+    }
   }
 }
 
diff -up '/usr/local/src/Tk-804.027/Tixish/NoteBook.pm' '/home/e/eserte/work/svk-checkouts/Tk/Tixish/NoteBook.pm'
Index: ./Tixish/NoteBook.pm
--- ./Tixish/NoteBook.pm	Sun Dec 14 20:44:50 2003
+++ ./Tixish/NoteBook.pm	Sat Nov  4 14:55:46 2006
@@ -9,7 +9,8 @@ package Tk::NoteBook;
 
 use vars qw($VERSION);
 
-$VERSION = sprintf '4.%03d', q$Revision: #9 $ =~ /\D(\d+)\s*$/;
+#$VERSION = sprintf '4.%03d', q$Revision: #9 $ =~ /\D(\d+)\s*$/;
+$VERSION = '4.010';
 require Tk::NBFrame;
 
 use base  qw(Tk::Derived Tk::NBFrame);
@@ -231,7 +232,7 @@ sub delete
   {
    $childw->bind('<Destroy>', undef);
    $childw->destroy;
-   @{$w->{'windows'}} = grep($_ !~ /$child/, @{$w->{'windows'}});
+   @{$w->{'windows'}} = grep($_ ne $child, @{$w->{'windows'}});
    $w->{'nWindows'}--;
    $w->SUPER::delete($child);
    # see if the child to be deleted was the top child
diff -up '/usr/local/src/Tk-804.027/Tk/FBox.pm' '/home/e/eserte/work/svk-checkouts/Tk/Tk/FBox.pm'
Index: ./Tk/FBox.pm
--- ./Tk/FBox.pm	Sat Dec 13 13:15:48 2003
+++ ./Tk/FBox.pm	Sat Nov  4 16:28:08 2006
@@ -39,7 +39,8 @@ require Tk::Toplevel;
 use strict;
 use vars qw($VERSION $updirImage $folderImage $fileImage);
 
-$VERSION = sprintf '4.%03d', q$Revision: #18 $ =~ /\D(\d+)\s*$/;
+#$VERSION = sprintf '4.%03d', q$Revision: #18 $ =~ /\D(\d+)\s*$/;
+$VERSION = '4.019';
 
 use base qw(Tk::Toplevel);
 
@@ -796,6 +797,7 @@ sub OkCmd {
     }
 
     my $filename = $filenames->[0];
+    $filename = "" if !defined $filename;
     if ($w->cget('-type') eq 'dir' && $from ne "iconlist") {
 	my $file = $filename eq '' ? $w->{'selectPath'} : JoinFile($w->{'selectPath'}, $filename);
 	$w->Done($file);
diff -up '/usr/local/src/Tk-804.027/Tk/MMtry.pm' '/home/e/eserte/work/svk-checkouts/Tk/Tk/MMtry.pm'
Index: ./Tk/MMtry.pm
--- ./Tk/MMtry.pm	Sun Sep  7 12:15:36 2003
+++ ./Tk/MMtry.pm	Sat Nov  4 14:54:47 2006
@@ -6,7 +6,8 @@ use Config;
 require Exporter;
 
 use vars qw($VERSION @EXPORT);
-$VERSION = sprintf '4.%03d', q$Revision: #9 $ =~ /\D(\d+)\s*$/;
+#$VERSION = sprintf '4.%03d', q$Revision: #9 $ =~ /\D(\d+)\s*$/;
+$VERSION = '4.010';
 
 use base  qw(Exporter);
 @EXPORT = qw(try_compile try_run);
@@ -18,12 +19,13 @@ my $stderr_too = ($^O eq 'MSWin32') ? ''
 
 sub try_compile
 {
- my ($file,$inc,$lib)  = @_;
+ my ($file,$inc,$lib,$def)  = @_;
  $inc = [] unless $inc;
  $lib = [] unless $lib;
+ $def = [] unless $def;
  my $out   = basename($file,'.c').$Config{'exe_ext'};
  warn "Test Compiling $file\n";
- my $msgs  = `$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib $stderr_too`;
+ my $msgs  = `$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib @$def $stderr_too`;
  my $ok = ($? == 0);
 # warn $msgs if $msgs;
  unlink($out) if (-f $out);
@@ -32,14 +34,15 @@ sub try_compile
 
 sub try_run
 {
- my ($file,$inc,$lib)  = @_;
+ my ($file,$inc,$lib,$def)  = @_;
  $inc = [] unless $inc;
  $lib = [] unless $lib;
+ $def = [] unless $def;
  my $out   = basename($file,'.c').$Config{'exe_ext'};
  warn "Test Compile/Run $file\n";
- my $msgs  = `$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib $stderr_too`;
+ my $msgs  = `$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib @$def $stderr_too`;
  my $ok = ($? == 0);
-# warn "$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib:\n$msgs" if $msgs;
+# warn "$Config{'cc'} -o $out $Config{'ccflags'} @$inc $file @$lib @$def:\n$msgs" if $msgs;
  if ($ok)
   {
    my $path = File::Spec->rel2abs($out);
diff -up '/usr/local/src/Tk-804.027/Tk/Menu.pm' '/home/e/eserte/work/svk-checkouts/Tk/Tk/Menu.pm'
Index: ./Tk/Menu.pm
Prereq:  1.34 
--- ./Tk/Menu.pm	Sat Feb 28 17:32:50 2004
+++ ./Tk/Menu.pm	Mon Oct 30 23:18:08 2006
@@ -602,15 +602,14 @@ sub NextMenu
    my $m2 = $menu->parent;
    if ($m2->IsMenu)
     {
+     $menu->activate('none');
+     $menu->GenerateMenuSelect;
+     $m2->SetFocus;
+
+     $m2->postcascade('none');
+
      if ($m2->cget('-type') ne 'menubar')
       {
-       $menu->activate('none');
-       $menu->GenerateMenuSelect;
-       $m2->SetFocus;
-       # This code unposts any posted submenu in the parent.
-       my $tmp = $m2->index('active');
-       $m2->activate('none');
-       $m2->activate($tmp);
        return;
       }
     }
@@ -796,7 +795,7 @@ sub FirstEntry
      if ($menu->type($i) eq 'cascade')
       {
        my $cascade = $menu->entrycget($i,'-menu');
-       if (defined $cascade)
+       if (0 && defined $cascade)
         {
          $menu->postcascade($i);
          $cascade->FirstEntry;
diff -up '/usr/local/src/Tk-804.027/ToDo' '/home/e/eserte/work/svk-checkouts/Tk/ToDo'
Index: ./ToDo
--- ./ToDo	Sat Dec 13 19:21:41 2003
+++ ./ToDo	Fri Nov  3 20:36:07 2006
@@ -1,3 +1,4 @@
+Tk::Tree has a dual live on CPAN. Incorporate the 4.3 version.
 
 Debug icon redraw issues on Solaris/olvwm
 
@@ -11,7 +12,7 @@ Do HTML build
 
 Make "compiled" Tk scripts work.
 
-Add one of FontSelect variants
+Add one of FontSelect variants (e.g. Tk::FontDialog)
 
 TixGrid repair/replace.
 
@@ -20,12 +21,6 @@ Release tkmail
 Start tkdraw ;-)
 
 Non-Sun Drag&Drop (e.g. linux) (Win32 Site now at least partly working.)
-
-Now 5.005_5X has utf8 how do we display it?
-
-Tk::Photo::data dumps core with beta9 and perl5.8.2:
-	$photo = $mw->Photo(-file => "some.gif");
-	$string = $photo->data(-format => "gif");
 
 Stipple bug, see Message-ID: <2uwCb.683348$pl3.76050@pd7tw3no> (should
 be fixed with Tk 8.4.5).
diff -up '/usr/local/src/Tk-804.027/config/xft.c' '/home/e/eserte/work/svk-checkouts/Tk/config/xft.c'
Index: ./config/xft.c
--- ./config/xft.c	Sun Aug 31 20:13:23 2003
+++ ./config/xft.c	Fri Nov  3 20:36:08 2006
@@ -1,3 +1,6 @@
+#ifdef NEED_FT2BUILD_H
+#include <ft2build.h>
+#endif
 #include <X11/Xft/Xft.h>
 
 const char *name = "-*-fixed-medium-r-*-*-*-120-*-*-*-*-iso8859-1";
diff -up '/usr/local/src/Tk-804.027/demos/widget' '/home/e/eserte/work/svk-checkouts/Tk/demos/widget'
Index: ./demos/widget
--- ./demos/widget	Sat Feb 28 17:35:25 2004
+++ ./demos/widget	Tue Oct 31 01:32:41 2006
@@ -62,7 +62,7 @@ my $file = $menubar->cascade(qw/-label F
         ], # end cascade menuitems
       ], # end view cascade
       '',
-      [command    => '~Quit', -command => [\&exit]],
+      [command    => '~Quit', -command => [\&exit], -accelerator => 'Ctrl-Q'],
     ]);
 
 my $help = $menubar->cascade(qw/-label Help -underline 0 -menuitems/ =>
@@ -85,6 +85,8 @@ my $T = $MW->Scrolled('ROText',
 $MW->gridRowconfigure(   0, -weight => 1); # allow expansion in both ...
 $MW->gridColumnconfigure(0, -weight => 1); # ... X and Y dimensions
 
+$MW->bind('<Control-q>' => \&exit);
+
 my $STATUS_VAR;
 my $status = $MW->Label(-textvariable => \$STATUS_VAR, qw/-anchor w/);
 $status->grid(qw/-sticky ew/);
@@ -270,6 +272,7 @@ while ($_ = shift @dirent) {
     my($name) = /^(.*)\.pl$/;
     $_ = <C>;
     my($title) = /^#\s*(.*)$/;
+    $title =~ s{\r}{}g; # strip DOS newlines
     $DEMO_DESCRIPTION{$name} = $title;
     close C;
     $T->insert('end', ++$i . ". $title\n", ['demo', "demo-$name"]);
@@ -307,7 +310,7 @@ sub build_about_dialog {
         -default_button => 'OK',
         -buttons        => ['OK'],
     );
-    my $df = $dialog->add( 'Labelframe', -text => '  2004 - Feb - 11  ' );
+    my $df = $dialog->add( 'Labelframe', -text => '  2006 - Oct - 31  ' );
     $df->pack( qw/ -fill both -expand 1 / );
     my( $change ) = $Tk::CHANGE =~ /Change:\s+(.*)/;
     my( $tk_date ) = scalar localtime( ( stat $Tk::library )[9] );
diff -up '/usr/local/src/Tk-804.027/myConfig' '/home/e/eserte/work/svk-checkouts/Tk/myConfig'
Index: ./myConfig
--- ./myConfig	Sat Feb 28 17:59:28 2004
+++ ./myConfig	Fri Nov  3 20:36:08 2006
@@ -348,15 +348,31 @@ if ($win_arch eq 'x') {
     if ($ftinc)
      {
       print "xlib='$xlib' xinc='$xinc'\n";
-      if (try_run("config/xft.c",[$xinc,$ftinc],[$xlib,'-lXft','-lfontconfig']))
+      my $success = 0;
+      # Including ft2build.h additionally seems to be necessary
+      # on an old RedHat 8.0 system
+      for my $def ([], ["-DNEED_FT2BUILD_H"])
        {
-        $inc .= " $ftinc";
-        warn "Seem to have -lXft\n";
-        $define{USE_XFT_FONTS} = 1;
-        $xlib .= " -lXft";
-        $xtra = ' -lfontconfig';
+	if (try_run("config/xft.c",[$xinc,$ftinc],[$xlib,'-lXft','-lfontconfig'],$def))
+         {
+          $inc .= " $ftinc";
+          warn "Seem to have -lXft\n";
+          $define{USE_XFT_FONTS} = 1;
+          $xlib .= " -lXft";
+          $xtra = ' -lfontconfig';
+	  if (@$def)
+	   {
+	    for my $d (@$def)
+	     {
+	      $d =~ s{-D}{};
+	      $define{$d} = 1;
+	     }
+	   }
+	  $success = 1;
+	  last;
+         }
        }
-      else
+      if (!$success)
        {
 	warn "Xft and/or fontconfig libraries and/or includes are missing\n";
        }
diff -up '/usr/local/src/Tk-804.027/pTk/mTk/generic/tkCanvWind.c' '/home/e/eserte/work/svk-checkouts/Tk/pTk/mTk/generic/tkCanvWind.c'
Index: ./pTk/mTk/generic/tkCanvWind.c
Prereq:  1.9 
--- ./pTk/mTk/generic/tkCanvWind.c	Fri Dec 19 12:54:51 2003
+++ ./pTk/mTk/generic/tkCanvWind.c	Tue Oct 31 01:40:39 2006
@@ -383,6 +383,14 @@ ConfigureWinItem(interp, canvas, itemPtr
 		    (ClientData) winItemPtr);
 	}
     }
+    if ((winItemPtr->tkwin != NULL)
+	    && (itemPtr->state == TK_STATE_HIDDEN)) {
+	if (canvasTkwin == Tk_Parent(winItemPtr->tkwin)) {
+	    Tk_UnmapWindow(winItemPtr->tkwin);
+	} else {
+	    Tk_UnmaintainGeometry(winItemPtr->tkwin, canvasTkwin);
+	}
+    }
 
     ComputeWindowBbox(canvas, winItemPtr);
 
diff -up '/usr/local/src/Tk-804.027/pTk/mTk/generic/tkEvent.c' '/home/e/eserte/work/svk-checkouts/Tk/pTk/mTk/generic/tkEvent.c'
Index: ./pTk/mTk/generic/tkEvent.c
Prereq:  1.17.2.1 
--- ./pTk/mTk/generic/tkEvent.c	Tue Dec 30 12:54:31 2003
+++ ./pTk/mTk/generic/tkEvent.c	Mon Oct 30 23:18:14 2006
@@ -986,7 +986,9 @@ Tk_HandleEvent(eventPtr)
 		TkWmProtocolEventProc(winPtr, eventPtr);
 	    } else {
 		/* Perl/Tk had/has its own hook for this */
-		LangClientMessage(winPtr->mainPtr->interp, (Tk_Window) winPtr, eventPtr);
+		if (eventPtr && winPtr && winPtr->mainPtr) {
+		    LangClientMessage(winPtr->mainPtr->interp, (Tk_Window) winPtr, eventPtr);
+		}
 
 		/*
 		 * Finally, invoke any ClientMessage event handlers.
diff -up '/usr/local/src/Tk-804.027/pTk/mTk/tclUnix/tclUnixTime.c' '/home/e/eserte/work/svk-checkouts/Tk/pTk/mTk/tclUnix/tclUnixTime.c'
Index: ./pTk/mTk/tclUnix/tclUnixTime.c
Prereq:  1.15 
--- ./pTk/mTk/tclUnix/tclUnixTime.c	Fri Dec 19 12:55:00 2003
+++ ./pTk/mTk/tclUnix/tclUnixTime.c	Mon Oct 30 23:18:12 2006
@@ -18,6 +18,8 @@
 
 #ifdef __EMX__
 #   include <sys/time.h>
+#else
+#   include <time.h>
 #endif
 
 #if 0
diff -up '/usr/local/src/Tk-804.027/pTk/mTk/unix/tkUnixWm.c' '/home/e/eserte/work/svk-checkouts/Tk/pTk/mTk/unix/tkUnixWm.c'
Index: ./pTk/mTk/unix/tkUnixWm.c
Prereq:  1.36 
--- ./pTk/mTk/unix/tkUnixWm.c	Fri Mar 26 23:03:02 2004
+++ ./pTk/mTk/unix/tkUnixWm.c	Tue Oct 31 01:17:07 2006
@@ -363,7 +363,8 @@ static void		UpdateCommand _ANSI_ARGS_((
 static void		UpdateGeometryInfo _ANSI_ARGS_((
 			    ClientData clientData));
 static void		UpdateHints _ANSI_ARGS_((TkWindow *winPtr));
-static void		UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr));
+static void		UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr,
+			    int newWidth, int newHeight));
 static void		UpdateVRootGeometry _ANSI_ARGS_((WmInfo *wmPtr));
 static void		UpdateWmProtocols _ANSI_ARGS_((WmInfo *wmPtr));
 static void		WaitForConfigureNotify _ANSI_ARGS_((TkWindow *winPtr,
@@ -4197,7 +4198,7 @@ UpdateGeometryInfo(clientData)
 	wmPtr->flags |= WM_UPDATE_SIZE_HINTS;
     }
     if (wmPtr->flags & WM_UPDATE_SIZE_HINTS) {
-	UpdateSizeHints(winPtr);
+	UpdateSizeHints(winPtr, width, height);
     }
 
     /*
@@ -4331,8 +4332,10 @@ UpdateGeometryInfo(clientData)
  */
 
 static void
-UpdateSizeHints(winPtr)
+UpdateSizeHints(winPtr, newWidth, newHeight)
     TkWindow *winPtr;
+    int newWidth;
+    int newHeight;
 {
     register WmInfo *wmPtr = winPtr->wmInfoPtr;
     XSizeHints *hintsPtr;
@@ -4394,20 +4397,13 @@ UpdateSizeHints(winPtr)
      */
 
     if (wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) {
-	if (wmPtr->width >= 0) {
-	    hintsPtr->min_width = wmPtr->width;
-	} else {
-	    hintsPtr->min_width = winPtr->reqWidth;
-	}
-	hintsPtr->max_width = hintsPtr->min_width;
+	hintsPtr->max_width = hintsPtr->min_width = newWidth;
+	hintsPtr->flags |= PMaxSize;
     }
     if (wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE) {
-	if (wmPtr->height >= 0) {
-	    hintsPtr->min_height = wmPtr->height;
-	} else {
-	    hintsPtr->min_height = winPtr->reqHeight + wmPtr->menuHeight;
-	}
-	hintsPtr->max_height = hintsPtr->min_height;
+	hintsPtr->max_height = hintsPtr->min_height =
+		newHeight + wmPtr->menuHeight;
+	hintsPtr->flags |= PMaxSize;
     }
 
     XSetWMNormalHints(winPtr->display, wmPtr->wrapperPtr->window, hintsPtr);
diff -up '/usr/local/src/Tk-804.027/pTk/mTk/unix/tkUnixXft.c' '/home/e/eserte/work/svk-checkouts/Tk/pTk/mTk/unix/tkUnixXft.c'
Index: ./pTk/mTk/unix/tkUnixXft.c
Prereq:  1.5 
--- ./pTk/mTk/unix/tkUnixXft.c	Thu Sep 11 13:32:32 2003
+++ ./pTk/mTk/unix/tkUnixXft.c	Fri Nov  3 20:36:08 2006
@@ -27,6 +27,9 @@
 
 #ifdef USE_XFT_FONTS
 
+#ifdef NEED_FT2BUILD_H
+#include <ft2build.h>
+#endif
 #include <X11/Xft/Xft.h>
 #include <ctype.h>
 
diff -up '/usr/local/src/Tk-804.027/pTk/mTk/xlib/X11/Xlib.h' '/home/e/eserte/work/svk-checkouts/Tk/pTk/mTk/xlib/X11/Xlib.h'
Index: ./pTk/mTk/xlib/X11/Xlib.h
--- ./pTk/mTk/xlib/X11/Xlib.h	Sat Apr  3 19:57:55 2004
+++ ./pTk/mTk/xlib/X11/Xlib.h	Mon Oct 30 23:18:13 2006
@@ -1203,7 +1203,7 @@ _XFUNCPROTOBEGIN
 
 
 
-#include "../pTk/tkIntXlibDecls.h"
+#include "../../../pTk/tkIntXlibDecls.h"
 
 _XFUNCPROTOEND
 
diff -up '/usr/local/src/Tk-804.027/pod/Font.pod' '/home/e/eserte/work/svk-checkouts/Tk/pod/Font.pod'
Index: ./pod/Font.pod
--- ./pod/Font.pod	Sat Jul 19 10:39:40 2003
+++ ./pod/Font.pod	Sat Nov  4 16:18:22 2006
@@ -206,13 +206,13 @@ such as lower-case ``g'' stick below the
 
 The amount in pixels that the tallest letter sticks up above the baseline of
 the font, plus any extra blank space added by the designer of the font.
-(I<$font>-<gt>B<ascent> is provided for compatibility.)
+(I<$font>-E<gt>B<ascent> is provided for compatibility.)
 
 =item B<-descent>
 
 The largest amount in pixels that any letter sticks down below the baseline
 of the font, plus any extra blank space added by the designer of the font.
-(I<$font>-<gt>B<descent> is provided for compatibility.)
+(I<$font>-E<gt>B<descent> is provided for compatibility.)
 
 =item B<-linespace>
 
diff -up '/usr/local/src/Tk-804.027/pod/Widget.pod' '/home/e/eserte/work/svk-checkouts/Tk/pod/Widget.pod'
Index: ./pod/Widget.pod
--- ./pod/Widget.pod	Wed Mar 10 09:35:40 2004
+++ ./pod/Widget.pod	Mon Oct 30 23:18:08 2006
@@ -613,6 +613,12 @@ to user interactions.
 If an event handler invokes B<tkwait> again, the nested call
 to B<tkwait> must complete before the outer call can complete.
 
+=item I<$widget>-E<gt>B<Walk>(I<proc>?, I<arg, ...>?)
+
+Traverse a widget hierarchy starting at I<$widget> while executing the
+subroutine I<proc> to every visited widget. The arguments I<arg, ...>
+are supplied to the subroutine.
+
 =item I<$widget>-E<gt>B<width>
 
 Returns a decimal string giving I<$widget>'s width in pixels.
diff -up '/usr/local/src/Tk-804.027/ptksh' '/home/e/eserte/work/svk-checkouts/Tk/ptksh'
Index: ./ptksh
--- ./ptksh	Sun Jul 27 17:23:57 2003
+++ ./ptksh	Sat Nov  4 14:16:47 2006
@@ -31,6 +31,8 @@
 #  - Clarify <Up> in docs and help means "up arrow"
 #  - Use HOMEDRIVE/HOMEPATH on Win32
 #
+# For more history look at the various Changes files in the Perl/Tk
+# distribution.
 
 =head1 NAME
 
@@ -94,11 +96,13 @@ in perl/Tk widget easier:
 
 displays a short help summary.
 
-=item B<d> ?I<args>, ...?
+=item B<d>, or B<x> ?I<args>, ...?
 
 Dumps recursively arguments to stdout. (see L<Data::Dumper>).
 You must have <Data::Dumper> installed to support this feature.
 
+B<x> was introduced for perl debugger compatibility.
+
 =item B<p> ?I<arg>, ...?
 
 appends "|\n" to each of it's arguments and prints it.
@@ -194,7 +198,7 @@ L<perldebug|perldebug>
 
 =head1 VERSION
 
-VERSION 2.02
+VERSION 2.03
 
 =head1 AUTHORS
 
@@ -217,7 +221,7 @@ use Tk;
 use vars qw($NAME $VERSION $FONT @FONT $WIN32 $HOME $HISTFILE $HISTSAVE $PROMPT $INITFILE);
 
 $NAME = 'ptksh';
-$VERSION = '2.02';
+$VERSION = '2.03';
 $WIN32 = 1 if $^O =~ /Win32/;
 $HOME = $WIN32 ? ($ENV{HOMEDRIVE} . $ENV{HOMEPATH}) || 'C:\\' : $ENV{HOME} . "/";
 @FONT = ($WIN32 ? (-font => 'systemfixed') : () );
@@ -252,7 +256,12 @@ $st = $mw->Scrolled('Text', -scrollbars 
 				-width => 80, -height => 25, @FONT);
 $t = $st->Subwidget('scrolled');
 $st->pack(-fill => 'both', -expand => 'true');
-$mw->bind('<Map>', sub {Center($mw);} );
+# $mw_mapped assures that Center is only called exactly twice: first time
+# will determine geometry of window, second time centering will work.
+# I observed a couple of further <Map> events, which are now ignored
+# and thus window creation seems to be faster now.
+my $mw_mapped;
+$mw->bind('<Map>', sub {return if $mw_mapped && $mw_mapped>=2; Center($mw); $mw_mapped++;} );
 
 # Event bindings
 $t->bindtags([$t, ref($t), $t->toplevel, 'all']); # take first crack at events
@@ -264,9 +273,19 @@ $t->bind('<Control-a>', \&BeginLine);
 $t->bind('<Home>', \&BeginLine);
 $t->bind('<Any-KeyPress>', [\&Key, Tk::Ev('K'), Tk::Ev('A')]);
 
+my $default_font = $t->cget(-font);
+my %default_font = $t->fontActual($default_font);
+my $normal_font;
+if (!$t->fontMetrics($default_font, '-fixed')) {
+    $normal_font = $t->fontCreate(%default_font, -family => "courier");
+    $t->configure(-font => $normal_font);
+}
+my %normal_font = $t->fontActual($normal_font);
+my $bold_font = $t->fontCreate(%normal_font, -weight => "bold");
+
 # Set up different colors for the various window outputs
 #$t->tagConfigure('prompt', -underline => 'true');
-$t->tagConfigure('prompt', -foreground => 'blue');
+$t->tagConfigure('prompt', -foreground => 'blue', -font => $bold_font);
 $t->tagConfigure('result', -foreground => 'purple');
 $t->tagConfigure('error', -foreground => 'red');
 $t->tagConfigure('output', -foreground => 'blue');
@@ -331,6 +350,7 @@ $t->focus;
 #$mw->after(1000, sub {print STDERR "now\n"; $mw->focus; $t->focus;});
 
 ##### Now enter main loop
+#$mw->afterIdle(sub {Center($mw);});
 MainLoop();
 
 ####### Callbacks/etc.
@@ -446,11 +466,13 @@ sub History {
 	$hist->bind('<Double-1>', \&HistPick);
 	$hist->bind('<Return>', \&HistPick);
 	$hist->bind('<Escape>', \&HistKill);
-	$hist->bind('<Map>', sub {Center($hist);} );
+	my $hist_mapped; # see above for $mw_mapped
+	$hist->bind('<Map>', sub {return if $hist_mapped && $hist_mapped>=2; Center($hist); $hist_mapped++;} );
 	$hist->bind('<Destroy>', \&HistDestroy);
 	$hist->focus;
 	$list->focus;
 	$hist->grab;
+	#$mw->afterIdle(sub {Center($hist);});
 	Tk->break;
 }
 
@@ -642,7 +664,7 @@ sub _h
     print <<'EOT';
 
   ? or h          print this message
-  d arg,...       calls Data::Dumper::Dumper
+  d or x arg,...  calls Data::Dumper::Dumper
   p arg,...       print args, each on a line and "|\n"
   o $w /regexp/   print options of widget matching regexp
   o $w [opt ...]  print (all) options of widget
@@ -668,7 +690,7 @@ sub PtkshCommand {
 		last if s/^\?\s*$/Tk::ptksh::_h /;
 		last if s/^h\s*$/Tk::ptksh::_h /;
 		last if s/^u(\s+|$)/Tk::ptksh::_u /;
-		last if s/^d\s+/Tk::ptksh::_d /;
+		last if s/^[dx]\s+/Tk::ptksh::_d /;
 		last if s/^u\s+(\S+)/Tk::ptksh::_u('$1')/;
 		last if s/^p\s+(.*)$/Tk::ptksh::_p $1;/;
 		last if s/^o\s+(\S+)\s*?$/Tk::ptksh::_o $1;/;
diff -up /dev/null '/home/e/eserte/work/svk-checkouts/Tk/t/canvas.t'
Index: ./t/canvas.t
--- ./t/canvas.t	Thu Jan  1 01:00:00 1970
+++ ./t/canvas.t	Fri Nov  3 22:00:45 2006
@@ -0,0 +1,515 @@
+#!/usr/bin/perl -w
+# -*- perl -*-
+
+#
+# $Id: $
+# Translated by: Slaven Rezic
+#
+# Original copyright from tk/tests/canvas.test, version 1.23 from
+# tktoolkit CVS on sourceforge:
+
+# This file is a Tcl script to test out the procedures in tkCanvas.c,
+# which implements generic code for canvases.  It is organized in the
+# standard fashion for Tcl tests.
+#
+# Copyright (c) 1995-1996 Sun Microsystems, Inc.
+# Copyright (c) 1998-2000 Ajuba Solutions.
+# All rights reserved.
+#
+# RCS: @(#) $Id: canvas.test,v 1.23 2004/12/07 21:22:19 dgp Exp $
+
+use strict;
+
+use Getopt::Long;
+use Tk;
+
+BEGIN {
+    if (!eval q{
+	use Test::More;
+	1;
+    }) {
+	print "1..0 # skip: no Test::More module\n";
+	exit;
+    }
+}
+
+plan tests => 158;
+
+use_ok("Tk::Canvas");
+
+my $verbose = 0;
+GetOptions("v" => \$verbose)
+    or die "usage: $0 [-v]";
+
+# XXX - This test file is woefully incomplete.  At present, only a
+# few of the features are tested.
+
+my $mw = MainWindow->new;
+$mw->geometry("+10+10");
+my $c = $mw->Canvas;
+isa_ok($c, "Tk::Canvas");
+isa_ok($c, "Tk::Widget");
+$c->pack;
+$c->update;
+
+sub deleteWindows () {
+    eval { $_->destroy } for $mw->children;
+}
+
+use constant SKIP_CGET    => 5;
+use constant SKIP_CONF    => 6;
+use constant SKIP_ERROR   => 7;
+use constant SKIP_RESTORE => 8;
+
+my @tests =
+   (
+    ['-background', '#ff0000', '#ff0000', 'non-existent',
+     'unknown color name "non-existent"'],
+    ['-bg', '#ff0000', '#ff0000', 'non-existent',
+     'unknown color name "non-existent"'],
+    [qw(-bd 4 4 badValue), 'bad screen distance "badValue"'],
+    [qw(-borderwidth 1.3 1 badValue), 'bad screen distance "badValue"'],
+    [qw(-closeenough 24 24 bogus), q{'bogus' isn't numeric}],
+    [qw(-confine true 1 silly), 'expected boolean value but got "silly"', 0,0,1,0], # probably auto-converted to some boolean value?
+    [qw(-cursor arrow arrow badValue), 'bad cursor spec "badValue"'],
+    [qw(-height 2.1 2 x42), 'bad screen distance "x42"'],
+    [qw(-highlightbackground), '#112233', '#112233', 'ugly', 'unknown color name "ugly"'],
+    [qw(-highlightcolor), '#110022', '#110022',	'bogus', 'unknown color name "bogus"'],
+    [qw(-highlightthickness 18 18 badValue), 'bad screen distance "badValue"'],
+    [qw(-insertbackground), '#110022', '#110022', 'bogus', 'unknown color name "bogus"'],
+    [qw(-insertborderwidth 1.3 1 2.6x), 'bad screen distance "2.6x"'],
+    [qw(-insertofftime 100 100 3.2), q{expected integer but got "3.2"}, 0,0,1,0], # probably auto-converted to integer?
+    [qw(-insertontime 100 100 3.2), q{expected integer but got "3.2"}, 0,0,1,0], # probably auto-converted to integer?
+    [qw(-insertwidth 1.3 1 6x), q{bad screen distance "6x"}],
+    [qw(-relief groove groove 1.5), q{bad relief type "1.5": must be flat, groove, raised, ridge, solid, or sunken}],
+    [qw(-selectbackground), '#110022', '#110022', 'bogus', q{unknown color name "bogus"}],
+    [qw(-selectborderwidth 1.3 1 badValue), q{bad screen distance "badValue"}],
+    [qw(-selectforeground), '#654321', '#654321', 'bogus', q{unknown color name "bogus"}],
+    [qw(-takefocus), "any string", "any string", undef, undef],
+    [qw(-width 402 402 xyz), q{bad screen distance "xyz"}],
+    [qw(-xscrollcommand), q{Some command}, q{Some command}, undef, undef, 1],
+    [qw(-yscrollcommand), q{Another command}, q{Another command}, undef, undef, 1],
+);
+
+foreach my $test (@tests) {
+    my $name = $test->[0];
+    $c->configure($name, $test->[1]);
+    if (!$test->[SKIP_CGET]) {
+	is($c->cget($name), $test->[2], "cget $name");
+    }
+    if (!$test->[SKIP_CONF]) {
+	is(($c->configure($name))[4], $c->cget($name), "Comparing configure and cget values for $name");
+    }
+
+    if (defined $test->[4]) {
+	if (!$test->[SKIP_ERROR]) {
+	    eval { $c->configure($name, $test->[3]) };
+	    like($@, qr/$test->[4]/, "Expected error message for $name");
+	}
+    }
+    if (!$test->[SKIP_RESTORE]) {
+	$c->configure($name, ($c->configure($name))[3]);
+    }
+}
+
+eval { $c->configure(-gorp => "foo") };
+like($@, qr{Bad option `-gorp'}, "configure throws error on bad option");
+$c->create("rect",10,10,100,100);
+eval { $c->configure(-gorp => "foo") };
+like($@, qr{Bad option `-gorp'}, "configure throws error on bad option");
+
+eval { $c->destroy };
+$c = $mw->Canvas(qw(-width 60 -height 40),
+		 -scrollregion => [qw(0 0 200 150)],
+		 -bd => 0,
+		 -highlightthickness => 0,
+		)->pack;
+$c->update;
+
+{
+    my $i = $c->createRectangle(10,10,100,100);
+    eval { $c->bind($i, "<a>") };
+    is($@, "", "bind method");
+}
+
+{
+    my $i = $c->create('rect',10,10,100,100);
+    eval { $c->bind($i, "<") };
+    like($@, qr{no event type or button # or keysym}, "bind method with failure");
+}
+
+{
+    $c->configure(-xscrollincrement => 40, -yscrollincrement => 5);
+    $c->xview('moveto', 0);
+    $c->update;
+    is_deeply([$c->xview], [0, 0.3], "xview method");
+    $c->xview('scroll', 2, 'units');
+    $c->update;
+    is_deeply([$c->xview], [0.4, 0.7], "xview method after scroll");
+}
+
+{
+    # Tcl/Tk comment:
+    # This test gives slightly different results on platforms such
+    # as NetBSD.  I don't know why...
+    # Perl/Tk comment:
+    # Everything's ok on a FreeBSD machine.
+    $c->configure(-xscrollincrement => 0, -yscrollincrement => 5);
+    $c->xviewMoveto(0.6);
+    $c->update;
+    is_deeply([$c->xview], [0.6, 0.9], "xview method (2)");
+    $c->xviewScroll(2, 'units');
+    $c->update;
+    is_deeply([$c->xview], [0.66, 0.96], "xview method after scroll (2)");
+}
+
+eval { $c->destroy };
+$c = $mw->Canvas(qw(-width 60 -height 40),
+		 -scrollregion => [qw(0 0 200 80)],
+		 -borderwidth => 0,
+		 -highlightthickness => 0,
+		)->pack;
+$c->update;
+
+{
+    $c->configure(qw(-xscrollincrement 40 -yscrollincrement 5));
+    $c->yview('moveto', 0);
+    $c->update;
+    is_deeply([$c->yview], [0, 0.5], "yview method");
+    $c->yview('scroll', 3, 'units');
+    $c->update;
+    is_deeply([$c->yview], [0.1875, 0.6875], "yview method after scroll");
+}
+
+{
+    $c->configure(qw(-xscrollincrement 40 -yscrollincrement 0));
+    $c->yviewMoveto(0);
+    $c->update;
+    is_deeply([$c->yview], [0, 0.5], "yview method (2)");
+    $c->yviewScroll(2, 'units');
+    $c->update;
+    is_deeply([$c->yview], [0.1, 0.6], "yview method after scroll (2)");
+}
+
+{
+    eval { $c->destroy };
+    $c = $mw->Canvas(qw(-width 100 -height 50),
+		     -scrollregion => [qw(-200 -100 305 102)],
+		     -borderwidth => 2,
+		     -highlightthickness => 3,
+		    )->pack;
+    $c->update;
+    $c->configure(qw(-xscrollincrement 0 -yscrollincrement 0));
+    $c->xview('moveto', 0);
+    $c->yview('moveto', 0);
+    $c->update;
+    is($c->canvasx(0), -205, "canvasx after scrolling to origin");
+    is($c->canvasy(0), -105, "canvasy after scrolling to origin");
+}
+
+{
+    $c->configure(qw(-xscrollincrement 20 -yscrollincrement 10));
+    my @x;
+    for my $i (qw(.08 .10 .48 .50)) {
+	$c->xviewMoveto($i);
+	$c->update;
+	push @x, $c->canvasx(0);
+    }
+    is_deeply(\@x, [-165, -145, 35, 55], "canvasx after multiple scroll");
+}
+
+{
+    $c->configure(qw(-xscrollincrement 20 -yscrollincrement 10));
+    my @x;
+    for my $i (qw(.06 .08 .70 .72)) {
+	$c->yviewMoveto($i);
+	$c->update;
+	push @x, $c->canvasy(0);
+    }
+    is_deeply(\@x, [-95, -85, 35, 45], "canvasy after multiple scroll");
+}
+
+{
+    $c->configure(qw(-xscrollincrement 20 -yscrollincrement 10));
+    $c->xview('moveto', 1.0);
+    is($c->canvasx(0), 215);
+}
+
+{
+    $c->configure(qw(-xscrollincrement 20 -yscrollincrement 10));
+    $c->yview(moveto => 1.0);
+    is($c->canvasy(0), 55);
+}
+
+deleteWindows;
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test dumps SV contents ...
+    $c = $mw->Canvas;
+    $c->create(qw(arc -100 10 100 210 -start 10 -extent 50 -style arc -tags arc1));
+    is_deeply([$c->bbox("arc1")], [qw(48 21 100 94)], "BBox of arc");
+    $c->createArc(qw(100 10 300 210 -start 10 -extent 50 -style chord -tags arc2));
+    is_deeply([$c->bbox("arc2")], [qw(248 21 300 94)], "BBox of chord");
+    $c->create(qw(arc 300 10 500 210 -start 10 -extent 50 -style pieslice -tags arc3));
+    is_deeply([$c->bbox("arc3")], [qw(398 21 500 112)], "BBox of pieslice");
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test dumps SV contents ...
+    $c = $mw->Canvas;
+
+    # With Tk 8.0.4 the ids are now stored in a hash table.  You
+    # can use this test as a performance test with older versions
+    # by changing the value of size.
+    my $size = 15;
+
+    for my $i (0 .. $size-1) {
+	my $x = -10 + 3*$i;
+	for(my $j = 0, my $y = -10; $j < 10; $j++, $y+=3) {
+	    $c->create('rect', "${x}c", "${y}c", ($x+2)."c", ($y+2)."c",
+		       qw(-outline black -fill blue -tags rect));
+	    $c->create('text', ($x+1)."c", ($y+1)."c", -text => "$i,$j",
+		       qw(-anchor center -tags text));
+	}
+    }
+
+    # The actual bench mark - this code also exercises all the hash
+    # table changes.
+
+    my $time = Tk::timeofday();
+    foreach my $id ($c->find(withtag => "all")) {
+	$c->lower($id);
+	$c->raise($id);
+	$c->find(withtag => $id);
+	$c->bind('<Return>', $id, '');
+	$c->delete($id);
+    }
+    my $delta = Tk::timeofday() - $time;
+    diag "Canvas creation and deletion test needed $delta s"
+	if $verbose;
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test dumps SV contents ...
+    $c = $mw->Canvas;
+
+    $c->create(qw(oval 20 20 40 40 -fill red -tag) , [qw(a b c d)]);
+    $c->create(qw(oval 20 60 40 80 -fill yellow -tag), [qw(b a)]);
+    $c->create(qw(oval 20 100 40 120 -fill green -tag), [qw(c b)]);
+    $c->create(qw(oval 20 140 40 160 -fill blue -tag), [qw(b)]);
+    $c->create(qw(oval 20 180 40 200 -fill bisque -tag), [qw(a d e)]);
+    $c->create(qw(oval 20 220 40 240 -fill bisque -tag b));
+    $c->create(qw(oval 20 260 40 280 -fill bisque -tag), ['d', "tag with spaces"]);
+
+    is_deeply([$c->find(withtag => q{!a})],[qw(3 4 6 7)], "Tag expressions");
+    is_deeply([$c->find(withtag => q{b&&c})],[qw(1 3)]);
+    is_deeply([$c->find(withtag => q{b||c})],[qw(1 2 3 4 6)]);
+    is_deeply([$c->find(withtag => q{a&&!b})],[qw(5)]);
+    is_deeply([$c->find(withtag => q{!b&&!c})],[qw(5 7)]);
+    is_deeply([$c->find(withtag => q{d&&a&&c&&b})],[qw(1)]);
+    is_deeply([$c->find(withtag => q{b^a})],[qw(3 4 5 6)]);
+    is_deeply([$c->find(withtag => q{(a&&!b)||(!a&&b)})],[qw(3 4 5 6)]);
+    is_deeply([$c->find(withtag => q{ ( a && ! b ) || ( ! a && b ) })],[qw(3 4 5 6)]);
+    is_deeply([$c->find(withtag => q{a&&!(c||d)})],[qw(2)]);
+    is_deeply([$c->find(withtag => q{d&&"tag with spaces"})],[qw(7)], "Tag with spaces");
+    is_deeply([$c->find(withtag => q"tag with spaces")],[qw(7)]);
+}
+
+for my $testdef (
+		 [q{&&c}, qr{Unexpected operator in tag search expression}],
+		 [q{!!c}, qr{Too many '!' in tag search expression}],
+		 [q{b||}, qr{Missing tag in tag search expression}],
+		 [q{b&&(c||)}, qr{Unexpected operator in tag search expression}],
+		 [q{d&&""}, qr{Null quoted tag string in tag search expression}],
+		 [q"d&&\"tag with spaces", qr{Missing endquote in tag search expression}],
+		 [q{a&&"tag with spaces"z}, qr{Invalid boolean operator in tag search expression}],
+		 [q{a&&b&c}, qr{Singleton '&' in tag search expression}],
+		 [q{a||b|c}, qr{Singleton '|' in tag search expression}],
+		) {
+    my($tag_expr, $error_rx) = @$testdef;
+
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas;
+
+    $c->create(qw(oval 20 20 40 40 -fill red -tag), [qw(a b c d)]);
+    $c->create(qw(oval 20 260 40 280 -fill bisque -tag), ['d', "tag with spaces"]);
+    eval { $c->find(withtag => $tag_expr) };
+    like($@, $error_rx, "Tag expression error ($tag_expr)");
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas;
+
+    $c->create(qw(oval 20 20 40 40 -fill red -tag), [q{ strange tag(xxx&yyy|zzz) " && \" || ! ^ " }]);
+    ok($c->find(withtag => q{ strange tag(xxx&yyy|zzz) " && \" || ! ^ " }), 
+       q{backward compatility - strange tags that are not expressions});
+} 
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas;
+
+    $c->bind(q{a && b}, '<Enter>' => sub {warn "Enter"});
+    $c->bind(q{a && b}, '<Leave>' => sub {warn "Leave"});
+
+    pass(q{multple events bound to same tag expr});
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas->pack;
+
+    # This would crash in 8.3.0 and 8.3.1
+    $c->create(qw(polygon 0 0 100 100 200 50),
+	       -fill => undef,
+	       qw(-stipple gray50 -outline black));
+    pass(q{canvas poly fill check, bug 5783});
+}
+   
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas->pack;
+
+    $c->create(qw(poly 30 30 90 90 30 90 90 30));
+    ok($c->find(qw(over 40 40 45 45)), "rect region inc. edge; canvas poly overlap fill check, bug 226357");
+    ok($c->find(qw(over 60 40 60 40)), "top-center point");
+    ok(!$c->find(qw(over 0 0 0 0)), "not on poly");
+    ok($c->find(qw(over 60 60 60 60)), "center-point");
+    ok(!$c->find(qw(over 45 50 45 50)), "outside poly");
+
+    $c->itemconfigure(1, -fill => "", -outline => "black");
+    ok($c->find(qw(over 40 40 45 45)), "rect region inc. edge");
+    ok($c->find(qw(over 60 40 60 40)), "top-center point");
+    ok(!$c->find(qw(over 0 0 0 0)), "not on poly");
+    ok($c->find(qw(over 60 60 60 60)), "center-point");
+    ok(!$c->find(qw(over 45 50 45 50)), "outside poly");
+
+    $c->itemconfigure(1, -width => 8);
+    ok($c->find(qw(over 45 50 45 50)), "outside poly?");
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas->pack;
+
+    my $qx = 1.+1.;
+    # qx has type double and no string representation (in Tcl?)
+    $c->scale('all', $qx, 0, 1., 1.);
+    # qx has now type MMRep and no string representation (in Tcl?);
+    is($qx, 2, q{canvas mm obj, patch SF-403327, 102471});
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas->pack;
+
+    my $val = 10;
+    $val++;
+    # qx has type double and no string representation (in Tcl?)
+    $c->scale('all', $val, 0, 1, 1);
+    # qx has now type MMRep and no string representation (in Tcl?)
+    $val++;
+    is($val, 12, q{canvas mm obj, patch SF-403327, 102471});
+}
+
+{
+    my $x = "";
+    
+    my $kill_canvas = sub {
+	my $w = shift;
+	$w->destroy;
+	$w = $mw->Canvas(qw(-height 200 -width 200))->pack(qw(-fill both -expand yes));
+	$mw->idletasks;
+	$w->create('rectangle', qw(80 80 120 120 -fill blue -tags blue));
+	# bind a button press to re-build the canvas
+	$w->bind('blue', '<ButtonRelease-1>' => sub { $x .= "ok" });
+	$w;
+    };
+
+    $c = $kill_canvas->($c);
+
+    # do this many times to improve chances of triggering the crash
+    for my $i (0 .. 29) {
+	$c->eventGenerate('<1>', qw(-x 100 -y 100));
+	$c->eventGenerate('<ButtonRelease-1>', qw(-x 100 -y 100));
+    }
+    is($x, "okokokokokokokokokokokokokokokokokokokokokokokokokokokokokok",
+       q{canvas delete during event, SF bug-228024});
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas->pack;
+
+    eval { $c->scan };
+    like($@, qr{\Qwrong # args: should be ".canvas scan mark|dragto x y ?dragGain?"\E},
+	 qr{canvas scan SF bug 581560});
+
+    eval { $c->scan("bogus") };
+    like($@, qr{\Qwrong # args: should be ".canvas scan mark|dragto x y ?dragGain?"\E},
+	 "canvas scan");
+
+    eval { $c->scan("mark") };
+    like($@, qr{\Qwrong # args: should be ".canvas scan mark|dragto x y ?dragGain?"\E});
+
+    $c->scan(qw(mark 10 10));
+    pass("correct canvas scan mark");
+
+    eval { $c->scan(qw(mark 10 10 5)) };
+    like($@, qr{wrong # args: should be ".canvas scan mark x y"});
+
+    $c->scan(qw(dragto 10 10 5));
+    pass("correct canvas scan dragto");
+}
+
+{
+    foreach my $type (qw{arc bitmap image line oval polygon rect text window}) {
+	eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+	$c = $mw->Canvas->pack;
+
+	eval { $c->create($type) };
+	like($@, qr{wrong # args: should be ".canvas create $type coords \Q?arg arg ...?"\E},
+	     "basic types check: $type requires coords");
+
+	eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+	$c = $mw->Canvas->pack;
+
+	eval { $c->create($type, 0) };
+	like($@, qr{wrong # coordinates: expected},
+	     "basic coords check: $type coords are paired");
+    }
+}
+
+{
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas->pack;
+
+    my $id = $c->createArc(qw(0 10 20 30 -start 33));
+    is($c->itemcget($id, "-start"), 33, "arc coords check");
+}
+
+{
+    local $TODO = "Decide whether test failures are expected or not...";
+
+    eval { $c->destroy } if Tk::Exists($c); # without existence test may dump SV contents ...
+    $c = $mw->Canvas->pack;
+
+    my $id = $c->createLine(qw{0 0 1 1 2 2 3 3 4 4 5 5 6 6});
+    is($c->itemcget($id, '-smooth'), 0);
+
+    foreach my $smoothtest (
+			    ['yes', 'true'],
+			    [1, 'true'],
+			    ['bezier', 'true'],
+			    ['raw', 'raw'],
+			    ['r', 'raw'],
+			    ['b', 'b']
+			   ) {
+	my($smoother, $expected) = @$smoothtest;
+	$c->itemconfigure($id, -smooth => $smoother);
+	is($c->itemcget($id, '-smooth'), $expected, "smooth test");
+    }
+}
+
+__END__
diff -up '/usr/local/src/Tk-804.027/t/entry.t' '/home/e/eserte/work/svk-checkouts/Tk/t/entry.t'
Index: ./t/entry.t
--- ./t/entry.t	Thu Mar 18 21:34:01 2004
+++ ./t/entry.t	Wed Nov  1 22:55:32 2006
@@ -21,10 +21,10 @@ my $Xft = $Tk::Config::xlib =~ /-lXft\b/
 
 BEGIN {
     if (!eval q{
-	use Test;
+	use Test::More;
 	1;
     }) {
-	print "# tests only work with installed Test module\n";
+	print "# tests only work with installed Test::More module\n";
 	print "1..1\n";
 	print "ok 1\n";
 	exit;
@@ -39,12 +39,25 @@ BEGIN {
         todo => \@fragile
       }
 
+use Getopt::Long;
+
+my $do_wm_test   = (defined($ENV{WINDOWMANAGER}) &&
+		    $ENV{WINDOWMANAGER} eq '/usr/X11R6/bin/kde');
+my $do_font_test = 1;
+
+GetOptions("wmtest!" => \$do_wm_test)
+    or die "usage: $0 [-wmtest]";
+
+my $skip_wm_test = "window manager dependent tests";
+my $skip_font_test = "font-related tests";
+my $skip_wm_font_test = "window manager and/or font-related tests";
+
 my $mw = Tk::MainWindow->new();
 $mw->geometry('+10+10');
 
 my $e0 = $mw->Entry;
-ok(Tk::Exists($e0), 1);
-ok(ref $e0, "Tk::Entry");
+ok(Tk::Exists($e0), "Entry widget exists");
+isa_ok($e0, "Tk::Entry");
 
 my @scrollInfo;
 sub scroll {
@@ -59,19 +72,23 @@ $sel->insert("end", "This is some sample
 # Font names
 
 my $big   = $Xft ? '{Adobe Helvetica} -24' : "-adobe-helvetica-medium-r-normal--24-240-75-75-p-*-iso8859-1";
-my $fixed = $Xft ? '{Adobe Courier} -12' : "-adobe-courier-medium-r-normal--12-120-75-75-m-*-iso8859-1";
+## Always use the X11 font, even with Xft, otherwise the measurements would
+## be wrong.
+#my $fixed = $Xft ? '{Adobe Courier} -12' : "-adobe-courier-medium-r-normal--12-120-75-75-m-*-iso8859-1";
+my $fixed = "-adobe-courier-medium-r-normal--12-120-75-75-m-*-iso8859-1";
 
 # Create entries in the option database to be sure that geometry options
 # like border width have predictable values.
 
 $mw->option("add", "*Entry.borderWidth", 2);
 $mw->option("add", "*Entry.highlightThickness", 2);
-$mw->option("add", "*Entry.font", $Xft ? '{Adobe Helvetica} -12' : "Helvetica -12");
+## Again, prefer the X11 font.
+#$mw->option("add", "*Entry.font", $Xft ? '{Adobe Helvetica} -12' : "Helvetica -12");
+$mw->option("add", "*Entry.font", "Helvetica -12");
 
 my $e = $mw->Entry(qw(-bd 2 -relief sunken))->pack;
 $mw->update;
 
-my $skip_font_test;
 if (!$Xft) { # XXX Is this condition necessary?
     my %fa = $mw->fontActual($e->cget(-font));
     my %expected = (
@@ -84,16 +101,11 @@ if (!$Xft) { # XXX Is this condition nec
 		   );
     while(my($k,$v) = each %expected) {
 	if ($v ne $fa{$k}) {
-	    $skip_font_test = "font-related tests";
+	    $do_font_test = 0;
 	    last;
 	}
     }
 }
-my $skip_wm_test;
-unless (defined($ENV{WINDOWMANAGER}) &&
-        $ENV{WINDOWMANAGER} eq '/usr/X11R6/bin/kde') {
-    $skip_wm_test = "window manager dependent tests";
-}
 
 my $i;
 
@@ -140,43 +152,35 @@ my @tests = (
 foreach my $test (@tests) {
     my $name = $test->[0];
     $e->configure($name, $test->[1]);
-    if ($test->[SKIP_CGET]) {
-	skip(1,1);
-    } else {
-	ok($e->cget($name), $test->[2], "Failed to cget $name");
+    if (!$test->[SKIP_CGET]) {
+	is($e->cget($name), $test->[2], "cget $name");
     }
-    if ($test->[SKIP_CONF]) {
-	skip(1,1);
-    } else {
-	ok(($e->configure($name))[4], $e->cget($name), "Failed comparing configure and cget values for $name");
+    if (!$test->[SKIP_CONF]) {
+	is(($e->configure($name))[4], $e->cget($name), "Comparing configure and cget values for $name");
     }
 
     if (defined $test->[4]) {
-	if ($test->[SKIP_ERROR]) {
-	    skip(1,1);
-	} else {
+	if (!$test->[SKIP_ERROR]) {
 	    eval { $e->configure($name, $test->[3]) };
-	    ok($@ =~ /$test->[4]/, 1, "Error message for $name: Got $@, expected $test->[4]");
+	    like($@, qr/$test->[4]/, "Expected error message for $name");
 	}
     }
-    if ($test->[SKIP_RESTORE]) {
-	skip(1,1);
-    } else {
+    if (!$test->[SKIP_RESTORE]) {
 	$e->configure($name, ($e->configure($name))[3]);
     }
 }
 
 eval { $e->destroy };
 $e = $mw->Entry;
-ok(Tk::Exists($e), 1);
-ok($e->class, 'Entry');
-ok(ref $e, 'Tk::Entry');
+ok(Tk::Exists($e));
+is($e->class, 'Entry', "Tk class name");
+isa_ok($e, 'Tk::Entry');
 
 eval { $e->destroy; undef $e };
 eval { $e = $mw->Entry(-gorp => 'foo') };
-ok($@ =~ /unknown option "-gorp"/, 1, $@);
-ok(!Tk::Exists($e), 1);
-ok(!defined $e, 1);
+like($@, qr/unknown option "-gorp"/);
+ok(!Tk::Exists($e), "Expected failure while creating entry widget with bad options");
+ok(!defined $e);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed)->pack;
@@ -184,188 +188,180 @@ $e->update;
 
 my $cx = $mw->fontMeasure($fixed, 'a');
 my $cy = $mw->fontMetrics($fixed, '-linespace');
-my $ux = $mw->fontMeasure($fixed, "\x{4e4e}"); # XXX no unicode yet
+my $ux = $mw->fontMeasure($fixed, "\x{4e4e}");
 
 eval { $e->bbox };
-ok($@ =~ /wrong \# args: should be ".* bbox index"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* bbox index"/, "bbox error message");
 
 eval { $e->bbox(qw(a b)) };
-ok($@ =~ /wrong \# args: should be ".* bbox index"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* bbox index"/);
 
 eval { $e->bbox(qw(bogus)) };
-ok($@ =~ /bad entry index "bogus"/, 1, $@);
+like($@, qr/bad entry index "bogus"/);
 
 $e->delete(0,"end");
-ok(join(",",$e->bbox(0)),"5,5,0,$cy");
+is_deeply([$e->bbox(0)],[5,5,0,$cy], "Expected bbox");
 
 $e->delete(0,"end");
 $e->insert(0,"abc");
-ok(join(",",$e->bbox(3)),join(",",5+2*$cx,5,$cx,$cy));
-ok(join(",",$e->bbox("end")), join(",",$e->bbox(3)));
+is_deeply([$e->bbox(3)],[5+2*$cx,5,$cx,$cy]);
+is_deeply([$e->bbox("end")],[$e->bbox(3)]);
 
-# XXX no unicode yet
-#  test entry-3.7 {EntryWidgetCmd procedure, "bbox" widget command} {
-#      # Tcl_UtfAtIndex(): utf at end
-#      .e delete 0 end
-#      .e insert 0 "ab\u4e4e"
-#      .e bbox end
-#  } "[expr 5+2*$cx] 5 $ux $cy"
-#  test entry-3.8 {EntryWidgetCmd procedure, "bbox" widget command} {
-#      # Tcl_UtfAtIndex(): utf before index
-#      .e delete 0 end
-#      .e insert 0 "ab\u4e4ec"
-#      .e bbox 3
-#  } "[expr 5+2*$cx+$ux] 5 $cx $cy"
+$e->delete(0,"end");
+$e->insert(0,"ab\x{4e4e}");
+is_deeply([$e->bbox("end")],[5+2*$cx,5,$ux,$cy], "Bbox check with unicode char (at end)");
 
 $e->delete(0,"end");
-ok("5,5,0,$cy",join(",",$e->bbox("end")));
+$e->insert(0,"ab\x{4e4e}c");
+is_deeply([$e->bbox(3)],[5+2*$cx+$ux,5,$cx,$cy], "Bbox check with unicode char (before index)");
 
-# XXX no unicode yet
-#  test entry-3.10 {EntryWidgetCmd procedure, "bbox" widget command} {
-#      .e delete 0 end
-#      .e insert 0 "abcdefghij\u4e4eklmnop"
-#      list [.e bbox 0] [.e bbox 1] [.e bbox 10] [.e bbox end]
-#  } [list "5 5 $cx $cy" "[expr 5+$cx] 5 $cx $cy" "[expr 5+10*$cx] 5 $ux $cy" "[expr 5+$ux+15*$cx] 5 $cx $cy"]
+$e->delete(0,"end");
+is_deeply([5,5,0,$cy],[$e->bbox("end")]);
+
+$e->delete(0,"end");
+$e->insert(0,"abcdefghij\x{4e4e}klmnop");
+is_deeply([[$e->bbox(0)],
+	   [$e->bbox(1)],
+	   [$e->bbox(10)],
+	   [$e->bbox("end")]],
+	  [[5,5,$cx,$cy],
+	   [5+$cx,5,$cx,$cy],
+	   [5+10*$cx,5,$ux,$cy],
+	   [5+$ux+15*$cx,5,$cx,$cy]], "More bbox checks with unicode char");
 
 eval { $e->cget };
-ok($@ =~ /wrong \# args: should be ".* cget option"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* cget option"/, "cget error message");
 
 eval { $e->cget(qw(a b)) };
-ok($@ =~ /wrong \# args: should be ".* cget option"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* cget option"/);
 
 eval { $e->cget(-gorp) };
-ok($@ =~ /unknown option "-gorp"/, 1, $@);
+like($@, qr/unknown option "-gorp"/);
 
 $e->configure(-bd => 4);
-ok($e->cget(-bd), 4);
-ok(scalar @{$e->configure}, 36);
+is($e->cget(-bd), 4);
+is(scalar @{$e->configure}, 36);
 
 eval { $e->configure('-foo') };
-ok($@ =~ /unknown option "-foo"/, 1, $@);
+like($@, qr/unknown option "-foo"/, "Unknown option error message");
 
 $e->configure(-bd => 4);
 $e->configure(-bg => '#ffffff');
-ok(($e->configure(-bd))[4], 4);
+is(($e->configure(-bd))[4], 4);
 
 eval { $e->delete };
-ok($@ =~ /wrong \# args: should be ".* delete firstIndex \?lastIndex\?"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* delete firstIndex \?lastIndex\?"/, "delete error message");
 
 eval { $e->delete(qw(a b c)) };
-ok($@ =~ /wrong \# args: should be ".* delete firstIndex \?lastIndex\?"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* delete firstIndex \?lastIndex\?"/);
 
 eval { $e->delete("foo") };
-ok($@ =~ /bad entry index "foo"/, 1, $@);
+like($@, qr/bad entry index "foo"/);
 
 eval { $e->delete(0, "bar") };
-ok($@ =~ /bad entry index "bar"/, 1, $@);
+like($@, qr/bad entry index "bar"/);
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
 $e->delete(2, 4);
-ok($e->get, "014567890");
+is($e->get, "014567890", "Expected get after insert");
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
 $e->delete(6);
-ok($e->get, "0123457890");
+is($e->get, "0123457890");
 
-#  test entry-3.24 {EntryWidgetCmd procedure, "delete" widget command} {
-#      # UTF
-#      set x {}
-#      .e delete 0 end
-#      .e insert end "01234\u4e4e67890"
-#      .e delete 6
-#      lappend x [.e get]
-#      .e delete 0 end
-#      .e insert end "012345\u4e4e7890"
-#      .e delete 6
-#      lappend x [.e get]
-#      .e delete 0 end
-#      .e insert end "0123456\u4e4e890"
-#      .e delete 6
-#      lappend x [.e get]
-#  } [list "01234\u4e4e7890" "0123457890" "012345\u4e4e890"]
+$e->delete(0, "end");
+$e->insert("end", "01234\x{4e4e}67890");
+$e->delete(6);
+is($e->get, "01234\x{4e4e}7890", "Delete with unicode character before");
+
+$e->delete(0, "end");
+$e->insert("end", "012345\x{4e4e}7890");
+$e->delete(6);
+is($e->get, "0123457890", "Delete unicode character");
 
+$e->delete(0, "end");
+$e->insert("end", "0123456\x{4e4e}890");
+$e->delete(6);
+is($e->get, "012345\x{4e4e}890", "Delete with unicode character after");
 
 $e->delete(0,"end");
 $e->insert("end", "01234567890");
 $e->delete(6, 5);
-ok($e->get, "01234567890");
+is($e->get, "01234567890", "Delete reversed range");
 
 $e->delete(0,"end");
 $e->insert("end", "01234567890");
 $e->configure(-state => 'disabled');
 $e->delete(2, 8);
 $e->configure(-state => 'normal');
-ok($e->get, "01234567890");
+is($e->get, "01234567890", "Delete while disabled state");
 
 eval { $e->get("foo") };
-ok($@ =~ /wrong \# args: should be ".* get"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* get"/, "get error message");
 
 eval { $e->icursor };
-ok($@ =~ /wrong \# args: should be ".* icursor pos"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* icursor pos"/);
 
 eval { $e->icursor("foo") };
-ok($@ =~ /bad entry index "foo"/, 1, $@);
+like($@, qr/bad entry index "foo"/);
 
 $e->delete(0,"end");
 $e->insert("end", "01234567890");
 $e->icursor(4);
-ok($e->index('insert'), 4);
+is($e->index('insert'), 4, "Index method");
 
 eval { $e->in };
-ok($@ =~ /Can\'t locate(?: file)? auto\/Tk\/Entry\/in\.al/, 1, $@);
+like($@, qr/Can\'t locate(?: file)? auto\/Tk\/Entry\/in\.al/, "Invalid abbreviated method name (index)");
 
 eval { $e->index };
-ok($@ =~ /wrong \# args: should be ".* index string"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* index string"/, "index error message");
 
 eval { $e->index("foo") };
-ok($@ =~ /bad entry index "foo"/, 1, $@);
+like($@, qr/bad entry index "foo"/);
 
-ok($e->index(0), 0);
+is($e->index(0), 0);
 
-#  test entry-3.35 {EntryWidgetCmd procedure, "index" widget command} {
-#      # UTF
-#      .e delete 0 end
-#      .e insert 0 abc\u4e4e\u0153def
-#      list [.e index 3] [.e index 4] [.e index end]
-#  } {3 4 8}
+$e->delete(0,"end");
+$e->insert(0, "abc\x{4e4e}\x{0153}def");
+is_deeply([$e->index(3), $e->index(4), $e->index("end")],[3,4,8], "Index with unicode characters");
 
 eval { $e->insert(qw(a)) };
-ok($@ =~ /wrong \# args: should be ".* insert index text"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* insert index text"/, "insert error message");
 
 eval { $e->insert(qw(a b c)) };
-ok($@ =~ /wrong \# args: should be ".* insert index text"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* insert index text"/);
 
 eval { $e->insert(qw(foo Text)) };
-ok($@ =~ /bad entry index "foo"/, 1, $@);
+like($@, qr/bad entry index "foo"/);
 
 $e->delete(0,"end");
 $e->insert("end", "01234567890");
 $e->insert(3, "xxx");
-ok($e->get, '012xxx34567890');
+is($e->get, '012xxx34567890', "get after insert method call");
 
 $e->delete(0,"end");
 $e->insert("end", "01234567890");
 $e->configure(qw(-state disabled));
 $e->insert(qw(3 xxx));
 $e->configure(qw(-state normal));
-ok($e->get, "01234567890");
+is($e->get, "01234567890");
 
 eval { $e->insert(qw(a b c)) };
-ok($@ =~ /wrong \# args: should be ".* insert index text"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* insert index text"/);
 
 eval { $e->scan(qw(a)) };
-ok($@ =~ /wrong \# args: should be ".* scan mark\|dragto x"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* scan mark\|dragto x"/, "scan error message");
 
 eval { $e->scan(qw(a b c)) };
-ok($@ =~ /wrong \# args: should be ".* scan mark\|dragto x"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* scan mark\|dragto x"/);
 
 eval { $e->scan(qw(foobar 20)) };
-ok($@ =~ /bad scan option "foobar": must be mark or dragto/, 1, $@);
+like($@, qr/bad scan option "foobar": must be mark or dragto/);
 
 eval { $e->scan(qw(mark 20.1)) };
-ok($@, '');
+is($@, '', "Correct mark method call");
 
 # This test is non-portable because character sizes vary.
 
@@ -375,19 +371,19 @@ $e->insert(end => "This is quite a long 
 $e->insert(end => "very very long string");
 $e->scan(qw(mark 30));
 $e->scan(qw(dragto 28));
-ok($e->index('@0'), 2);
+is($e->index('@0'), 2, "Index of a scrolled string");
 
 eval {$e->select };
-ok($@ =~ /Can\'t locate(?: file)? auto\/Tk\/Entry\/select\.al/, 1, $@);
+like($@, qr/Can\'t locate(?: file)? auto\/Tk\/Entry\/select\.al/, "Invalid abbreviated method name (selection)");
 
 eval {$e->selection };
-ok($@ =~ /wrong \# args: should be ".* selection option \?index\?"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection option \?index\?"/, "selection error message");
 
 eval {$e->selection('foo') };
-ok($@ =~ /bad selection option "foo": must be adjust, clear, from, present, range, or to/, 1, $@);
+like($@, qr/bad selection option "foo": must be adjust, clear, from, present, range, or to/);
 
 eval { $e->selection("clear", "gorp") };
-ok($@ =~ /wrong \# args: should be ".* selection clear"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection clear"/);
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
@@ -396,24 +392,24 @@ $e->selection("to", 4);
 $e->update;
 $e->selection("clear");
 eval { $mw->SelectionGet };
-ok($@ =~ /PRIMARY selection doesn\'t exist or form "(UTF8_)?STRING" not defined/, 1, $@);
-ok($mw->SelectionOwner, $e);
+like($@, qr/PRIMARY selection doesn\'t exist or form "(UTF8_)?STRING" not defined/);
+is($mw->SelectionOwner, $e, "Expected selection owner");
 
 eval { $e->selection("present", "foo") };
-ok($@ =~ /wrong \# args: should be ".* selection present"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection present"/);
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
 $e->selectionFrom(3);
 $e->selectionTo(6);
-ok($e->selectionPresent,1);
+ok($e->selectionPresent, "Selection is now present");
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
 $e->selectionFrom(3);
 $e->selectionTo(6);
 $e->configure(-exportselection => 0);
-ok($e->selection('present'), 1);
+ok($e->selection('present'), "Selection is also present with no exportselection");
 
 $e->configure(-exportselection => 1);
 
@@ -422,13 +418,13 @@ $e->insert("end", "01234567890");
 $e->selectionFrom(3);
 $e->selectionTo(6);
 $e->delete(0,"end");
-ok($e->selectionPresent, 0);
+ok(!$e->selectionPresent, "Selection is not present, -exportselection set to true");
 
 eval { $e->selectionAdjust("x") };
-ok($@ =~ /bad entry index "x"/, 1, $@);
+like($@, qr/bad entry index "x"/, "selectionAdjust error message");
 
 eval { $e->selection(qw(adjust 2 3)) };
-ok($@ =~ /wrong \# args: should be ".* selection adjust index"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection adjust index"/);
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
@@ -436,7 +432,7 @@ $e->selectionFrom(1);
 $e->selection(qw(to 5));
 $e->update;
 $e->selectionAdjust(4);
-ok($mw->SelectionGet, "123");
+is($mw->SelectionGet, "123", "Expected result with selectionGet");
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
@@ -444,16 +440,16 @@ $e->selectionFrom(1);
 $e->selection(qw(to 5));
 $e->update;
 $e->selectionAdjust(2);
-ok($mw->SelectionGet, "234");
+is($mw->SelectionGet, "234");
 
 eval { $e->selectionFrom(qw(2 3)) };
-ok($@ =~ /wrong \# args: should be ".* selection from index"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection from index"/, "selectionFrom error message");
 
 eval { $e->selection(qw(range 2)) };
-ok($@ =~ /wrong \# args: should be ".* selection range start end"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection range start end"/, "selectionRange error message");
 
 eval { $e->selection(qw(range 2 3 4)) };
-ok($@ =~ /wrong \# args: should be ".* selection range start end"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection range start end"/);
 
 $e->delete(0, "end");
 $e->insert("end", "01234567890");
@@ -461,100 +457,99 @@ $e->selectionFrom(1);
 $e->selection(qw(to 5));
 $e->selection(qw(range 4 4 ));
 eval { $e->index("sel.first") };
-ok($@ =~ /selection isn\'t in widget/, 1, $@);
+like($@, qr/selection isn\'t in widget/);
 
 $e->delete(0, "end");
 $e->insert("end", "0123456789");
 $e->selectionFrom(3);
 $e->selection(qw(to 7));
 $e->selection(qw(range 2 9));
-ok($e->index("sel.first"), 2);
-ok($e->index("sel.last"), 9);
-ok($e->index("anchor"), 3);
+is($e->index("sel.first"), 2, "Index of selection");
+is($e->index("sel.last"), 9);
+is($e->index("anchor"), 3);
 
 $e->delete(qw(0 end));
 $e->insert(end => "This is quite a long text string, so long that it ");
 $e->insert(end => "runs off the end of the window quite a bit.");
 
 eval { $e->selectionTo(2,3) };
-ok($@ =~ /wrong \# args: should be ".* selection to index"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* selection to index"/);
 
 $e->xview(5);
-ok(join(",", map { substr($_, 0, 8) } $e->xview), "0.053763,0.268817");
+is_deeply([map { substr($_, 0, 8) } $e->xview],["0.053763","0.268817"], "Expected xview result");
 
 eval { $e->xview(qw(gorp)) };
-ok($@ =~ /bad entry index "gorp"/, 1, $@);
+like($@, qr/bad entry index "gorp"/, "xview error message");
 
 $e->xview(0);
 $e->icursor(10);
 $e->xview('insert');
-ok(join(",", map { substr($_, 0, 7) } $e->xview), "0.10752,0.32258");
+is_deeply([map { substr($_, 0, 7) } $e->xview],["0.10752","0.32258"]);
 
 eval { $e->xviewMoveto(qw(foo bar)) };
-ok($@ =~ /wrong \# args: should be ".* xview moveto fraction"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* xview moveto fraction"/);
 
 eval { $e->xview(qw(moveto foo)) };
-ok($@ =~ /\'foo\' isn\'t numeric/, 1, $@);
+like($@, qr/\'foo\' isn\'t numeric/);
 
 $e->xviewMoveto(0.5);
-ok(join(",", map { substr($_, 0, 7) } $e->xview), "0.50537,0.72043");
+is_deeply([map { substr($_, 0, 7) } $e->xview],["0.50537","0.72043"]);
 
 eval { $e->xviewScroll(24) };
-ok($@ =~ /wrong \# args: should be ".* xview scroll number units\|pages"/, 1, $@);
+like($@, qr/wrong \# args: should be ".* xview scroll number units\|pages"/, "xviewScroll error message");
 
 eval { $e->xviewScroll(qw(gorp units)) };
-ok($@ =~ /\'gorp\' isn\'t numeric/, 1, $@);
+like($@, qr/\'gorp\' isn\'t numeric/);
 
 $e->xviewMoveto(0);
 $e->xview(qw(scroll 1 pages));
-ok(join(",", map { substr($_, 0, 7) } $e->xview), "0.19354,0.40860");
+is_deeply([map { substr($_, 0, 7) } $e->xview],["0.19354","0.40860"]);
 
 $e->xview(qw(moveto .9));
 $e->update;
 $e->xview(qw(scroll -2 p));
-ok(join(",", map { substr($_, 0, 7) } $e->xview), "0.39784,0.61290");
+is_deeply([map { substr($_, 0, 7) } $e->xview],["0.39784","0.61290"]);
 
 $e->xview(30);
 $e->update;
 $e->xview(qw(scroll 2 units));
-ok($e->index('@0'), 32);
+is($e->index('@0'), 32);
 
 $e->xview(30);
 $e->update;
 $e->xview(qw(scroll -1 units));
-ok($e->index('@0'), 29);
+is($e->index('@0'), 29);
 
 eval { $e->xviewScroll(23,"foobars") };
-ok($@ =~ /bad argument "foobars": must be units or pages/, 1, $@);
+like($@, qr/bad argument "foobars": must be units or pages/);
 
 eval { $e->xview(qw(eat 23 hamburgers)) };
-ok($@ =~ /unknown option "eat": must be moveto or scroll/, 1, $@);
+like($@, qr/unknown option "eat": must be moveto or scroll/);
 
 $e->xview(0);
 $e->update;
 $e->xview(-4);
-ok($e->index('@0'), 0);
+is($e->index('@0'), 0);
 
 $e->xview(300);
-ok($e->index('@0'), 73);
+is($e->index('@0'), 73);
+
+{
+    $e->insert(10, "\x{4e4e}");
 
-#  .e insert 10 \u4e4e
-#  test entry-3.81 {EntryWidgetCmd procedure, "xview" widget command} {
-#      # UTF
-#      # If Tcl_NumUtfChars wasn't used, wrong answer would be:
-#      # 0.106383 0.117021 0.117021
-
-#      set x {}
-#      .e xview moveto .1
-#      lappend x [lindex [.e xview] 0]
-#      .e xview moveto .11
-#      lappend x [lindex [.e xview] 0]
-#      .e xview moveto .12
-#      lappend x [lindex [.e xview] 0]
-#  } {0.0957447 0.106383 0.117021}
+    my @x;
+    $e->xviewMoveto(0.1);
+    push @x, ($e->xview)[0];
+    $e->xviewMoveto(0.11);
+    push @x, ($e->xview)[0];
+    $e->xviewMoveto(0.12);
+    push @x, ($e->xview)[0];
+
+    is_deeply([map { substr($_, 0, 7) } @x],["0.09574","0.10638","0.11702"], "xviewMoveto with unicode character");
+}
 
 eval { $e->gorp };
-ok($@ =~ /Can\'t locate(?: file)? auto\/Tk\/Entry\/gorp\.al/, 1, $@);
+like($@, qr/Can\'t locate(?: file)? auto\/Tk\/Entry\/gorp\.al/, "Invalid method");
 
 # The test below doesn't actually check anything directly, but if run
 # with Purify or some other memory-allocation-checking program it will
@@ -573,7 +568,7 @@ my $f = $mw->Frame(qw(-width 200 -height
 #eval { $e->destroy };
 $x = 12345;
 $e = $mw->Entry(-textvariable => \$x);
-ok($e->get, "12345");
+is($e->get, "12345", "-textvariable check");
 
 eval { $e->destroy };
 $x = "12345";
@@ -581,21 +576,21 @@ $e = $mw->Entry(-textvariable => \$x);
 my $y = "abcde";
 $e->configure(-textvariable => \$y);
 $x = 54321;
-ok($e->get, "abcde");
+is($e->get, "abcde");
 
 eval { $e->destroy };
 undef $x;
 $e = $mw->Entry;
 $e->configure(-textvariable => \$x);
 $e->insert(0, "Some text");
-ok($x, "Some text");
+is($x, "Some text");
 
 eval { $e->destroy };
 undef $x;
 $e = $mw->Entry;
 $e->insert(0, "Some text");
 $e->configure(-textvariable => \$x);
-#ok($x, "Some text"); # XXX does not work with Perl/Tk!
+#is($x, "Some text"); # XXX does not work with Perl/Tk!
 
 sub override {
     $x = 12345;
@@ -610,20 +605,20 @@ $e->configure(-textvariable => \$x);
 $e->insert('0', "Some text");
 my @result = ($x,$e->get);
 undef $x;
-ok($result[0], "12345");
-ok($result[1], "12345");
+is($result[0], "12345", "-textvariable with traceVariable");
+is($result[1], "12345");
 
 eval { $e->destroy };
 $e = $mw->Entry(-exportselection => 0)->pack;
 $e->insert(qw(end 0123456789));
 $sel->selectionFrom(0);
 $sel->selectionTo(10);
-ok($mw->SelectionGet, "This is so");
+is($mw->SelectionGet, "This is so");
 $e->selectionFrom(1);
 $e->selectionTo(5);
-ok($mw->SelectionGet, "This is so");
+is($mw->SelectionGet, "This is so");
 $e->configure(-exportselection => 1);
-ok($mw->SelectionGet, "1234");
+is($mw->SelectionGet, "1234");
 
 eval { $e->destroy };
 $e = $mw->Entry->pack;
@@ -632,16 +627,16 @@ $e->selectionFrom(1);
 $e->selectionTo(5);
 $e->configure(-exportselection => 0);
 eval { $mw->SelectionGet };
-ok($@ =~ /PRIMARY selection doesn\'t exist or form "(UTF8_)?STRING" not defined/, 1, $@);
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 5);
+like($@, qr/PRIMARY selection doesn\'t exist or form "(UTF8_)?STRING" not defined/);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 5);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, qw(-width 4 -xscrollcommand), \&scroll)->pack;
 $e->insert(qw(end 01234567890));
 $e->update;
 $e->configure(qw(-width 5));
-ok(join(",", map { substr($_, 0, 8) } @scrollInfo), "0,0.363636");
+is_deeply([map { substr($_, 0, 8) } @scrollInfo], [0,0.363636]);
 
 eval { $e->destroy };
 
@@ -650,25 +645,29 @@ $e->insert(end => "0123");
 $e->update;
 $e->configure(-font => $big);
 $e->update;
-skip($skip_wm_test, $e->geometry, qr/62x3\d\+0\+0/);
+SKIP: {
+    skip($skip_wm_test, 1)
+	if !$do_wm_test;
+    like($e->geometry, qr/62x3\d\+0\+0/, "Geometry check");
+}
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, -bd => 2, -relief => "raised")->pack;
 $e->insert(end => "0123");
 $e->update;
-ok($e->index('@10'), 0);
-ok($e->index('@11'), 0);
-ok($e->index('@12'), 1);
-ok($e->index('@13'), 1);
+is($e->index('@10'), 0, "index with raised relief");
+is($e->index('@11'), 0);
+is($e->index('@12'), 1);
+is($e->index('@13'), 1);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, -bd => 2, -relief => "flat")->pack;
 $e->insert(end => "0123");
 $e->update;
-ok($e->index('@10'), 0);
-ok($e->index('@11'), 0);
-ok($e->index('@12'), 1);
-ok($e->index('@13'), 1);
+is($e->index('@10'), 0, "index with flat relief");
+is($e->index('@11'), 0);
+is($e->index('@12'), 1);
+is($e->index('@13'), 1);
 
 # If "0" in selected font had 0 width, caused divide-by-zero error.
 
@@ -683,85 +682,90 @@ eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, -bd => 2, -relief => "raised", -width => 20, -highlightthickness => 3)->pack;
 $e->insert("end", "012\t45");
 $e->update;
-ok($e->index('@61'), 3);
-ok($e->index('@62'), 4);
+is($e->index('@61'), 3, "index with highlightthickness");
+is($e->index('@62'), 4);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, qw(-bd 2 -relief raised -width 20 -justify center -highlightthickness 3))->pack;
 $e->insert("end", "012\t45");
 $e->update;
-ok($e->index('@96'), 3);
-ok($e->index('@97'), 4);
+is($e->index('@96'), 3, "index with center justify");
+is($e->index('@97'), 4);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, qw(-bd 2 -relief raised -width 20 -justify right -highlightthickness 3))->pack;
 $e->insert("end", "012\t45");
 $e->update;
-ok($e->index('@131'), 3);
-ok($e->index('@132'), 4);
+is($e->index('@131'), 3, "index with right justify");
+is($e->index('@132'), 4);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, qw(-bd 2 -relief raised -width 5))->pack;
 $e->insert(qw(end 01234567890));
 $e->update;
 $e->xview(6);
-ok($e->index('@0'), 6);
+is($e->index('@0'), 6);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, qw(-bd 2 -relief raised -width 5))->pack;
 $e->insert(qw(end 01234567890));
 $e->update;
 $e->xview(7);
-ok($e->index('@0'), 6);
+is($e->index('@0'), 6);
 
 eval { $e->destroy };
 $e = $mw->Entry(-font => $fixed, qw(-bd 2 -relief raised -width 10))->pack;
 $e->insert(qw(end), "01234\t67890");
 $e->update;
 $e->xview(3);
-ok($e->index('@39'), 5);
-ok($e->index('@40'), 6);
-
-eval { $e->destroy };
-$e = $mw->Entry(-font => $big, qw(-bd 3 -relief raised -width 5))->pack;
-$e->insert(qw(end), "01234567");
-$e->update;
-skip($skip_font_test, $e->reqwidth, 77);
-skip($skip_font_test, $e->reqheight, 39);
+is($e->index('@39'), 5, "index with tabulator in entry");
+is($e->index('@40'), 6);
 
-eval { $e->destroy };
-$e = $mw->Entry(-font => $big, qw(-bd 3 -relief raised -width 0))->pack;
-$e->insert(qw(end), "01234567");
-$e->update;
-skip($skip_font_test, $e->reqwidth, 116);
-skip($skip_font_test, $e->reqheight, 39);
+SKIP: {
+    skip($skip_wm_test, 10)
+	if !$do_wm_test;
+
+    eval { $e->destroy };
+    $e = $mw->Entry(-font => $big, qw(-bd 3 -relief raised -width 5))->pack;
+    $e->insert(qw(end), "01234567");
+    $e->update;
+    is($e->reqwidth, 77, "Expected reqwidth");
+    is($e->reqheight, 39, "Expected reqheight");
 
-eval { $e->destroy };
-$e = $mw->Entry(-font => $big, qw(-bd 3 -relief raised -width 0 -highlightthickness 2))->pack;
-$e->update;
-skip($skip_font_test, $e->reqwidth, 25);
-skip($skip_font_test, $e->reqheight, 39);
+    eval { $e->destroy };
+    $e = $mw->Entry(-font => $big, qw(-bd 3 -relief raised -width 0))->pack;
+    $e->insert(qw(end), "01234567");
+    $e->update;
+    is($e->reqwidth, 116);
+    is($e->reqheight, 39);
 
-eval { $e->destroy };
-$e = $mw->Entry(qw(-bd 1 -relief raised -width 0 -show .))->pack;
-$e->insert(0, "12345");
-$e->update;
-skip($skip_font_test, $e->reqwidth, 23);
-$e->configure(-show => 'X');
-skip($skip_font_test, $e->reqwidth, 53);
-#$e->configure(-show => '');
-#skip($skip_font_test, $e->reqwidth, 43);
+    eval { $e->destroy };
+    $e = $mw->Entry(-font => $big, qw(-bd 3 -relief raised -width 0 -highlightthickness 2))->pack;
+    $e->update;
+    is($e->reqwidth, 25);
+    is($e->reqheight, 39);
 
-eval { $e->destroy };
-$e = $mw->Entry(qw(-bd 1 -relief raised -width 0 -show .),
-		-font => 'helvetica 12')->pack;
-$e->insert(0, "12345");
-$e->update;
-skip($skip_font_test, $e->reqwidth, 8+5*$mw->fontMeasure("helvetica 12", "."));
-$e->configure(-show => 'X');
-skip($skip_font_test, $e->reqwidth, 8+5*$mw->fontMeasure("helvetica 12", "X"));
-#$e->configure(-show => '');
-#ok($e->reqwidth, 8+$mw->fontMeasure("helvetica 12", "12345"));
+    eval { $e->destroy };
+    $e = $mw->Entry(qw(-bd 1 -relief raised -width 0 -show .))->pack;
+    $e->insert(0, "12345");
+    $e->update;
+    is($e->reqwidth, 23);
+    $e->configure(-show => 'X');
+    is($e->reqwidth, 53);
+    #$e->configure(-show => '');
+    #is($e->reqwidth, 43);
+
+    eval { $e->destroy };
+    $e = $mw->Entry(qw(-bd 1 -relief raised -width 0 -show .),
+		    -font => 'helvetica 12')->pack;
+    $e->insert(0, "12345");
+    $e->update;
+    is($e->reqwidth, 8+5*$mw->fontMeasure("helvetica 12", "."));
+    $e->configure(-show => 'X');
+    is($e->reqwidth, 8+5*$mw->fontMeasure("helvetica 12", "X"));
+    #$e->configure(-show => '');
+    #is($e->reqwidth, 8+$mw->fontMeasure("helvetica 12", "12345"));
+}
 
 eval { $e->destroy };
 my $contents;
@@ -772,120 +776,120 @@ $e->delete(0, "end");
 $e->insert(0, "abcde");
 $e->insert(2, "XXX");
 $e->update;
-ok($e->get, "abXXXcde");
-ok($contents, "abXXXcde");
-ok(join(" ", @scrollInfo), "0 1");
+is($e->get, "abXXXcde");
+is($contents, "abXXXcde");
+is(join(" ", @scrollInfo), "0 1", "Result collected in -xscrollcommand callback");
 
 $e->delete(0, "end");
 $e->insert(0, "abcde");
 $e->insert(500, "XXX");
 $e->update;
-ok($e->get, "abcdeXXX");
-ok($contents, "abcdeXXX");
-ok(join(" ", @scrollInfo), "0 1");
+is($e->get, "abcdeXXX");
+is($contents, "abcdeXXX");
+is(join(" ", @scrollInfo), "0 1");
 
 $e->delete(0, "end");
 $e->insert(0, "0123456789");
 $e->selectionFrom(2);
 $e->selectionTo(6);
 $e->insert(2, "XXX");
-ok($e->index("sel.first"), 5);
-ok($e->index("sel.last"), 9);
+is($e->index("sel.first"), 5);
+is($e->index("sel.last"), 9);
 $e->selectionTo(8);
-ok($e->index("sel.first"), 5);
-ok($e->index("sel.last"), 8);
+is($e->index("sel.first"), 5);
+is($e->index("sel.last"), 8);
 
 $e->delete(0, "end");
 $e->insert(0, "0123456789");
 $e->selectionFrom(2);
 $e->selectionTo(6);
 $e->insert(3, "XXX");
-ok($e->index("sel.first"), 2);
-ok($e->index("sel.last"), 9);
+is($e->index("sel.first"), 2);
+is($e->index("sel.last"), 9);
 $e->selectionTo(8);
-ok($e->index("sel.first"), 2);
-ok($e->index("sel.last"), 8);
+is($e->index("sel.first"), 2);
+is($e->index("sel.last"), 8);
 
 $e->delete(0, "end");
 $e->insert(0, "0123456789");
 $e->selectionFrom(2);
 $e->selectionTo(6);
 $e->insert(5, "XXX");
-ok($e->index("sel.first"), 2);
-ok($e->index("sel.last"), 9);
+is($e->index("sel.first"), 2);
+is($e->index("sel.last"), 9);
 $e->selectionTo(8);
-ok($e->index("sel.first"), 2);
-ok($e->index("sel.last"), 8);
+is($e->index("sel.first"), 2);
+is($e->index("sel.last"), 8);
 
 $e->delete(0, "end");
 $e->insert(0, "0123456789");
 $e->selectionFrom(2);
 $e->selectionTo(6);
 $e->insert(6, "XXX");
-ok($e->index("sel.first"), 2);
-ok($e->index("sel.last"), 6);
+is($e->index("sel.first"), 2);
+is($e->index("sel.last"), 6);
 $e->selectionTo(5);
-ok($e->index("sel.first"), 2);
-ok($e->index("sel.last"), 5);
+is($e->index("sel.first"), 2);
+is($e->index("sel.last"), 5);
 
 $e->delete(0, "end");
 $e->insert(0, "0123456789");
 $e->icursor(4);
 $e->insert(4, "XXX");
-ok($e->index("insert"), 7);
+is($e->index("insert"), 7);
 
 $e->delete(0, "end");
 $e->insert(0, "0123456789");
 $e->icursor(4);
 $e->insert(5, "XXX");
-ok($e->index("insert"), 4);
+is($e->index("insert"), 4);
 
 $e->delete(0, "end");
 $e->insert(0, "This is a very long string");
 $e->update;
 $e->xview(4);
 $e->insert(qw(3 XXX));
-ok($e->index('@0'), 7);
+is($e->index('@0'), 7);
 
 $e->delete(0, "end");
 $e->insert(0, "This is a very long string");
 $e->update;
 $e->xview(4);
 $e->insert(qw(4 XXX));
-ok($e->index('@0'), 4);
+is($e->index('@0'), 4);
 
 $e->delete(0, "end");
 $e->insert(0, "xyzzy");
 $e->update;
 $e->insert(2, "00");
-## XXX ok($e->reqwidth, 59);
+## XXX is($e->reqwidth, 59);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 abcde));
 $e->delete(qw(2 4));
 $e->update;
-ok($e->get, "abe");
-ok($contents, "abe");
-ok($scrollInfo[0], 0);
-ok($scrollInfo[1], 1);
+is($e->get, "abe");
+is($contents, "abe");
+is($scrollInfo[0], 0);
+is($scrollInfo[1], 1);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 abcde));
 $e->delete(qw(-2 2));
 $e->update;
-ok($e->get, "cde");
-ok($contents, "cde");
-ok($scrollInfo[0], 0);
-ok($scrollInfo[1], 1);
+is($e->get, "cde");
+is($contents, "cde");
+is($scrollInfo[0], 0);
+is($scrollInfo[1], 1);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 abcde));
 $e->delete(qw(3 1000));
 $e->update;
-ok($e->get, "abc");
-ok($contents, "abc");
-ok($scrollInfo[0], 0);
-ok($scrollInfo[1], 1);
+is($e->get, "abc");
+is($contents, "abc");
+is($scrollInfo[0], 0);
+is($scrollInfo[1], 1);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -893,11 +897,11 @@ $e->selection(qw(from 3));
 $e->selection(qw(to 8));
 $e->delete(qw(1 3));
 $e->update;
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 6);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 6);
 $e->selectionTo(5);
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 5);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 5);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -905,11 +909,11 @@ $e->selection(qw(from 3));
 $e->selection(qw(to 8));
 $e->delete(qw(1 4));
 $e->update;
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 5);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 5);
 $e->selectionTo(4);
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 4);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 4);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -917,11 +921,11 @@ $e->selection(qw(from 3));
 $e->selection(qw(to 8));
 $e->delete(qw(1 7));
 $e->update;
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 2);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 2);
 $e->selectionTo(5);
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 5);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 5);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -929,7 +933,7 @@ $e->selection(qw(from 3));
 $e->selection(qw(to 8));
 $e->delete(qw(1 8));
 eval { $e->index("sel.first") };
-ok($@ =~ /selection isn\'t in widget/, 1, $@);
+like($@, qr/selection isn\'t in widget/, "Expected error, no selection");
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -937,11 +941,11 @@ $e->selection(qw(from 3));
 $e->selection(qw(to 8));
 $e->delete(qw(3 7));
 $e->update;
-ok($e->index("sel.first"), 3);
-ok($e->index("sel.last"), 4);
+is($e->index("sel.first"), 3);
+is($e->index("sel.last"), 4);
 $e->selectionTo(8);
-ok($e->index("sel.first"), 3);
-ok($e->index("sel.last"), 8);
+is($e->index("sel.first"), 3);
+is($e->index("sel.last"), 8);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -949,7 +953,7 @@ $e->selection(qw(from 3));
 $e->selection(qw(to 8));
 $e->delete(qw(3 8));
 eval { $e->index("sel.first") };
-ok($@ =~ /selection isn\'t in widget/, 1, $@);
+like($@, qr/selection isn\'t in widget/);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -957,11 +961,11 @@ $e->selection(qw(from 8));
 $e->selection(qw(to 3));
 $e->delete(qw(5 8));
 $e->update;
-ok($e->index("sel.first"), 3);
-ok($e->index("sel.last"), 5);
+is($e->index("sel.first"), 3);
+is($e->index("sel.last"), 5);
 $e->selectionTo(8);
-ok($e->index("sel.first"), 5);
-ok($e->index("sel.last"), 8);
+is($e->index("sel.first"), 5);
+is($e->index("sel.last"), 8);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
@@ -969,47 +973,47 @@ $e->selection(qw(from 8));
 $e->selection(qw(to 3));
 $e->delete(qw(8 10));
 $e->update;
-ok($e->index("sel.first"), 3);
-ok($e->index("sel.last"), 8);
+is($e->index("sel.first"), 3);
+is($e->index("sel.last"), 8);
 $e->selectionTo(4);
-ok($e->index("sel.first"), 4);
-ok($e->index("sel.last"), 8);
+is($e->index("sel.first"), 4);
+is($e->index("sel.last"), 8);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
 $e->icursor(4);
 $e->delete(qw(1 4));
-ok($e->index("insert"), 1);
+is($e->index("insert"), 1);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
 $e->icursor(4);
 $e->delete(qw(1 5));
-ok($e->index("insert"), 1);
+is($e->index("insert"), 1);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcde));
 $e->icursor(4);
 $e->delete(qw(4 6));
-ok($e->index("insert"), 4);
+is($e->index("insert"), 4);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0), "This is a very long string");
 $e->xview(4);
 $e->delete(qw(1 4));
-ok($e->index('@0'), 1);
+is($e->index('@0'), 1);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0), "This is a very long string");
 $e->xview(4);
 $e->delete(qw(1 5));
-ok($e->index("\@0"), 1);
+is($e->index("\@0"), 1);
 
 $e->delete(qw(0 end));
 $e->insert(qw(0), "This is a very long string");
 $e->xview(4);
 $e->delete(qw(4 6));
-ok($e->index("\@0"), 4);
+is($e->index("\@0"), 4);
 
 $e->configure(qw(-width 0));
 
@@ -1017,7 +1021,7 @@ $e->delete(qw(0 end));
 $e->insert(0, "xyzzy");
 $e->update;
 $e->delete(qw(2 4));
-ok($e->reqwidth, 31);
+is($e->reqwidth, 31);
 
 eval { $e->destroy };
 
@@ -1028,8 +1032,8 @@ undef $x;
 $mw->traceVariable(\$x, 'w', \&_override2);
 $e = $mw->Entry(-textvariable => \$x);
 $e->insert(0, "foo");
-ok($x, 12345);
-ok($e->get, 12345);
+is($x, 12345);
+is($e->get, 12345);
 undef $x;
 
 Tk::catch {$e->destroy};
@@ -1042,8 +1046,8 @@ $e->configure(-textvariable => \$x);
 $e->update;
 $e->configure(-textvariable => \$y);
 $e->update;
-ok($e->get, "ab");
-ok($e->reqwidth, 24);
+is($e->get, "ab");
+is($e->reqwidth, 24);
 
 $mw->traceVdelete(\$x); # XXX why?
 
@@ -1053,23 +1057,23 @@ $e->insert(0, "abcdefghjklmnopqrstu");
 $e->selection(qw(range 4 10));
 $x = "a";
 eval { $e->index("sel.first") };
-ok($@ =~ /selection isn\'t in widget/, 1, $@);
+like($@, qr/selection isn\'t in widget/);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry(-textvariable => \$x);
 $e->insert(0, "abcdefghjklmnopqrstu");
 $e->selection(qw(range 4 10));
 $x = "abcdefg";
-ok($e->index("sel.first"), 4);
-ok($e->index("sel.last"), 7);
+is($e->index("sel.first"), 4);
+is($e->index("sel.last"), 7);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry(-textvariable => \$x);
 $e->insert(0, "abcdefghjklmnopqrstu");
 $e->selection(qw(range 4 10));
 $x = "abcdefghijklmn";
-ok($e->index("sel.first"), 4);
-ok($e->index("sel.last"), 10);
+is($e->index("sel.first"), 4);
+is($e->index("sel.last"), 10);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry(-textvariable => \$x)->pack;
@@ -1078,7 +1082,7 @@ $e->xview(10);
 $e->update;
 $x = "abcdefg";
 $e->update;
-ok($e->index('@0'), 0);
+is($e->index('@0'), 0);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry(-font => $fixed, -width => 10, -textvariable => \$x)->pack;
@@ -1087,21 +1091,21 @@ $e->xview(10);
 $e->update;
 $x = "1234567890123456789012";
 $e->update;
-ok($e->index('@0'), 10);
+is($e->index('@0'), 10);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry(-font => $fixed, -width => 10, -textvariable => \$x)->pack;
 $e->insert(0, "abcdefghjklmnopqrstu");
 $e->icursor(5);
 $x = "123";
-ok($e->index("insert"), 3);
+is($e->index("insert"), 3);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry(-font => $fixed, -width => 10, -textvariable => \$x)->pack;
 $e->insert(0, "abcdefghjklmnopqrstuvwxyz");
 $e->icursor(5);
 $x = "123456";
-ok($e->index("insert"), 5);
+is($e->index("insert"), 5);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry;
@@ -1111,45 +1115,45 @@ $mw->update;
 
 $_->destroy for ($mw->children);
 my $e1 = $mw->Entry(-fg => '#112233');
-ok(($mw->children)[0], $e1);
+is(($mw->children)[0], $e1);
 $e1->destroy;
-ok(scalar($mw->children), undef); # XXX why not 0?
+is(scalar($mw->children), undef); # XXX why not 0?
 
 $e = $mw->Entry(-font => $fixed, qw(-width 5 -bd 2 -relief sunken))->pack;
 $e->insert(qw(0 012345678901234567890));
 $e->xview(4);
 $e->update;
-ok($e->index("end"), 21);
+is($e->index("end"), 21);
 
 eval { $e->index("abogus") };
-ok($@ =~ /bad entry index "abogus"/, 1, $@);
+like($@, qr/bad entry index "abogus"/);
 
 $e->selection(qw(from 1));
 $e->selection(qw(to 6));
-ok($e->index(qw(anchor)), 1);
+is($e->index(qw(anchor)), 1);
 
 $e->selection(qw(from 4));
 $e->selection(qw(to 1));
-ok($e->index(qw(anchor)), 4);
+is($e->index(qw(anchor)), 4);
 
 $e->selection(qw(from 3));
 $e->selection(qw(to 15));
 $e->selection(qw(adjust 4));
-ok($e->index(qw(anchor)), 15);
+is($e->index(qw(anchor)), 15);
 
 eval { $e->index("ebogus") };
-ok($@ =~ /bad entry index "ebogus"/, 1, $@);
+like($@, qr/bad entry index "ebogus"/);
 
 $e->icursor(2);
-ok($e->index('insert'), 2);
+is($e->index('insert'), 2);
 
 eval { $e->index("ibogus") };
-ok($@ =~ /bad entry index "ibogus"/, 1, $@);
+like($@, qr/bad entry index "ibogus"/);
 
 $e->selectionFrom(1);
 $e->selectionTo(6);
-ok($e->index("sel.first"), 1);
-ok($e->index("sel.last"), 6);
+is($e->index("sel.first"), 1);
+is($e->index("sel.last"), 6);
 
 $mw->SelectionClear($e);
 
@@ -1158,49 +1162,54 @@ if ($^O ne 'MSWin32') {
     # selection range is reset.
 
     eval { $e->index("sel.first") };
-    skip("Test only for MSWin32", $@ =~ /selection isn\'t in widget/, 1, $@) for (1..2);
+    like($@, qr/selection isn\'t in widget/);
+    pass("Dummy to align number of tests with MSWin32");
 
 } else {
     # On mac and pc, when selection is cleared, entry widget remembers
     # last selected range.  When selection ownership is restored to
     # entry, the old range will be rehighlighted.
 
-    ok($e->getSelected, '12345');
-    ok($e->index("sel.first"), 1);
+    is($e->getSelected, '12345');
+    is($e->index("sel.first"), 1);
 }
 
 if ($^O ne 'MSWin32') {
     eval { $e->index("sbogus") };
-    ok($@ =~ /selection isn\'t in widget/, 1, $@);
+    like($@, qr/selection isn\'t in widget/);
 } else {
     eval { $e->index("sbogus") };
-    ok($@ =~ /bad entry index "sbogus"/, 1, $@);
+    like($@, qr/bad entry index "sbogus"/);
 }
 
 eval { $e->index('@xyz') };
-ok($@ =~ /bad entry index "\@xyz"/, 1, $@);
+like($@, qr/bad entry index "\@xyz"/);
 
-ok($e->index('@4'), 4);
-ok($e->index('@11'), 4);
-ok($e->index('@12'), 5);
-ok($e->index('@' . ($e->width-6)), 8);
-ok($e->index('@' . ($e->width-5)), 9);
-ok($e->index('@1000'), 9);
+is($e->index('@4'), 4);
+is($e->index('@11'), 4);
+is($e->index('@12'), 5);
+is($e->index('@' . ($e->width-6)), 8);
+is($e->index('@' . ($e->width-5)), 9);
+is($e->index('@1000'), 9);
 
 eval { $e->index('1xyz') };
-ok($@ =~ /bad entry index "1xyz"/, 1, $@);
+like($@, qr/bad entry index "1xyz"/);
 
-ok($e->index(-10), 0);
-ok($e->index(12), 12);
-ok($e->index(49), 21);
+is($e->index(-10), 0);
+is($e->index(12), 12);
+is($e->index(49), 21);
 
 Tk::catch { $e->destroy };
 $e = $mw->Entry(-show => ".");
 $e->insert(qw(0 XXXYZZY));
 $e->pack;
 $e->update;
-skip($skip_font_test, $e->index('@7'), 0);
-skip($skip_font_test, $e->index('@8'), 1);
+SKIP: {
+    skip($skip_font_test, 2)
+	if !$do_font_test;
+    is($e->index('@7'), 0);
+    is($e->index('@8'), 1);
+}
 
 # XXX Still need to write tests for EntryScanTo and EntrySelectTo.
 
@@ -1214,32 +1223,32 @@ $e = $mw->Entry;
 $e->insert(end => "This is a test string");
 $e->selection(qw(from 1));
 $e->selection(qw(to 18));
-ok($mw->SelectionGet, "his is a test str");
+is($mw->SelectionGet, "his is a test str");
 
 Tk::catch { $e->destroy };
 $e = $mw->Entry(-show => "*");
 $e->insert(end => "This is a test string");
 $e->selection(qw(from 1));
 $e->selection(qw(to 18));
-ok($mw->SelectionGet, "*****************");
+is($mw->SelectionGet, "*****************");
 
 Tk::catch { $e->destroy };
 $e = $mw->Entry;
 $e->insert("end", $x);
 $e->selectionFrom(0);
 $e->selectionTo("end");
-ok($mw->SelectionGet, $x);
+is($mw->SelectionGet, $x);
 
 Tk::catch { $e->destroy };
 $e = $mw->Entry;
 $e->insert(0, "Text");
 $e->selectionFrom(0);
 $e->selectionTo(4);
-ok($mw->SelectionGet, "Text");
+is($mw->SelectionGet, "Text");
 $mw->SelectionClear;
 $e->selectionFrom(0);
 $e->selectionTo(4);
-ok($mw->SelectionGet, "Text");
+is($mw->SelectionGet, "Text");
 
 # No tests for EventuallyRedraw.
 
@@ -1249,7 +1258,11 @@ $e->update;
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 .............................));
-skip($skip_font_test || $skip_wm_test, join(" ", map { substr($_, 0, 8) } $e->xview), "0 0.827586");
+SKIP: {
+    skip($skip_wm_font_test, 1)
+	if !$do_font_test || !$do_wm_test;
+    is_deeply([map { substr($_, 0, 8) } $e->xview], [0, 0.827586]);
+}
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX));
@@ -1258,16 +1271,20 @@ my $Xw = join(" ", map { substr($_, 0, 8
 $e->configure(-show => 'X');
 $e->delete(qw(0 end));
 $e->insert(qw(0 .............................));
-ok(join(" ", map { substr($_, 0, 8) } $e->xview), $Xw);
+is(join(" ", map { substr($_, 0, 8) } $e->xview), $Xw);
 
 $e->configure(-show => '.');
 $e->delete(qw(0 end));
 $e->insert(qw(0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX));
-skip($skip_font_test || $skip_wm_test, join(" ", map { substr($_, 0, 8) } $e->xview), "0 0.827586");
+SKIP: {
+    skip($skip_wm_font_test, 1)
+	if !$do_font_test || !$do_wm_test;
+    is_deeply([map { substr($_, 0, 8) } $e->xview], [0, 0.827586]);
+}
 
 $e->configure(-show => "");
 $e->delete(qw(0 end));
-ok(($e->xview)[$_], $_) for (0 .. 1);
+is(($e->xview)[$_], $_) for (0 .. 1);
 
 Tk::catch {$e->destroy};
 $e = $mw->Entry(qw(-width 10 -xscrollcommand), \&scroll, -font => $fixed)->pack;
@@ -1276,19 +1293,27 @@ $e->update;
 $e->delete(qw(0 end));
 $e->insert(qw(0 123));
 $e->update;
-ok(join(" ",@scrollInfo),"0 1");
+is(join(" ",@scrollInfo),"0 1");
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 0123456789abcdef));
 $e->xview(3);
 $e->update;
-skip($skip_font_test || $skip_wm_test, join(" ",@scrollInfo),"0.1875 0.8125");
+SKIP: {
+    skip($skip_wm_font_test, 1)
+	if !$do_font_test || !$do_wm_test;
+    is_deeply([@scrollInfo],[0.1875, 0.8125]);
+}
 
 $e->delete(qw(0 end));
 $e->insert(qw(0 abcdefghijklmnopqrs));
 $e->xview(6);
 $e->update;
-skip($skip_font_test || $skip_wm_test, join(" ",map { sprintf "%8f", $_ } @scrollInfo),"0.315789 0.842105");
+SKIP: {
+    skip($skip_wm_font_test, 1)
+	if !$do_font_test || !$do_wm_test;
+    is_deeply([map { sprintf "%8f", $_ } @scrollInfo],[0.315789, 0.842105]);
+}
 
 Tk::catch {$e->destroy};
 my $err;
@@ -1297,7 +1322,7 @@ eval {
     $e = $mw->Entry(qw(-width 5 -xscrollcommand thisisnotacommand))->pack;
     $e->update;
 };
-ok($err =~ /Undefined subroutine &main::thisisnotacommand/);
+like($err, qr/Undefined subroutine &main::thisisnotacommand/, "Expected invalid -xscrollcommand callback");
 
 #      pack .e
 #      update
@@ -1323,7 +1348,7 @@ ok($err =~ /Undefined subroutine &main::
 # Additional tests
 
 $e->validate; # check whether validate method is defined
-ok(1);
+pass("validate method seems to be defined");
 
 __END__
 
diff -up '/usr/local/src/Tk-804.027/t/listbox.t' '/home/e/eserte/work/svk-checkouts/Tk/t/listbox.t'
Index: ./t/listbox.t
Prereq:  1.2 
--- ./t/listbox.t	Sun Dec 21 21:03:05 2003
+++ ./t/listbox.t	Wed Nov  1 23:04:17 2006
@@ -52,15 +52,20 @@ my $partial_lb;
 my $mw = new MainWindow;
 $mw->geometry('+10+10');
 $mw->raise;
-my $fixed = $Xft ? '{Adobe Courier} -12' : 'Courier -12';
+## Always use the X11 font, even with Xft, otherwise the measurements would
+## be wrong.
+#my $fixed = $Xft ? '{Adobe Courier} -12' : 'Courier -12';
+my $fixed = "-adobe-courier-medium-r-normal--12-120-75-75-m-*-iso8859-1";
 ok(Tk::Exists($mw), 1);
 
 # Create entries in the option database to be sure that geometry options
 # like border width have predictable values.
 $mw->optionAdd("*$Listbox.borderWidth",2);
 $mw->optionAdd("*$Listbox.highlightThickness",2);
-$mw->optionAdd("*$Listbox.font",
-                $Xft ? '{Adobe Helvetica} -12 bold' :'Helvetica -12 bold');
+## Again, prefer the X11 font.
+#$mw->optionAdd("*$Listbox.font",
+#                $Xft ? '{Adobe Helvetica} -12 bold' :'Helvetica -12 bold');
+$mw->optionAdd("*$Listbox.font", 'Helvetica -12 bold');
 
 my $lb = $mw->$Listbox->pack;
 ok(Tk::Exists($lb), 1);
@@ -89,24 +94,22 @@ if (!$Xft) { # XXX Is this condition nec
 my $skip_fixed_font_test;
 {
     my $fixed_lb = $mw->$Listbox(-font => $fixed);
-    if (!$Xft) { # XXX Is this condition necessary?
-	my %fa = $mw->fontActual($fixed_lb->cget(-font));
-	my %expected = (
-			"-weight" => "normal",
-			"-underline" => 0,
-			"-family" => "courier",
-			"-slant" => "roman",
-			"-size" => -12,
-			"-overstrike" => 0,
-		       );
-	while(my($k,$v) = each %expected) {
-	    if ($v ne $fa{$k}) {
-		$skip_fixed_font_test = "font-related tests (fixed font)";
-		last;
-	    }
+    my %fa = $mw->fontActual($fixed_lb->cget(-font));
+    my %expected = (
+		    "-weight" => "normal",
+		    "-underline" => 0,
+		    "-family" => "courier", # with $Xft, this would be "Courier"
+		    "-slant" => "roman",
+		    "-size" => -12,
+		    "-overstrike" => 0,
+		   );
+    while(my($k,$v) = each %expected) {
+	if ($v ne $fa{$k}) {
+	    $skip_fixed_font_test = "font-related tests (fixed font)";
+	    last;
 	}
-	$fixed_lb->destroy;
     }
+    $fixed_lb->destroy;
 }
 
 resetGridInfo();
#### End of Patch data ####

#### ApplyPatch data follows ####
# Data version        : 1.0
# Date generated      : Sat Nov  4 19:33:29 2006
# Generated by        : makepatch 2.03
# Recurse directories : Yes
# Excluded files      : (\A|/).*\~\Z
#                       (\A|/).*\.a\Z
#                       (\A|/).*\.bak\Z
#                       (\A|/).*\.BAK\Z
#                       (\A|/).*\.elc\Z
#                       (\A|/).*\.exe\Z
#                       (\A|/).*\.gz\Z
#                       (\A|/).*\.ln\Z
#                       (\A|/).*\.o\Z
#                       (\A|/).*\.obj\Z
#                       (\A|/).*\.olb\Z
#                       (\A|/).*\.old\Z
#                       (\A|/).*\.orig\Z
#                       (\A|/).*\.rej\Z
#                       (\A|/).*\.so\Z
#                       (\A|/).*\.Z\Z
#                       (\A|/)\.del\-.*\Z
#                       (\A|/)\.make\.state\Z
#                       (\A|/)\.nse_depinfo\Z
#                       (\A|/)core\Z
#                       (\A|/)tags\Z
#                       (\A|/)TAGS\Z
# p 'MANIFEST' 48280 1162504300 0100660
# p 'MANIFEST.SKIP' 5557 1162647919 0100666
# p 'Text/Text.pm' 43613 1162648375 0100664
# p 'Tixish/NoteBook.pm' 9923 1162648546 0100664
# p 'Tk/FBox.pm' 30078 1162654088 0100664
# p 'Tk/MMtry.pm' 1403 1162648487 0100664
# p 'Tk/Menu.pm' 29308 1162246688 0100660
# p 'ToDo' 1300 1162582567 0100660
# p 'config/xft.c' 316 1162582568 0100660
# p 'demos/widget' 18915 1162254761 0100771
# p 'myConfig' 10333 1162582568 0100660
# p 'pTk/mTk/generic/tkCanvWind.c' 34145 1162255239 0100660
# p 'pTk/mTk/generic/tkEvent.c' 44822 1162246694 0100660
# p 'pTk/mTk/tclUnix/tclUnixTime.c' 10915 1162246692 0100660
# p 'pTk/mTk/unix/tkUnixWm.c' 209810 1162253827 0100660
# p 'pTk/mTk/unix/tkUnixXft.c' 18178 1162582568 0100660
# p 'pTk/mTk/xlib/X11/Xlib.h' 41024 1162246693 0100660
# p 'pod/Font.pod' 15562 1162653502 0100660
# p 'pod/Widget.pod' 25131 1162246688 0100660
# p 'ptksh' 17421 1162646207 0100775
# c 't/canvas.t' 0 1162587645 0100775
# p 't/entry.t' 35494 1162418132 0100775
# p 't/listbox.t' 61131 1162418657 0100775
#### End of ApplyPatch data ####

#### End of Patch kit [created: Sat Nov  4 19:33:29 2006] ####
#### Patch checksum: 2829 91912 47814 ####
#### Checksum: 2859 92917 1185 ####
