#!/usr/bin/perl

##
## xybin - the X yaboot installer
##         the wrapper program for ybin
##
## MATSUBAYASHI 'Shaolin' Kohji <shaolin@rhythmaning.org>
##     based on xinstaller code
##     distributed under GPL license
##


use Gtk;
use Gtk::Atoms;
use Gtk::Gdk;

use strict 'vars';

init Gtk;


my $version = " Ver 1.0.3";

my $CurrentWindow;
my $cngrat_window;
my $main_window;
my %my_widgets;

my %words;

my $bootstrap  = "";
my $bootstrap2 = "";
my $linuxroot  = "";
my $macosroot  = "";
my $macosxroot  = "";
my $defaultos  = "macos";
my $kernelname = "vmlinux-2.2.17-0vl11";
my $kernelarguments = "video=aty128fb:vmode:16";

my $format = 0;
my $macos  = 0;
my $macosx = 0;
my $darwin = 0;

my $newworld = 0;
my $newermac = 0;


sub new_pixmap {
 my ($filename, $window, $background) = @_;
 my ($pixmap, $mask) = create_from_xpm Gtk::Gdk::Pixmap($window, $background, $filename);
 return new Gtk::Pixmap($pixmap, $mask);
}


sub destroy_window {
        my($widget, $windowref, $w2) = @_;
        $$windowref = undef;
        $w2 = undef if defined $w2;
        0;
}


sub create_standard_entry {
        my($hbox) = create_standard_hbox( 10 , $_[2]);

        my($label) = new Gtk::Label $_[0];
        $label->set_alignment(0.0,0.5);
        $hbox->pack_start($label, 0, 1, 0);
        $label->show;

        my($entry) = new Gtk::Entry;
        $entry->set_usize(0, 20);
        $entry->set_text("$_[1]");
        $hbox->pack_start($entry, 1, 1, 0);
        $entry->show;

        return $entry;
}


sub my_separator {
        my($box1) = @_;

        my($separator) = new Gtk::HSeparator;
        $box1->pack_start($separator, 0, 1, 0);
        $separator->show;

        my($box2) = create_standard_hbox( 10 , $box1, 0, 1, 0 );
        return $box2;
}


sub create_standard_window {
        if ( defined $_[0] ) { $_[0]->destroy; return; }
        $_[0] = new Gtk::Window "toplevel";
        $_[0]->set_uposition($_[1],$_[2]);
        if ( ! ( $_[3] == -1 )) {
                # print "Setting window size to $_[3], $_[4]\n";
                # $_[0]->set_usize($_[3],$_[4]);
                $_[0]->set_default_size( $_[3], $_[4] );
        }
        $_[0]->signal_connect("destroy", \&destroy_window, \$_[0]);
        $_[0]->signal_connect("delete_event", \&destroy_window, \$_[0]);
        $_[0]->set_title( "$_[5]" );
        $_[0]->border_width(0);
        $_[0]->grab_focus;
        $_[0]->show;
        $CurrentWindow = $_[0];
}


sub create_standard_vbox {
        my( $item );
        $item = new Gtk::VBox(0,0);
        $item->border_width( $_[0] );
        if( defined $_[1] ) {
                if( defined $_[2] ) {
                        $_[1]->pack_start($item, $_[2], $_[3], $_[4] );
                } else {
#                       $_[1]->add($item);
                }
        } else {
                $CurrentWindow->add($item);
        }
        $item->show;
        return $item;
}


sub create_standard_hbox {
        my( $item );
        $item = new Gtk::HBox(0,10);
        $item->border_width( $_[0] );
        if( ! defined $_[1] ) {
                $CurrentWindow->add($item);
        } elsif ( ! defined $_[2] ) {
                $_[1]->add($item);
        } else {
                $_[1]->pack_start($item, $_[2], $_[3], $_[4] );
        }
        $item->show;
        return $item;
}


sub create_standard_label {
        my($label) = new Gtk::Label $_[0];
#       $label->set_alignment(0.0,0.5);
        if( ! defined $_[2] ) {
                $_[1]->add($label);
        } else {
                $_[1]->pack_start($label, $_[2], $_[3], $_[4] );
        }
        $label->show;
        return $label;
}


sub create_standard_button {
        my( $button ) = new Gtk::Button( $_[0] );
#       $_[0]->can_default(1);
        if( ! defined $_[1] ) {
                $button->show;
                return $button;
        }
        if( ! defined $_[2] ) {
                $_[1]->add($button);
        } else {
                $_[1]->pack_start($button, $_[2], $_[3], $_[4] );
        }
        if( defined $_[5] ) {
                $button->signal_connect('clicked', $_[5] );
        }
        $button->show;
        return $button;
}


sub create_text_window {
        my($box1,$box2,$button,$separator,$table,$hscrollbar,$vscrollbar,$text);
        my($pixmap1, $bg1, $pixmapdir, $quit);

        create_standard_window( $cngrat_window, $_[0], $_[1], $_[2], $_[3], $_[4
] ) || return;
        $bg1 = $cngrat_window->style->bg('normal');

        $box1 = create_standard_vbox( 0 );
        $box2 = create_standard_vbox( 10, $box1, 1, 1, 0 );

        $table = new Gtk::Table(3,2,0);
        $table->set_row_spacing(0,2);
        $table->set_col_spacing(0,2);
        $box2->pack_start($table,1,1,0);
        $table->show;

        if ( defined $_[7] ) {
		if ( -e "/usr/X11R6/lib/xinstaller/pixmaps" ) {
			$pixmapdir = "/usr/X11R6/lib/xinstaller/pixmaps";
		} else {
			$pixmapdir = "/root/bin/pixmaps";
		}
		$pixmap1 = new_pixmap("$pixmapdir/$_[7].xpm", $cngrat_window->window, $bg1);
		$table->attach_defaults($pixmap1, 0,1,0,1);
		show $pixmap1;
	}

	$text = new Gtk::Text(undef,undef);
	$table->attach_defaults($text, 0,1,1,2);
	show $text;

	$hscrollbar = new Gtk::HScrollbar($text->hadj);
	$table->attach($hscrollbar, 0, 1,2,3,[-expand,-fill],[-fill],0,0);
	$hscrollbar->show;

	$vscrollbar = new Gtk::VScrollbar($text->vadj);
	$table->attach($vscrollbar, 1, 2,1,2,[-fill],[-expand,-fill],0,0);
	$vscrollbar->show;

	$text->freeze;
	$text->realize;

	$text->insert(undef,$text->style->black,undef, $_[6] );

	$text->thaw;

	$box2 = my_separator($box1);

	if ( defined $_[8] ) {
		if ( $_[8] eq "quit" ) { $quit = 1; }
	}

	if ( $quit eq 1 ) {
		create_standard_button( $_[5] , $box2, 1, 1, 0, sub {
			Gtk->exit(0); 
		});
	} else {
		create_standard_button( $_[5] , $box2, 1, 1, 0, sub {
			$cngrat_window->destroy; 
		});
	}
}


sub read_xybin_conf {
	my @tmp;

	if ( -e "/etc/xybin.conf" ) {
		print "Reading /etc/xybin.conf ... ";
		open (CONF, "/etc/xybin.conf");
		while (<CONF>) {
			chop( $_ );
			if ( $_ eq "" ) { next; }
			@tmp = split( "==" , $_ );
			if ( ! defined $tmp[1] ) { next; }

			if ( $tmp[0] eq "DEFAULTOS" ) {
				$defaultos = $tmp[1];
			}
			if ( $tmp[0] eq "KERNEL" ) {
				$kernelname = $tmp[1];
			}
			if ( $tmp[0] eq "APPEND" ) {
				$kernelarguments = $tmp[1];
			}
			if ( $tmp[0] eq "ROOT" ) {
				$linuxroot = $tmp[1];
			}
			if ( $tmp[0] eq "MAGICBOOT" ) {
				$bootstrap = $tmp[1];
			}
			if ( $tmp[0] eq "MACOS" ) {
				$macosroot = $tmp[1];
			}
			if ( $tmp[0] eq "MACOSX" ) {
				$macosxroot = $tmp[1];
			}
		}
		close (CONF);
		print "done.\n";
	}
}


sub create_main_window {

	my ( $vbox, $hbox, $bbox, $button, $label, $chkbox, $entry );
	my ( $hbox1, $hbox2, $hbox3, $hboxx );
	my ( $tooltip );


	create_standard_window ( $main_window, 260, 20, -1, 350, $words{Title}.$version );

	$vbox = create_standard_vbox( 1 );
	#$hbox = create_standard_hbox( 5, $vbox, 0, 1, 0 );

	$my_widgets{boot} = create_standard_entry ($words{BootStrapPartition}, $bootstrap, $vbox);
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $my_widgets{boot},
			$words{Tip_BootStrapPartition}, NULL);

	$chkbox = new Gtk::CheckButton $words{FormatFirst};
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $chkbox,
			$words{Tip_FormatFirst}, NULL);
	$vbox->pack_start($chkbox, 1, 0, 1);
	$chkbox->show;
	$chkbox->signal_connect('clicked', sub{
		if ( $format eq 0 ) {
			$format = 1;
		} else {
			$format = 0;
		}
	});

	$my_widgets{defaultos} = create_standard_entry ($words{DefaultOS}, $defaultos, $vbox);
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $my_widgets{defaultos},
			$words{Tip_DefaultOS}, NULL);

	$bbox = my_separator($vbox);

	$hbox = create_standard_hbox( 1, $vbox, 0, 1, 0 );
	$my_widgets{kernel} = create_standard_entry ($words{Kernel}, $kernelname, $vbox);
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $my_widgets{kernel},
			$words{Tip_Kernel}, NULL);
	$my_widgets{root} = create_standard_entry ($words{LinuxRootPartition}, $linuxroot, $vbox);
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $my_widgets{root},
			$words{Tip_RootPartition}, NULL);
	$my_widgets{argument} = create_standard_entry ($words{KernelArgument}, $kernelarguments, $vbox);
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $my_widgets{argument},
			$words{Tip_KernelArgument}, NULL);

	$bbox = my_separator($vbox);

	$chkbox = new Gtk::CheckButton $words{EnableMacOS};
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $chkbox,
			$words{Tip_EnableMacOS}, NULL);
	$vbox->pack_start($chkbox, 1, 0, 1);
	$chkbox->show;

	$my_widgets{macos} = create_standard_entry ($words{MacOSPartition}, $macosroot, $vbox);
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $my_widgets{macos},
			$words{Tip_MacOSPartition}, NULL);
	if ( $macosroot eq "" ) {
		$my_widgets{macos}->hide;
	} else {
		$my_widgets{macos}->show;
		$chkbox->set_state(1);
		$macos = 1;
	}
	$chkbox->signal_connect('clicked', sub{
		if ( $macos eq 0 ) {
			$my_widgets{macos}->show; $macos = 1;
		} else {
			$my_widgets{macos}->hide; $macos = 0;
		}
	});

	$bbox = my_separator($vbox);

	$chkbox = new Gtk::CheckButton $words{EnableMacOSX};
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $chkbox,
			$words{Tip_EnableMacOSX}, NULL);
	$vbox->pack_start($chkbox, 1, 0, 1);
	$chkbox->show;

	$my_widgets{macosx} = create_standard_entry ($words{MacOSXPartition}, $macosxroot, $vbox);
		$tooltip = new Gtk::Tooltips;
		$tooltip->set_tip( $my_widgets{macosx},
			$words{Tip_MacOSXPartition}, NULL);
	if ( $macosxroot eq "" ) {
		$my_widgets{macosx}->hide;
	} else {
		$my_widgets{macosx}->show;
		$chkbox->set_state(1);
		$macosx = 1;
	}
	$chkbox->signal_connect('clicked', sub{
		if ( $macosx eq 0 ) {
			$my_widgets{macosx}->show; $macosx = 1;
		} else {
			$my_widgets{macosx}->hide; $macosx = 0;
		}
	});

	$bbox = my_separator($vbox);

	create_standard_button ($words{DoIt} , $bbox, 1, 1, 1, sub { validate_conf(); } );
	create_standard_button ($words{Quit} , $bbox, 1, 1, 1, sub { Gtk->exit(0); });
}


sub validate_conf {
	my $returned;


	##
	## Validate bootstrap partition path
	##
	$bootstrap = $my_widgets{boot}->get_text;
	if ( -e "/usr/sbin/ofpath" ) {
		$returned = system "/usr/sbin/ofpath $bootstrap 2>&1 >/dev/null";
		if ( $returned ne 0 ) {
			create_text_window ( 260, 20, 420, 350, $words{BootStrap_Invalid}, $words{Close}, $words{BootStrap_Invalid2}, "stop" );
			$my_widgets{boot}->grab_focus;
			return;
		}
		$bootstrap2 = `/usr/sbin/ofpath $bootstrap`;
		chomp $bootstrap2;
	} else {
		create_text_window (260, 20, 420, 350, $words{No_OFpath}, $words{Close}, $words{No_OFpath2}, "stop" );
		return;
	}
	print "BootStrap = $bootstrap \n";


	##
	## Validate Default OS name
	##

	$defaultos = $my_widgets{defaultos}->get_text;
	if ( ( $defaultos ne 'linux' ) && ( $defaultos ne 'macos' ) && ( $defaultos ne 'macosx' ) ) {
		create_text_window ( 260, 20, 420, 350, $words{Invalid_OS}, $words{Close}, $words{Invalid_OS2}, "stop" );
		$my_widgets{defaultos}->grab_focus;
		return;
	}
	print "Default OS = $defaultos \n";

	if ( ( $defaultos eq 'macos' ) && ( $macos ne 1 ) ) {
		create_text_window ( 260, 20, 420, 350, $words{Invalid_OS}, $words{Close}, $words{Invalid_OS3}, "stop" );
		$my_widgets{defaultos}->grab_focus;
		return;
	}
	if ( ( $defaultos eq 'macosx' ) && ( $macosx ne 1 ) ) {
		create_text_window ( 260, 20, 420, 350, $words{Invalid_OS}, $words{Close}, $words{Invalid_OS3}, "stop" );
		$my_widgets{defaultos}->grab_focus;
		return;
	}


	##
	## Validate kernel file name
	##

	$kernelname = $my_widgets{kernel}->get_text;
	if ( ! -e "/boot/$kernelname" ) {
		create_text_window (260, 20, 420, 350, $words{No_Kernel_File}, $words{Close}, $words{No_Kernel_File2}, "stop" );
		$my_widgets{kernel}->grab_focus;
		return;
	}
	print "Kernel = /boot/$kernelname \n";


	##
	## Validate root partition
	##
	$linuxroot = $my_widgets{root}->get_text;
	if ( -e "/usr/sbin/ofpath" ) {
		$returned = system "/usr/sbin/ofpath $linuxroot 2>&1 >/dev/null";
		if ( $returned ne 0 ) {
			create_text_window ( 260, 20, 420, 350, $words{Root_Invalid}, $words{Close}, $words{Root_Invalid2}, "stop" );
			$my_widgets{root}->grab_focus;
			return;
		}
	} else {
		create_text_window (260, 20, 420, 350, $words{No_OFpath}, $words{Close}, $words{No_OFpath2}, "stop" );
		return;
	}

	if ( $linuxroot eq $bootstrap ) {
		create_text_window ( 260, 20, 420, 350, $words{Root_Boot_Invalid}, $words{Close}, $words{Root_Boot_Invalid2}, "stop" );
		return;
	}
	print "Linux root = $linuxroot \n";


	##
	## Validate kernel arguments
	##

	$kernelarguments = $my_widgets{argument}->get_text;
	print "Kernel arguments = $kernelarguments \n";

	
	##
	## Validate MacOS root partition
	##

	if ( $macos == 1 ) {
		$macosroot = $my_widgets{macos}->get_text;
		$returned = system "/usr/sbin/ofpath $macosroot 2>&1 >/dev/null";
		if ( $returned ne 0 ) {
			create_text_window ( 260, 20, 420, 350, $words{MacOS_Invalid}, $words{Close}, $words{MacOS_Invalid2}, "stop" );
			$my_widgets{macos}->grab_focus;
			return;
		}
		if ( $macosroot eq $linuxroot ) {
			create_text_window ( 260, 20, 420, 350, $words{MacOS_Root_Invalid}, $words{Close}, $words{MacOS_Root_Invalid2}, "stop" );
			return;
		}
		if ( $macosroot eq $bootstrap ) {
			create_text_window ( 260, 20, 420, 350, $words{MacOS_Boot_Invalid}, $words{Close}, $words{MacOS_Boot_Invalid2}, "stop" );
			return;
		}

		print "MacOS partition = $macosroot \n";
	}
	
	##
	## Validate MacOSX root partition
	##

	if ( $macosx == 1 ) {
		$macosxroot = $my_widgets{macosx}->get_text;
		$returned = system "/usr/sbin/ofpath $macosxroot 2>&1 >/dev/null";
		if ( $returned ne 0 ) {
			create_text_window ( 260, 20, 420, 350, $words{MacOSX_Invalid}, $words{Close}, $words{MacOSX_Invalid2}, "stop" );
			$my_widgets{macosx}->grab_focus;
			return;
		}
		if ( $macosxroot eq $linuxroot ) {
			create_text_window ( 260, 20, 420, 350, $words{MacOSX_Root_Invalid}, $words{Close}, $words{MacOSX_Root_Invalid2}, "stop" );
			return;
		}
		if ( $macosxroot eq $bootstrap ) {
			create_text_window ( 260, 20, 420, 350, $words{MacOSX_Boot_Invalid}, $words{Close}, $words{MacOSX_Boot_Invalid2}, "stop" );
			return;
		}
		if ( $macosxroot eq $macosroot ) {
			create_text_window ( 260, 20, 420, 350, $words{MacOSX_MacOS_Invalid}, $words{Close}, $words{MacOSX_MacOS_Invalid2}, "stop" );
			return;
		}

		print "MacOSX partition = $macosroot \n";
	}

	confirm_format();
}


sub confirm_format {
	my( $confirm_window, $vbox, $bbox, $label );
	my( $bg1, $pixmapdir, $pixmap1 );

	if ( $format eq 1 ) {
		create_standard_window ( $confirm_window, 260, 20, 350, 160, $words{Confirm_Format} );
        	$bg1 = $confirm_window->style->bg('normal');
		$vbox = create_standard_vbox( 0 );

                if ( -e "/usr/X11R6/lib/xinstaller/pixmaps" ) {
                        $pixmapdir = "/usr/X11R6/lib/xinstaller/pixmaps";
                } else {
                        $pixmapdir = "/root/bin/pixmaps";
                }
                $pixmap1 = new_pixmap("$pixmapdir/caution.xpm", $confirm_window->window, $bg1);
		$pixmap1->show;
		$vbox->pack_start( $pixmap1, 1, 1, 1 );

		$label = create_standard_label ( $words{Confirm_Format2}, $vbox, 1, 1, 0 );
		$bbox = my_separator($vbox);
		create_standard_button ($words{Proceed} , $bbox, 1, 1, 1, sub { $confirm_window->destroy; prepare_conf(); } );
		create_standard_button ($words{Cancel} , $bbox, 1, 1, 1, sub { $confirm_window->destroy; } );
	} else {
		prepare_conf();
	}
}


sub prepare_conf {
	open ( CONF , ">/tmp/yaboot.conf" );

	print CONF "\n";
	print CONF "## yaboot conf for ybin and yaboot >= 0.6\n";
	print CONF "## generated by xybin for Vine Linux.\n";
	print CONF "## see man yaboot.conf for more details.\n";

	print CONF "\n";

	print CONF "init-message=\"\\nWelcome to Vine Linux\!\\n\\nHit \<TAB\> for boot options.\\n\\n\"\n";
	print CONF "boot=$bootstrap\n";
	print CONF "delay=10\n";
	print CONF "timeout=300\n";

	print CONF "install=/usr/lib/yaboot/yaboot\n";
	print CONF "magicboot=/usr/lib/yaboot/ofboot\n";
	print CONF "protect\n";

	print CONF "enablecdboot\n";
	print CONF "enablenetboot\n";
	print CONF "enableofboot\n";
	print CONF "defaultos=$defaultos\n";

	print CONF "\n";

	print CONF "image=$bootstrap2,$kernelname\n";
	print CONF "\tlabel=linux\n";
	print CONF "\troot=$linuxroot\n";
	print CONF "\tread-only\n";
	if ( $kernelarguments ne "" ) {
		print CONF "\tappend=\" $kernelarguments\"\n";
	} else {
		print CONF "\tnovideo\n";
	}
	if ( $macos eq 1 ) {
		print CONF "\n";
		print CONF "macos=$macosroot\n";
	}
	if ( $macosx eq 1 ) {
		print CONF "\n";
		print CONF "macosx=$macosxroot\n";
	}

	print CONF "\n";
	close ( CONF );

	show_conf();
}


sub show_conf {
	my( $showconf_window, $vbox, $bbox, $label );
	my( $bg1, $pixmapdir, $pixmap1 );
	my( $table, $hscrollbar, $vscrollbar, $text, $CONF );

	create_standard_window ( $showconf_window, 260, 20, 400, 400, $words{Show_Conf} );
       	$bg1 = $showconf_window->style->bg('normal');
	$vbox = create_standard_vbox( 0 );

	if ( -e "/usr/X11R6/lib/xinstaller/pixmaps" ) {
		$pixmapdir = "/usr/X11R6/lib/xinstaller/pixmaps";
	} else {
		$pixmapdir = "/root/bin/pixmaps";
	}
	$pixmap1 = new_pixmap("$pixmapdir/caution.xpm", $showconf_window->window, $bg1);
	$pixmap1->show;
	$vbox->pack_start( $pixmap1, 1, 1, 1 );

	$label = create_standard_label ( $words{Show_Conf2}, $vbox, 1, 1, 0 );

	$table = new Gtk::Table(3,2,0);
	$table->set_row_spacing(0,2);
	$table->set_col_spacing(0,2);
	$vbox->pack_start($table,1,1,0);
	$table->show;

        $text = new Gtk::Text(undef,undef);
        $table->attach_defaults($text, 0,1,1,2);
        show $text;
                
        #$hscrollbar = new Gtk::HScrollbar($text->hadj);
        #$table->attach($hscrollbar, 0, 1,2,3,[-expand,-fill],[-fill],0,0);
        #$hscrollbar->show;

        $vscrollbar = new Gtk::VScrollbar($text->vadj);
        $table->attach($vscrollbar, 1, 2,1,2,[-fill],[-expand,-fill],0,0);
        $vscrollbar->show;
                
        $text->freeze;
        $text->realize;
        
	$CONF = "";
	open ( CONF , "/tmp/yaboot.conf" );
	while ( <CONF> ) {
		$CONF .= $_;
	}
        $text->insert(undef,$text->style->black,undef, $CONF );
        
        $text->thaw;

	$bbox = my_separator($vbox);
	create_standard_button ($words{Proceed} , $bbox, 1, 1, 1, sub { $showconf_window->destroy; write_conf();} );
	create_standard_button ($words{Back} , $bbox, 1, 1, 1, sub { $showconf_window->destroy; } );
}


sub write_conf {
	if ( -e "/etc/yaboot.conf" ) {
		print "Backing up old /etc/yaboot.conf ... ";
		system ("mv -f /etc/yaboot.conf /etc/yaboot.conf.orig");
		print "done.\n";
	}
	print "Preparing /etc/yaboot.conf ... ";
	system ("cp -f /tmp/yaboot.conf /etc/yaboot.conf");
	print "done.\n";

	prepare_bootstrap();
}


sub prepare_bootstrap {

	# format bootstrap partition
	if ( $format eq 1 ) {
		system "hformat -l \"Vine Linux Boot\" $bootstrap";
	}

	system "hmount $bootstrap";

	# copy specified kernel onto the bootstrap partition
	system "hcopy -r /boot/$kernelname :";

	# do ybin itself
	system "ybin -v 2>&1 | tee /tmp/ybin.log";

	# update xybin.conf
	open (CONF, ">/etc/xybin.conf");

	print CONF "DEFAULTOS==$defaultos\n\n";
	print CONF "KERNEL==$kernelname\n";
	if ( $kernelarguments ne "" ) {
		print CONF "APPEND==$kernelarguments\n";
	}
	print CONF "ROOT==$linuxroot\n";
	print CONF "MAGICBOOT==$bootstrap\n";
	if ( $macos eq 1 ) {
		print CONF "MACOS==$macosroot\n";
	}
	if ( $macosx eq 1 ) {
		print CONF "MACOSX==$macosxroot\n";
	}

	close (CONF);

	system "humount $bootstrap";

	# a final note...
	create_text_window ( 260, 20, 420, 250,
		$words{Finished}, $words{Quit}, $words{Finished2}, "note" );
}


sub make_word_hash {
	my( $entry, $key, @stuff );
	print "start make_word_hash\n";
	if( -e "/usr/X11R6/lib/xinstaller/$_[0].xybin" ) {
		open( WORDS , "/usr/X11R6/lib/xinstaller/$_[0].xybin" );
	}
	while( <WORDS> ) {
		chop $_;
		if( $_ eq "" ) { next; };
		@stuff = split( /	/ , $_ );
		if( defined $stuff[1] ) {
			$words{ $stuff[0] } = pop( @stuff );
			next;
		}
		$entry = $_;
		undef $words{ $entry };
		while( <WORDS> ) {
			chop $_;
			if( $_ eq "end" ) { 
				chop $words{ $entry };
				last;
			}
			$words{ $entry } .= "$_\n";
#			print "$_\n";
		}
	}
	close( WORDS );

#	foreach $key ( keys( %words ) ) { print "$key\n"; }
}


##
## main routine
##

if ( $ENV{'LANGUAGE'} eq "ja" ) {
	make_word_hash("Japanese");
} else {
	make_word_hash("English");
}

Gtk->set_locale();


## check whether on NewWorld ROM Machine

$newworld = `grep -c NewWorld /proc/cpuinfo`;
chomp($newworld);

if ( $newworld ne 1 ) {
	create_text_window ( 260, 20, 420, 250,
		$words{No_NewWorld}, $words{Quit}, $words{No_NewWorld2},
		"stop" , "quit");
} else {

	$kernelname = `(cd /boot; ls -t vmlinux* | head -1)`;
	chomp $kernelname;

	read_xybin_conf();
	create_main_window();

	# this is not needed anymore
	# if you have ybin >= 0.26-0vl3 ...
	#create_text_window ( 240, 40, 420, 250,
	#	$words{NewerMac}, $words{Close}, $words{NewerMac2},
	#	"note");

}

main Gtk;
