#!/usr/bin/perl -w # Control-center # Copyright (C) 1999 MandrakeSoft # Damien Krotkine (damien@mandrakesoft.com) # Daouda Lo (daouda@mandrakesoft.com) # # 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 Gtk; use Config; use POSIX; # for i18n use Locale::GetText; setlocale (LC_ALL, ""); Locale::GetText::textdomain ("DrakConf"); import Locale::GetText I_; *_ = *I_; init Gtk; use Data::Dumper; my $false = 0; my $true = 1; my $_xbindir = "/usr/X11R6/bin"; my $_bindir = "/usr/bin"; my $_sbindir = "/usr/sbin"; my $_iconsdir = "/usr/share/icons"; my %pixmaps_global; my $xpm_path="$_iconsdir"; my $xpm_path_l="./pixmaps"; my $tree_depth_max = 1; my @treeitem_sub; my $nb_pages=0; my $window_global = new Gtk::Window -toplevel; $window_global->set_usize(745, 530); $window_global->signal_connect ( delete_event => sub { quit_global(); }); $window_global->set_position(1); $window_global->set_title(_("Mandrake Control Center")); $window_global->border_width(0); #$window_global->realize; $vbox_global = new Gtk::VBox(0, 0); $window_global->add($vbox_global); ######### menus my @item_factory_entries = ( [_("/_File"), undef, 0, ""], [_("/File/tearoff1"), undef, 0, ""], { 'path' => _("/File/_Quit"), 'accelerator' => _("Q"), 'action' => 1, 'type' => '' }, [_("/_Help"), undef, 0, ""], [_("/Help/_Mandrake Control Center"), undef, 2], [_("/Help/_Report Bug"), undef, 3 ], [_("/Help/_About..."), undef, 4 ] ); my ($accel_group, $item_factory, $box1, $label, $box2); my ($separator, $button, $dummy); $accel_group = new Gtk::AccelGroup; $item_factory = new Gtk::ItemFactory('Gtk::MenuBar', "
", $accel_group); $accel_group->attach($window_global); foreach (@item_factory_entries) { $item_factory->create_item($_, \&item_factory_cb); } $vbox_global->pack_start($item_factory->get_widget('
'), 0, 0, 0); $hseparator_global = new Gtk::HSeparator; $vbox_global->pack_start($hseparator_global, 0, 1, 0); ######### menus end my $hpane_global = new Gtk::HPaned; $vbox_global->pack_start($hpane_global, 1, 1, 0); $hpane_global->border_width(5); my $scrolled_global = new Gtk::ScrolledWindow; $scrolled_global->set_policy('automatic','automatic'); $scrolled_global->set_usize(190, 0); $scrolled_global->set_name("icons_back"); #$scrolled_global->window->draw_rectangle(nil,1, 0, 0, 70, 70); #$scrolled_global->window->style->bg_gc('normal') $hpane_global->pack1($scrolled_global,0,1); #my $vseparator_global = new Gtk::VSeparator; #$hbox_global->pack_start($vseparator_global,0,1,0); my $notebook_global = new Gtk::Notebook; $notebook_global->set_show_border(0); $notebook_global->set_show_tabs(0); $hpane_global->pack2($notebook_global,0,1); #-------------------------------- splash screeen -------------------------------------------------------- my ($pix_about_map, $pix_about_mask) = Gtk::Gdk::Pixmap->create_from_xpm(NULL, Gtk::Widget->get_default_style->bg('normal'), "$xpm_path_l/logo.xpm"); my ($pix_splash_map, $pix_splash_mask) = Gtk::Gdk::Pixmap->create_from_xpm(NULL, Gtk::Widget->get_default_style->bg('normal'), "$xpm_path_l/splash.xpm"); my $pix_splash = new Gtk::Pixmap ($pix_splash_map, $pix_splash_mask); my $pix_about = new Gtk::Pixmap ($pix_about_map, $pix_about_mask); my $fixed1= new Gtk::Fixed(); $pix_about->set_alignment(10,0); $fixed1->put($pix_about, 0, 0); my $style = new Gtk::Style; $style->font(Gtk::Gdk::Font->load(_("-adobe-times-bold-r-normal--*-180-100-100-p-*-iso8859-*,*-r-*"))); my $label_about2 = new Gtk::Label (_("The Mandrake Control Center")); $label_about2->set_alignment(0,0); $label_about2->set_style($style); $fixed1->put($pix_splash, 0, 0); $fixed1->put($label_about2, 50, 130); my $label_about3 = new Gtk::Label (_("The place where you can configure your Mandrake Box")); $fixed1->put($label_about3, 60, 160); my @revtree; my @infotree; open VERS, "/etc/redhat-release" or die( sprintf _("cannot open this file for read: $!")); while () { push (@revtree,$_); } @info_tree = split / /, $revtree[0]; my ($sysname, $nodename, $release, $version, $machine ) = POSIX::uname(); my $username= POSIX::cuserid(); my $style1 = new Gtk::Style; $style1->font(Gtk::Gdk::Font->load(_("-adobe-times-bold-r-normal--14-*-100-100-p-*-iso8859-*,*-r-*"))); my $label_user = new Gtk::Label(_("User: ")); $label_user->set_style($style1); $fixed1->put($label_user, 50, 190); my $ld = new Gtk::Label("$username"); $fixed1->put($ld, 170, 190); my $label_os = new Gtk::Label(_("System: ")); $label_os->set_style($style1); $label_os->set_justify('right'); $fixed1->put($label_os, 50, 210); my $ld1 = new Gtk::Label("$info_tree[0] $info_tree[1] $info_tree[3] $info_tree[4] "); $fixed1->put($ld1, 170, 210); my $label_host = new Gtk::Label(_("Hostname: ")); $label_host->set_style($style1); $fixed1->put($label_host, 50, 230); my $ld2 = new Gtk::Label("$nodename"); $fixed1->put($ld2, 170, 230); my $label_kernel = new Gtk::Label(_("Kernel Version: ")); $label_kernel->set_style($style1); $fixed1->put($label_kernel, 50, 260); my $ld3 = new Gtk::Label("$release $version"); $fixed1->put($ld3, 170, 260); my $label_box = new Gtk::Label(_("Machine: ")); $label_box->set_style($style1); $fixed1->put($label_box, 50, 290); my $ld4 = new Gtk::Label("$machine"); $fixed1->put($ld4, 170, 290); $notebook_global->append_page($fixed1, ""); my $vbox_global_left = new Gtk::VBox(0,0); $scrolled_global->add_with_viewport($vbox_global_left); $window_global->realize; my $tree= new Gtk::Tree; $tree->set_selection_mode('browse'); $vbox_global_left->pack_start($tree,1,1,0); map { create_tree_item($tree, $_->[0] , "$xpm_path_l/$_->[1]",1); } ([_("Boot"), 'logo.xpm'] , [_("Hardware"), 'logo.xpm'] , [_("User and Groups"),'logo.xpm'], [_("Network & Internet"),'logo.xpm'] , [_("Menu Customization"),'logo.xpm'] , [_("Font Management"),'logo.xpm']); map { create_tree_item($treeitem_sub[int($_->[2])],$_->[0], "$xpm_path/$_->[1]",0); } ([_("Boot Loader"),'item.xpm',5] , [_("Boot Disk"), 'item.xpm',5] , [_("Boot Logo"), 'item.xpm',5], [_("XFDrake"),'item.xpm',4] , [_("Harddrake"),'item.xpm',4] , [_("Mousedrake"), 'item.xpm',4] , [_("Printerdrake"),'item.xpm',4] , [_("Keyboarddrake"), 'item.xpm',4], [_("Userdrake"),'item.xpm',3] , [_("Draknet") , 'item.xpm',2] , [_("Drakgw"),'item.xpm',2], [_("Menudrake") , 'item.xpm',1] , [_("Drakfont"), 'item.xpm', 0]); %tree_exec = (_("Boot Loader") => " ../bootlookdrake/bootlookdrake", _("Boot Disk") => "$_xbindir/drakfloppy", _("Boot Logo") => "$_xbindir/DrakeLogo" , _("XFDrake") => "$_sbindir/XFdrake --expert" , _("Harddrake") => "$_bindir/harddrake-auth" , _("Mousedrake") => "$_sbindir/mousedrake" , _("Printerdrake") => "$_sbindir/printerdrake" , _("Keyboarddrake") => "$_sbindir/keyboarddrake" , _("Userdrake") => "$_bindir/userdrake" , _("Draknet") => "$_sbindir/draknet" , _("Drakgw") => "$_sbindir/drakgw" , _("Menudrake") => "$_bindir/menudrake" , _("Drakfont") => "$_xbindir/drakfont" ); my @pid_launched; %tree_launched = (_("Boot Loader") => -1, _("Boot Disk") => -1, _("Boot Logo") => -1 , _("XFDrake") => -1 , _("Harddrake") => -1 , _("Mousedrake") => -1 , _("Printerdrake") => -1 , _("Keyboarddrake") => -1 , _("Userdrake") => -1 , _("Draknet") => -1 , _("Drakgw") => -1 , _("Menudrake") => -1 , _("Drakfont") => -1 ); #exec_treeitem("harddrake-auth",4); my $rc = "control-center.rc"; Gtk::Rc->parse($rc); #$fixed1->set_back_pixmap($pix_splash_mask,1); $window_global->show_all; print "num: " . $notebook_global->page_num($fixed1) . "\n"; $SIG{USR1} = sub { $notebook_global->set_page(0); }; # embedded applications will send me that signal in order to "hide" them Gtk->main; sub quit_global { print _("Cleaning...\n"); foreach (@pid_launched) { print "$_\n"; } kill TERM, @pid_launched; Gtk->exit(0); } sub about_mdk_cc { my $window_about = new Gtk::Dialog(); $window_about->set_position(1); my $button = new Gtk::Button(_("Close")); $button->signal_connect_object("clicked",$window_about => 'destroy'); $window_about->action_area->pack_start($button,$true,$true,0); my $label = new Gtk::Label( _("Mandrake Control Center 1.0 \n Copyright (C) 2001 Mandrakesoft SA\n") ); my $style1 = new Gtk::Style; $style1->font(Gtk::Gdk::Font->load(_("-adobe-times-bold-r-normal--14-*-100-100-p-*-iso8859-*,*-r-*"))); $label->set_style($style1); $window_about->vbox->pack_start( $label, $true, $true, 0 ); $window_about->vbox->pack_start( new Gtk::Label( _("Authors: ") . "\n\n Daouda Lo \n \n Damien Krotkine \n"), $true, $true, 0 ); $window_about->show_all(); $window_about->set_modal(1); } sub help_mandrake_cc { my $docdir="/usr/share/doc"; my $browser="netscape"; system("$browser -geometry 600x800+10+10 -no-about-splash $_docdir/Drakconf/help.html &"); } sub bug_report { my $bug_url="https://qa.mandrakesoft.com/dimension"; my $browser="netscape"; system("$browser -geometry 600x800+10+10 -no-about-splash $bug_url &"); } sub create_tree_item { my ($parent_tree, $label, $pixmap, $tree_depth_max) =@_; my ($treeitem, $treebox, $new_subtree); $treeitem = new Gtk::TreeItem(); $treebox = xpm_label_box($window_global,$pixmap,$label); $treeitem->add($treebox); $treebox->show(); if ($tree_depth_max == 0) { $treeitem->signal_connect('select', sub { exec_treeitem($label, $tree_exec{$label});}); } $parent_tree->append($treeitem); $treeitem->show(); if ($tree_depth_max) { $tree_depth_max-- ; $new_subtree= new Gtk::Tree(); $treeitem->set_subtree($new_subtree); $new_subtree->ref(); unshift(@treeitem_sub, $new_subtree); } } sub xpm_label_box { my ( $parent, $xpm_filename, $label_text ) = @_; # Create box for xpm and label my $box = new Gtk::HBox( $false, 0 ); # Get the style of the button to get the background color. my $style = $parent->get_style()->bg( 'normal' ); # Now on to the xpm stuff my ($pixmap, $mask) = Gtk::Gdk::Pixmap->create_from_xpm($parent->window, $style, $xpm_filename ); my $pixmapwid = new Gtk::Pixmap( $pixmap, $mask ); # Create a label for the button my $label = new Gtk::Label( $label_text ); # Pack the pixmap and label into the box $box->pack_start( $pixmapwid, $false, $false, 3 ); $box->pack_start( $label, $false, $false, 3 ); $box->border_width( 2 ); $pixmapwid->show(); $label->show(); return ( $box ); } sub exec_treeitem { my ($label, $exec_string) = @_; #exec_treeitem($tree_exec{$label},1);}); if ($exec_string) { print _("SELECTED\n"); if ($tree_launched{$label}==-1) { print _("yes\n"); my $socket = new Gtk::Socket; $socket->show; $notebook_global->append_page($socket, ""); $socket->realize; printf (_("The XID of the sockets window nr. %s is [%s]\n"), "", $socket->window->XWINDOW ); printf (_("My PID is [%s]\n"), $$ ); my $a = $exec_string . " --embedded " . $socket->window->XWINDOW . " " . $$; print "$a\n"; (my $pid = fork()) ? $pid_launched[$nb_pages] = $pid : exec ($a) or print STDERR _("couldn't exec $a: $!"); $nb_pages++; $tree_launched{$label}=$nb_pages; $notebook_global->set_page($nb_pages); } else { print _("no\n"); $notebook_global->set_page($tree_launched{$label}); } } } sub item_factory_cb { my ($widget, $action, @data) = @_; print "ItemFactory: activated ", $widget->item_factory_path(), " -> ", $action, "\n"; $action == 1 and quit_global(); $action == 4 and about_mdk_cc(); $action == 2 and help_mandrake_cc(); $action == 3 and bug_report(); } sub create_item_factory { if (!defined $item_factory_window) { my ($accel_group, $item_factory, $box1, $label, $box2); my ($separator, $button, $dummy); $item_factory_window = new Gtk::Window('toplevel'); signal_connect $item_factory_window destroy => \&destroy_window, \$item_factory_window; signal_connect $item_factory_window "delete-event" => \&destroy_window, \$item_factory_window; $accel_group = new Gtk::AccelGroup; $item_factory = new Gtk::ItemFactory('Gtk::MenuBar', "
", $accel_group); #$item_factory_window->set_data('
', $item_factory); $accel_group->attach($item_factory_window); # $item_factory->create_items(); foreach (@item_factory_entries) { $item_factory->create_item($_, \&item_factory_cb); } $item_factory_window->set_title(_("Item Factory")); $item_factory_window->set_border_width(0); $box1 = new Gtk::VBox(0, 0); $item_factory_window->add($box1); $box1->pack_start($item_factory->get_widget('
'), 0, 0, 0); $label = new Gtk::Label( _("Type\n\nto start") ); $label->set_usize(200, 200); $label->set_alignment(0.5, 0.5); $box1->pack_start($label, 1, 1, 0); $separator = new Gtk::HSeparator; $box1->pack_start($separator, 0, 1, 0); $box2 = new Gtk::VBox(0, 10); $box2->set_border_width(10); $box1->pack_start($box2, 0, 1, 0); $button = new Gtk::Button(_("Close")); $button->signal_connect('clicked', sub {$item_factory_window->destroy;}); $box2->pack_start($button, 1, 1, 0); $button->can_default(1); $button->grab_default; } (!visible $item_factory_window) ? show_all $item_factory_window : destroy $item_factory_window; }