#!/usr/bin/perl

# Copyright (C) 2004 Robert Vojta <robert.vojta@mandrake.cz> 
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

use lib qw(/usr/share/drakxtools-ng/lib);
use preload;
use dialogs;
use comm;

use Libconf::System::Users;
use Libconf::System::Desktop;
use Libconf::System::Startup;

use Gtk2 -init;
use Gtk2::GladeXML;

use Locale::gettext;
use POSIX;

setuplocales();

comm::require_root();

#
# Glade XML file informations
#
my $xmlfile = "$::gtkguidir/drakdm.glade";

$gladexml = Gtk2::GladeXML->new($xmlfile, 'drakdmw');
$mainw = $gladexml->get_widget('drakdmw');

#
# Graphical mode widgets
#
my $startx_button = $gladexml->get_widget('startx_button');

#
# Display manager widgets
#
my $dm_label = $gladexml->get_widget('dm_label');
my $gdm_radio = $gladexml->get_widget('gdm_radio');
my $kdm_radio = $gladexml->get_widget('kdm_radio');
my $kde_radio = $gladexml->get_widget('kde_radio');
my $xdm_radio = $gladexml->get_widget('xdm_radio');
my $image = $gladexml->get_widget('image');
my $cfgdm_button = $gladexml->get_widget('cfgdm_button');

#
# Autologin widgets
#
my $autologin_label = $gladexml->get_widget('autologin_label');
my $autologin_button = $gladexml->get_widget('autologin_button');

my $defuser_label = $gladexml->get_widget('defuser_label');
my $defuser_combo = $gladexml->get_widget('defuser_combo');
my $defdesktop_label = $gladexml->get_widget('defdesktop_label');
my $defdesktop_combo = $gladexml->get_widget('defdesktop_combo');

#
# Load Display manager settings
#

my %dm = (
    'GNOME' => [ '/usr/bin/gdm', 'gdm', 'dm-gdm.png', '/usr/bin/gdmsetup',
		 0, \$gdm_radio ],
    'KDM'   => [ '/usr/bin/kdm', 'kdebase-kdm', 'dm-kdm.png', '',
		 0, \$kdm_radio ],
    'KDE'   => [ '/usr/bin/mdkkdm', 'mdkkdm', 'dm-mdkkdm.png', '',
		 0, \$kde_radio ],
    'XDM'   => [ '/usr/bin/X11/xdm', 'XFree86', 'dm-xdm.png', '',
		 0, \$xdm_radio ],
    );

#
# Disable not installed display managers and inform user
# Temporary solution, we should handle missing RPMS like drakxtools 
foreach (keys %dm) {
    if (!($dm{$_}[4] = -x $dm{$_}[0])) {
	my $label = ${$dm{$_}[5]}->get_label();
	$label .= T("  [not installed]");
	${$dm{$_}[5]}->set_label($label);
    }
}

my $cfg = new Libconf::System::Desktop;

($cfg->{general}{displaymanager} !~ /(GNOME|XDM|KDM|KDE)/) &&
    ($cfg->{general}{displaymanager} = "KDE");

${$dm{$cfg->{general}{displaymanager}}[5]}->set_active(1);

$image->set_from_file("$::imgdir/".$dm{$cfg->{general}{displaymanager}}[2]);
$cfgdm_button->set_sensitive($dm{$cfg->{general}{displaymanager}}[3] ne '');

#
# Load Autologin settings
#

my $sys_users = new Libconf::System::Users();
$defuser_combo->set_popdown_strings($sys_users->getUsersList(sub { $_[0]->{UID} >= 500 && $_ ne 'nobody'}));
$defdesktop_combo->set_popdown_strings(split(' ', `/usr/sbin/chksession -l`));

$autologin_button->set_active($cfg->{general}{autologin} ne '');
if ($cfg->{general}{autologin} ne '') {
    $defuser_combo->entry->set_text($cfg->{general}{autologin});
    $defdesktop_combo->entry->set_text($cfg->{general}{desktop}) if $cfg->{general}{desktop};
}

#
# Widgets sensitivity is based on the current settings
#
$startup_cfg = new Libconf::System::Startup;

if ($startup_cfg->{inittab}->{id}->{runlevels} == 5) {
    $startx_button->set_active(1);

    enable_dm_widgets(1);
    enable_autologin_widgets(1, $autologin_button->get_active);
} else {
    $startx_button->set_active(0);

    enable_dm_widgets(0);
    enable_autologin_widgets(0, 0);
}

#
# Connect signals and run
#

$gladexml->signal_autoconnect_from_package('main');
Gtk2->main;
exit;

sub enable_dm_widgets {
    $dm_label->set_sensitive($_[0]);
    foreach $d (keys %dm) {
	${$dm{$d}[5]}->set_sensitive($_[0] && $dm{$d}[4]);
    }
    $image->set_sensitive($_[0]);
    $cfgdm_button->set_sensitive($_[0] && $dm{$cfg->{general}{displaymanager}}[3] ne '');
}

sub enable_autologin_widgets {
    $autologin_label->set_sensitive($_[0]);
    $autologin_button->set_sensitive($_[0]);

    $defuser_label->set_sensitive($_[1]);
    $defuser_combo->set_sensitive($_[1]);
    $defdesktop_label->set_sensitive($_[1]);
    $defdesktop_combo->set_sensitive($_[1]);
}

sub on_startx_button_toggled {
    if ($startx_button->get_active) {
        enable_dm_widgets(1);
        enable_autologin_widgets(1, $autologin_button->get_active);
    } else {
        enable_dm_widgets(0);
        enable_autologin_widgets(0, 0);
    }
}

sub on_dm_radio_toggled {
    foreach (keys %dm) {
	$cfg->{general}{displaymanager} = $_ if (${$dm{$_}[5]}->get_active);
    }

    $image->set_from_file("$::imgdir/".$dm{$cfg->{general}{displaymanager}}[2]);
    $cfgdm_button->set_sensitive($dm{$cfg->{general}{displaymanager}}[3] ne '');
}

sub on_autologin_button_toggled {
    enable_autologin_widgets(1, $autologin_button->get_active);
}

sub gtk_main_quit {
    Gtk2->main_quit;
}

sub on_cancel_button_clicked {
    Gtk2->main_quit;
}

sub apply_changes {
    $startup_cfg->{inittab}->{id}->{runlevels} = $startx_button->get_active ? 5 : 3;
    $startup_cfg->writeConf;

    # Update autologin info
    if ($autologin_button->get_active)
    {
		$cfg->{general}{autologin} = $defuser_combo->entry->get_text;
		$cfg->{general}{desktop} = $defdesktop_combo->entry->get_text;
    } else {
		$cfg->{general}{autologin} = "";
    }

	$cfg->writeConf;

    return 1;
}

sub on_ok_button_clicked {
    if (apply_changes) {
        Gtk2->main_quit;
    }
}

sub on_cfgdm_button_clicked {
    system($dm{$cfg->{general}{displaymanager}}[3]);
}

