From 2b467244921da9f75590f1ca21e3f6d1eae09471 Mon Sep 17 00:00:00 2001 From: Siep Kroonenberg Date: Sat, 15 Apr 2017 08:22:51 +0000 Subject: Reworked installer and tlaunch option git-svn-id: svn://tug.org/texlive/trunk@43805 c570f23f-e606-0410-a88d-b1316a301751 --- Master/bin/win32/tlaunch.exe | Bin 114176 -> 114688 bytes Master/install-tl | 476 +++++++++------- Master/tlpkg/installer/install-menu-perltk.pl | 778 +++++++++++++++----------- Master/tlpkg/installer/install-menu-text.pl | 125 +++-- Master/tlpkg/installer/install-menu-wizard.pl | 133 +---- Master/tlpkg/installer/tracked-install.pl | 141 +++++ 6 files changed, 946 insertions(+), 707 deletions(-) create mode 100644 Master/tlpkg/installer/tracked-install.pl (limited to 'Master') diff --git a/Master/bin/win32/tlaunch.exe b/Master/bin/win32/tlaunch.exe index 1aa7910b2d3..589da750271 100755 Binary files a/Master/bin/win32/tlaunch.exe and b/Master/bin/win32/tlaunch.exe differ diff --git a/Master/install-tl b/Master/install-tl index 238a5e12341..f7dac723073 100755 --- a/Master/install-tl +++ b/Master/install-tl @@ -45,6 +45,7 @@ BEGIN { 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 @@ if (win32) { &unregister_file_type &broadcast_env &update_assocs - &add_desktop_shortcut &add_menu_shortcut &remove_desktop_shortcut &remove_menu_shortcut @@ -195,7 +195,8 @@ $::fileassocdesc[2] = "All"; 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 = ; if ($answer =~ m/^y(es)?$/i) { $opt_profile = "installation.profile"; @@ -314,7 +315,8 @@ if ($opt_profile) { # for now, not allowed if in_place 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 (($opt_gui ne "text") && !$opt_no_gui && ($opt_profile eq "")) { } } -# if (defined($opt_force_arch)) { tlwarn("Overriding platform to $opt_force_arch\n"); $::_platform_ = $opt_force_arch; @@ -470,6 +471,7 @@ if ($opt_location) { } } +# find wget, tar, xzdec if (!setup_programs ("$::installerdir/tlpkg/installer", "$::_platform_")) { tldie("$0: Goodbye.\n"); } @@ -530,22 +532,20 @@ if ($opt_profile eq "") { 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! } } } 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,27 +564,39 @@ foreach my $key (sort keys %vars) { } 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(); -} - -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"; +sanitise_options(); +install_warnlines_hook(); # collect warnings in @::WARNLINES +info("Installing to: $vars{TEXDIR}\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 @@ sub only_load_remote { } } return load_tlpdb(); -} +} # only_load_remote sub do_remote_init { @@ -660,7 +672,7 @@ END_MISMATCH } final_remote_init(); return 1; -} +} # do_remote_init sub do_version_agree { $texlive_release = $tlpdb->config_release; @@ -681,7 +693,7 @@ sub do_version_agree { } else { return 1; } -} +} # do_version_agree sub final_remote_init { info("Installing TeX Live $TeXLive::TLConfig::ReleaseYear from: $location" . @@ -714,7 +726,8 @@ sub final_remote_init { 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,27 +760,33 @@ sub final_remote_init { 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"); 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 @@ sub do_installation { && ! -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,17 +860,30 @@ sub do_installation { $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 @@ sub run_postinst_cmd { } return $ret; -} +} # run_postinst_cmd # @@ -911,7 +943,7 @@ sub do_postinst_stuff { 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 @@ operations might be disturbed.\n\n"; 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 @@ operations might be disturbed.\n\n"; $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,18 +1097,19 @@ operations might be disturbed.\n\n"; # 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 $errcount += do_tlpdb_postactions(); return $errcount; -} +} # do_postinst_stuff # Run the post installation code in the postaction tlpsrc entries. @@ -1073,20 +1120,67 @@ sub do_tlpdb_postactions { # 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 = ; + 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"); @@ -1100,7 +1194,7 @@ sub do_path_adjustments { $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 @@ EOF } print TMFLUA "}\n"; close(TMFLUA) || warn "close($TMFLUA) failed: $!"; -} +} # do_texmf_cnf sub dump_vars { @@ -1264,7 +1358,7 @@ sub dump_vars { } close VARS if (!ref($filename)); debug("\n%vars dumped to '$filename'.\n"); -} +} # dump_vars # Determine which platforms are supported. @@ -1278,7 +1372,7 @@ sub set_platforms_supported { 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 @@ sub set_texlive_default_dirs { $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 @@ sub calc_depends { } $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 @@ sub load_tlpdb { # 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(<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 @@ END_EXPLICIT_MIRROR $vars{'selected_scheme'} = $default_scheme; } return 1; -} +} # load_tlpdb sub initialize_collections { foreach my $pkg ($tlpdb->list_packages) { @@ -1581,7 +1678,7 @@ sub initialize_collections { $vars{"collection-wintools"} = 1; ++$vars{'n_collections_selected'}; } -} +} # initialize_collections sub set_install_platform { my $detected_platform=platform; @@ -1619,7 +1716,7 @@ sub set_install_platform { } } return($ret); -} +} # set_install_platform sub create_profile { my $profilepath = shift; @@ -1656,7 +1753,7 @@ sub create_profile { if (!ref($profilepath)) { close PROFILE; } -} +} # create_profile sub read_profile { my $profilepath = shift; @@ -1696,16 +1793,15 @@ sub read_profile { 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 @@ sub do_install_packages { 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 @@ sub save_options_into_tlpdb { $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 @@ sub save_options_into_tlpdb { $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 @@ sub save_options_into_tlpdb { } $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 @@ sub import_settings_from_old_tlpdb { $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 @@ sub import_settings_from_old_tlpdb { } 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 @@ sub select_scheme { } # 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 @@ sub schemes_ordered_for_presentation { 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 @@ sub update_numbers { ++$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,25 +2166,9 @@ sub flushlog { foreach my $l (@::LOGLINES) { print $fh $l; } -} +} # flushlog sub do_cleanup { - # 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")) { - $::LOGFILE = \*LOGF; - foreach my $line(@::LOGLINES) { - print $::LOGFILE "$line"; - } - } else { - tlwarn("$0: Cannot create log file $vars{'TEXDIR'}/install-tl.log: $!\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"); @@ -2097,74 +2183,49 @@ sub do_cleanup { 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"; + + # 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)) { + # 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 { - print "No logfile\n"; + tlwarn("$0: Cannot create log file $::LOGFILENAME: $!\n" + . "Not writing out log lines.\n"); + } } -} - - -# 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, -# C, and C. - -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"; - } + # Close log file if present + close($::LOGFILE) if (defined($::LOGFILE)); + 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 + +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 @@ EOF while running TeX. If you encounter problems, try unsetting them. Please ignore spurious matches unrelated to TeX. -$texenvs ---------------------------------------------------------------------- +$::env_warns ---------------------------------------------------------------------- EOF - } } +} - $welcome .= <<"EOF"; - - Welcome to TeX Live! -EOF - - return $welcome; + +# 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. + +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,17 +2261,17 @@ sub install_warnlines_hook { push @::warn_hook, sub { push @::WARNLINES, @_; }; } -# a summary of warnings if there were any -sub warnings_summary { - return '' unless @::WARNLINES; - my $summary = <destroy; } -sub setup_hooks_perltk { - @::info_hook = (); - push @::info_hook, - sub { - return unless defined $mainwindow; - update_status(join(" ",@_)); - $mainwindow->update; - }; - push @::warn_hook, - sub { - return unless defined $mainwindow ; - update_status(join(" ",@_)); - $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 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 menu_do_it { + $return = $MENU_INSTALL; + $mainwindow->destroy; } sub disable_buttons { @@ -194,46 +169,46 @@ sub change_button_state { $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 { 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 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 @@ sub run_menu_perltk { 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 @@ sub run_menu_perltk { } } 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 @@ sub run_menu_perltk { -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 @@ Please select a different mirror.', $TeXLive::TLConfig::ReleaseYear, $texlive_re 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,139 +357,255 @@ Please select a different mirror.', $TeXLive::TLConfig::ReleaseYear, $texlive_re $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"); } } $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') } } $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 @@ Licensed under the GNU General Public License version 2 or higher 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('', [ $quitbutton, 'Invoke' ]); #my $wizardbutton = $f3->Button( @@ -550,7 +665,8 @@ In case of problems, please contact: texlive\@tug.org" 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 @@ In case of problems, please contact: texlive\@tug.org" $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,62 +697,12 @@ sub pre_warn() { __("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'); -} - -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; }); + 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; } # this sub will not be called if $vars{'in_place'} @@ -681,19 +745,31 @@ sub menu_edit_texdir { 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,56 +795,28 @@ sub menu_edit_vars_value { } 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('' => [ $okbutton, 'Invoke']); $sw->bind('' => [ $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('', [ $okbutton, 'Invoke' ]); - $sw->bind('', [ $cancelbutton, 'Invoke' ]); -} - sub menu_select_scheme { my $sw = $mainwindow->Toplevel(-title => __('Selected scheme')); @@ -785,7 +833,8 @@ sub menu_select_scheme { 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,19 +845,24 @@ sub menu_select_scheme { $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(); } } $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('' => [ $okbutton, 'Invoke']); $sw->bind('' => [ $cancelbutton, 'Invoke']); @@ -825,18 +879,25 @@ sub menu_select_standard_collections { 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; 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 @@ sub menu_select_standard_collections { $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 @@ sub menu_select_standard_collections { } $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('' => [ $okbutton, 'Invoke']); $sw->bind('' => [ $cancelbutton, 'Invoke']); } @@ -905,15 +971,15 @@ sub menu_select_symlink { $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 @@ sub menu_select_symlink { $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('' => [ $okbutton, 'Invoke']); @@ -959,10 +1026,14 @@ sub menu_select_binsystems { $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('' => [ $okbutton, 'Invoke']); $sw->bind('' => [ $cancelbutton, 'Invoke']); @@ -974,9 +1045,10 @@ sub check_on_removal { 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 @@ sub menu_set_binbutton_text { } 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_collections_text { 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 @@ sub callback_edit_var() { 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 @@ sub toggle_portable { $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 @@ sub toggle_portable { $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,18 +1265,24 @@ sub toggle_portable { 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 } 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(); } diff --git a/Master/tlpkg/installer/install-menu-text.pl b/Master/tlpkg/installer/install-menu-text.pl index 2571420daaa..3b7f192b5cd 100644 --- a/Master/tlpkg/installer/install-menu-text.pl +++ b/Master/tlpkg/installer/install-menu-text.pl @@ -32,10 +32,14 @@ my $ptoggle_alert = "\n". " !! 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); @@ -47,9 +51,21 @@ sub string_to_list { return split(//, $string); } -sub button { +sub button { # for main menu: 1 char + my $val=shift; + 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; - return ($val)? '[X]':'[ ]'; + my $vals=shift; # array ref to descriptions of possible values + $vals = [' ', 'x'] unless defined $vals; + return "[$$vals[$val]]"; } sub hbar { @@ -58,7 +74,11 @@ sub hbar { 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 help_menu { 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 EOF ; } - if (win32() || $::opt_all_options) { - print " create Start menu shortcuts: $b_deskint\n"; - print " update file associations: [$::fileassocdesc[$vars{'option_file_assocs'}]]\n"; + if ((win32() && !$vars{'portable'}) || $::opt_all_options) { + print " Start menu shortcuts / launcher: ".obutton( + $vars{'option_desktop_integration'}, \@::deskintdesc)."\n"; + print " 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 " make installation available to all users: $b_admin\n"; @@ -851,34 +874,42 @@ EOF } } - # 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'}; +# # 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 = ); +# 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'}; +# } +# } - } 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 = ); - if ($a eq "0" || $a eq "1" || $a eq "2") { - $vars{'option_file_assocs'} = $a; - } - return $command{'self'}; + # other options - } elsif ("\u$answer" eq 'U' and !$vars{'portable'}) { - toggle 'option_w32_multi_user'; - return $command{'self'}; - } - } + if (("\u$answer" eq 'M') && !$vars{'portable'}) { + toggle ('option_desktop_integration', \@::deskintdesc); + return $command{'self'}; - # other options + } elsif (("\u$answer" eq 'N') && !$vars{'portable'}) { + toggle ('option_file_assocs', \@::fileassocdesc); + return $command{'self'}; - if ("\u$answer" eq 'P') { + } elsif ("\u$answer" eq 'P') { toggle 'option_letter'; return $command{'self'}; @@ -953,7 +984,10 @@ sub main_menu { 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 @@ EOF return $command{'self'}; } } - # needs a terminal 1 for require to succeed! 1; diff --git a/Master/tlpkg/installer/install-menu-wizard.pl b/Master/tlpkg/installer/install-menu-wizard.pl index 44738c815b1..7f92dd35d6c 100644 --- a/Master/tlpkg/installer/install-menu-wizard.pl +++ b/Master/tlpkg/installer/install-menu-wizard.pl @@ -68,8 +68,8 @@ require Tk::BrowseEntry; 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 @@ sub menu_abort { $mw->destroy; } -sub setup_hooks_wizard { - @::info_hook = (); - push @::info_hook, - sub { - return unless defined($mw); - wizard_update_status(join(" ",@_)); - $mw->update; - }; - push @::warn_hook, - sub { - return unless defined($mw); - wizard_update_status(join(" ",@_)); - $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 @@ sub run_menu_wizard { $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 @@ sub reset_start { 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 @@ sub ask_mirror { 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 @@ sub ask_mirror_hierarchical { 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 @@ sub load_remote_screen { 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 @@ sub ask_path { $_->destroy; } - $counter->configure(-text => "2/5"); + $counter->configure(-text => "2/4"); $dest = $vars{'TEXDIR'}; $dest_display = native_slashify($dest); @@ -583,7 +551,7 @@ sub ask_options { 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 @@ sub ask_go { 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 @@ sub ask_go { $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; diff --git a/Master/tlpkg/installer/tracked-install.pl b/Master/tlpkg/installer/tracked-install.pl new file mode 100644 index 00000000000..bdc12e3f041 --- /dev/null +++ b/Master/tlpkg/installer/tracked-install.pl @@ -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('' => ''); +# $ret = do_installation(); +# $::sww->destroy; +#} + +sub setup_hooks_perltk { + @::info_hook = (); + push @::info_hook, + sub { + update_status(join(" ",@_)); + $::sww->update; + }; + push @::warn_hook, + sub { + return unless defined $::sww ; + update_status(join(" ",@_)); + }; + @::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)); + } +} -- cgit v1.2.3