texlive[43805] Master: Reworked installer and tlaunch option

commits+siepo at tug.org commits+siepo at tug.org
Sat Apr 15 10:22:51 CEST 2017


Revision: 43805
          http://tug.org/svn/texlive?view=revision&revision=43805
Author:   siepo
Date:     2017-04-15 10:22:51 +0200 (Sat, 15 Apr 2017)
Log Message:
-----------
Reworked installer and tlaunch option

Modified Paths:
--------------
    trunk/Master/bin/win32/tlaunch.exe
    trunk/Master/install-tl
    trunk/Master/tlpkg/installer/install-menu-perltk.pl
    trunk/Master/tlpkg/installer/install-menu-text.pl
    trunk/Master/tlpkg/installer/install-menu-wizard.pl

Added Paths:
-----------
    trunk/Master/tlpkg/installer/tracked-install.pl

Modified: trunk/Master/bin/win32/tlaunch.exe
===================================================================
(Binary files differ)

Modified: trunk/Master/install-tl
===================================================================
--- trunk/Master/install-tl	2017-04-15 01:00:49 UTC (rev 43804)
+++ trunk/Master/install-tl	2017-04-15 08:22:51 UTC (rev 43805)
@@ -45,6 +45,7 @@
 use Cwd 'abs_path';
 use Getopt::Long qw(:config no_autoabbrev);
 use Pod::Usage;
+use POSIX ();
 
 use TeXLive::TLUtils qw(platform platform_desc sort_archs
    which getenv win32 unix info log debug tlwarn ddebug tldie
@@ -78,7 +79,6 @@
     &unregister_file_type
     &broadcast_env
     &update_assocs
-    &add_desktop_shortcut
     &add_menu_shortcut
     &remove_desktop_shortcut
     &remove_menu_shortcut
@@ -195,7 +195,8 @@
 if (-r "installation.profile") {
   my $pwd = Cwd::getcwd();
   print "ABORTED TL INSTALLATION FOUND: installation.profile (in $pwd)\n";
-  print "Do you want to continue with the exact same settings as before (y/N): ";
+  print
+    "Do you want to continue with the exact same settings as before (y/N): ";
   my $answer = <STDIN>;
   if ($answer =~ m/^y(es)?$/i) {
     $opt_profile = "installation.profile";
@@ -314,7 +315,8 @@
     info("Automated TeX Live installation using profile: $opt_profile\n");
   } else {
     $opt_profile = "";
-    info("Profile $opt_profile not readable, continuing in interactive mode.\n");
+    info(
+      "Profile $opt_profile not readable, continuing in interactive mode.\n");
   }
 }
 
@@ -410,7 +412,6 @@
   }
 }
 
-#
 if (defined($opt_force_arch)) {
   tlwarn("Overriding platform to $opt_force_arch\n");
   $::_platform_ = $opt_force_arch;
@@ -470,6 +471,7 @@
   }
 }
 
+# find wget, tar, xzdec
 if (!setup_programs ("$::installerdir/tlpkg/installer", "$::_platform_")) {
   tldie("$0: Goodbye.\n");
 }
@@ -530,6 +532,7 @@
       if (-r $tlpdboldpath && $dn ne $install_tl_root) {
         debug ("found old installation in $dn\n");
         push @runargs, "-old-installation-found=$dn";
+        # only the text-mode menu will pay attention!
       }
     }
   }
@@ -536,16 +539,13 @@
 
   my $ret = &{$::run_menu}(@runargs);
   if ($ret == $MENU_QUIT) {
-    do_cleanup();
+    do_cleanup(); # log, profile, temp files
     flushlog();
     exit(1);
   } elsif ($ret == $MENU_ABORT) {
-    # omit do_cleanup().
+    # here, omit do_cleanup()
     flushlog();
     exit(2);
-  } elsif ($ret == $MENU_ALREADYDONE) {
-    debug("run_menu has already done the work ... cleaning up.\n");
-    $finished = 1;
   }
   if (!$finished && ($ret != $MENU_INSTALL)) {
     tlwarn("Unknown return value of run_menu: $ret\n");
@@ -564,28 +564,40 @@
 }
 log("Settings:\n" . $varsdump);
 
-my $errcount = 0;
-if (!$finished) {
-  # do the actual installation
-  # w32: first, remove trailing slash from texdir[w]
-  # in case it is the root of a drive
-  $vars{'TEXDIR'} =~ s![/\\]$!!;
-  sanitise_options();
-  info("Installing to: $vars{TEXDIR}\n");
-  $errcount = do_installation();
-}
+sanitise_options();
+install_warnlines_hook(); # collect warnings in @::WARNLINES
+info("Installing to: $vars{TEXDIR}\n");
 
-do_cleanup();
-
-my $status = 0;
-if ($errcount > 0) {
-  $status = 1;
-  warn "$0: errors in installation reported above,\n";
-  warn "$0: exiting with bad status.\n";
+$::env_warns = "";
+check_env() unless $ENV{"TEXLIVE_INSTALL_ENV_NOCHECK"};
+create_welcome();
+my $status = 1;
+if ($opt_gui eq 'text' or
+      !(-r "$::installerdir/tlpkg/installer/tracked-install.pl")) {
+  $status = do_installation();
+  if (@::WARNLINES) {
+    foreach my $t (@::WARNLINES) { print STDERR $t; }
+  }
+  if ($::env_warns) { print STDERR $::env_warns; }
+  foreach my $t (@::welcome_arr) {
+    printf STDERR sprintf (shift @$t, @$t);
+    print STDERR "\n";
+  }
+  do_cleanup(); # sets $::LOGFILENAME if not already defined
+  if ($LOGFILENAME) {
+    print STDERR "Logfile: $::LOGFILENAME\n";
+  } else {
+    # do_cleanup sets $::LOGFILENAME to ""
+    #if no logfile could be written
+    print STDERR
+      "Cannot create logfile $vars{'TEXDIR'}/install-tl.log: $!\n";
+  }
+} else {
+  require("installer/tracked-install.pl");
+  $status = installer_tracker();
 }
-exit($status);
+exit $status;
 
-
 

 ###################################################################
 #
@@ -637,7 +649,7 @@
     }
   }
   return load_tlpdb();
-}
+} # only_load_remote
 
 
 sub do_remote_init {
@@ -660,7 +672,7 @@
   }
   final_remote_init();
   return 1;
-}
+} # do_remote_init
 
 sub do_version_agree {
   $texlive_release = $tlpdb->config_release;
@@ -681,7 +693,7 @@
   } else {
     return 1;
   }
-}
+} # do_version_agree
 
 sub final_remote_init {
   info("Installing TeX Live $TeXLive::TLConfig::ReleaseYear from: $location" .
@@ -714,7 +726,8 @@
   if ($opt_in_place and ($media ne "local_uncompressed")) {
     print "TeX Live not local or not decompressed; 'in_place' option not applicable\n";
     $opt_in_place = 0;
-  } elsif ($opt_in_place and (!TeXLive::TLUtils::texdir_check($::installerdir))) {
+  } elsif (
+      $opt_in_place and (!TeXLive::TLUtils::texdir_check($::installerdir))) {
     print "Installer dir not writable; 'in_place' option not applicable\n";
     $opt_in_place = 0;
   }
@@ -747,14 +760,20 @@
       tlwarn("Scheme $opt_scheme not defined, ignoring it.\n");
     }
   }
-}
+} # final_remote_init
 
 
 sub do_installation {
-  install_warnlines_hook();
   if (win32()) {
     non_admin() if !$vars{'option_w32_multi_user'};
   }
+  if ($vars{'portable'}) {
+    $vars{'option_desktop_integration'} = 0;
+    $vars{'option_menu_integration'} = 0;
+    $vars{'option_file_assocs'} = 0;
+    $vars{'option_path'} = 0;
+    $vars{'option_w32_multi_user'} = 0;
+  }
   if ($vars{'selected_scheme'} ne "scheme-infraonly"
       && $vars{'n_collections_selected'} <= 0) {
     tlwarn("Nothing selected, nothing to install, exiting!\n");
@@ -761,13 +780,13 @@
     exit 1;
   }
   # maybe_make_ro tests for admin, local drive and NTFS before proceeding.
-  # setting the root read-only automatically locks everything below it.
-  # do TEXDIR now, before removing final slash
+  # making the root read-only automatically locks everything below it.
+  # do TEXDIR now, before it loses its final slash
   mkdirhier "$vars{'TEXDIR'}";
   if (win32()) {
     TeXLive::TLWinGoo::maybe_make_ro ($vars{'TEXDIR'});
   }
-  # remove final slash from TEXDIR even if it is the root of a drive
+  # now remove final slash from TEXDIR even if it is the root of a drive
   $vars{'TEXDIR'} =~ s!/$!!;
   # do the actual installation
   make_var_skeleton "$vars{'TEXMFSYSVAR'}";
@@ -796,7 +815,7 @@
         && ! -e "$vars{TEXDIR}/release-texlive.txt") {
       copy("$::installerdir/release-texlive.txt", "$vars{TEXDIR}/");
     }
-    
+
     calc_depends();
     save_options_into_tlpdb();
     # we need to do that dir, since we use the TLPDB->install_package which
@@ -841,18 +860,31 @@
   $localtlpdb->add_tlpobj($tlpobj);  
   
   $localtlpdb->save unless $vars{'in_place'};
-  
+
   my $errcount = do_postinst_stuff();
-  if (win32() || $vars{'portable'}) {
-    print welcome();
-  } else {
-    print welcome_paths();
+
+  #tlwarn("!!! Dummy test warning\n");
+  #tlwarn("!!! Another test warning\n");
+  #$errcount += 2;
+
+  # check environment for possibly tex-related strings:
+  check_env();
+  # log, profile, temp files:
+  do_cleanup();
+
+  create_welcome();
+  if (@::WARNLINES) {
+    unshift @::WARNLINES, ("\nSummary of warnings:\n");
   }
-  print warnings_summary();
-  
-  return $errcount;
-}
+  my $status = 0;
+  if ($errcount > 0) {
+    $status = 1;
+    warn "\n$0: errors in installation reported above\n";
+  }
 
+  return $status;
+} # do_installation
+
 sub run_postinst_cmd {
   my ($cmd) = @_;
   
@@ -867,7 +899,7 @@
   }
   
   return $ret;
-}
+} # run_postinst_cmd
 
 
 # 

@@ -911,7 +943,7 @@
     TEXMFVAR TEXMFCONFIG TEXMFHOME TEXMFCACHE);
 
   if (defined($ENV{'TEXMFCNF'})) {
-    print "WARNING: environment variable TEXMFCNF is set.
+    tlwarn "WARNING: environment variable TEXMFCNF is set.
 You should know what you are doing.
 We will unset it for the post-install actions, but all further
 operations might be disturbed.\n\n";
@@ -957,12 +989,6 @@
     debug("Effective TEXMFCNF: " . `kpsewhich -expand-path=\$TEXMFCNF` ."\n");
   }
 
-  if (win32() and !$vars{'portable'} and !$vars{'in_place'}) {
-    create_uninstaller($vars{'TEXDIR'});
-    # TODO: custom uninstaller for in_place
-    # (re-)initialize batchfile for uninstalling shortcuts
-  }
-
   # Step 4: run the programs
   my $errcount = 0;
 
@@ -1026,9 +1052,29 @@
     $errcount += run_postinst_cmd("tlmgr --no-execute-actions paper letter");
   }
 
+  # option settings in launcher.ini
+  if (win32() && !$vars{'portable'}) {
+    if ($vars{'option_file_assocs'} != 1 || !$vars{'option_path'}) {
+      # create higher priority tlaunch.ini with adjusted settings
+      # whether or not launcher mode (desktop integration 2)
+      # was selected
+      rewrite_tlaunch_ini();
+    }
+  }
+
   # now rerun mktexlsr for updmap-sys and tlmgr paper letter updates.
   $errcount += wsystem("re-running", "mktexlsr", $TEXMFSYSVAR,$TEXMFSYSCONFIG);
 
+  if (win32() and !$vars{'portable'} and !$vars{'in_place'}) {
+    if ($vars{'option_desktop_integration'} != 2) {
+      create_uninstaller($vars{'TEXDIR'});
+    } else {
+      $errcount += wsystem (
+        'Running','tlaunch.exe',
+        admin() ? 'admin_inst_silent' : 'user_inst_silent');
+    }
+  }
+
   # luatex/context setup.
   if (exists($install{"context"}) && $install{"context"} == 1
       && !exists $ENV{"TEXLIVE_INSTALL_NO_CONTEXT_CACHE"}) {
@@ -1051,11 +1097,12 @@
   # on Unix set symlinks
   # for portable, this option should be unset
   # it should not be necessary to test separately for portable
-  do_path_adjustments() if $vars{'option_path'};
+  do_path_adjustments() if
+    $vars{'option_path'} and $vars{option_desktop_integration} != 2;
 
   # now do the system integration:
   # on unix this means setting up symlinks
-  # on w32 this means adding to path, settting registry values
+  # on w32 this means settting registry values
   # on both, we run the postaction directives of the tlpdb
   # no need to test for portable or in_place:
   # the menus (or profile?) should have set the required options
@@ -1062,7 +1109,7 @@
   $errcount += do_tlpdb_postactions();
   
   return $errcount;
-}
+} # do_postinst_stuff
 
 
 # Run the post installation code in the postaction tlpsrc entries.
@@ -1073,21 +1120,68 @@
 
   # option settings already reflect portable- and in_place options.
   my $usedtlpdb = $vars{'in_place'} ? $tlpdb : $localtlpdb;
-  
+  my $ret = 0; # n. of errors
+
   foreach my $package ($usedtlpdb->list_packages) {
-    TeXLive::TLUtils::do_postaction("install",
-                                    $usedtlpdb->get_package($package),
-                                    $vars{'option_file_assocs'},
-                                    $vars{'option_menu_integration'},
-                                    $vars{'option_desktop_integration'},
-                                    $vars{'option_post_code'});
+    # !!! alert: parameter 4 is menu shortcuts, parameter 5 does nothing !!!
+    if ($vars{'option_desktop_integration'}==2) {
+      # skip creation of shortcuts and file associations
+      if (!TeXLive::TLUtils::do_postaction(
+        "install", $usedtlpdb->get_package($package),
+        0, 0, 0, $vars{'option_post_code'})) { $ret += 1; }
+    } else {
+      # create shortcuts and file associations
+      # according to corresponding options
+      if (!TeXLive::TLUtils::do_postaction(
+        "install", $usedtlpdb->get_package($package),
+        $vars{'option_file_assocs'},
+        $vars{'option_desktop_integration'}, 0,
+        $vars{'option_post_code'})) { $ret += 1; }
+    }
   }
+  # windows: alert the system about changed file associations
   if (win32) { TeXLive::TLWinGoo::update_assocs(); }
   info ("finished with package-specific postactions\n");
-  
-  return 0; # xxxx errcount
-}
+  return $ret;
+} # do_tlpdb_postactions
 
+sub rewrite_tlaunch_ini {
+  # create a higher-priority copy of tlaunch.ini in TEXMFSYSVAR
+  # with appropriate settings in the General section
+  my $ret = 0; # n. of errors
+
+  chomp( my $tmfmain = `kpsewhich -var-value=TEXMFMAIN` ) ;
+  chomp( my $tmfsysvar = `kpsewhich -var-value=TEXMFSYSVAR` ) ;
+  if (open IN, "$tmfmain/web2c/tlaunch.ini") {
+    my $eolsave = $/;
+    undef $/;
+    my $ini = <IN>;
+    close IN;
+    # remove general section, if any
+    $ini =~ s/\r\n/\n/g;
+    $ini =~ s/\[general[^\[]*//si;
+    mkdirhier("$tmfsysvar/web2c");
+    if (open OUT, ">", "$tmfsysvar/web2c/tlaunch.ini") {
+      my @fts = ('none', 'new', 'overwrite');
+      $\ = "\n";
+      print OUT $ini;
+      print OUT "[General]";
+      print OUT "FILETYPES=$fts[$vars{'option_file_assocs'}]";
+      print OUT "SEARCHPATH=$vars{'option_path'}\n";
+      close OUT;
+      `mktexlsr $tmfsysvar`;
+    } else {
+      $ret += 1;
+      tlwarn("Cannot write modified tlaunch.ini\n");
+    }
+    $/ = $eolsave;
+  } else {
+    $ret += 1;
+    tlwarn("Cannot open tlaunch.ini for reading\n");
+  }
+  return $ret;
+} # rewrite_tlaunch_ini
+
 sub do_path_adjustments {
   info ("running path adjustment actions\n");
   if (win32()) {
@@ -1100,7 +1194,7 @@
       $vars{'option_sys_info'});
   }
   info ("finished with path adjustment actions\n");
-}
+} # do_path_adjustments
 
 
 # we have to adjust the texmf.cnf file to the paths set in the configuration!
@@ -1247,7 +1341,7 @@
   }
   print TMFLUA "}\n";
   close(TMFLUA) || warn "close($TMFLUA) failed: $!";
-}
+} # do_texmf_cnf
 
 
 sub dump_vars {
@@ -1264,7 +1358,7 @@
   }
   close VARS if (!ref($filename));
   debug("\n%vars dumped to '$filename'.\n");
-}
+} # dump_vars
 
 
 # Determine which platforms are supported.
@@ -1278,7 +1372,7 @@
   for my $key (keys %vars) {
     ++$vars{'n_systems_available'} if ($key=~/^binary/);
   }
-}
+} # set_platforms_supported
 
 # Environment variables and default values on UNIX:
 #   TEXLIVE_INSTALL_PREFIX         /usr/local/texlive   => $tex_prefix
@@ -1340,7 +1434,7 @@
     $vars{'TEXMFVAR'}    = "\$TEXMFSYSVAR";
     $vars{'TEXMFCONFIG'} = "\$TEXMFSYSCONFIG";
   }
-}
+} # set_texlive_default_dirs
 
 sub calc_depends {
   # we have to reset the install hash EVERY TIME otherwise everything will
@@ -1468,12 +1562,13 @@
   }
   $vars{'total_size'} =
     sprintf "%d", ($size * $TeXLive::TLConfig::BlockSize)/1024**2;
-}
+} # calc_depends
 
 sub load_tlpdb {
   my $master = $location;
   info("Loading $master/$TeXLive::TLConfig::InfraLocation/$TeXLive::TLConfig::DatabaseName\n");
-  $tlpdb = TeXLive::TLPDB->new(root => $master, 'verify' => $opt_verify_downloads);
+  $tlpdb = TeXLive::TLPDB->new(
+    root => $master, 'verify' => $opt_verify_downloads);
   if (!defined($tlpdb)) {
     my $do_die = 1;
     # if that failed, and:
@@ -1492,7 +1587,8 @@
       # download object
       $::tldownload_server->enable if defined($::tldownload_server);
       #
-      $tlpdb = TeXLive::TLPDB->new(root => $master, 'verify' => $opt_verify_downloads);
+      $tlpdb = TeXLive::TLPDB->new(
+        root => $master, 'verify' => $opt_verify_downloads);
       if (!defined($tlpdb)) {
         tlwarn("Oh well, adding tlnet did not help.\n");
         tlwarn(<<END_EXPLICIT_MIRROR);
@@ -1523,12 +1619,13 @@
   $vars{'option_autobackup'} = $tlpdb->option("autobackup");
   $vars{'option_backupdir'} = $tlpdb->option("backupdir");
   $vars{'option_letter'} = defined($tlpdb->option("paper"))
-                           && ($tlpdb->option("paper") eq "letter" ? 1 : 0);
+    && ($tlpdb->option("paper") eq "letter" ? 1 : 0);
+  # below, we really mean (start) menu integration.
+  # 2016: always menu shortcuts, never desktop shortcuts, whatever the setting
+  # 2017: new option value 2: launcher instead of menu.
+  # in portable case, shortcuts sanitized away elsewhere
   $vars{'option_desktop_integration'} = $tlpdb->option("desktop_integration");
   $vars{'option_desktop_integration'} = 1 if win32();
-  # we unconditionally set the menu integration, this will be done in all
-  # cases but portable use, where we sanitize it away
-  $vars{'option_menu_integration'} = 1;
   $vars{'option_path'} = $tlpdb->option("path");
   $vars{'option_path'} = 0 if !defined($vars{'option_path'});
   $vars{'option_path'} = 1 if win32();
@@ -1556,7 +1653,7 @@
     $vars{'selected_scheme'} = $default_scheme;
   }
   return 1;
-}
+} # load_tlpdb
 
 sub initialize_collections {
   foreach my $pkg ($tlpdb->list_packages) {
@@ -1581,7 +1678,7 @@
     $vars{"collection-wintools"} = 1;
     ++$vars{'n_collections_selected'};
   }
-}
+} # initialize_collections
 
 sub set_install_platform {
   my $detected_platform=platform;
@@ -1619,7 +1716,7 @@
     }
   }
   return($ret);
-}
+} # set_install_platform
 
 sub create_profile {
   my $profilepath = shift;
@@ -1656,7 +1753,7 @@
   if (!ref($profilepath)) {
     close PROFILE;
   }
-}
+} # create_profile
 
 sub read_profile {
   my $profilepath = shift;
@@ -1696,16 +1793,15 @@
   for my $scheme_content ($scheme->depends) {
     $vars{"$scheme_content"}=1 if ($scheme_content=~/^collection-/);
   }
-}
+} # read_profile
 
 # helper subroutine to do sanity check of options before installation
 sub sanitise_options {
   # portable option overrides any system integration options
-  $vars{'option_path'}                &&= !$vars{'portable'};
-  $vars{'option_file_assocs'}         &&= !$vars{'portable'};
-  $vars{'option_desktop_integration'} &&= !$vars{'portable'};
-  $vars{'option_menu_integration'}    &&= !$vars{'portable'};
-}
+  $vars{'option_path'} = 0 if $vars{'portable'};
+  $vars{'option_file_assocs'} = 0 if $vars{'portable'};
+  $vars{'option_desktop_integration'} = 0 if $vars{'portable'};
+} # sanitise_options
 
 sub do_install_packages {
   my @what;
@@ -1736,11 +1832,13 @@
     flushlog();
     exit(1);
   }
-  $localtlpdb->option ("desktop_integration", $vars{'option_desktop_integration'} ? "1" : "0");
+  # restore options in tlpdb
+  $localtlpdb->option (
+    "desktop_integration", $vars{'option_desktop_integration'});
   $localtlpdb->option ("file_assocs", $vars{'option_file_assocs'});
   $localtlpdb->option ("post_code", $vars{'option_post_code'} ? "1" : "0");
   $localtlpdb->save;
-}
+} # do_install_packages
 
 # for later complete removal we want to save some options and values
 # into the local tlpdb:
@@ -1758,7 +1856,8 @@
   $localtlpdb->option ("autobackup", $vars{'option_autobackup'});
   $localtlpdb->option ("backupdir", $vars{'option_backupdir'});
   $localtlpdb->option ("create_formats", $vars{'option_fmt'} ? "1" : "0");
-  $localtlpdb->option ("desktop_integration", $vars{'option_desktop_integration'} ? "1" : "0");
+  $localtlpdb->option (
+    "desktop_integration", $vars{'option_desktop_integration'});
   $localtlpdb->option ("file_assocs", $vars{'option_file_assocs'});
   $localtlpdb->option ("post_code", $vars{'option_post_code'} ? "1" : "0");
   $localtlpdb->option ("sys_bin", $vars{'option_sys_bin'});
@@ -1766,7 +1865,8 @@
   $localtlpdb->option ("sys_man", $vars{'option_sys_man'});
   $localtlpdb->option ("install_docfiles", $vars{'option_doc'} ? "1" : "0");
   $localtlpdb->option ("install_srcfiles", $vars{'option_src'} ? "1" : "0");
-  $localtlpdb->option ("w32_multi_user", $vars{'option_w32_multi_user'} ? "1" : "0");
+  $localtlpdb->option (
+    "w32_multi_user", $vars{'option_w32_multi_user'} ? "1" : "0");
   my @archs;
   foreach (keys %vars) {
     if (m/^binary_(.*)$/ ) {
@@ -1783,11 +1883,12 @@
   }
   $localtlpdb->setting("available_architectures", @archs);
   $localtlpdb->save() unless $vars{'in_place'};
-}
+} # save_options_into_tlpdb
 
 sub import_settings_from_old_tlpdb {
   my $dn = shift;
-  my $tlpdboldpath = "$dn/$TeXLive::TLConfig::InfraLocation/$TeXLive::TLConfig::DatabaseName";
+  my $tlpdboldpath =
+    "$dn/$TeXLive::TLConfig::InfraLocation/$TeXLive::TLConfig::DatabaseName";
   my $previoustlpdb;
   if (-r $tlpdboldpath) {
     # we found an old installation, so read that one in and save
@@ -1901,7 +2002,6 @@
     $previoustlpdb->option_pkg("00texlive.installation",
                                "create_formats");
   $vars{'option_desktop_integration'} = 1 if win32();
-  $vars{'option_menu_integration'} = 1 if win32();
   $vars{'option_path'} =
     $previoustlpdb->option_pkg("00texlive.installation",
                                "path");
@@ -1967,12 +2067,13 @@
     } elsif ($common_paper eq "a4") {
       # do nothing
     } else {
-      tlwarn("Previous installation has common paper setting of: $common_paper\n");
+      tlwarn(
+        "Previous installation has common paper setting of: $common_paper\n");
       tlwarn("After installation has finished, you will need\n");
       tlwarn("  to redo this setting by running:\n");
     }
   }
-}
+} # import_settings_from_old_tlpdb
 
 # do everything to select a scheme
 #
@@ -2009,7 +2110,7 @@
   }
   # for good measure, update the deps
   calc_depends();
-}
+} # select_scheme
 
 # try to give a decent order of schemes, but be so general that
 # if we change names of schemes nothing bad happnes (like forgetting one)
@@ -2029,7 +2130,7 @@
     push @scheme_order, $s if !$schemes_shown{$s};
   }
   return @scheme_order;
-}
+} # schemes_ordered_for_presentation
 
 sub update_numbers {
   $vars{'n_collections_available'}=0;
@@ -2046,8 +2147,9 @@
       ++$vars{'n_collections_selected'} if $vars{$key} == 1;
     }
   }
-}
+} # update_numbers
 
+# to be called at exit when the installation did not complete
 sub flushlog {
   my $fh;
   my $logfile = "install-tl.log";
@@ -2064,107 +2166,66 @@
   foreach my $l (@::LOGLINES) {
     print $fh $l;
   }
-}
+} # flushlog
 
 sub do_cleanup {
+  # remove temporary files from TEXDIR/temp
+  if (($media eq "local_compressed") or ($media eq "NET")) {
+    debug("Remove temporary downloaded containers...\n");
+    rmtree("$vars{'TEXDIR'}/temp") if (-d "$vars{'TEXDIR'}/temp");
+  }
+
+  # write the profile out
+  if ($vars{'in_place'}) {
+    create_profile("$vars{'TEXDIR'}/texlive.profile");
+    debug("Profile written to $vars{'TEXDIR'}/texlive.profile\n");
+  } else {
+    create_profile("$vars{'TEXDIR'}/$InfraLocation/texlive.profile");
+    debug("Profile written to $vars{'TEXDIR'}/$InfraLocation/texlive.profile\n");
+  }
+
   # now open the log file and write out the log lines if needed.
   # the user could have given the -logfile option in which case all the
   # stuff is already dumped to it and $::LOGFILE defined. So do not
   # redefine it.
   if (!defined($::LOGFILE)) {
-    if (open(LOGF,">$vars{'TEXDIR'}/install-tl.log")) {
+    # no -logfile option; nothing written yet
+    $::LOGFILENAME = "$vars{'TEXDIR'}/install-tl.log";
+    if (open(LOGF,">$::LOGFILENAME")) {
       $::LOGFILE = \*LOGF;
       foreach my $line(@::LOGLINES) {
         print $::LOGFILE "$line";
       }
     } else {
-      tlwarn("$0: Cannot create log file $vars{'TEXDIR'}/install-tl.log: $!\n"
+      tlwarn("$0: Cannot create log file $::LOGFILENAME: $!\n"
              . "Not writing out log lines.\n");
     }
   }
 
-  # remove temporary files from TEXDIR/temp
-  if (($media eq "local_compressed") or ($media eq "NET")) {
-    debug("Remove temporary downloaded containers...\n");
-    rmtree("$vars{'TEXDIR'}/temp") if (-d "$vars{'TEXDIR'}/temp");
-  }
-
-  # write the profile out
-  if ($vars{'in_place'}) {
-    create_profile("$vars{'TEXDIR'}/texlive.profile");
-    debug("Profile written to $vars{'TEXDIR'}/texlive.profile\n");
-  } else {
-    create_profile("$vars{'TEXDIR'}/$InfraLocation/texlive.profile");
-    debug("Profile written to $vars{'TEXDIR'}/$InfraLocation/texlive.profile\n");
-  }
   # Close log file if present
   close($::LOGFILE) if (defined($::LOGFILE));
-    if (defined($::LOGFILENAME) and (-e $::LOGFILENAME)) {
-      print "Logfile: $::LOGFILENAME\n";
-    } elsif (-e "$vars{'TEXDIR'}/install-tl.log") {
-      print "Logfile: $vars{'TEXDIR'}/install-tl.log\n";
-    } else {
-      print "No logfile\n";
+  if (!defined($::LOGFILENAME) and (-e "$vars{'TEXDIR'}/install-tl.log")) {
+    $::LOGFILENAME = "$vars{'TEXDIR'}/install-tl.log";
   }
-}
+  if (!(defined($::LOGFILENAME)) or !(-e $::LOGFILENAME)) {
+    $::LOGFILENAME = "";
+  }
+} # do_cleanup
 
-

-# Return the basic welcome message.
-
-sub welcome {
-  my $welcome = <<"EOF";
-
- See
-   $::vars{'TEXDIR'}/index.html
- for links to documentation.  The TeX Live web site
- contains updates and corrections: http://tug.org/texlive.
-
- TeX Live is a joint project of the TeX user groups around the world;
- please consider supporting it by joining the group best for you. The
- list of user groups is on the web at http://tug.org/usergroups.html.
-
- Welcome to TeX Live!
-
-EOF
-  return $welcome;
-}
-
-
-# The same welcome message as above but with hints about C<PATH>,
-# C<MANPATH>, and C<INFOPATH>.
-
-sub welcome_paths {
-  my $welcome = welcome ();
-
-  # ugly, remove welcome msg; better than repeating the whole text, though.
-  $welcome =~ s/\n Welcome to TeX Live!\n//;
-
-  $welcome .= <<"EOF";
- Add $::vars{'TEXDIR'}/texmf-dist/doc/info to INFOPATH.
- Add $::vars{'TEXDIR'}/texmf-dist/doc/man to MANPATH
-   (if not dynamically found).
-EOF
-
-  $welcome .= <<"EOF";
-
- Most importantly, add $::vars{'TEXDIR'}/bin/$::vars{'this_platform'}
- to your PATH for current and future sessions.
-EOF
-
-  unless ($ENV{"TEXLIVE_INSTALL_ENV_NOCHECK"}) {
-    # check for tex-related envvars.
-    my $texenvs = "";
-    for my $evar (sort keys %origenv) {
-      next if $evar =~ /^(_
-                          |.*PWD
-                          |GENDOCS_TEMPLATE_DIR|PATH|SHELLOPTS
-                         )$/x; # don't worry about these
-      if ("$evar $origenv{$evar}" =~ /tex/i) { # check both key and value
-        $texenvs .= "    $evar=$origenv{$evar}\n";
-      }
+sub check_env {
+  # check for tex-related envvars.
+  $::env_warns = "";
+  for my $evar (sort keys %origenv) {
+    next if $evar =~ /^(_
+                        |.*PWD
+                        |GENDOCS_TEMPLATE_DIR|PATH|SHELLOPTS
+                       )$/x; # don't worry about these
+    if ("$evar $origenv{$evar}" =~ /tex/i) { # check both key and value
+      $::env_warns .= "    $evar=$origenv{$evar}\n";
     }
-    if ($texenvs) {
-      $welcome .= <<"EOF";
+  }
+  if ($::env_warns) {
+    $::env_warns = <<"EOF";
 
  ----------------------------------------------------------------------
  The following environment variables contain the string "tex"
@@ -2173,17 +2234,25 @@
  while running TeX.  If you encounter problems, try unsetting them.
  Please ignore spurious matches unrelated to TeX.
 
-$texenvs ----------------------------------------------------------------------
+$::env_warns ----------------------------------------------------------------------
 EOF
-    }
   }
+}
 
-  $welcome .= <<"EOF";
+

+# Create a welcome message.
+# This is an array of references to anonymous arrays of parameters for
+# either __ or sprintf: a localizable string, possibly with placeholders,
+# followed by parameters for those placeholders, if any.
 
- Welcome to TeX Live!
-EOF
-
-  return $welcome;
+sub create_welcome {
+  @::welcome_arr = ();
+  push @::welcome_arr, (["\nWelcome to TeX Live!\n"]);
+  push @::welcome_arr, [
+    "See %s/index.html for links to documentation.\nThe TeX Live web site (http://tug.org/texlive/)\ncontains any updates and corrections.\n\nTeX Live is a joint project of the TeX user groups around the world;\nplease consider supporting it by joining the group best for you.\nThe list of groups is available on the web at http://tug.org/usergroups.html.\n", $::vars{'TEXDIR'}];
+  if (!win32()) {
+    push @::welcome_arr, ["Add %s/texmf-dist/doc/man to MANPATH.\nAdd %s/texmf-dist/doc/info to INFOPATH.\nMost importantly, add %s/bin/%s\nto your PATH for current and future sessions.", $::vars{'TEXDIR'}, $::vars{'TEXDIR'}, $::vars{'TEXDIR'}, $::vars{'this_platform'}];
+  }
 }
 
 

@@ -2192,19 +2261,19 @@
   push @::warn_hook, sub { push @::WARNLINES, @_; };
 }
 
-# a summary of warnings if there were any
-sub warnings_summary {
-  return '' unless @::WARNLINES;
-  my $summary = <<EOF;
+## a summary of warnings if there were any
+#sub warnings_summary {
+#  return '' unless @::WARNLINES;
+#  my $summary = <<EOF;
+#
+#Summary of warning messages during installation:
+#EOF
+#  $summary .= join ("", map { "  $_" } @::WARNLINES); # indent each warning
+#  $summary .= "\n";  # extra blank line
+#  return $summary;
+#}
 
-Summary of warning messages during installation:
-EOF
-  $summary .= join ("", map { "  $_" } @::WARNLINES); # indent each warning
-  $summary .= "\n";  # extra blank line
-  return $summary;
-}
 
-
 

 # some helper functions
 # 
@@ -2222,7 +2291,6 @@
   }
 }
 
-
 __END__
 

 =head1 NAME

Modified: trunk/Master/tlpkg/installer/install-menu-perltk.pl
===================================================================
--- trunk/Master/tlpkg/installer/install-menu-perltk.pl	2017-04-15 01:00:49 UTC (rev 43804)
+++ trunk/Master/tlpkg/installer/install-menu-perltk.pl	2017-04-15 08:22:51 UTC (rev 43805)
@@ -22,8 +22,8 @@
 require Tk::Dialog;
 require Tk::DialogBox;
 require Tk::PNG;
-require Tk::ROText;
-require Tk::ProgressBar;
+#require Tk::ROText;
+#require Tk::ProgressBar;
 require Tk::BrowseEntry;
 
 if ($::alternative_selector) {
@@ -52,6 +52,7 @@
 require("TeXLive/trans.pl");
 load_translations();
 
+# @fileassocdesc also defined in install-tl
 $::fileassocdesc[0] = __("None");
 $::fileassocdesc[1] = __("Only new");
 $::fileassocdesc[2] = __("All");
@@ -59,6 +60,14 @@
 $::letterdesc[0] = __('A4');
 $::letterdesc[1] = __('letter');
 
+$::deskintdesc[0] = __("No shortcuts");
+$::deskintdesc[1] = __("TeX Live menu");
+if (win32() && is_vista()) { $::deskintdesc[2] = __("Launcher entry"); }
+
+# generic option strings:
+$::yesno[0] = __('No');
+$::yesno[1] = __('Yes');
+
 my $mw;
 my $subframe;
 my $mainwindow;
@@ -116,19 +125,19 @@
 # From here on only function definitions
 # ##################################################################
 
-sub setup_perltk_local_vars {
-  $portableyesno = ( $vars{'portable'} ? __("Yes") : __("No") );
+sub setup_perltk_local_strings {
+  $portableyesno = $::yesno[$vars{'portable'}];
   $letteryesno = $::letterdesc[$vars{'option_letter'}];
-  $fmtyesno = ( $vars{'option_fmt'} ? __("Yes") : __("No") );
-  $srcyesno = ( $vars{'option_src'} ? __("Yes") : __("No") );
-  $deskintyesno = ( $vars{'option_desktop_integration'} ? __("Yes") : __("No") );
-  $pathadjyesno = ( $vars{'option_path'} ? __("Yes") : __("No") );
+  $fmtyesno = $::yesno[$vars{'option_fmt'}];
+  $srcyesno = $::yesno[$vars{'option_src'}];
+  $deskintyesno = $::deskintdesc[$vars{'option_desktop_integration'}];
+  $pathadjyesno = $::yesno[$vars{'option_path'}];
   $fileassocyesno = $::fileassocdesc[$vars{'option_file_assocs'}];
-  $editoryesno = ( $vars{'collection-texworks'} ? __("Yes") : __("No") );
-  $adminallyesno = ( $vars{'option_w32_multi_user'} ? __("Yes") : __("No") );
-  $docyesno = ( $vars{'option_doc'} ? __("Yes") : __("No") );
-  $restrictedyesno = ( $vars{'option_write18_restricted'} ? __("Yes") : __("No") );
-  $adjustrepoyesno = ( $vars{'option_adjustrepo'} ? __("Yes") : __("No") );
+  $editoryesno = $::yesno[$vars{'collection-texworks'}];
+  $adminallyesno = $::yesno[$vars{'option_w32_multi_user'}];
+  $docyesno = $::yesno[$vars{'option_doc'}];
+  $restrictedyesno = $::yesno[$vars{'option_write18_restricted'}];
+  $adjustrepoyesno = $::yesno[$vars{'option_adjustrepo'}];
 }
 
 sub menu_abort {
@@ -136,45 +145,11 @@
     $mainwindow->destroy;
 }
 
-sub setup_hooks_perltk {
-  @::info_hook = ();
-  push @::info_hook,
-    sub {
-      return unless defined $mainwindow;
-      update_status(join(" ", at _));
-      $mainwindow->update;
-    };
-  push @::warn_hook,
-    sub {
-      return unless defined $mainwindow ;
-      update_status(join(" ", at _));
-      $mainwindow->update;
-    };
-  @::install_packages_hook = ();
-  push @::install_packages_hook, \&update_progressbar;
-  push @::install_packages_hook,
-    sub {
-      return unless defined $mainwindow;
-      return unless defined $::sww;
-      $mainwindow->update;
-      $::sww->update;
-    };
+sub menu_do_it {
+    $return = $MENU_INSTALL;
+    $mainwindow->destroy;
 }
 
-sub update_status {
-  my ($p) = @_;
-  return unless defined $::progressw;
-  $::progressw->insert("end", "$p");
-  $::progressw->see("end");
-}
-sub update_progressbar {
-  my ($n,$total) = @_;
-  return unless defined $::progress;
-  if (defined($n) && defined($total)) {
-    $::progress->value(int($n*100/$total));
-  }
-}
-
 sub disable_buttons {
   change_button_state('disabled');
 }
@@ -194,15 +169,17 @@
   $collection_toggle_button->configure(-state => $what);
   $portable_toggle_button->configure(-state => $what);
   $texdir_toggle_button->configure(-state => $what);
-  $texdir_toggle_button->configure(-state => $what);
   $paper_toggle_button->configure(-state => $what);
   $write_eighteen_toggle_button->configure(-state => $what);
   $format_toggle_button->configure(-state => $what);
   $adjustrepo_toggle_button->configure(-state => $what);
   $pathbutton->configure(-state => $what);
-  $doc_files_toggle_button->configure(-state => $what) if defined($doc_files_toggle_button);
-  $src_files_toggle_button->configure(-state => $what) if defined($src_files_toggle_button);
-  $texworks_toggle_button->configure(-state => $what) if defined($texworks_toggle_button);
+  $doc_files_toggle_button->configure(-state => $what)
+    if defined($doc_files_toggle_button);
+  $src_files_toggle_button->configure(-state => $what)
+    if defined($src_files_toggle_button);
+  $texworks_toggle_button->configure(-state => $what)
+    if defined($texworks_toggle_button);
 }
 
 sub run_menu_perltk {
@@ -209,23 +186,18 @@
   if ($::opt_select_repository) {
   } else {
     do_remote_init();
-    setup_perltk_local_vars();
+    setup_perltk_local_strings();
     calc_depends();
   }
   $mainwindow = Tk::MainWindow->new;
   $mainwindow->protocol('WM_DELETE_WINDOW' => \&menu_abort);
-  setup_hooks_perltk();
 
   # Taco once reported for 2010 that using these scrolled pane
   # on Windows just died
   # with the proliferation of netbooks and a new perl installed
   # let us try to go back to using scrolled pane on both unix and windows
-  #if (!win32()) {
-    require Tk::Pane;
-    $subframe = $mainwindow->Scrolled("Frame", -scrollbars => "oe");
-  #} else {
-  #  $subframe = $mainwindow->Frame;
-  #}
+  require Tk::Pane;
+  $subframe = $mainwindow->Scrolled("Frame", -scrollbars => "oe");
   $mw = $subframe->Frame;
 
   # image frame on the left
@@ -232,8 +204,11 @@
   my $fl = $mw->Frame(-background => "#0078b8");
   my $img = $fl->Photo(-format => 'png',
                        -file => "$::installerdir/tlpkg/installer/texlive.png");
-  $fl->Label(-image => $img, -background => "#0078b8")->pack(-expand => 1, -fill => "y");
-  $fl->Label(-text => "v$::installerrevision/$::menurevision", -background => "#0078b8")->pack;
+  $fl->Label(-image => $img, -background => "#0078b8")
+    ->pack(-expand => 1, -fill => "y");
+  $fl->Label(
+    -text => "v$::installerrevision/$::menurevision",
+    -background => "#0078b8")->pack;
 
   # data frame on the right
   my $fr = $mw->Frame;
@@ -242,7 +217,9 @@
 
 
   my $row = 1;
-  $fr->Label(-text => __("TeX Live %s Installation", $TeXLive::TLConfig::ReleaseYear))->grid(-row => $row, -column => 1, -columnspan => 3);
+  $fr->Label(
+    -text => __("TeX Live %s Installation", $TeXLive::TLConfig::ReleaseYear))
+    ->grid(-row => $row, -column => 1, -columnspan => 3);
 
   if ($::opt_select_repository) {
     $row++;
@@ -266,29 +243,36 @@
       }
     }
     push @mirror_list, __("NETWORK REPOSITORIES");
-    push @mirror_list, "  " . __("Default remote repository") . ": http://mirror.ctan.org";
+    push @mirror_list,
+      "  " . __("Default remote repository") . ": http://mirror.ctan.org";
     push @mirror_list, @netlst;
     push @mirror_list, TeXLive::TLUtils::create_mirror_list();
     my $mirror_entry;
-    $fr->Label(-text => __('Select repository'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $fr->BrowseEntry(-state => 'readonly',
-    -listheight => 12, 
-    -listwidth => 400,
-    -width => 35,
-    -autolistwidth => 1,
-    -choices => \@mirror_list,
-    -browsecmd => 
-      sub {
-        if ($mirror_entry !~ m/^  /) {
-          $mirror_entry = "";
-        } elsif ($mirror_entry =~ m!(http|ftp)://!) {
-          $mirror_entry = TeXLive::TLUtils::extract_mirror_entry($mirror_entry);
-        } else {
-          $mirror_entry =~ s/^\s*//;
-          # $mirror_entry = TeXLive::TLUtils::extract_mirror_entry($mirror_entry);
-        }
-      },
-    -variable => \$mirror_entry)->grid(-row => $row, -column => 2, -sticky => 'w');
+    $fr->Label(
+      -text => __('Select repository'),
+      -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->BrowseEntry(
+      -state => 'readonly',
+      -listheight => 12, 
+      -listwidth => 400,
+      -width => 35,
+      -autolistwidth => 1,
+      -choices => \@mirror_list,
+      -browsecmd => 
+        sub {
+          if ($mirror_entry !~ m/^  /) {
+            $mirror_entry = "";
+          } elsif ($mirror_entry =~ m!(http|ftp)://!) {
+            $mirror_entry =
+              TeXLive::TLUtils::extract_mirror_entry($mirror_entry);
+          } else {
+            $mirror_entry =~ s/^\s*//;
+            # $mirror_entry =
+            # TeXLive::TLUtils::extract_mirror_entry($mirror_entry);
+          }
+        },
+      -variable => \$mirror_entry)
+      ->grid(-row => $row, -column => 2, -sticky => 'w');
     $load_remote_button = $fr->Button(-text => __("Load"), 
       -command => sub { 
         $::init_remote_needed = 1;
@@ -302,17 +286,20 @@
             -buttons => [ __("Ok") ])->Show;
           $mirror_entry = "";
         } elsif (!do_version_agree()) {
-          $fr->Dialog(-title => __("Warning"),
-            -text => __('The TeX Live versions of the local installation and the repository being accessed are not compatible:
+          $fr->Dialog(
+            -title => __("Warning"),
+            -text => __(
+              'The TeX Live versions of the local installation and the repository being accessed are not compatible:
   local: %s
   repository: %s
-Please select a different mirror.', $TeXLive::TLConfig::ReleaseYear, $texlive_release),
+Please select a different mirror.',
+              $TeXLive::TLConfig::ReleaseYear, $texlive_release),
             -buttons => [ __("Ok") ])->Show;
           $mirror_entry = "";
         } else {
           $load_remote_button->configure(-state => 'disable');
           final_remote_init($mfull);
-          setup_perltk_local_vars();
+          setup_perltk_local_strings();
           calc_depends();
           menu_update_texts();
           enable_buttons();
@@ -322,34 +309,46 @@
   if (!$vars{'in_place'}) {
 
     $row++;
-    $fr->Label(-text => "------- " . __("Basic Information") . " -------")->grid(-row => $row, -column => 1, -columnspan => 3);
+    $fr->Label(-text => "------- " . __("Basic Information") . " -------")
+      ->grid(-row => $row, -column => 1, -columnspan => 3);
 
     # binary system line
     if (!win32()) {
       $row++;
-      $fr->Label(-text => __('Binary system(s)'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
+      $fr->Label(-text => __('Binary system(s)'), -anchor => 'w')
+        ->grid(-row => $row, -column => 1, -sticky => 'w');
       $bintextbutton = $fr->Label(-anchor => 'w');
       $bintextbutton->grid(-row => $row, -column => 2, -padx => "2m");
-      $bin_toggle_button = $fr->Button(-text => __("Change"), -command => sub { menu_select_binsystems(); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+      $bin_toggle_button = $fr->Button(
+        -text => __("Change"), -command => sub { menu_select_binsystems(); })
+        ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
     }
 
     $row++;
 
     # scheme line
-    $fr->Label(-text => __('Selected scheme'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->Label(-text => __('Selected scheme'), -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
     $schemebutton = $fr->Label(-anchor => 'w');
     $schemebutton->grid(-row => $row, -column => 2, -padx => "2m");
-    $scheme_toggle_button = $fr->Button(-text => __("Change"), -command => sub { menu_select_scheme(); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+    $scheme_toggle_button = $fr->Button(
+      -text => __("Change"), -command => sub { menu_select_scheme(); })
+      ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
     $row++;
 
     # further customization
-    $fr->Label(-text => "------- " . __("Further Customization") . " -------")->grid(-row => $row, -column => 1,-columnspan => 3);
+    $fr->Label(-text => "------- " . __("Further Customization") . " -------")
+      ->grid(-row => $row, -column => 1,-columnspan => 3);
 
     $row++;
     # collection line
-    $fr->Label(-text => __('Installation collections'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $collection_toggle_button = $fr->Button(-text => __("Change"), -command => sub { menu_select_standard_collections(); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+    $fr->Label(-text => __('Installation collections'), -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
+    $collection_toggle_button = $fr->Button(
+      -text => __("Change"),
+      -command => sub { menu_select_standard_collections(); })
+      ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
     $row++;
     $collectionstext = $fr->Label();
@@ -358,22 +357,35 @@
 
   $row++;
   # further customization
-  $fr->Label(-text => "------- " . __("Directory setup") . " -------")->grid(-row => $row, -column => 1, -columnspan => 3);
+  $fr->Label(-text => "------- " . __("Directory setup") . " -------")
+    ->grid(-row => $row, -column => 1, -columnspan => 3);
 
   $row++;
-  $fr->Label(-text => __('Portable setup'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $fr->Label(-anchor => 'w', -textvariable => \$portableyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-  $portable_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_portable(); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(-text => __('Portable setup'), -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $fr->Label(-anchor => 'w', -textvariable => \$portableyesno)
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $portable_toggle_button = $fr->Button(
+    -text => __("Toggle"),
+    -command => sub { toggle_portable(); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   $row++;
   # texdir line
-  $fr->Label(-text => __('TEXDIR (the main TeX directory)'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $texdirtext = $fr->Label(-anchor => 'w')->grid(-row => $row, -column => 2, -padx => "2m");
+  $fr->Label(-text => __('TEXDIR (the main TeX directory)'), -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $texdirtext = $fr->Label(-anchor => 'w')
+    ->grid(-row => $row, -column => 2, -padx => "2m");
   if (!$vars{'in_place'}) {
     if ($::alternative_selector) {
-      $texdir_toggle_button = $fr->Button(-text => __("Change"), -command => sub { menu_edit_texdir("TEXDIR"); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+      $texdir_toggle_button = $fr->Button(
+        -text => __("Change"), -command => sub { menu_edit_texdir("TEXDIR"); })
+        ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
     } else {
-      $texdir_toggle_button = $fr->Button(-text => __("Change"), -command => sub { menu_edit_vars_value("TEXDIR"); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+      $texdir_toggle_button = $fr->Button(
+        -text => __("Change"),
+        -command => sub { menu_edit_vars_value("TEXDIR"); })
+        ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
     }
   }
 
@@ -380,34 +392,58 @@
 
   $row++;
   # texmflocal line
-  $fr->Label(-text => __('TEXMFLOCAL (directory for site-wide local files)'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $texmflocaltext = $fr->Label(-anchor => 'w')->grid(-row => $row, -column => 2, -padx => "2m");
-  $tmflocalbutton = $fr->Button(-text => __("Change"), -command => sub { menu_edit_vars_value("TEXMFLOCAL"); });
-  $tmflocalbutton -> grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(
+    -text => __('TEXMFLOCAL (directory for site-wide local files)'),
+    -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $texmflocaltext = $fr->Label(-anchor => 'w')
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $tmflocalbutton = $fr->Button(
+    -text => __("Change"),
+    -command => sub { menu_edit_vars_value("TEXMFLOCAL"); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   $row++;
   # texmfsysvar line
-  $fr->Label(-text => __('TEXMFSYSVAR (directory for autogenerated data)'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $texmfsysvartext = $fr->Label(-anchor => 'w')->grid(-row => $row, -column => 2, -padx => "2m");
-  $tmfsysvarbutton = $fr->Button(-text => __("Change"), -command => sub { menu_edit_vars_value("TEXMFSYSVAR"); });
-  $tmfsysvarbutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(
+    -text => __('TEXMFSYSVAR (directory for autogenerated data)'),
+    -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $texmfsysvartext = $fr->Label(-anchor => 'w')
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $tmfsysvarbutton = $fr->Button(
+    -text => __("Change"),
+    -command => sub { menu_edit_vars_value("TEXMFSYSVAR"); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   $row++;
   # texmfsysconfig line
-  $fr->Label(-text => __('TEXMFSYSCONFIG (directory for local config)'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $texmfsysconfigtext = $fr->Label(-anchor => 'w')->grid(-row => $row, -column => 2, -padx => "2m");
-  $tmfsysconfigbutton = $fr->Button(-text => __("Change"), -command => sub { menu_edit_vars_value("TEXMFSYSCONFIG"); });
-  $tmfsysconfigbutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(
+    -text => __('TEXMFSYSCONFIG (directory for local config)'), -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $texmfsysconfigtext = $fr->Label(-anchor => 'w')
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $tmfsysconfigbutton = $fr->Button(
+    -text => __("Change"),
+    -command => sub { menu_edit_vars_value("TEXMFSYSCONFIG"); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   $row++;
   # texmfhome line
-  $fr->Label(-text => __('TEXMFHOME (directory for user-specific files)'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $texmfhometext = $fr->Label(-anchor => 'w')->grid(-row => $row, -column => 2, -padx => "2m");
-  $tmfhomebutton = $fr->Button(-text => __("Change"), -command => sub { menu_edit_vars_value("TEXMFHOME"); });
-  $tmfhomebutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(
+    -text => __('TEXMFHOME (directory for user-specific files)'),
+    -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $texmfhometext = $fr->Label(-anchor => 'w')
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $tmfhomebutton = $fr->Button(
+    -text => __("Change"),
+    -command => sub { menu_edit_vars_value("TEXMFHOME"); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   if ($vars{'portable'}) {
-    for my $b ($tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
+    for my $b (
+      $tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
       $b->configure(-state => 'disabled')
     }
   }
@@ -414,83 +450,162 @@
 
   $row++;
   # Options
-  $fr->Label(-text => "------- " . __("Options") . " -------")->grid(-row => $row, -column => 1, -columnspan => 3);
+  $fr->Label(-text => "------- " . __("Options") . " -------")
+    ->grid(-row => $row, -column => 1, -columnspan => 3);
 
   $row++;
   # optpaper
-  $fr->Label(-text => __('Default paper size'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $fr->Label(-anchor => 'w', -textvariable => \$letteryesno)->grid(-row => $row, -column => 2, -padx => "2m");
-  $paper_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_letter'}, \$letteryesno, \@::letterdesc); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(-text => __('Default paper size'), -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $fr->Label(-anchor => 'w', -textvariable => \$letteryesno)
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $paper_toggle_button = $fr->Button(
+    -text => __("Toggle"),
+    -command => sub {
+      toggle_and_set_opt_variable(
+        \$vars{'option_letter'}, \$letteryesno, \@::letterdesc); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   $row++;
-  $fr->Label(-text => __('Allow execution of restricted list of programs via \write18'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $fr->Label(-anchor => 'w', -textvariable => \$restrictedyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-  $write_eighteen_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_write18_restricted'}, \$restrictedyesno); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(
+    -text => __('Allow execution of restricted list of programs via \write18'),
+    -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $fr->Label(-anchor => 'w', -textvariable => \$restrictedyesno)
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $write_eighteen_toggle_button = $fr->Button(
+    -text => __("Toggle"),
+    -command => sub {
+      toggle_and_set_opt_variable(
+        \$vars{'option_write18_restricted'},
+        \$restrictedyesno); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   $row++;
-  $fr->Label(-text => __('Create all format files'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $fr->Label(-anchor => 'w', -textvariable => \$fmtyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-  $format_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_fmt'}, \$fmtyesno); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+  $fr->Label(
+    -text => __('Create all format files'), -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $fr->Label(-anchor => 'w', -textvariable => \$fmtyesno)
+    ->grid(-row => $row, -column => 2, -padx => "2m");
+  $format_toggle_button = $fr->Button(
+    -text => __("Toggle"),
+    -command => sub {
+      toggle_and_set_opt_variable(\$vars{'option_fmt'}, \$fmtyesno); })
+    ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   if ($vars{'doc_splitting_supported'} and !$vars{'in_place'}) {
     $row++;
-    $fr->Label(-text => __('Install font/macro doc tree'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $fr->Label(-anchor => 'w', -textvariable => \$docyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-    $doc_files_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_doc'}, \$docyesno); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+    $fr->Label(-text => __('Install font/macro doc tree'), -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->Label(-anchor => 'w', -textvariable => \$docyesno)
+      ->grid(-row => $row, -column => 2, -padx => "2m");
+    $doc_files_toggle_button = $fr->Button(
+      -text => __("Toggle"),
+      -command => sub {
+        toggle_and_set_opt_variable(\$vars{'option_doc'}, \$docyesno); })
+      ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
   }
 
   if ($vars{'src_splitting_supported'} and !$vars{'in_place'}) {
     $row++;
-    $fr->Label(-text => __('Install font/macro source tree'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $fr->Label(-anchor => 'w', -textvariable => \$srcyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-    $src_files_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_src'}, \$srcyesno); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+    $fr->Label(-text => __('Install font/macro source tree'), -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->Label(-anchor => 'w', -textvariable => \$srcyesno)
+      ->grid(-row => $row, -column => 2, -padx => "2m");
+    $src_files_toggle_button = $fr->Button(
+      -text => __("Toggle"),
+      -command => sub {
+        toggle_and_set_opt_variable(\$vars{'option_src'}, \$srcyesno); })
+      ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
   }
 
   $row++;
-  $fr->Label(-text => (win32()) ? __('Adjust PATH setting in registry') :
-                                 __('Create symlinks in system directories'),
-             -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-  $fr->Label(-anchor => 'w', -textvariable => \$pathadjyesno)->grid(-row => $row, -column => 2, -padx => "2m");
+  $fr->Label(
+    -text => (win32()) ? __('Adjust PATH setting in registry') :
+      __('Create symlinks in system directories'),
+    -anchor => 'w')
+    ->grid(-row => $row, -column => 1, -sticky => 'w');
+  $fr->Label(-anchor => 'w', -textvariable => \$pathadjyesno)
+    ->grid(-row => $row, -column => 2, -padx => "2m");
   if (unix()) {
-    $pathbutton = $fr->Button(-text => __("Change"), -command => sub { menu_select_symlink(); });
+    $pathbutton = $fr->Button(
+      -text => __("Change"), -command => sub { menu_select_symlink(); });
   } else {
-    $pathbutton = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_path'}, \$pathadjyesno); });
+    $pathbutton = $fr->Button(
+      -text => __("Toggle"),
+      -command => sub {
+        toggle_and_set_opt_variable(\$vars{'option_path'}, \$pathadjyesno); });
   }
   $pathbutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
   if ($::opt_all_options || win32()) {
     $row++;
-    $fr->Label(-text => __('Add menu shortcuts'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $fr->Label(-anchor => 'w', -textvariable => \$deskintyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-    $deskintbutton = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_desktop_integration'}, \$deskintyesno); });
-    $deskintbutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+    $fr->Label(-text => __('Add menu shortcuts'), -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->Label(-anchor => 'w', -textvariable => \$deskintyesno)
+      ->grid(-row => $row, -column => 2, -padx => "2m");
+    $deskintbutton = $fr->Button(
+      -text => __("Change"),
+      -command => sub {
+        toggle_and_set_opt_variable(
+          \$vars{'option_desktop_integration'},
+          \$deskintyesno, \@::deskintdesc); })
+      ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
     $row++;
-    $fr->Label(-text => __('Change file associations'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $fr->Label(-anchor => 'w', -textvariable => \$fileassocyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-    $assocbutton = $fr->Button(-text => __("Change"), -command => sub { menu_edit_file_assocs(); });
-    $assocbutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+    $fr->Label(-text => __('Change file associations'), -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->Label(-anchor => 'w', -textvariable => \$fileassocyesno)
+      ->grid(-row => $row, -column => 2, -padx => "2m");
+    $assocbutton = $fr->Button(
+      -text => __("Change"),
+      -command => sub {
+        toggle_and_set_opt_variable(
+          \$vars{'option_file_assocs'}, \$fileassocyesno, \@::fileassocdesc); })
+      ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
 
     if ($::opt_all_options || admin()) {
       $row++;
-      $fr->Label(-text => __('Installation for all users'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-      $fr->Label(-anchor => 'w', -textvariable => \$adminallyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-      $adminbutton = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_w32_multi_user'}, \$adminallyesno); });
-      $adminbutton->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+      $fr->Label(-text => __('Installation for all users'), -anchor => 'w')
+        ->grid(-row => $row, -column => 1, -sticky => 'w');
+      $fr->Label(-anchor => 'w', -textvariable => \$adminallyesno)
+        ->grid(-row => $row, -column => 2, -padx => "2m");
+      $adminbutton = $fr->Button(
+        -text => __("Toggle"),
+        -command => sub {
+          toggle_and_set_opt_variable(
+            \$vars{'option_w32_multi_user'}, \$adminallyesno); })
+        ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
     }
 
     $row++;
-    $fr->Label(-text => __('Install TeXworks front end'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $fr->Label(-anchor => 'w', -textvariable => \$editoryesno)->grid(-row => $row, -column => 2, -padx => "2m");
+    $fr->Label(-text => __('Install TeXworks front end'), -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->Label(-anchor => 'w', -textvariable => \$editoryesno)
+      ->grid(-row => $row, -column => 2, -padx => "2m");
     if (!$vars{'in_place'}) {
-      $texworks_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'collection-texworks'}, \$editoryesno); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+      $texworks_toggle_button = $fr->Button(
+        -text => __("Toggle"),
+        -command => sub {
+          toggle_and_set_opt_variable(
+            \$vars{'collection-texworks'}, \$editoryesno); })
+        ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
     }
   }
   if ($media ne 'NET') {
     $row++;
-    $fr->Label(-text => __('After installation, get package updates from CTAN'), -anchor => 'w')->grid(-row => $row, -column => 1, -sticky => 'w');
-    $fr->Label(-anchor => 'w', -textvariable => \$adjustrepoyesno)->grid(-row => $row, -column => 2, -padx => "2m");
-    $adjustrepo_toggle_button = $fr->Button(-text => __("Toggle"), -command => sub { toggle_and_set_opt_variable(\$vars{'option_adjustrepo'}, \$adjustrepoyesno); })->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
+    $fr->Label(
+      -text => __('After installation, get package updates from CTAN'),
+      -anchor => 'w')
+      ->grid(-row => $row, -column => 1, -sticky => 'w');
+    $fr->Label(-anchor => 'w', -textvariable => \$adjustrepoyesno)
+      ->grid(-row => $row, -column => 2, -padx => "2m");
+    $adjustrepo_toggle_button = $fr->Button(
+      -text => __("Toggle"),
+      -command => sub {
+        toggle_and_set_opt_variable(
+          \$vars{'option_adjustrepo'}, \$adjustrepoyesno); })
+      ->grid(-row => $row, -column => 3, -sticky => "ew", -padx => "2m");
   }
 
   if ($vars{'portable'}) {
@@ -516,17 +631,17 @@
 In case of problems, please contact: texlive\@tug.org"
      )->pack(-ipadx => "2m", -ipady => "2m");
     $sw->Show;
- })->pack(-side => 'left', -padx => "2m", -pady => "2m");
-                                                                       
+  })->pack(-side => 'left', -padx => "2m", -pady => "2m");
 
 
+
   $installbutton = $f3->Button(
     -text    => __("Install TeX Live"),
-    -command => sub { installation_window(); });
-  $installbutton->pack(-side => 'left', -padx => "2m", -pady => "2m")->focus();
+    -command => \&menu_do_it
+  )->pack(-side => 'left', -padx => "2m", -pady => "2m")->focus();
   my $quitbutton = $f3->Button(
     -text    => __("Quit"),
-    -command => \&menu_abort,
+    -command => \&menu_abort
   )->pack(-side => 'right', -padx => "2m", -pady => "2m");
   $mw->bind('<Escape>', [ $quitbutton, 'Invoke' ]);
   #my $wizardbutton = $f3->Button(
@@ -550,7 +665,8 @@
   my $rh = $mw->reqheight;
   my $rw = $mw->reqwidth;
   my $maxheight = $mainwindow->screenheight() - 20;
-  debug("Requested height: $rh, requested width: $rw, max height: $maxheight\n");
+  debug(
+    "Requested height: $rh, requested width: $rw, max height: $maxheight\n");
   if ($rh > $maxheight) {
     $rh = $maxheight;
     $rw += 20; # for the scrollbar =  =
@@ -561,20 +677,18 @@
   $mainwindow->geometry("=${rw}x${rh}");
   #$mw->pack(-expand => 1, -fill => "both");
 
-  pre_warn($mainwindow) if win32();
+  if (win32() && pre_warn($mainwindow)) { return $MENU_ABORT; }
 
   Tk::MainLoop();
   return($return);
 }
 
-sub pre_warn() {
+sub pre_warn {
   my $parent = shift;
   require TeXLive::TLWinGoo;
-  my $pre_warning = $parent->Toplevel();
-  $pre_warning->title(
-    __("TeX Live %s Installation", $TeXLive::TLConfig::ReleaseYear));
-  my $wrn = __('Best to disable your virus scanner during installation.');
-
+  my ($b_quit, $b_cont) = (__('Quit'), __('Continue'));
+  my $wrn = __(
+   'In case of trouble, try disabling your virus scanner during installation.');
   if (!admin()) {
     $wrn .= "\n\n".
       __("The installer does not have adminstrative permissions;\nso can only install for current user.");
@@ -583,64 +697,14 @@
       __("Right-click install-tl-advanced and select \"run as administrator\"\n if you want to install for all users.");
     }
   }
-  $pre_warning->Label(-textvariable=>\$wrn, -justify=>'left')->pack();
-  my $sf = $pre_warning->Frame;
-  $sf->Button(-text=>__('Quit'), -command=>sub{exit()})->pack(-side=>'left');
-  $sf->Button(-text=>__('Continue'), -command=>sub{
-    $parent->deiconify();
-    $parent->raise;
-    $pre_warning->withdraw();
-  })->pack(-side=>'right');
-  $sf->pack(-fill => 'x');
+  my $ans = $parent->Dialog(
+    -title => __("TeX Live %s Installation", $TeXLive::TLConfig::ReleaseYear),
+    -text => $wrn,
+    -default_button => $b_cont,
+    -buttons => [$b_quit, $b_cont])->Show();
+  return $ans eq $b_quit;
 }
 
-sub installation_window {
-  # create a progress bar window
-  $::sww = $mainwindow->Toplevel(-title => __("Installation process"),
-                                 -width => 400);
-  $::sww->transient($mainwindow);
-  $::sww->grab();
-  $::sww->Label(-text => __("Installation process"))->pack;
-  $::progressw = $::sww->Scrolled("ROText", -scrollbars => "e", -height => 16);
-  $::progressw->pack(-expand => 1, -fill => "both");
-  my $percent_done = 0;
-  $::progress = $::sww->ProgressBar(-variable => \$percent_done,
-    -width => 20, -length => 400, -from => 0, -to => 100, -blocks => 10,
-    -colors => [ 0, '#0078b8' ]);
-  $::progress->pack(-fill => "x");
-  my $f = $::sww->Frame;
-  my $b = $f->Button(-text => __("Cancel"),
-                     -command => sub { $::sww->destroy; $mainwindow->destroy;
-                                       do_cleanup(); exit(1); }
-                    )->pack(-pady => "2m");
-  $b->focus();
-  $f->pack;
-  do_installation();
-  $return = $MENU_ALREADYDONE;
-  my $t = __("See %s/index.html for links to documentation.\nThe TeX Live web site (http://tug.org/texlive/) contains any updates and corrections. TeX Live is a joint project of the TeX user groups around the world; please consider supporting it by joining the group best for you. The list of groups is available on the web at http://tug.org/usergroups.html.", $::vars{'TEXDIR'});
-  if (!win32()) {
-    $t .= "\n\n" . __("Add %s/texmf-dist/doc/man to MANPATH.\nAdd %s/texmf-dist/doc/info to INFOPATH.\nMost importantly, add %s/bin/%s\nto your PATH for current and future sessions.", $::vars{'TEXDIR'}, $::vars{'TEXDIR'}, $::vars{'TEXDIR'}, $::vars{'this_platform'});
-  }
-  if (@::WARNLINES) {
-    $t .= "\n\n" . __("There were some warnings during the installation process.\nHere is the list of warning messages:") . "\n";
-    $t .= join('', @::WARNLINES);
-    $t =~ s/\n\z//;
-  }
-
-  $t .= "\n\n" . __("Welcome to TeX Live!");
-  #$t =~ s/\\n/\n/g;
-  $::progressw->insert("end", "\n");
-  my $linechar = $::progressw->index("end");
-  $::progressw->markSet("finaltext", $linechar);
-  $::progressw->markGravity("finaltext", "left");
-  $::progressw->insert("end", "\n$t");
-  $::progressw->see("end");
-  $::progressw->tagAdd("centered", $linechar, "end");
-  $::progressw->tagConfigure("centered", -justify => "center");
-  $b->configure(-text => __("Finish"),
-                -command => sub { $mainwindow->destroy; });
-}
-
 # this sub will not be called if $vars{'in_place'}
 sub menu_edit_texdir {
   my $key = shift;
@@ -681,19 +745,31 @@
   my $sw = $mainwindow->Toplevel(-title => __("Change variable value"));
   $sw->transient($mainwindow);
   $sw->grab();
-  $sw->Label(-text =>  __("Enter path for %s (use ~ for %s)", $key, $hint_var))->pack(-padx => "2m", -pady => "2m");
+  $sw->Label(-text =>  __("Enter path for %s (use ~ for %s)", $key, $hint_var))
+    ->pack(-padx => "2m", -pady => "2m");
   $entry = $sw->Entry(-width => 60)->pack(-padx => "2m", -pady => "2m");
   my $f = $sw->Frame;
-  my $c1 = $f->Checkbutton(-text => 'Add "texlive"', -variable => \$addtexlive,
+  my $c1 = $f->Checkbutton(
+    -text => 'Add "texlive"',
+    -variable => \$addtexlive,
     -command => \&update_label);
-  my $c2 = $f->Checkbutton(-text => "Add \"$texlive_release\"", -variable => \$addyear,
+  my $c2 = $f->Checkbutton(
+    -text => "Add \"$texlive_release\"", -variable => \$addyear,
     -command => \&update_label);
-  my $foo = $sw->Scrolled("DirTree", -scrollbars => "osoe",
-                          -browsecmd => sub { my ($d) = @_; $currsel = $d; update_label(); },
-                          -directory => "$currsel");
+  my $foo = $sw->Scrolled(
+    "DirTree", -scrollbars => "osoe",
+    -browsecmd => sub { my ($d) = @_; $currsel = $d; update_label(); },
+    -directory => "$currsel");
   my $ff = $sw->Frame;
-  my $ok = $ff->Button(-text => __("Ok"), -command => sub { $val = $entry->get; callback_edit_directories($key,$val); $sw->destroy; });
-  my $cancel = $ff->Button(-text => __("Cancel"), -command => sub { $sw->destroy; });
+  my $ok = $ff->Button(
+    -text => __("Ok"),
+    -command => sub {
+      $val = $entry->get;
+      callback_edit_directories($key,$val);
+      $sw->destroy; });
+  my $cancel = $ff->Button(
+    -text => __("Cancel"),
+    -command => sub { $sw->destroy; });
   update_label();
   $c1->pack(-side => "left",  -padx => "2m", -pady => "2m");
   $c2->pack(-side => "right", -padx => "2m", -pady => "2m");
@@ -719,14 +795,22 @@
   } else {
     $hint_var = win32() ? '%USERPROFILE%' : '$HOME';
   }
-  $sw->Label(-text => __("Enter path for %s (use ~ for %s)", $key, $hint_var))->pack(-padx => "2m", -pady => "2m");
+  $sw->Label(-text => __("Enter path for %s (use ~ for %s)", $key, $hint_var))
+    ->pack(-padx => "2m", -pady => "2m");
   my $entry = $sw->Entry(-text => native_slashify($val), -width => 60);
   $entry->pack(-padx => "2m", -pady => "2m")->focus();
   my $f = $sw->Frame;
-  my $okbutton = $f->Button(-text => __("Ok"),
-     -command => sub { $val = forward_slashify($entry->get); callback_edit_directories($key,$val) ; $sw->destroy })->pack(-side => 'left', -padx => "2m", -pady => "2m");
-  my $cancelbutton = $f->Button(-text => __("Cancel"),
-     -command => sub { $sw->destroy })->pack(-side => 'right', -padx => "2m", -pady => "2m");
+  my $okbutton = $f->Button(
+    -text => __("Ok"),
+    -command => sub {
+      $val = forward_slashify($entry->get);
+      callback_edit_directories($key,$val) ;
+      $sw->destroy })
+    ->pack(-side => 'left', -padx => "2m", -pady => "2m");
+  my $cancelbutton = $f->Button(
+    -text => __("Cancel"),
+    -command => sub { $sw->destroy })
+    ->pack(-side => 'right', -padx => "2m", -pady => "2m");
   $f->pack(-expand => 'x');
   # bindings
   $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
@@ -733,43 +817,7 @@
   $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
 }
 
-sub menu_edit_file_assocs {
-  my $sw = $mainwindow->Toplevel(-title => __('Change file associations'));
-  $sw->transient($mainwindow);
-  $sw->grab();
-  my $key = 'option_file_assocs';
-  my $var = $::fileassocdesc[$vars{$key}];
-  $sw->Label(-text => __("Change file associations"))->pack(-padx => "2m", -pady => "2m");
-  my $opt = $sw->BrowseEntry(-autolistwidth => 1,
-                             -variable => \$var);
-  for my $i (0..2) {
-    $opt->insert("end", $::fileassocdesc[$i]);
-  }
 
-  $opt->pack(-padx => "2m", -pady => "2m")->focus();
-  my $f = $sw->Frame;
-  my $okbutton = $f->Button(-text => __("Ok"),
-    -command => sub {
-                      my $idx;
-                      if ($var eq $::fileassocdesc[0]) {
-                        $idx = 0;
-                      } elsif ($var eq $::fileassocdesc[1]) {
-                        $idx = 1;
-                      } elsif ($var eq $::fileassocdesc[2]) {
-                        $idx = 2;
-                      } else {
-                        die "How that could happen!\n";
-                      }
-                      $vars{$key} = $idx;
-                      $fileassocyesno = $::fileassocdesc[$idx];
-                      $sw->destroy; })->pack(-side => "left", -padx => "2m", -pady => "2m");
-  my $cancelbutton = $f->Button(-text => __("Cancel"), -command => sub { $sw->destroy; })->pack(-side => "left", -padx => "2m", -pady => "2m");
-  $f->pack;
-  $sw->bind('<Return>', [ $okbutton, 'Invoke' ]);
-  $sw->bind('<Escape>', [ $cancelbutton, 'Invoke' ]);
-}
-
-
 sub menu_select_scheme {
   my $sw = $mainwindow->Toplevel(-title => __('Selected scheme'));
   $sw->transient($mainwindow);
@@ -785,7 +833,8 @@
   my @scheme_order = schemes_ordered_for_presentation();
   push @scheme_order, "scheme-custom";
   my $selected = $vars{'selected_scheme'};
-  $sw->Label(-text => __("Selected scheme"))->pack(-padx => "2m", -pady => "2m");
+  $sw->Label(-text => __("Selected scheme"))
+    ->pack(-padx => "2m", -pady => "2m");
   my $f2 = $sw->Frame;
   foreach my $scheme (@scheme_order) {
     my $desc;
@@ -796,9 +845,11 @@
       $desc = __("custom selection of collections");
     }
     my $b;
-    $b = $f2->Radiobutton(-variable => \$selected, -value => $scheme,
+    $b = $f2->Radiobutton(
+      -variable => \$selected, -value => $scheme,
       -text => __($desc), 
-      -justify => 'left', -wraplength => 500)->pack(-anchor => 'w', -pady => "1m");
+      -justify => 'left', -wraplength => 500)
+      ->pack(-anchor => 'w', -pady => "1m");
     if ($selected eq $scheme) {
       $b->focus();
     }
@@ -805,10 +856,13 @@
   }
   $f2->pack;
   my $f3 = $sw->Frame;
-  my $okbutton = $f3->Button(-text => __("Ok"),
-     -command => sub { callback_select_scheme($selected) ; $sw->destroy })->pack(-side => 'left', -padx => "2m", -pady => "2m");
-  my $cancelbutton = $f3->Button(-text => __("Cancel"),
-     -command => sub { $sw->destroy })->pack(-side => 'left', -padx => "2m", -pady => "2m");
+  my $okbutton = $f3->Button(
+    -text => __("Ok"),
+    -command => sub { callback_select_scheme($selected) ; $sw->destroy })
+  ->pack(-side => 'left', -padx => "2m", -pady => "2m");
+  my $cancelbutton = $f3->Button(
+    -text => __("Cancel"), -command => sub { $sw->destroy })
+    ->pack(-side => 'left', -padx => "2m", -pady => "2m");
   $f3->pack(-expand => 'x');
   $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
   $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
@@ -825,7 +879,8 @@
   my $f2 = $fb->Frame;
   my $f3 = $fb->Frame;
   my %lvars = %vars;
-  $sw->Label(-text => __("Select the collections to be installed"))->pack(-padx => "2m", -pady => "2m");
+  $sw->Label(-text => __("Select the collections to be installed"))
+    ->pack(-padx => "2m", -pady => "2m");
   my $onethirdcol = $#collections_std / 3;
   my $twothirdcol = 2 * $onethirdcol;
   my $i = 0;
@@ -832,11 +887,17 @@
   foreach my $coll (sort @collections_std) {
     my $tlpobj = $tlpdb->get_package("$coll");
     if ($i < $onethirdcol) {
-      $f1->Checkbutton(-variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))->pack(-anchor => 'w');
+      $f1->Checkbutton(
+        -variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))
+        ->pack(-anchor => 'w');
     } elsif ($i < $twothirdcol) {
-      $f2->Checkbutton(-variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))->pack(-anchor => 'w');
+      $f2->Checkbutton(
+        -variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))
+        ->pack(-anchor => 'w');
     } else {
-      $f3->Checkbutton(-variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))->pack(-anchor => 'w');
+      $f3->Checkbutton(
+        -variable => \$lvars{$coll}, -text => __($tlpobj->shortdesc))
+        ->pack(-anchor => 'w');
     }
     $i++;
   }
@@ -845,10 +906,14 @@
   $f3->pack(-side => 'left', -padx => "2m", -pady => "2m");
   $fb->pack(-padx => "2m", -pady => "2m");
   $fc->pack(-side => 'left', -expand => 'x', -padx => "2m", -pady => "2m");
-  $fc->Button(-text => __("Select All"),
-    -command => sub { select_collections(\%lvars, @collections_std) })->pack(-side => 'left', -padx => "2m", -pady => "2m")->focus();
-  $fc->Button(-text => __("Deselect All"),
-    -command => sub { deselect_collections(\%lvars, @collections_std) })->pack(-side => 'right', -padx => "2m", -pady => "2m");
+  $fc->Button(
+    -text => __("Select All"),
+    -command => sub { select_collections(\%lvars, @collections_std) })
+    ->pack(-side => 'left', -padx => "2m", -pady => "2m")->focus();
+  $fc->Button(
+    -text => __("Deselect All"),
+    -command => sub { deselect_collections(\%lvars, @collections_std) })
+    ->pack(-side => 'right', -padx => "2m", -pady => "2m");
   $fd->pack(-side => 'left', -expand => 'x', -padx => "2m", -pady => "2m");
   my $okbutton = $fd->Button(-text => __("Ok"),
     -command => sub {
@@ -866,8 +931,9 @@
       }
       $sw->destroy;
     })->pack(-side => 'left', -padx => "2m", -pady => "2m");
-  my $cancelbutton = $fd->Button(-text => __("Cancel"),
-     -command => sub { $sw->destroy })->pack(-side => 'right', -padx => "2m", -pady => "2m");
+  my $cancelbutton = $fd->Button(
+    -text => __("Cancel"), -command => sub { $sw->destroy })
+    ->pack(-side => 'right', -padx => "2m", -pady => "2m");
   $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
   $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
 }
@@ -905,15 +971,15 @@
     $vars{'option_path'} = $osym;
     toggle_and_set_opt_variable(\$vars{'option_path'}, \$pathadjyesno);
   }
-  my $sw = $mainwindow->Toplevel(-title => __('Create symlinks in system directories'));
+  my $sw = $mainwindow->Toplevel(
+    -title => __('Create symlinks in system directories'));
   $sw->transient($mainwindow);
   $sw->grab();
-  $sw->Checkbutton(-variable => \$osym,
-                   -text => __("create symlinks in standard directories"),
-		   -command => sub { set_unset_buttons(); } )->grid(-column => 1,
-                                                        -row => 1,
-                                                        -columnspan => 2,
-                                                        -padx => "2m");
+  $sw->Checkbutton(
+    -variable => \$osym,
+    -text => __("create symlinks in standard directories"),
+    -command => sub { set_unset_buttons(); } )
+    ->grid(-column => 1, -row => 1, -columnspan => 2, -padx => "2m");
   $binlab = $sw->Label(-text => __("binaries to"));
   $binb = $sw->Entry(-textvariable => \$lbin);
   $manlab = $sw->Label(-text => __("manpages to"));
@@ -928,8 +994,9 @@
   $infob->grid(-row => 4, -column => 2, -sticky => "ew", -padx => "2m");
   set_unset_buttons();
   my $f2 = $sw->Frame; $f2->grid(-column => 1, -columnspan => 2, -row => 5);
-  my $okbutton = $f2->Button(-text => __("Ok"),
-     -command => sub { return_callback(); $sw->destroy })->pack(-side => 'left');
+  my $okbutton = $f2->Button(
+    -text => __("Ok"), -command => sub { return_callback(); $sw->destroy })
+    ->pack(-side => 'left');
   my $cancelbutton = $f2->Button(-text => __("Cancel"),
      -command => sub { $sw->destroy })->pack(-side => 'right');
   $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
@@ -959,10 +1026,14 @@
   $f2l->pack(-side => 'left');
   $f2->pack(-padx => "2m", -pady => "2m");
   my $f3 = $sw->Frame;
-  my $okbutton = $f3->Button(-text => __("Ok"),
-     -command => sub { callback_select_systems() ; $sw->destroy })->pack(-side => 'left', -padx => "2m", -pady => "2m");
-  my $cancelbutton = $f3->Button(-text => __("Cancel"),
-     -command => sub { $sw->destroy })->pack(-side => 'right', -padx => "2m", -pady => "2m");
+  my $okbutton = $f3->Button(
+    -text => __("Ok"),
+    -command => sub { callback_select_systems() ; $sw->destroy })
+    ->pack(-side => 'left', -padx => "2m", -pady => "2m");
+  my $cancelbutton = $f3->Button(
+    -text => __("Cancel"),
+    -command => sub { $sw->destroy })
+    ->pack(-side => 'right', -padx => "2m", -pady => "2m");
   $f3->pack(-expand => 'x');
   $sw->bind('<Return>' => [ $okbutton, 'Invoke']);
   $sw->bind('<Escape>' => [ $cancelbutton, 'Invoke']);
@@ -974,9 +1045,10 @@
   if (!$vars{"binary_$a"} && $a eq $vars{'this_platform'}) {
     # removal not supported
     $vars{"binary_$a"} = 1;
-    $arch_frame->Dialog(-title => __("Warning"),
-                        -text => __("Removals of the main platform not possible!"),
-                        -buttons => [ __("Ok") ])->Show;
+    $arch_frame->Dialog(
+      -title => __("Warning"),
+       -text => __("Removals of the main platform not possible!"),
+       -buttons => [ __("Ok") ])->Show;
   }
 }
 
@@ -1007,7 +1079,10 @@
       }
       menu_set_text($bintextbutton, $selsys);
     } else {
-      menu_set_text($bintextbutton, __("%s out of %s", $vars{'n_systems_selected'}, $vars{'n_systems_available'}));
+      menu_set_text(
+        $bintextbutton, __(
+          "%s out of %s", $vars{'n_systems_selected'},
+          $vars{'n_systems_available'}));
     }
   }
 }
@@ -1020,32 +1095,51 @@
 
 sub menu_set_pathes_text {
   if (TeXLive::TLUtils::texdir_check($vars{'TEXDIR'})) {
-    menu_set_text($texdirtext, native_slashify($vars{'TEXDIR'}), -foreground => "black");
+    menu_set_text(
+      $texdirtext, native_slashify($vars{'TEXDIR'}),
+      -foreground => "black");
   } else {
-    menu_set_text($texdirtext, __("(default not allowed or not writable - please change!)"), -foreground => "red");
+    menu_set_text(
+      $texdirtext,
+      __("(default not allowed or not writable - please change!)"),
+      -foreground => "red");
   }
   menu_set_text($texmflocaltext, native_slashify($vars{'TEXMFLOCAL'}));
   if ((-w $vars{'TEXMFSYSVAR'}) || (-w dirname($vars{'TEXMFSYSVAR'}))) {
-    menu_set_text($texmfsysvartext, native_slashify($vars{'TEXMFSYSVAR'}), -foreground => "black");
+    menu_set_text(
+      $texmfsysvartext, native_slashify($vars{'TEXMFSYSVAR'}),
+      -foreground => "black");
   } elsif ("$vars{'TEXMFSYSVAR'}" =~ m;^$vars{'TEXDIR'};) {
     if (TeXLive::TLUtils::texdir_check($vars{'TEXDIR'})) {
-      menu_set_text($texmfsysvartext, native_slashify($vars{'TEXMFSYSVAR'}), -foreground => "black");
+      menu_set_text(
+        $texmfsysvartext, native_slashify($vars{'TEXMFSYSVAR'}),
+        -foreground => "black");
     } else {
-      menu_set_text($texmfsysvartext, __("(please change TEXDIR first!)"), -foreground => "red");
+      menu_set_text(
+        $texmfsysvartext, __("(please change TEXDIR first!)"),
+        -foreground => "red");
     }
   } else {
-    menu_set_text($texmfsysvartext, __("(default not writable - please change!)"));
+    menu_set_text(
+      $texmfsysvartext, __("(default not writable - please change!)"));
   }
   if ((-w $vars{'TEXMFSYSCONFIG'}) || (-w dirname($vars{'TEXMFSYSCONFIG'}))) {
-    menu_set_text($texmfsysconfigtext, native_slashify($vars{'TEXMFSYSCONFIG'}), -foreground => "black");
+    menu_set_text(
+      $texmfsysconfigtext, native_slashify($vars{'TEXMFSYSCONFIG'}),
+      -foreground => "black");
   } elsif ("$vars{'TEXMFSYSCONFIG'}" =~ m;^$vars{'TEXDIR'};) {
     if (TeXLive::TLUtils::texdir_check($vars{'TEXDIR'})) {
-      menu_set_text($texmfsysconfigtext, native_slashify($vars{'TEXMFSYSCONFIG'}), -foreground => "black");
+      menu_set_text(
+        $texmfsysconfigtext, native_slashify($vars{'TEXMFSYSCONFIG'}),
+        -foreground => "black");
     } else {
-      menu_set_text($texmfsysconfigtext, __("(please change TEXDIR first!)"), -foreground => "red");
+      menu_set_text(
+        $texmfsysconfigtext, __("(please change TEXDIR first!)"),
+        -foreground => "red");
     }
   } else {
-    menu_set_text($texmfsysconfigtext, __("(default not writable - please change!)"));
+    menu_set_text(
+      $texmfsysconfigtext, __("(default not writable - please change!)"));
   }
   menu_set_text($texmfhometext, native_slashify($vars{'TEXMFHOME'}));
 }
@@ -1128,11 +1222,11 @@
   menu_update_texts();
 }
 
-sub dump_vars_stdout {
-  foreach my $k (keys %vars) {
-    print "DEBUG: vars{$k} = $vars{$k}\n";
-  }
-}
+#sub dump_vars_stdout {
+#  foreach my $k (keys %vars) {
+#    print "DEBUG: vars{$k} = $vars{$k}\n";
+#  }
+#}
 
 sub toggle_portable {
   my $td = $vars{'TEXDIR'};
@@ -1141,8 +1235,9 @@
     $vars{'portable'} = 0;
     $portableyesno = __('No');
     # enable some buttons
-    for $b ($tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
-      $b->configure(-state => 'normal');
+    for $b (
+      $tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
+        $b->configure(-state => 'normal');
     }
     for $b ($pathbutton, $deskintbutton, $assocbutton, $adminbutton) {
       $b->configure(-state => 'normal') if $b;
@@ -1151,8 +1246,9 @@
     $vars{'portable'} = 1;
     $portableyesno = __('Yes');
     # disable some buttons. These should get a name first.
-    for $b ($tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
-      $b->configure(-state => 'disabled');
+    for $b (
+      $tmflocalbutton, $tmfsysvarbutton, $tmfsysconfigbutton, $tmfhomebutton) {
+        $b->configure(-state => 'disabled');
     }
     $vars{'option_path'} = 0;
     $vars{'option_desktop_integration'} = 0;
@@ -1169,7 +1265,8 @@
   set_texlive_default_dirs(); # this sub tests for portable and in_place
   $mw -> messageBox(
     -title => __('Warning'),
-    -message => __("Portable option changed;\nDirectories have been reinitialized"),
+    -message =>
+      __("Portable option changed;\nDirectories have been reinitialized"),
     -type => 'OK', -icon => 'warning');
   menu_set_pathes_text();
   # same for some options
@@ -1176,11 +1273,16 @@
 }
 
 sub toggle_and_set_opt_variable {
+  # $varsref: the variable to be changed
+  # $toggleref: the string representation of the value of $varsref;
+  # $choicesref: array ref of possible values for $toggleref
   my ($varsref, $toggleref, $choicesref) = @_;
-  my ($no, $yes) = $choicesref ? @$choicesref : (__('No'), __('Yes'));
-  $$toggleref = ($$toggleref eq $yes) ? $no : $yes;
-  $$varsref = 0;
-  $$varsref = 1 if ($$toggleref eq $yes);
+  $choicesref = \@::yesno unless defined $choicesref;
+
+  my $n_opts = @$choicesref;
+  $$varsref += 1;
+  $$varsref = 0 if $$varsref >= $n_opts;
+  $$toggleref = $$choicesref[$$varsref];
   calc_depends();
   menu_update_texts();
 }

Modified: trunk/Master/tlpkg/installer/install-menu-text.pl
===================================================================
--- trunk/Master/tlpkg/installer/install-menu-text.pl	2017-04-15 01:00:49 UTC (rev 43804)
+++ trunk/Master/tlpkg/installer/install-menu-text.pl	2017-04-15 08:22:51 UTC (rev 43805)
@@ -32,11 +32,15 @@
     "   !! Portable option changed;\n" .
     "   !! Directories have been reinitialized!\n";
 
-# issue welcome message on end of installation
-push @::end_install_hook,
-    sub { if (win32()) { print TeXLive::TLUtils::welcome(); }
-          else { print TeXLive::TLUtils::welcome_paths(); } };
+# @fileassocdesc also defined in install-tl
+$::fileassocdesc[0] = "None";
+$::fileassocdesc[1] = "Only new";
+$::fileassocdesc[2] = "All";
 
+$::deskintdesc[0] = "None";
+$::deskintdesc[1] = "Menu shortcuts";
+if (win32() && is_vista()) { $::deskintdesc[2] = "Launcher"; }
+
 sub clear_screen {
   return 0 if ($::opt_no_cls);
   system (unix() ? 'clear' : 'cls');
@@ -47,11 +51,23 @@
   return split(//, $string);
 }
 
-sub button {
+sub button { # for main menu: 1 char
   my $val=shift;
-  return ($val)? '[X]':'[ ]';
+  my $vals=shift; # array ref to descriptions of possible values
+  if (defined $vals) {
+    return "[$val]";
+  } else { # just yes/no
+    return ($val)? '[X]':'[ ]';
+  }
 }
 
+sub obutton { # for options menu: more chars allowed
+  my $val=shift;
+  my $vals=shift; # array ref to descriptions of possible values
+  $vals = [' ', 'x'] unless defined $vals;
+  return "[$$vals[$val]]";
+}
+
 sub hbar {
   return '=' x79, "\n";
 }
@@ -58,7 +74,11 @@
 
 sub toggle {
   my $var=shift;
-  $vars{$var} = ($vars{$var} ? 0 : 1);
+  my $vals=shift; # array ref to descriptions of possible values
+  $vals = [' ', 'x'] unless defined $vals;
+  my $n_vals = @$vals;
+  $vars{$var} += 1;
+  $vars{$var} = 0 unless $vars{$var} < $n_vals;
 }
 
 sub menu_head {
@@ -736,16 +756,17 @@
 
 
 sub options_menu {
-  my $b_path=button($vars{'option_path'});
-  my $b_doc=button($vars{'option_doc'});
-  my $b_src=button($vars{'option_src'});
-  my $b_fmt=button($vars{'option_fmt'});
-  my $b_letter=button($vars{'option_letter'});
-  my $b_adjustrepo=button($vars{'option_adjustrepo'});
-  my $b_deskint=button($vars{'option_desktop_integration'});
-  my $b_admin=button($vars{'option_w32_multi_user'});
-  my $b_addoneditor=button($vars{'collection-texworks'});
-  my $b_restricted=button($vars{'option_write18_restricted'});
+  my $b_path=obutton($vars{'option_path'});
+  my $b_doc=obutton($vars{'option_doc'});
+  my $b_src=obutton($vars{'option_src'});
+  my $b_fmt=obutton($vars{'option_fmt'});
+  my $b_letter=obutton($vars{'option_letter'});
+  my $b_adjustrepo=obutton($vars{'option_adjustrepo'});
+  my $b_deskint=obutton(
+    $vars{'option_desktop_integration'}, \@::deskintdesc);
+  my $b_admin=obutton($vars{'option_w32_multi_user'});
+  my $b_addoneditor=obutton($vars{'collection-texworks'});
+  my $b_restricted=obutton($vars{'option_write18_restricted'});
 
   my $sys_bin=$vars{'option_sys_bin'};
   my $sys_man=$vars{'option_sys_man'};
@@ -791,9 +812,11 @@
 EOF
 ;
     }
-    if (win32() || $::opt_all_options) {
-      print " <M> create Start menu shortcuts:              $b_deskint\n";
-      print " <N> update file associations:                 [$::fileassocdesc[$vars{'option_file_assocs'}]]\n";
+    if ((win32() && !$vars{'portable'}) || $::opt_all_options) {
+      print " <M> Start menu shortcuts / launcher:          ".obutton(
+          $vars{'option_desktop_integration'}, \@::deskintdesc)."\n";
+      print " <N> update file associations:                 ".obutton(
+        $vars{'option_file_assocs'}, \@::fileassocdesc)."\n";
       if ($::opt_all_options || TeXLive::TLWinGoo::admin()) {
         # if we are admin we allow normal user installation, too
         print " <U> make installation available to all users: $b_admin\n";
@@ -851,34 +874,42 @@
     }
   }
 
-  # option_desktop_integration, option_file_assocs
+#  # option_desktop_integration, option_file_assocs
+#
+#  if (win32() || $::opt_all_options) {
+#    if ("\u$answer" eq 'M' and !$vars{'portable'}) {
+#      toggle 'option_desktop_integration';
+#      return $command{'self'};
+#
+#    } elsif ("\u$answer" eq 'N' and !$vars{'portable'}) {
+#      print "New value for file_assocs:\n";
+#      print "  0 -- don't tweak the file associations\n";
+#      print "  1 -- only add new file associations, don't overwrite old ones\n";
+#      print "  2 -- always create file associations to TeX Live programs\n";
+#      print "New value for file_assocs [$vars{'option_file_assocs'}]: ";
+#      chomp (my $a = <STDIN>);
+#      if ($a eq "0" || $a eq "1" || $a eq "2") {
+#        $vars{'option_file_assocs'} = $a;
+#      }
+#      return $command{'self'};
+#
+#    } elsif ("\u$answer" eq 'U' and !$vars{'portable'}) {
+#      toggle 'option_w32_multi_user';
+#      return $command{'self'};
+#    }
+#  }
 
-  if (win32() || $::opt_all_options) {
-    if ("\u$answer" eq 'M' and !$vars{'portable'}) {
-      toggle 'option_desktop_integration';
-      return $command{'self'};
+  # other options
 
-    } elsif ("\u$answer" eq 'N' and !$vars{'portable'}) {
-      print "New value for file_assocs:\n";
-      print "  0 -- don't tweak the file associations\n";
-      print "  1 -- only add new file associations, don't overwrite old ones\n";
-      print "  2 -- always create file associations to TeX Live programs\n";
-      print "New value for file_assocs [$vars{'option_file_assocs'}]: ";
-      chomp (my $a = <STDIN>);
-      if ($a eq "0" || $a eq "1" || $a eq "2") {
-        $vars{'option_file_assocs'} = $a;
-      }
-      return $command{'self'};
+  if (("\u$answer" eq 'M') && !$vars{'portable'}) {
+    toggle ('option_desktop_integration', \@::deskintdesc);
+    return $command{'self'};
 
-    } elsif ("\u$answer" eq 'U' and !$vars{'portable'}) {
-      toggle 'option_w32_multi_user';
-      return $command{'self'};
-    }
-  }
+  } elsif (("\u$answer" eq 'N') && !$vars{'portable'}) {
+    toggle ('option_file_assocs', \@::fileassocdesc);
+    return $command{'self'};
 
-  # other options
-
-  if ("\u$answer" eq 'P') {
+  } elsif ("\u$answer" eq 'P') {
     toggle 'option_letter';
     return $command{'self'};
 
@@ -953,7 +984,10 @@
   my $b_src=button($vars{'option_src'});
   my $b_fmt=button($vars{'option_fmt'});
   my $b_letter=button($vars{'option_letter'});
-  my $b_deskint=button($vars{'option_desktop_integration'});
+  my $b_deskint=button($vars{'option_desktop_integration'}, \@::deskintdesc);
+  if (win32()) {
+    my $b_fileassoc=button($vars{'option_file_assocs'}, \@::fileassocdesc);
+  }
   my $b_admin=button($vars{'option_w32_multi_user'});
   my $b_addoneditor=button($vars{'collection-texworks'});
   my $b_restricted=button($vars{'option_write18_restricted'});
@@ -1094,7 +1128,6 @@
     return $command{'self'};
   }
 }
-
 # needs a terminal 1 for require to succeed!
 1;
 

Modified: trunk/Master/tlpkg/installer/install-menu-wizard.pl
===================================================================
--- trunk/Master/tlpkg/installer/install-menu-wizard.pl	2017-04-15 01:00:49 UTC (rev 43804)
+++ trunk/Master/tlpkg/installer/install-menu-wizard.pl	2017-04-15 08:22:51 UTC (rev 43805)
@@ -68,8 +68,8 @@
 require Tk::Dialog;
 require Tk::DialogBox;
 require Tk::PNG;
-require Tk::ROText;
-require Tk::ProgressBar;
+#require Tk::ROText;
+#require Tk::ProgressBar;
 require Tk::Font;
 
 use utf8;
@@ -119,44 +119,12 @@
     $mw->destroy;
 }
 
-sub setup_hooks_wizard {
-  @::info_hook = ();
-  push @::info_hook,
-    sub {
-      return unless defined($mw);
-      wizard_update_status(join(" ", at _));
-      $mw->update;
-    };
-  push @::warn_hook,
-    sub {
-      return unless defined($mw);
-      wizard_update_status(join(" ", at _));
-      $mw->update;
-    };
-  @::install_packages_hook = ();
-  push @::install_packages_hook, \&wizard_update_progressbar;
-  push @::install_packages_hook, sub { $mw->update; };
-}
-
-sub wizard_update_status {
-  my ($p) = @_;
-  return unless defined($::progressw);
-  $::progressw->insert("end", "$p");
-  $::progressw->see("end");
-}
-sub wizard_update_progressbar {
-  my ($n,$total) = @_;
-  if (defined($n) && defined($total)) {
-    $::progress->value(int($n*100/$total));
-  }
-}
-
 ################# WELCOME SCREEN ######################################
 
 sub run_menu_wizard {
   $mw = Tk::MainWindow->new(-width => $MWIDTH, -height => $MHEIGHT);
   $mw->protocol('WM_DELETE_WINDOW' => \&menu_abort);
-  setup_hooks_wizard();
+  #setup_hooks_wizard();
 
   my $img = $mw->Photo(-format => 'png', -file => "$::installerdir/tlpkg/installer/texlive.png");
   $mw->Label(-image => $img, -background => "#0078b8")->place(-x => 0, -y => 0);
@@ -172,7 +140,7 @@
 
   $tit->place(-x => 0, -y => 0);
 
-  $counter = $ftitle->Label(-text => "1/5");
+  $counter = $ftitle->Label(-text => "1/4");
   $counter->place(-x => $INNERWIDTH, -y => 0, -anchor => "ne");
 
   $fmain = $mw->Frame(-height => $INNERHEIGHT, -width => $INNERWIDTH);
@@ -201,12 +169,12 @@
   for ($fmain->children) {
     $_->destroy;
   }
-  $counter->configure(-text => "1/5");
+  $counter->configure(-text => "1/4");
   $prv->placeForget;
 
   my $inf = $fmain->Label(
     -text => __("Welcome to the installation of TeX Live %s\nhttp://tug.org/texlive\n\nThis wizard will guide you through the installation.", $TeXLive::TLConfig::ReleaseYear)
-      . ( (win32()) ? "\n\n" . __("Best to disable your virus scanner during installation.") : "" )
+      . ( (win32()) ? "\n\n" . __("In case of trouble, try to disable your virus scanner during installation.") : "" )
        . "\n\n"
        . __("For an advanced, customizable installation, please consult\nthe web pages or installation guide.")
       . "\n"
@@ -246,7 +214,7 @@
   for ($fmain->children) {
     $_->destroy;
   }
-  $counter->configure(-text => "1-1/5");
+  $counter->configure(-text => "1-1/4");
 
   my @mirror_list;
   my @netlst;
@@ -314,7 +282,7 @@
   for ($fmain->children) {
     $_->destroy;
   }
-  $counter->configure(-text => "1-1/5");
+  $counter->configure(-text => "1-1/4");
 
   our $mirrors;
   require("installer/mirrors.pl");
@@ -405,7 +373,7 @@
   for ($fmain->children) {
     $_->destroy;
   }
-  $counter->configure(-text => "1-2/5");
+  $counter->configure(-text => "1-2/4");
 
   if ($::init_remote_needed) {
     my $labela = $fmain->Label(-text => __('Please wait while the repository database is loaded.'))->place(-x => 0, -y => 50);
@@ -448,7 +416,7 @@
     $_->destroy;
   }
 
-  $counter->configure(-text => "2/5");
+  $counter->configure(-text => "2/4");
 
   $dest = $vars{'TEXDIR'};
   $dest_display = native_slashify($dest);
@@ -583,7 +551,7 @@
   for ($fmain->children) {
     $_->destroy;
   }
-  $counter->configure(-text => "3/5");
+  $counter->configure(-text => "3/4");
 
   my $inf = $fmain->Label(-text => __("This screen allows you to configure some options"), -justify => "left");
   $inf->place(-x => 0, -y => 20);
@@ -629,7 +597,7 @@
   for ($fmain->children) {
     $_->destroy;
   }
-  $counter->configure(-text => "4/5");
+  $counter->configure(-text => "4/4");
   my $inf = $fmain->Label(-justify => "left", -text => __("We are ready to install TeX Live %s.\nThe following settings will be used.\nIf you want to change something please go back,\notherwise press the \"Install\" button.", $TeXLive::TLConfig::ReleaseYear));
 
 
@@ -656,85 +624,12 @@
 
   
   $nxt->configure(-text => __('Install'), 
-                  -command => \&wizard_installation_window);
+                  -command => sub { $return = $MENU_INSTALL; $mw->destroy; });
+#                  -command => \&wizard_installation_window);
   $prv->configure(-text => __('< Back'), -command => \&ask_options);
   $can->place(-x => $LEFT, -y => ($MHEIGHT - $BOTTOM), -anchor => "sw");
 }
 
-sub wizard_installation_window {
-  for ($fmain->children) {
-    $_->destroy;
-  }
-  $counter->configure(-text => "5/5");
-  # create a progress bar window
-  # compute the height of the Text by the given font
-
-  $::progressw = $fmain->Scrolled("ROText", -scrollbars => "e",
-                                -wrap => "word");
-
-  # we want to have the progressbar about 20px wide, so compute how
-  # many lines of the current font do fit into the remaining area
-  my $lines = int( ($INNERHEIGHT - 20) / $lineskip);
-  # it seems that on Windows the computation is not right, the
-  # progress bar overwrites the last line of the text widget
-  # remove one line here
-  $lines-- if win32();
-  $::progressw->configure(-height => $lines);
-  $::progressw->place(-x => 0, -y => 0, -width => $INNERWIDTH); 
-
-  # that is necessary otherwise the progressbar gets very strange dimensions
-  $fmain->update;
-
-
-  my $percent_done = 0;
-
-  # compute the remaining space in pixel for the progressbar
-  my $pw = $INNERHEIGHT - ($lines * $lineskip) - 5;
-  # make sure that the line we remove above for Windows is not re-added
-  # to the size of the progressbar. The 7 was found by trial and error
-  $pw -= ($lineskip + 7) if win32();
-  $::progress = $fmain->ProgressBar(-variable => \$percent_done,
-      -width => $pw, -length => $INNERWIDTH,
-      -from => 0, -to => 110, -blocks => 10,
-      -colors => [ 0, '#0078b8' ]);
-  $::progress->place(-x => 0, -y => $INNERHEIGHT, -anchor => "sw");
-
-  #
-  # change the buttons so that the Prev disappears, the Next becomes
-  # Cancel, and the Cancel button disappears
-  $prv->placeForget;
-  $nxt->placeForget;
-  #$can->configure(-text => __('Cancel'),
-  #                -command => sub { $return = $MENU_ABORT; $mw->destroy; });
-  calc_depends();
-  do_installation();
-  $::progress->value(110);
-  $return = $MENU_ALREADYDONE;
-  my $t = __("See %s/index.html for links to documentation.\nThe TeX Live web site (http://tug.org/texlive/) contains any updates and corrections. TeX Live is a joint project of the TeX user groups around the world; please consider supporting it by joining the group best for you. The list of groups is available on the web at http://tug.org/usergroups.html.", $::vars{'TEXDIR'});
-  if (!win32()) {
-    $t .= "\n\n" . __("Add %s/texmf-dist/doc/man to MANPATH.\nAdd %s/texmf-dist/doc/info to INFOPATH.\nMost importantly, add %s/bin/%s\nto your PATH for current and future sessions.", $::vars{'TEXDIR'}, $::vars{'TEXDIR'}, $::vars{'TEXDIR'}, $::vars{'this_platform'});
-  }
-  if (@::WARNLINES) {
-    $t .= "\n\n" . __("There were some warnings during the installation process.\nHere is the list of warning messages:") . "\n";
-    $t .= join('', @::WARNLINES);
-    $t =~ s/\n\z//;
-  }
-  $t .= "\n\n" . __('Welcome to TeX Live!');
-  #$t =~ s/\\n/\n/g;
-  my $linechar = $::progressw->index("end");
-  $::progressw->markSet("finaltext", $linechar);
-  $::progressw->markGravity("finaltext", "left");
-  $::progressw->insert("end", "\n$t");
-  $::progressw->see("end");
-  $::progressw->tagAdd("centered", $linechar, "end");
-  $::progressw->tagConfigure("centered", -justify => "center");
-  my $rb = $MWIDTH - $RIGHT;
-  $nxt->configure(-text => __('Finish'),
-                -command => sub { $mw->destroy; });
-  $nxt->place(-x => ($MWIDTH - $RIGHT) ,
-              -y => ($MHEIGHT - $BOTTOM), -anchor => "se")->focus();
-}
-
 ################### END OF MODULE RETURN 1 FOR REQUIRE ###########
 
 1;

Added: trunk/Master/tlpkg/installer/tracked-install.pl
===================================================================
--- trunk/Master/tlpkg/installer/tracked-install.pl	                        (rev 0)
+++ trunk/Master/tlpkg/installer/tracked-install.pl	2017-04-15 08:22:51 UTC (rev 43805)
@@ -0,0 +1,141 @@
+#!/usr/bin/env perl
+# $Id: install-menu-perltk.pl 41176 2016-05-16 00:42:28Z preining $
+#
+# Copyright 2008-2014 Norbert Preining
+# Copyright 2008 Reinhard Kotucha
+# This file is licensed under the GNU General Public License version 2
+# or any later version.
+#
+# TODO:
+# - make the fancy selector the default, at least on unix
+# - for w32 find out the necessary files for the fancy selector and move
+#   them to the installer perl package
+
+use strict;
+$^W = 1;
+
+my $svnrev = '$Revision: 41176 $';
+$svnrev =~ m/: ([0-9]+) /;
+$::menurevision = $1;
+
+require Tk;
+require Tk::ROText;
+require Tk::ProgressBar;
+
+use utf8;
+no utf8;
+
+sub installer_tracker {
+  my $ret;
+  # create a progress bar window
+  $::sww = Tk::MainWindow->new;
+  $::sww->Label(-text => __("Installation process"))->pack;
+  #warn "Debug!! Creating text window";
+  $::progressw = $::sww->Scrolled("ROText", -scrollbars => "e", -height => 18);
+  #warn "Debug!! Created text window";
+  $::progressw->pack(-expand => 1, -fill => "both");
+  #warn "Debug!! Placed text window";
+  my $percent_done = 0;
+  $::progress = $::sww->ProgressBar(-variable => \$percent_done,
+    -width => 20, -length => 400, -from => 0, -to => 100, -blocks => 10,
+    -colors => [ 0, '#0078b8' ]);
+  $::progress->pack(-fill => "x");
+  #my $f = $::sww->Frame;
+  my $b = $::sww->Button(
+    -text => __("Cancel"),
+    -command => sub {
+      do_cleanup(); $::sww->destroy;
+      # POSIX::exit prevents Tk error message 'Tk::Error: ("after" script)'
+      POSIX::exit(1);
+    })->pack(-pady => "2m");
+  $b->focus();
+  # $f->pack;
+  setup_hooks_perltk();
+
+  $ret = do_installation();
+
+  if (@::WARNLINES) {
+    foreach my $t (@::WARNLINES) {
+      update_status ($t);
+    }
+  }
+  if ($::env_warns) {
+    update_status($::env_warns);
+  }
+  $::progressw->tagConfigure('centered', -justify => 'center');
+  # basic welcome message
+  foreach my $t (@::welcome_arr) {
+    my $s = shift @$t;
+    $::progressw->insert("end", __($s, @$t)."\n", 'centered');
+  }
+  $::progressw->insert("end", "\n");
+  # additional info
+  if ($::LOGFILENAME) {
+    $::progressw->insert ("end", "Logfile: $::LOGFILENAME");
+  } else {
+    # do_cleanup sets $::LOGFILENAME to ""
+    #if no logfile could be written
+    $::progressw->insert ("end",
+      "Cannot create logfile $::vars{'TEXDIR'}/install-tl.log: $!");
+  }
+  if (@::WARNLINES or $::env_vars or !$::LOGFILENAME) {
+    $::progressw->insert("end", "\n");
+    $::progressw->insert("end", __("Scroll back to inspect warnings"));
+  }
+  $::progressw->insert("end", "\n");
+  my $linechar = $::progressw->index("end");
+  $::progressw->see("end");
+  $::progressw->tagAdd("centered", $linechar, "end");
+  $::progressw->tagConfigure("centered", -justify => "center");
+  $b->configure(
+    -text => __("Finish"),
+    -command => sub {
+      $::sww->destroy; return $ret;
+  });
+
+  Tk::MainLoop();
+  return $ret;
+} # installer_tracker
+
+#sub tracked_installation {
+#  # undo binding, since this should run only once
+#  my $b = shift;
+#  $b->bind('<Map>' => '');
+#  $ret = do_installation();
+#  $::sww->destroy;
+#}
+
+sub setup_hooks_perltk {
+  @::info_hook = ();
+  push @::info_hook,
+    sub {
+      update_status(join(" ", at _));
+      $::sww->update;
+    };
+  push @::warn_hook,
+    sub {
+      return unless defined $::sww ;
+      update_status(join(" ", at _));
+    };
+  @::install_packages_hook = ();
+  push @::install_packages_hook, \&update_progressbar;
+  push @::install_packages_hook,
+    sub {
+      return unless defined $::sww;
+      $::sww->update;
+    };
+}
+
+sub update_status {
+  my ($p) = @_;
+  return unless defined $::progressw;
+  $::progressw->insert("end", "$p");
+  $::progressw->see("end");
+}
+sub update_progressbar {
+  my ($n,$total) = @_;
+  return unless defined $::progress;
+  if (defined($n) && defined($total)) {
+    $::progress->value(int($n*100/$total));
+  }
+}


Property changes on: trunk/Master/tlpkg/installer/tracked-install.pl
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property


More information about the tex-live-commits mailing list