package install_gtk; # $Id$
use diagnostics;
use strict;
use ugtk2 qw(:wrappers :helpers :create);
use common;
use lang;
use devices;
#-#####################################################################################
#-INTERN CONSTANT
#-#####################################################################################
my @background;
#- if we're running for the doc team, we want screenshots with
#- a good B&W contrast: we'll override values of our theme
my $theme_overriding_for_doc = q(style "galaxy-default"
{
base[SELECTED] = "#E0E0FF"
base[ACTIVE] = "#E0E0FF"
base[PRELIGHT] = "#E0E0FF"
bg[SELECTED] = "#E0E0FF"
bg[ACTIVE] = "#E0E0FF"
bg[PRELIGHT] = "#E0E0FF"
text[ACTIVE] = "#000000"
text[PRELIGHT] = "#000000"
text[SELECTED] = "#000000"
fg[SELECTED] = "#000000"
}
style "white-on-blue"
{
base[NORMAL] = { 0.93, 0.93, 0.93 }
bg[NORMAL] = { 0.93, 0.93, 0.93 }
text[NORMAL] = "#000000"
fg[NORMAL] = "#000000"
}
style "background"
{
bg[NORMAL] = { 0.93, 0.93, 0.93 }
}
style "background-logo"
{
bg[NORMAL] = { 0.70, 0.70, 0.70 }
}
widget "*logo*" style "background-logo"
);
#------------------------------------------------------------------------------
sub load_rc {
my ($o, $name) = @_;
if (my $f = -r $name ? $name
: find { -r $_ } map { "$_/themes-$name.rc" } ("share", $ENV{SHARE_PATH}, dirname(__FILE__))) {
my @contents = cat_($f);
$o->{doc} and push @contents, $theme_overriding_for_doc;
Gtk2::Rc->parse_string(join("\n", @contents));
foreach (@contents) {
if (/style\s+"background"/ .. /^\s*$/) {
@background = map { $_ * 256 * 257 } split ',', $1 if /NORMAL.*\{(.*)\}/;
}
}
}
if ($::move) {
#- override selection color since we won't do inverse-video on the text when it's images
Gtk2::Rc->parse_string(q(
style "galaxy-default"
{
base[ACTIVE] = "#CECECE"
base[SELECTED] = "#CECECE"
text[ACTIVE] = "#000000"
text[PRELIGHT] = "#000000"
text[SELECTED] = "#000000"
}
));
}
}
#------------------------------------------------------------------------------
sub load_font {
my ($o) = @_;
if (lang::text_direction_rtl()) {
Gtk2::Widget->set_default_direction('rtl');
my ($x, $y) = $::WizardWindow->get_position;
my ($width) = $::WizardWindow->get_size;
$::WizardWindow->move($::rootwidth - $width - $x, $y);
}
Gtk2::Rc->parse_string(q(
style "default-font"
{
font_name = ") . lang::l2pango_font($o->{locale}{lang}) . q("
}
widget "*" style "default-font"
));
}
#------------------------------------------------------------------------------
sub default_theme {
my ($o) = @_;
$::move ? '/usr/share/themes/Galaxy/gtk-2.0/gtkrc' :
$o->{meta_class} eq 'firewall' ? 'mdk-Firewall' :
$o->{simple_themes} || $o->{vga16} ? 'blue' : 'galaxy';
}
sub install_theme {
my ($o) = @_;
load_rc($o, $o->{theme} ||= default_theme($o));
load_font($o);
$::move or gtkset_background(@background);
}
#------------------------------------------------------------------------------
sub create_help_window {
my ($o) = @_;
my $w;
if ($w = $o->{help_window}) {
$w->{window}->foreach(sub { $_[0]->destroy }, undef);
} else {
$w = $o->{help_window} = bless {}, 'ugtk2';
$w->{rwindow} = $w->{window} = Gtk2::Window->new('toplevel');
$w->{rwindow}->set_uposition($::rootwidth - $::helpwidth, $::rootheight - $::helpheight);
$w->{rwindow}->set_size_request($::helpwidth, $::helpheight);
$w->{rwindow}->set_title('skip');
};
gtkadd($w->{window}, create_scrolled_window($o->{help_window_text} = Gtk2::TextView->new));
$w->show;
}
#------------------------------------------------------------------------------
my %steps;
sub create_steps_window {
my ($o) = @_;
return if $::stepswidth == 0;
$o->{steps_window} and $o->{steps_window}->destroy;
my $w = bless {}, 'ugtk2';
$w->{rwindow} = $w->{window} = Gtk2::Window->new('toplevel');
$w->{rwindow}->set_uposition(lang::text_direction_rtl() ? ($::rootwidth - $::stepswidth - 8) : 8, 150);
$w->{rwindow}->set_size_request($::stepswidth, -1);
$w->{rwindow}->set_name('Steps');
$w->{rwindow}->set_title('skip');
$steps{$_} ||= gtkcreate_pixbuf("steps_$_") foreach qw(on off);
my $category = sub { gtkset_markup(Gtk2::Label->new,
$o->{doc} ? $_[0] : '' . $_[0] . '') };
gtkpack__(my $vb = Gtk2::VBox->new(0, 3), $steps{inst} = $category->(N("System installation")), '');
foreach (grep { !eval $o->{steps}{$_}{hidden} } @{$o->{orderedSteps}}) {
$_ eq 'setRootPassword'
and gtkpack__($vb, '', '', $steps{conf} = $category->(N("System configuration")), '');
$steps{steps}{$_} = { img => gtkcreate_img('steps_off.png'),
txt => Gtk2::Label->new(translate($o->{steps}{$_}{text})) };
gtkpack__($vb, gtkpack__(Gtk2::HBox->new(0, 7), $steps{steps}{$_}{img}, $steps{steps}{$_}{txt}));
}
gtkadd($w->{window}, $vb);
$w->show;
$o->{steps_window} = $w;
}
sub update_steps_position {
my ($o) = @_;
return if !$steps{steps};
my $last_step;
foreach (@{$o->{orderedSteps}}) {
exists $steps{steps}{$_} or next;
if ($o->{steps}{$_}{entered} && !$o->{steps}{$_}{done}) {
$steps{steps}{$_}{img}->set_from_pixbuf($steps{on});
$last_step and $steps{steps}{$last_step}{img}->set_from_pixbuf($steps{off});
return;
}
$last_step = $_;
}
}
#------------------------------------------------------------------------------
sub create_logo_window {
my ($o) = @_;
return if $::logowidth == 0 || $::move;
gtkdestroy($o->{logo_window});
my $w = bless {}, 'ugtk2';
$w->{rwindow} = $w->{window} = Gtk2::Window->new('toplevel');
# $w->{rwindow}->set_position(0, 0);
$w->{rwindow}->set_size_request($::logowidth, $::logoheight);
$w->{rwindow}->set_name("logo");
$w->{rwindow}->set_title('skip');
$w->show;
my $file = $o->{meta_class} eq 'firewall' ? "logo-mandrake-Firewall.png" : "logo-mandrake.png";
-r $file or $file = "$ENV{SHARE_PATH}/$file";
-r $file and gtkadd($w->{window}, gtkcreate_img($file));
$o->{logo_window} = $w;
}
#------------------------------------------------------------------------------
sub init_gtk {
my ($o) = @_;
symlink("/tmp/stage2/etc/$_", "/etc/$_") foreach qw(gtk-2.0 pango fonts);
if ($o->{vga16}) {
#- inactivate antialias in VGA16 because it makes fonts look worse
output('/tmp/fonts.conf',
q(
/etc/fonts/fonts.conf
false
));
$ENV{FONTCONFIG_FILE} = '/tmp/fonts.conf';
}
Gtk2->init;
Gtk2->set_locale;
}
#------------------------------------------------------------------------------
sub init_sizes() {
($::rootwidth, $::rootheight) = (Gtk2::Gdk->screen_width, Gtk2::Gdk->screen_height);
#- ($::rootheight, $::rootwidth) = (min(768, $::rootheight), min(1024, $::rootwidth));
$::move or $::stepswidth = $::rootwidth <= 640 ? 0 : 160;
($::logowidth, $::logoheight) = $::rootwidth <= 640 ? (0, 0) : (500, 40);
($::helpwidth, $::helpheight) = ($::rootwidth - $::stepswidth, $::move && 15);
($::windowwidth, $::windowheight) = ($::rootwidth - $::stepswidth, $::rootheight - $::helpheight - $::logoheight);
($::real_windowwidth, $::real_windowheight) = (576, 418);
$::move and $::windowwidth -= 100;
}
#------------------------------------------------------------------------------
sub createXconf {
my ($file, $mouse_type, $mouse_dev, $_wacom_dev, $Driver) = @_;
symlinkf(devices::make($mouse_dev), "/dev/mouse") if $mouse_dev ne 'none';
#- needed for imlib to start on 8-bit depth visual.
symlink("/tmp/stage2/etc/imrc", "/etc/imrc");
symlink("/tmp/stage2/etc/im_palette.pal", "etc/im_palette.pal");
#- remove "error opening security policy file" warning
symlink("/tmp/stage2/etc/X11", "/etc/X11");
if ($Driver) {
output($file, sprintf(<<'END', $mouse_type, $Driver, $Driver eq 'fbdev' ? '"default"' : '"800x600" "640x480"'));
Section "Files"
FontPath "/usr/X11R6/lib/X11/fonts:unscaled"
EndSection
Section "InputDevice"
Identifier "Keyboard"
Driver "Keyboard"
Option "XkbDisable"
Option "XkbModel" "pc105"
Option "XkbLayout" ""
EndSection
Section "InputDevice"
Identifier "Mouse"
Driver "mouse"
Option "Protocol" "%s"
Option "Device" "/dev/mouse"
Option "ZAxisMapping" "4 5"
EndSection
Section "Monitor"
Identifier "monitor"
HorizSync 31.5-35.5
VertRefresh 50-70
EndSection
Section "Device"
Identifier "device"
Driver "%s"
EndSection
Section "Screen"
Identifier "screen"
Device "device"
Monitor "monitor"
DefaultColorDepth 16
Subsection "Display"
Depth 16
Modes %s
EndSubsection
EndSection
Section "ServerLayout"
Identifier "layout"
Screen "screen"
InputDevice "Mouse" "CorePointer"
InputDevice "Keyboard" "CoreKeyboard"
EndSection
END
}
}
1;