diff options
author | Daouda Lo <daouda@mandriva.com> | 2001-01-31 17:26:27 +0000 |
---|---|---|
committer | Daouda Lo <daouda@mandriva.com> | 2001-01-31 17:26:27 +0000 |
commit | 66674428100cb977c5e26fde9be040291e8cf8a9 (patch) | |
tree | 1b6747a46a435eab29f40bed7396df732c91d7d6 /control-center3 | |
parent | a7dbc762f84d4a97f3c9d10fc9c339bf1e12601e (diff) | |
download | control-center-66674428100cb977c5e26fde9be040291e8cf8a9.tar control-center-66674428100cb977c5e26fde9be040291e8cf8a9.tar.gz control-center-66674428100cb977c5e26fde9be040291e8cf8a9.tar.bz2 control-center-66674428100cb977c5e26fde9be040291e8cf8a9.tar.xz control-center-66674428100cb977c5e26fde9be040291e8cf8a9.zip |
new fork : we use a tree widget for groups and applis instead of hash
Diffstat (limited to 'control-center3')
-rwxr-xr-x | control-center3 | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/control-center3 b/control-center3 new file mode 100755 index 00000000..0cd15430 --- /dev/null +++ b/control-center3 @@ -0,0 +1,436 @@ +#!/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; + +init Gtk; +use Data::Dumper; + +my %pixmaps_global; +my $xpm_path="pixmaps"; + +my $window_global = new Gtk::Window -toplevel; +$window_global->set_usize(640, 480); +$window_global->signal_connect ( delete_event => sub { Gtk->exit(0); }); +$window_global->set_position(1); +$window_global->set_title("Mandrake Control Center"); +$window_global->border_width(0); + +$vbox_global = new Gtk::VBox(0, 0); +$window_global->add($vbox_global); + +######### menus +my @item_factory_entries = ( + ["/_File", undef, 0, "<Branch>"], + ["/File/tearoff1", undef, 0, "<Tearoff>"], + #["/File/_Quit", "<control>Q", 5], + { + 'path' => "/File/_Quit", + 'accelerator' => "<control>Q", + 'action' => 1, + 'type' => '<Item>' + }, + ["/_Help", undef, 0, "<Branch>"], + ["/Help/_Mandrake Control Center", undef, 30], + ["/Help/_Report Bug", undef, 30], + ["/Help/_About", undef, 30] + ); + +my ($accel_group, $item_factory, $box1, $label, $box2); +my ($separator, $button, $dummy); + +$accel_group = new Gtk::AccelGroup; +$item_factory = new Gtk::ItemFactory('Gtk::MenuBar', "<main>", $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('<main>'), 0, 0, 0); +$hseparator_global = new Gtk::HSeparator; +$vbox_global->pack_start($hseparator_global, 0, 1, 0); +######### menus end + + +my $hbox_global = new Gtk::HBox(0,0); +$vbox_global->pack_start($hbox_global, 1, 1, 0); +$hbox_global->border_width(5); +my $scrolled_global = new Gtk::ScrolledWindow; +$scrolled_global->set_policy('automatic','automatic'); +$scrolled_global->set_usize(120, 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') +$hbox_global->pack_start($scrolled_global,0,1,0); +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); +$hbox_global->pack_start($notebook_global,1,1,0); + +#-------------------------------- splash screeen -------------------------------------------------------- + +my $hbox1= new Gtk::HBox(0,20); +my ($pix_about_map, $pix_about_mask) = Gtk::Gdk::Pixmap->create_from_xpm(NULL, Gtk::Widget->get_default_style->bg('normal'), "$xpm_path/logo.xpm"); +my $pix_about = new Gtk::Pixmap ($pix_about_map, $pix_about_mask); +$pix_about->set_alignment(10,0); +$hbox1->pack_start($pix_about, 0, 1, 0); +my $style = new Gtk::Style; +$style->font(Gtk::Gdk::Font->load('-adobe-times-bold-r-normal--25-180-100-100-p-132-iso8859-1')); +my $label_about2 = new Gtk::Label ("Mandrake Control Center"); +$label_about2->set_alignment(0,0); +$label_about2->set_style($style); +$hbox1->pack_start($label_about2, 0, 1, 0); +my $vbox_about = new Gtk::VBox(0,10); +$vbox_about->pack_start($hbox1, 0, 1, 0); +my $label_about3 = new Gtk::Label ("This is the Mandrake Control Center, The place where you can configure your Mandrake Box"); +$vbox_about->pack_start($label_about3, 0, 0, 0); + +my $table_info1 = new Gtk::Table(6,2,1); +$table_info1->set_row_spacings(15); +$table_info1->set_col_spacings(10); + +my @revtree; +my @infotree; +open VERS, "/etc/redhat-release" or die "cannot open this file for read :$!"; +while (<VERS>) { + 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-100-p-76-iso8859-1')); + +my $ld = new Gtk::Label("$username"); +$table_info1->attach($ld, 1, 2, 0, 1, 0, 0, 0, 0); +my $label_user = new Gtk::Label("User: "); +$label_user->set_style($style1); +$label_user->set_justify('right'); +$table_info1->attach($label_user, 0, 1, 0, 1, 0, 0, 0, 0); +my $ld1 = new Gtk::Label("$info_tree[0] $info_tree[1] $info_tree[3] $info_tree[4] "); +$table_info1->attach($ld1, 1, 2, 1, 2, 0, 0, 0, 0); +my $ld2 = new Gtk::Label("$nodename"); +$table_info1->attach($ld2, 1, 2, 2, 3, 0, 0, 0, 0); +my $ld3 = new Gtk::Label("$release $version"); +$table_info1->attach($ld3, 1, 2, 3, 4, 0, 0, 0, 0); +my $ld4 = new Gtk::Label("$machine"); +$table_info1->attach($ld4, 1, 2, 4, 5, 0, 0, 0, 0); +my $label_os = new Gtk::Label("System: "); +$label_os->set_style($style1); +$label_os->set_justify('right'); +$table_info1->attach($label_os, 0, 1, 1, 2, 0, 0, 0, 0); +my $label_host = new Gtk::Label("Hostname: "); +$label_host->set_style($style1); +$table_info1->attach_defaults($label_host, 0, 1, 2, 3); +my $label_kernel = new Gtk::Label("Kernel Version : "); +$label_kernel->set_style($style1); +$table_info1->attach_defaults($label_kernel, 0, 1, 3, 4); +my $label_box = new Gtk::Label("Machine: "); +$label_box->set_style($style1); +$table_info1->attach_defaults($label_box, 0, 1, 4, 5); + +$vbox_about->set_spacing(30); +$vbox_about->pack_start($table_info1, 0, 0, 0); +$vbox_about->reorder_child($table_info1,150); + + +$notebook_global->append_page($vbox_about, "$arg"); +my $vbox_global_left = new Gtk::VBox(0,0); +$scrolled_global->add_with_viewport($vbox_global_left); + +$window_global->realize; +#map { +# $pixmaps_global{$_ . '_pixmap'} = +# Gtk::Gdk::Pixmap->create_from_xpm($window_global->window, Gtk::Widget->get_default_style->bg('normal'), "$xpm_path/$_.xpm"); +#} ('item1', 'item2', 'item3', 'item4', 'item5','draknet1','draknet2','draknet3','draknet4', 'draknet5', 'drakgw'); + + +my $tree= new Gtk::Tree; +$vbox_global_left->pack_start($tree,1,1,0); +map { + create_treeitem($tree,"$xpm_path/logo.xpm",$_); + } ('Boot Conf', 'Hard Conf', 'Encule', 'Ta race', 'Salope'); + + +my $rc = "control-center.rc"; +Gtk::Rc->parse($rc); +$window_global->show_all; +#for (my $i=0; $i<$tree{nb_groups}; $i++) { +# for (my $j=0; $j<$tree[$i]{nb_applis}; $j++) { +# $tree[$i]{applis}[$j]{darea}->hide; +# $tree[$i]{applis}[$j]{label}->hide; +# } +#} + +print "num : " . $notebook_global->page_num($vbox_about) . "\n"; +$notebook_global->set_page(0); +$SIG{USR1} = sub { $notebook_global->set_page(0); }; # embedded applications will send me that signal in order to "hide" them + +Gtk->main; + +#sub about_mdk_cc() +#{ +#} + +sub create_treeitem() +{ + my ($parent_tree, $pixmap, $label) =@_; + + my ( + $tree_item, + $treebox + ); + + $treeitem = new Gtk::TreeItem; + $treebox = xpm_label_box($window_global,$pixmap,$label); + $treeitem->add($treebox); + $treebox->show(); + $parent_tree->append($treeitem); +} + +sub create_subtree +{ + my($item, $box, $level) = @_; + + my( + $item_subtree, + $item_new, + $nb_item, + $no_root_item + ); + + +} + +sub xpm_label_box +{ + my ( $parent, $xpm_filename, $label_text ) = @_; + + my $box; + my $style; + my $pixmap; + my $mask; + my $pixmapwid; + my $label; + + # Create box for xpm and label + $box = new Gtk::HBox( $false, 0 ); + + # Get the style of the button to get the background color. + $style = $parent->get_style()->bg( 'normal' ); + + # Now on to the xpm stuff + ( $pixmap, $mask ) = Gtk::Gdk::Pixmap->create_from_xpm($parent->window, $style, $xpm_filename ); + $pixmapwid = new Gtk::Pixmap( $pixmap, $mask ); + + # Create a label for the button + $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 draw_icon { + my ($width, $height, $icon_name, $decalage, $exec_string, $name, $number ) = @_; + my %hash; + if ($exec_string) { + my $socket = new Gtk::Socket; + $socket->show; + $notebook_global->append_page($socket, ""); + $socket->realize; + print ("The XID of the sockets window n°$arg is [" . $socket->window->XWINDOW . "]\nMy PID is [" . $$ . "]\n"); + my $a = $exec_string . " --embedded " . $socket->window->XWINDOW . " " . $$ . "&"; + print "$a\n"; + system ($a); + } + $hash{PIX_W} = $width; + $hash{PIX_H} = $height; + $hash{actual_pixmap}=1; + $hash{save_pixmap}=0; + $hash{anim_idle}=undef; + $hash{timeout}=undef; + $hash{darea} = new Gtk::DrawingArea; + $hash{label} = new Gtk::DrawingArea; + $hash{label}->set_usize(50, 12); + $hash{label}->signal_connect(expose_event => sub { + my $font = $hash{label}->style->font; + my $w = $font->string_width($name); + $hash{label}->window->draw_string($font, $hash{label}->style->fg_gc('normal'), ($hash{label}->allocation->[2] - $w) / 2 * 0 + $decalage*20, 9, $name ); +#($hash{label}->allocation->[3]-40)/2 +#$hash{label}->window->draw_string($font, $hash{label}->style->bg_gc('normal'), 0, 10, "QQWWylt"); #($hash{label}->allocation->[3]-40)/2 +}); + + if ($exec_string) { + $tree[$group]{applis}[$item]{darea} = $hash{darea}; + $tree[$group]{applis}[$item]{label} = $hash{label}; + } + $hash{darea}->set_usize($width,$height); + $hash{darea}->set_events(['exposure_mask', 'enter_notify_mask', 'leave_notify_mask', 'button_press_mask', 'button_release_mask' ]); + $hash{darea}->signal_connect + (expose_event => sub { + $hash{darea}->window->draw_pixmap + ($hash{darea}->style->bg_gc('normal'), + $pixmaps_global{ $icon_name . $hash{actual_pixmap} . '_pixmap'}, 0, 0, + ($hash{darea}->allocation->[2]-$hash{PIX_W})/2*0+($decalage * 20), + ($hash{darea}->allocation->[3]-$hash{PIX_H})/2, + $hash{PIX_W} , $hash{PIX_H} ); + }); + + + $hash{darea}->signal_connect + (enter_notify_event => sub { + $hash{anim_idle} ||= Gtk->idle_add + ( sub { + $hash{actual_pixmap}==$hash{save_pixmap} and return 1; + $hash{darea}->window->draw_pixmap + ($hash{darea}->style->bg_gc('normal'), + $pixmaps_global{ $icon_name . 1 . '_pixmap'}, # $hash{actual_pixmap} . '_pixmap'}, + 0, 0, + ($hash{darea}->allocation->[2]-$hash{PIX_W})/2*0+($decalage * 20), + ($hash{darea}->allocation->[3]-$hash{PIX_H})/2, + $hash{PIX_W} , $hash{PIX_H} ); + $hash{save_pixmap}=$hash{actual_pixmap}; + return 1; + }); + + $hash{timeout} ||= Gtk->timeout_add + ( 50, sub { + $hash{actual_pixmap}++; + $hash{actual_pixmap}>5 and $hash{actual_pixmap}=1; + return 1; + }); + }); + + + $hash{darea}->signal_connect + (leave_notify_event => sub { + Gtk->main_iteration() while ($hash{save_pixmap}!=1); + Gtk->idle_remove($hash{anim_idle}); + Gtk->timeout_remove($hash{timeout}); + undef $hash{anim_idle}; + undef $hash{timeout}; + }); + # $hash{darea}->signal_connect(button_press_event => sub { }); + if ($exec_string) { + $hash{darea}->signal_connect(button_release_event => sub { $notebook_global->set_page($number+1); }); + } else { + $hash{darea}->signal_connect(button_release_event => sub { + print "group : $number\n"; + for (my $i=0; $i<$tree{nb_groups}; $i++) { + for (my $j=0; $j<$tree[$i]{nb_applis}; $j++) { + if ($i==$number) { + #print "yep i : $i ; j : $j\n"; + #print Data::Dumper->Dump([$tree[$i]{applis}[$j]{darea}], ['darea-->']) . "\n"; + $tree[$i]{applis}[$j]{darea}->show; + $tree[$i]{applis}[$j]{label}->show; + } else { + #print "nope i : $i ; j : $j\n"; + $tree[$i]{applis}[$j]{darea}->hide; + $tree[$i]{applis}[$j]{label}->hide; + } + } + } + }); + } + $vbox_global_left->pack_start($hash{darea},0,1,0); + $vbox_global_left->pack_start($hash{label},0,1,0); +} + +sub item_factory_cb { + my ($widget, $action, @data) = @_; + + print "ItemFactory: activated ", $widget->item_factory_path(), " -> ", $action, "\n"; + $action == 1 and Gtk->exit(0); +} + + +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', "<main>", $accel_group); + + #$item_factory_window->set_data('<main>', $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('<main>'), 0, 0, 0); + + $label = new Gtk::Label "Type\n<alt>\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; + + } + if (!visible $item_factory_window) { + show_all $item_factory_window; + } else { + destroy $item_factory_window; + } +} |