summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Vignaud <tvignaud@mandriva.org>2002-12-19 15:06:57 +0000
committerThierry Vignaud <tvignaud@mandriva.org>2002-12-19 15:06:57 +0000
commite1290f3d98e40ad41347e904f7eb6b39e0f75d9d (patch)
tree282d894ba034372f154659d54e869013a8da2e49
parentba909141e1eeb16ea2c1517fc39dfc4ce73f83a4 (diff)
downloadcontrol-center-e1290f3d98e40ad41347e904f7eb6b39e0f75d9d.tar
control-center-e1290f3d98e40ad41347e904f7eb6b39e0f75d9d.tar.gz
control-center-e1290f3d98e40ad41347e904f7eb6b39e0f75d9d.tar.bz2
control-center-e1290f3d98e40ad41347e904f7eb6b39e0f75d9d.tar.xz
control-center-e1290f3d98e40ad41347e904f7eb6b39e0f75d9d.zip
enhancements:
- perl_checker fixes - ui is a lot faster to refresh - quite a lot less hardcoded values, giving more control on icons size - gtk+2 port - anti aliased fonts - reorganize source in a cleaner way - better icon/text alignment - comment - internal logic has been *much* improved - simplify code by reusing MDK::Common - dialog window are now modal - enhanced topic descriptions - new topic design (2 columns) - splash screen - ... bug fixes: - mcc is now resistant to missing icons - mcc will fall back on default icons if a theme is missing some - a left button isn't any more highlighted if one has put the cursor on its position *before* it's drawn the first time - transparent icons can be arbitrary placed in right part of mcc : there's not anymore any alignment problems with background, so one can use non horizontally hachured background for right part know bugs / limitations: - resizing the main window should resizing the right icons table which should resize description texts - gtk+ engines are know to dramatically slow down *first* display of right icons - there should be some spacing between right icons and their description - descriptions are not yet written ("dummy description") - gtk+-2 support for embedding is broken for now
-rw-r--r--ChangeLog54
-rwxr-xr-xcontrol-center1309
-rw-r--r--control-center.rc436
-rw-r--r--drakconf.spec51
4 files changed, 1198 insertions, 652 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c4b0837..bf7047f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,57 @@
+2002-12-15 19:39 alus
+
+ * po/pl.po: updates and bugfixes
+
+2002-12-15 17:04 pablo
+
+ * po/: pt_BR.po, sv.po: updated po files
+
+2002-12-13 10:42 pablo
+
+ * po/ms.po: updated po file
+
+2002-12-11 12:08 pablo
+
+ * po/ro.po: updated po file
+
+2002-12-02 15:50 pablo
+
+ * po/sk.po: updated po file
+
+2002-12-02 05:45 pablo
+
+ * po/: fi.po, vi.po: updated po files
+
+2002-11-29 13:42 pablo
+
+ * po/pt.po: updated po file
+
+2002-11-28 20:29 pablo
+
+ * po/: et.po, zh_CN.po: updated po files
+
+2002-11-28 13:46 pablo
+
+ * po/: af.po, ar.po, az.po, be.po, bg.po, br.po, bs.po, ca.po,
+ cs.po, cy.po, da.po, de.po, drakconf.pot, el.po, eo.po, es.po,
+ et.po, eu.po, fi.po, fr.po, ga.po, gl.po, hr.po, hu.po, id.po,
+ it.po, ja.po, ka.po, ko.po, lt.po, lv.po, ms.po, mt.po, nl.po,
+ no.po, pl.po, pt.po, pt_BR.po, ro.po, ru.po, sk.po, sl.po, sp.po,
+ sq.po, sr.po, sv.po, ta.po, tg.po, th.po, tr.po, uk.po, vi.po,
+ wa.po, zh_CN.po, zh_TW.po: updated po files
+
+2002-11-27 10:52 tvignaud
+
+ * drakconf.spec: typo fixes
+
+2002-11-27 10:38 tvignaud
+
+ * cest_ton_boot, relcontrolcenter: [no log message]
+
+2002-11-27 10:36 tvignaud
+
+ * ChangeLog: [no log message]
+
2002-11-27 10:34 tvignaud
* drakconf.spec: 9.1-0.3mdk
diff --git a/control-center b/control-center
index 65f70828..d950bff2 100755
--- a/control-center
+++ b/control-center
@@ -2,8 +2,10 @@
# $Id$
# Copyright (C) 1999-2002 MandrakeSoft
+# Daouda Lo <daouda@mandrakesoft.com>
# Damien Krotkine
-# Thierry Vignaud (tvignaud@mandrakesoft.com)
+# Thierry Vignaud <tvignaud@mandrakesoft.com>
+# Yves Duret
#
# 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
@@ -18,521 +20,586 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-my $_xbindir = "/usr/X11R6/bin";
-my $_bindir = "/usr/bin";
-my $_sbindir = "/usr/sbin";
-my $mcc_dir = "/usr/share/mcc";
+my $xbindir = "/usr/X11R6/bin";
+my $bindir = "/usr/bin";
+my $sbindir = "/usr/sbin";
+my $mcc_dir = "/usr/share/mcc";
my $themes_dir = "$mcc_dir/themes/";
-my $_wizdir = "/usr/share/wizards";
+my $wizdir = "/usr/share/wizards";
+use strict;
+use diagnostics;
use lib qw(/usr/lib/libDrakX);
use standalone;
use common;
use interactive;
use detect_devices;
-use ugtk qw(:helpers :wrappers :various);
-use my_gtk qw(:helpers :wrappers :various);
-use strict;
+use ugtk2 qw(:create :helpers :wrappers);
-#---
-# i18n :
-# IMPORTANT to get correct namespace (drakconf instead of libDrakX)
-#---
+#-------------------------------------------------------------
+# i18n : IMPORTANT to get correct namespace (drakconf instead of libDrakX)
push @::textdomains, 'drakconf';
-# set the locale, needed for proper fontset and charset selection
-#Gtk->set_locale;
-use Config;
-use POSIX qw(uname);
+my ($version, $conffile, $class_install) = ("9.1", "/etc/mcc.conf", "/etc/sysconfig/system");
my $in = 'interactive'->vnew('su', 'default'); # just to get root capabilities
-my ($_version, $conffile, $class_install) = ("9.1", "/etc/mcc.conf","/etc/sysconfig/system");
-
-#we'll show log only once and don't restart it with new embedded process
-my $show_log = 1;
-my $still_in_splash_screen = 1;
+#-------------------------------------------------------------
+# read configuration, set themes, ...
my %h = getVarsFromSh($conffile);
my %class = getVarsFromSh($class_install);
$h{THEME} ||= 'default';
$h{EMBEDDED} ||= bool2text(1);
$h{LOGS} ||= bool2text($class{CLASS} eq 'expert' ? 1 : 0);
-my ($embedded, $logs) = (text2bool($h{EMBEDDED}), text2bool($h{LOGS}));
+my ($embedded, $show_logs, $expert_wizard) = (text2bool($h{EMBEDDED}), text2bool($h{LOGS}), text2bool($h{EXPERT_WIZARD}));
my $theme = $h{THEME};
if ("@ARGV" =~ /--theme (\w+)/) { $theme = $1 }
-d "$themes_dir/$theme" or $theme = 'default';
-add_icon_path("$themes_dir/$theme");
-my $window_splash = new Gtk::Window -popup;
+add_icon_path("$themes_dir/$theme/");
+add_icon_path("$themes_dir/default") if $theme ne 'default'; # fall back if theme miss some icons
+
+my $rc = "$themes_dir/$theme/gtkrc";
+Gtk2::Rc->parse($rc) if -r $rc;
+
+#-------------------------------------------------------------
+# Splash window: please wait ...
+my $window_splash = Gtk2::Window->new('popup');
$window_splash->signal_connect(delete_event => \&quit_global);
-$window_splash->set_title(N("Mandrake Control Center"));
-$window_splash->set_policy(0, 0, 1);
-$window_splash->set_position(1);
-$window_splash->add(gtkadd(gtkset_shadow_type(new Gtk::Frame(), 'etched_out'), new Gtk::Label(N("Loading... Please wait"))));
+$window_splash->set_title(N("Mandrake Control Center") . $version);
+$window_splash->allow_shrink(0);
+$window_splash->allow_grow(0);
+$window_splash->set_position('center_always');
+$window_splash->add(gtkadd(gtkset_shadow_type(Gtk2::Frame->new, 'etched_out'),
+ gtkpack(Gtk2::VBox->new(0, 0),
+ if_(-r "$themes_dir/$theme/splash_screen.png", gtkcreate_img("splash_screen")),
+ Gtk2::Label->new(N("Loading... Please wait"))
+ )
+ )
+ );
$window_splash->show_all;
-gtkflush;
-my $timer_splash = Gtk->timeout_add(200, \&gtkflush);
+gtkflush();
-my $rc = "$mcc_dir/$theme/gtkrc";
--r $rc and Gtk::Rc->parse($rc);
-my ($log_check_box, $embedded_check_box, $timeout);
+#-------------------------------------------------------------
+# we'll show log only once and don't restart it with new embedded process
+my $freeze_log = 1;
+my $still_in_splash_screen = 1;
+
+#-------------------------------------------------------------
+# Data structures
$::isWiz = -e "/usr/sbin/drakwizard";
$::isRpmDrake = -e "/usr/sbin/rpmdrake";
-# { key => [log_exp, binary, gtkplug?, alternate] }
-my $exec_hash =
- {
- N("Boot Disk") => [ "drakfloppy", "$_sbindir/drakfloppy", 1],
- N("Boot Config") => [ "drakboot", "$_sbindir/drakboot", 1 ],
- N("Auto Install") => [ "drakautoinst", "$_sbindir/drakautoinst", 1 ],
- N("Monitor") => [ "XFdrake", "$_sbindir/XFdrake monitor", 1 ],
- N("Resolution") => [ "XFdrake", "$_sbindir/XFdrake resolution", 1 ],
- N("Graphical server configuration") => [ "XFdrake", "$_sbindir/XFdrake", 1 ],
- N("Hardware List") => [ "harddrake", "$_sbindir/harddrake2", 1 ],
- N("Mouse") => [ "mousedrake", "$_sbindir/mousedrake", 1 ],
- N("Printer") => [ "printerdrake", "$_sbindir/printerdrake", 1, "$_sbindir/printerdrake" ],
- N("Scanner") => [ "scannerdrake", "$_sbindir/scannerdrake", 1 ],
- N("Users") => [ "userdrake", "$_bindir/userdrake", 1 ],
- N("Keyboard") => [ "keyboarddrake", "$_sbindir/keyboarddrake", 1 ],
- N("Hard Drives") => [ "diskdrake", "$_sbindir/diskdrake --hd", 1 ],
- N("NFS mount points") => [ "diskdrake", "$_sbindir/diskdrake --nfs", 1 ],
- N("Samba mount points") => [ "diskdrake", "$_sbindir/diskdrake --smb", 1 ],
- N("WebDAV mount points") => [ "diskdrake", "$_sbindir/diskdrake --dav", 1 ],
- N("Partition Sharing") => [ "diskdrake", "$_sbindir/diskdrake --fileshare", 1 ],
- N("Connection") => [ "drakconnect", "$_sbindir/drakconnect", 1 ],
- N("Connection Sharing") => [ "drakgw", "$_sbindir/drakgw", 1 ],
- N("Proxy Configuration") => [ "drakproxy", "$_sbindir/drakproxy", 1 ],
- N("Security Level") => [ "draksec", "$_sbindir/draksec", 1 ],
- N("Security Permissions") => [ "drakperm", "$_sbindir/drakperm", 1 ],
- N("Programs scheduling") => [ "drakcronat", "/usr/X11R6/bin/drakcronat", 1 ],
- N("Firewall") => [ "drakfirewall", "$_sbindir/drakfirewall", 1 ],
- N("Backups") => [ "drakbackup", "$_sbindir/drakbackup", 1 ],
- N("Menus") => [ "menudrake", "$_sbindir/menus_launcher.pl", 1, "$_bindir/menudrake" ],
- N("Services") => [ "drakxservices", "$_sbindir/drakxservices", 1 ],
- N("Fonts") => [ "drakfont", "$_sbindir/drakfont", 1 ],
- N("Date & Time") => [ "clock", "$_sbindir/clock.pl", 1 ],
- N("Logs") => [ "logdrake", "$_sbindir/logdrake", 1 ],
- # little workaround to avoid drakconf freeze
- N("Console") => [ "rxvt", "", 0, ["$_xbindir/rxvt", "rxvt", 1] ],
-# N("Console") => [ "rxvt", "$_xbindir/rxvt", -1 ],
- N("Install Software") => [ "rpmdrake", "$_sbindir/rpmdrake", -1 ],
- N("Remove Software") => [ "rpmdrake", "$_sbindir/rpmdrake-remove", -1 ],
- N("Mandrake Update") => [ "rpmdrake", "$_sbindir/MandrakeUpdate", -1 ],
- N("Software Sources Manager") => [ "rpmdrake", "$_sbindir/edit-urpm-sources.pl", -1 ],
-
-
- N("TV Cards") => [ "drakxtv", "$_sbindir/drakxtv", 1 ],
-
- N("DNS Client") => ["Client wizard", "drakwizard $_wizdir/client_wizard/client.wiz", -1 ],
- N("DHCP") => ["DHCP wizard", "drakwizard $_wizdir/dhcp_wizard/dhcp.wiz", -1 ],
- N("DNS") => ["DNS wizard", "drakwizard $_wizdir/dns_wizard/dns.wiz", -1 ],
- N("FTP") => ["FTP wizard", "drakwizard $_wizdir/ftp_wizard/ftp.wiz", -1 ],
- N("News") => ["News wizard", "drakwizard $_wizdir/news_wizard/news.wiz", -1 ],
- N("Postfix") => ["Postfix wizard", "drakwizard $_wizdir/postfix_wizard/postfix.wiz", -1 ],
- N("Proxy") => ["Squid wizard", "drakwizard $_wizdir/proxy_wizard/proxy.wiz", -1 ],
- N("Samba") => ["Samba wizard", "drakwizard $_wizdir/samba_wizard/samba.wiz", -1 ],
- N("Time") => ["Time wizard", "drakwizard $_wizdir/time_wizard/time.wiz", -1 ],
- N("Web") => ["Web wizard", "drakwizard $_wizdir/web_wizard/web.wiz", -1 ],
- };
+# { key => [ log_exp, binary, gtkplug?, description ] }
+# { key => [ log_exp, [ binary, win_nb ], gtkplug?, description ] }
+my $exec_hash =
+{
+ "Auto Install" => [ "drakautoinst", "$sbindir/drakautoinst", 1, N("Auto Install: dummy description") ],
+ "Backups" => [ "drakbackup", "$sbindir/drakbackup", 1, N("Backups: dummy description") ],
+ "Boot Config" => [ "drakboot", "$sbindir/drakboot", 1, N("Boot Config: dummy description") ],
+ "Boot Disk" => [ "drakfloppy", "$sbindir/drakfloppy", 1, N("Boot Disk: dummy description") ],
+ "Connection Sharing" => [ "drakgw", "$sbindir/drakgw", 1, N("Connection Sharing: dummy description") ],
+ "Connection" => [ "drakconnect", "$sbindir/drakconnect", 1, N("Connection: dummy description") ],
+ # little workaround to avoid drakconf freeze
+# "Console" => [ "rxvt", "$xbindir/rxvt", -1, N("dummy description") ],
+ "Console" => [ "rxvt", [ "$xbindir/rxvt", "rxvt", 1 ], 0, N("Console: dummy description") ],
+ "Date & Time" => [ "clock", "$sbindir/clock.pl", 1, N("Date & Time: dummy description") ],
+ "Firewall" => [ "drakfirewall", "$sbindir/drakfirewall", 1, N("Firewall: dummy description") ],
+ "Fonts" => [ "drakfont", "$sbindir/drakfont", 1, N("Fonts: dummy description") ],
+ "Graphical server configuration" => [ "XFdrake", "$sbindir/XFdrake", 1, N("Graphical server configuration: dummy description") ],
+ "Hard Drives" => [ "diskdrake", "$sbindir/diskdrake --hd", 1, N("Hard Drives: dummy description") ],
+ "Hardware List" => [ "harddrake", "$sbindir/harddrake2", 1, N("Hardware List: dummy description") ],
+ "Install Software" => [ "rpmdrake", "$sbindir/rpmdrake", -1, N("Install Software: dummy description") ],
+ "Keyboard" => [ "keyboarddrake", "$sbindir/keyboarddrake", 1, N("Keyboard: dummy description") ],
+ "Logs" => [ "logdrake", "$sbindir/logdrake", 1, N("Logs: dummy description") ],
+ "Mandrake Update" => [ "rpmdrake", "$sbindir/MandrakeUpdate", -1, N("Mandrake Update: dummy description") ],
+ "Menus" => [ "menudrake", "$sbindir/menus_launcher.pl", 1, N("Menus: dummy description"), "$bindir/menudrake" ],
+ "Monitor" => [ "XFdrake", "$sbindir/XFdrake monitor", 1, N("Monitor: dummy description") ],
+ "Mouse" => [ "mousedrake", "$sbindir/mousedrake", 1, N("Mouse: dummy description") ],
+ "NFS mount points" => [ "diskdrake", "$sbindir/diskdrake --nfs", 1, N("NFS mount points: dummy description") ],
+ "Partition Sharing" => [ "diskdrake", "$sbindir/diskdrake --fileshare", 1, N("Partition Sharing: dummy description") ],
+ "Printer" => [ "printerdrake", "$sbindir/printerdrake", 1, N("Printer: dummy description"), "$sbindir/printerdrake" ],
+ "Programs scheduling" => [ "drakcronat", "/usr/X11R6/bin/drakcronat", 1, N("Programs scheduling: dummy description") ],
+ "Proxy Configuration" => [ "drakproxy", "$sbindir/drakproxy", 1, N("Proxy Configuration: dummy description") ],
+ "Remove Software" => [ "rpmdrake", "$sbindir/rpmdrake-remove", -1, N("Remove Software: dummy description") ],
+ "Resolution" => [ "XFdrake", "$sbindir/XFdrake resolution", 1, N("Resolution: dummy description") ],
+ "Samba mount points" => [ "diskdrake", "$sbindir/diskdrake --smb", 1, N("Samba mount points: dummy description") ],
+ "Scanner" => [ "scannerdrake", "$sbindir/scannerdrake", 1, N("Scanner: dummy description") ],
+ "Security Level" => [ "draksec", "$sbindir/draksec", 1, N("Security Level: dummy description") ],
+ "Security Permissions" => [ "drakperm", "$sbindir/drakperm", 1, N("Security Permissions: dummy description") ],
+ "Services" => [ "drakxservices", "$sbindir/drakxservices", 1, N("Services: dummy description") ],
+ "Software Sources Manager" => [ "rpmdrake", "$sbindir/edit-urpm-sources.pl", -1, N("Software Sources Manager: dummy description") ],
+ "TV Cards" => [ "drakxtv", "$sbindir/drakxtv", 1, N("TV Cards: dummy description") ],
+ "Users" => [ "userdrake", "$bindir/userdrake", 1, N("Users: dummy description") ],
+ "WebDAV mount points" => [ "diskdrake", "$sbindir/diskdrake --dav", 1, N("WebDAV mount points: dummy description") ],
+
+ "DHCP" => [ "DHCP wizard", "drakwizard $wizdir/dhcp_wizard/dhcp.wiz", -1, N("DHCP wizard: dummy description") ],
+ "DNS Client" => [ "Client wizard", "drakwizard $wizdir/client_wizard/client.wiz", -1, N("DNS Client wizard: dummy description") ],
+ "DNS" => [ "DNS wizard", "drakwizard $wizdir/dns_wizard/dns.wiz", -1, N("DNS wizard: dummy description") ],
+ "FTP" => [ "FTP wizard", "drakwizard $wizdir/ftp_wizard/ftp.wiz", -1, N("FTP wizard: dummy description") ],
+ "News" => [ "News wizard", "drakwizard $wizdir/news_wizard/news.wiz", -1, N("News wizard: dummy description") ],
+ "Postfix" => [ "Postfix wizard", "drakwizard $wizdir/postfix_wizard/postfix.wiz", -1, N("Postfix wizard: dummy description") ],
+ "Proxy" => [ "Squid wizard", "drakwizard $wizdir/proxy_wizard/proxy.wiz", -1, N("Proxy wizard: dummy description") ],
+ "Samba" => [ "Samba wizard", "drakwizard $wizdir/samba_wizard/samba.wiz", -1, N("Samba wizard: dummy description") ],
+ "Time" => [ "Time wizard", "drakwizard $wizdir/time_wizard/time.wiz", -1, N("Time wizard: dummy description") ],
+ "Web" => [ "Web wizard", "drakwizard $wizdir/web_wizard/web.wiz", -1, N("Web wizard: dummy description") ],
+};
# { name => [ label, icon core ] }
-my %wizard = ("client" => [ N("DNS Client"), 'server-mdk'],
- "dhcp" => [ N("DHCP"), 'server-mdk'],
- "dns" => [ N("DNS"), 'server-mdk'],
- "ftp" => [ N("FTP"), 'ftp-mdk'],
- "news" => [ N("News"), 'news-mdk'],
- "postfix" => [ N("Postfix"), 'postfix-mdk'],
- "proxy" => [ N("Proxy"), 'web-mdk'],
- "samba" => [ N("Samba"), 'diskdrake_samba'],
- "time" => [ N("Time"), 'time-mdk'],
- "web" => [ N("Web"), 'web-mdk'],
- );
-
-# { class_name => [
-# [ label, icon core ]
-# ]
-# }
+my %wizard = ("client" => [ N("DNS Client"), 'server-mdk' ],
+ "dhcp" => [ N("DHCP"), 'server-mdk' ],
+ "dns" => [ N("DNS"), 'server-mdk' ],
+ "ftp" => [ N("FTP"), 'ftp-mdk' ],
+ "news" => [ N("News"), 'news-mdk' ],
+ "postfix" => [ N("Postfix"), 'postfix-mdk' ],
+ "proxy" => [ N("Proxy"), 'web-mdk' ],
+ "samba" => [ N("Samba"), 'diskdrake_samba' ],
+ "time" => [ N("Time"), 'time-mdk' ],
+ "web" => [ N("Web"), 'web-mdk' ],
+ );
+
+# [ [ class_label, class icon name, [ [ program_label, program icon name ] ... ] ] ]
my @tree =
- ([N("Boot"), 'boot-mdk',
- [
- [N("Boot Disk"), 'drakfloppy-mdk'],
- [N("Boot Config"),'drakboot-mdk'],
- [N("Auto Install"), 'drakfloppy-mdk'],
- ]
- ],
- [N("Hardware"), 'drakhard-mdk',
- [
- [N("Hardware List"),'harddrake-mdk'],
- [N("Monitor"),'XFdrake-mdk'],
- [N("Resolution"),'resolution-mdk'],
- [N("Graphical server configuration"),'XFdrake-mdk'],
- [N("TV Cards"),'tv-mdk'],
- [N("Keyboard"), 'keyboard-mdk'],
- [N("Mouse"), 'mousedrake-mdk'],
- [N("Printer"),'printer-mdk'],
- [N("Scanner"),'scanner-mdk'],
- ]
- ],
- [N("Mount Points"),'partition-mdk',
- [
- [N("Hard Drives"), 'diskdrake_hd'],
- (map {
- my ($type, $name, $scan) = @$_;
- map_index {
- my $full_name = $name . ($::i ? $::i + 1 : '');
- $exec_hash->{$full_name} = [ "diskdrake", "$_sbindir/diskdrake --removable=$_->{device}", 1 ];
- [ $full_name, "diskdrake_$type" ];
- } $scan->();
- } do {
- my %cdroms_by_type;
- foreach (detect_devices::cdroms()) {
- my $type = detect_devices::isBurner($_) ? 'burner' : detect_devices::isDvdDrive($_) ? 'DVD' : 'cdrom';
- push @{$cdroms_by_type{$type}}, $_;
- }
- (
- [ 'cdrom', N("CD-ROM"), sub { @{$cdroms_by_type{cdrom} || []} } ],
- [ 'dvd', N("DVD"), sub { @{$cdroms_by_type{DVD} || []} } ],
- [ 'cdwriter', N("CD Burner"), sub { @{$cdroms_by_type{burner} || []} } ],
- [ 'floppy', N("Floppy"), \&detect_devices::floppies ],
- [ 'zip', N("Zip"), \&detect_devices::zips ],
- ),
- }),
- [N("NFS mount points"), 'diskdrake_nfs'],
- [N("Samba mount points"), 'diskdrake_samba'],
- [N("WebDAV mount points"), 'webdav-mdk'],
- [N("Partition Sharing"), 'diskdrake_fileshare'],
- ]
- ],
- [N("Network & Internet"),'net-mdk',
- [
- [N("Connection"), 'drakconnect-mdk'],
- [N("Proxy Configuration"),'drakconnect-mdk'],
- [N("Connection Sharing"),'drakgw-mdk'],
- ],
- ],
- [N("Security"),'security-mdk',
- [
- [N("Security Level"), 'draksec-mdk'],
- [N("Security Permissions"), 'drakperm-mdk'],
- [N("Firewall"), 'firewall-mdk'],
- ]
- ],
- [N("System"),'system-mdk',
- [
- [N("Menus") , 'menudrake-mdk'],
- [N("Services") , 'service-mdk'],
- [N("Fonts"), 'drakfont-mdk'],
- [N("Date & Time") , 'time-mdk'],
- [N("Logs"), 'logdrake-mdk'],
- [N("Console"), 'console-mdk'],
- [N("Users"), 'user-mdk'],
- [N("Programs scheduling"), 'time-mdk'],
- [N("Backups"), 'backup-mdk'],
-# [N("RFBDrake"), 'unknown-mdk'],
- ]
- ],
- if_($::isRpmDrake,
- [N("Software Management"),'software',
- [
- [N("Install Software"), 'rpmdrake'],
- [N("Remove Software"), 'rpmdrake-remove'],
- [N("Mandrake Update"), 'MandrakeUpdate'],
- [N("Software Sources Manager"), 'source-manager'],
- ]
- ]),
- if_($::isWiz,
- [N("Server Configuration"), 'wizard-mdk',
- [
- (map {
- if_(-e '/usr/share/wizards/'.$_.'_wizard/'.$_.'.wiz', $wizard{$_})
- } keys %wizard)
- ]
- ]),
- );
+ ([ N("Boot"), 'boot-mdk',
+ [
+ [ "Boot Disk", 'drakfloppy-mdk', ],
+ [ "Boot Config", 'drakboot-mdk', ],
+ [ "Auto Install", 'drakfloppy-mdk', ],
+ ]
+ ],
+ [ N("Hardware"), 'drakhard-mdk',
+ [
+ [ "Hardware List", 'harddrake-mdk', ],
+ [ "Monitor", 'XFdrake-mdk', ],
+ [ "Resolution", 'resolution-mdk', ],
+ [ "Graphical server configuration", 'XFdrake-mdk', ],
+ [ "TV Cards", 'tv-mdk', ],
+ [ "Keyboard", 'keyboard-mdk', ],
+ [ "Mouse", 'mousedrake-mdk', ],
+ [ "Printer", 'printer-mdk', ],
+ [ "Scanner", 'scanner-mdk', ],
+ ]
+ ],
+ [ N("Mount Points"), 'partition-mdk',
+ [
+ [ "Hard Drives", 'diskdrake_hd', ],
+ (map {
+ my ($type, $name, $scan, $text) = @$_;
+ map_index {
+ my $full_name = $name . ($::i ? $::i + 1 : '');
+ $exec_hash->{$full_name} = [ "diskdrake", "$sbindir/diskdrake --removable=$_->{device}", 1, $text ];
+ [ $full_name, "diskdrake_$type" ];
+ } $scan->();
+ } do {
+ my %cdroms_by_type;
+ foreach (detect_devices::cdroms()) {
+ my $type = detect_devices::isBurner($_) ? 'burner' : detect_devices::isDvdDrive($_) ? 'DVD' : 'cdrom';
+ push @{$cdroms_by_type{$type}}, $_;
+ } ([ 'cdrom', N("CD-ROM"), sub { @{$cdroms_by_type{cdrom} || []} }, N("") ],
+ [ 'dvd', N("DVD"), sub { @{$cdroms_by_type{DVD} || []} }, N("") ],
+ [ 'cdwriter', N("CD Burner"), sub { @{$cdroms_by_type{burner} || []} }, N("CD/DVD burner: dummy description") ],
+ [ 'floppy', N("Floppy"), \&detect_devices::floppies, N("") ],
+ [ 'zip', N("Zip"), \&detect_devices::zips, N("") ],
+ ),
+ }),
+ [ "NFS mount points", 'diskdrake_nfs', ],
+ [ "Samba mount points", 'diskdrake_samba', ],
+ [ "WebDAV mount points", 'webdav-mdk', ],
+ [ "Partition Sharing", 'diskdrake_fileshare', ],
+ ]
+ ],
+ [ N("Network & Internet"), 'net-mdk',
+ [
+ [ "Connection", 'drakconnect-mdk', ],
+ [ "Proxy Configuration", 'drakconnect-mdk', ],
+ [ "Connection Sharing", 'drakgw-mdk', ],
+ ],
+ ],
+ [ N("Security"), 'security-mdk',
+ [
+ [ "Security Level", 'draksec-mdk', ],
+ [ "Security Permissions", 'drakperm-mdk', ],
+ [ "Firewall", 'firewall-mdk', ],
+ ]
+ ],
+ [ N("System"), 'system-mdk',
+ [
+ [ "Menus" , 'menudrake-mdk', ],
+ [ "Services" , 'service-mdk', ],
+ [ "Fonts", 'drakfont-mdk', ],
+ [ "Date & Time" , 'time-mdk', ],
+ [ "Logs", 'logdrake-mdk', ],
+ [ "Console", 'console-mdk', ],
+ [ "Users", 'user-mdk', ],
+ [ "Programs scheduling", 'time-mdk', ],
+ [ "Backups", 'backup-mdk', ],
+# [ "RFBDrake", 'unknown-mdk' ],
+ ]
+ ],
+ if_($::isRpmDrake,
+ [ N("Software Management"), 'software',
+ [
+ [ "Install Software", 'rpmdrake' ],
+ [ "Remove Software", 'rpmdrake-remove' ],
+ [ "Mandrake Update", 'MandrakeUpdate' ],
+ [ "Software Sources Manager", 'source-manager' ],
+ ]
+ ]),
+ if_($::isWiz,
+ [ N("Server Configuration"), 'wizard-mdk',
+ [
+ (map {
+ if_(-e '/usr/share/wizards/'.$_.'_wizard/'.$_.'.wiz', $wizard{$_})
+ } keys %wizard)
+ ]
+ ]),
+ );
#-------------------------------------------------------------
+# let build the GUI
+
+# main window :
+
+my ($global_width, $global_height) = (720, 578);
+
+my ($timeout, $show_log_check_box, $embedded_check_box, $expert_wizard_check_box);
+
+my $window_global = gtkset_size_request(Gtk2::Window->new('toplevel'), $global_width, $global_height);
+my $pending_app = 0;
+
+my ($menu, $factory) = create_factory_menu($window_global,
+ ({ path => N("/_File"), type => '<Branch>' },
+ { path => N("/_File") . N("/_Quit"), accelerator => N("<control>Q"), callback => \&quit_global },
+#-PO Don't remember to translate "_Options" the same way "Options" is (but for the underscore of course)
+ { path => N("/_Options"), type => '<Branch>' },
+ { path => N("/_Options") . N("/Display _Logs"), type => '<CheckItem>',
+ callback => sub {
+ $show_logs = $show_log_check_box->active;
+ update_exp();
+ }
+ },
+ { path => N("/_Options") . N("/_Embedded Mode"), type => '<ToggleItem>',
+ callback => sub {
+ $embedded = $embedded_check_box->active;
+ if ($embedded) {
+ $embedded = 0;
+ splash_warning(N("Embedding support is currently broken as of Gtk+-2.1.5."));
+ }
+ }
+ },
+ if_($::isWiz,
+ { path => N("/_Options") . N("/Expert mode in _wizards"), type => '<ToggleItem>',
+ callback => sub { $embedded = $expert_wizard_check_box->active }
+ },
+ ),
+
+ if_(all($themes_dir) > 1,
+ { path => N("/_Themes"), type => '<Branch>' },
+ (map {
+ my $name = $_;
+ { path => N("/_Themes") . "/" . ($name eq $theme ? " O " : " ") . "_$_",
+ callback => sub {
+ return if $theme eq $name;
+ !$pending_app || splash_warning(N("This action will restart the control center.\nAny change not applied will be lost."), 1) and sig_usr1(), exec "$0 --theme $name";
+ } };
+ } grep { -d "$themes_dir/$_" } all($themes_dir)),
+ { path => N("/_Themes").N("/_More themes"), callback => \&more_themes }
+ ),
+ { path => N("/_Help"), type => '<Branch>' },
+ { path => N("/_Help").N("/_Report Bug"), callback => sub { fork_("drakbug --report drakconf &") } },
+ { path => N("/_Help").N("/_About..."), callback => \&about_mdk_cc }
+ ));
+
+#-PO Don't remember to translate "Options" the same way "_Options" is (but without the underscore of course)
+$show_log_check_box = $factory->get_widget("<main>" . N("/Options") . N("/Display Logs"));
+$embedded_check_box = $factory->get_widget("<main>" . N("/Options") . N("/Embedded Mode"));
+$expert_wizard_check_box = $factory->get_widget("<main>" . N("/Options") . N("/Expert mode in wizards"));
+
+gtkadd($window_global,
+ gtkpack_(Gtk2::VBox->new(0, 3),
+ 0, $menu,
+ 0, gtkset_size_request(my $darea_title = Gtk2::DrawingArea->new, $global_width, 55),
+ 0, Gtk2::HSeparator->new,
+ 1, gtkpack_(Gtk2::HBox->new(0, 0),
+ 0, my $fixed_left = Gtk2::Fixed->new,
+ 1, gtkpack_(my $right_box = Gtk2::VBox->new(0, 0),
+ 1, gtkpack_(my $emb_box = Gtk2::VBox->new(0, 0),
+ 1, my $emb_wait = gtkpack_(Gtk2::VBox->new(0, 0),
+ 1, Gtk2::HBox->new(0, 0),
+ 0, gtkpack_(Gtk2::HBox->new(0, 0),
+ 1, Gtk2::VBox->new(0, 0),
+ 0, gtkadd(gtkset_shadow_type(Gtk2::Frame->new, 'etched_out'),
+ my $run_darea = gtkset_size_request(Gtk2::DrawingArea->new, 128, 128)
+ ),
+ 1, Gtk2::VBox->new(0, 0),
+ ),
+ 0, Gtk2::Label->new(N("Please wait...")),
+ 1, Gtk2::HBox->new(0, 0),
+ 0, gtkadd(gtkset_layout(gtkset_border_width(Gtk2::HButtonBox->new, 10), 'end'),
+ gtksignal_connect(Gtk2::Button->new(N("Cancel")), clicked => sub { Gtk2->timeout_remove($timeout) if $timeout; kill('USR1', $$) }),
+ )
+ )
+ ),
+ 1, my $notebook_global = Gtk2::Notebook->new,
+ )
+ )
+ )
+ );
-my $window_global = new Gtk::Window -toplevel;
-my ($pixmap_back_right, undef) = gtkcreate_png('mcc-core-back');
$window_global->signal_connect(delete_event => \&quit_global);
-$window_global->set_title(N("Mandrake Control Center %s", $_version));
-$window_global->set_policy(0, 1, 1);
-my $notebook_global;
+$window_global->set_title(N("Mandrake Control Center %s", $version));
+$window_global->set_position('center');
-my $left_back_pixbuf_unaltered = gtkcreate_png_pixbuf('mcc-left-back');
-my $left_back_pixbuf_unaltered_h = gtkcreate_png_pixbuf('mcc-left-back2');
+$notebook_global->set_property('show-border', 0);
+$notebook_global->set_property('show-tabs', 0); #$notebook_global->set_show_tabs(0);
+
+# banner :
+
+$darea_title->signal_connect(realize => sub { set_back_pixbuf($darea_title, gtkcreate_pixbuf('mcc-title-back')) });
+
+my $pixbuf_icon = gtkcreate_pixbuf('mcc-title-icon');
+$darea_title->signal_connect(expose_event => sub {
+ $pixbuf_icon->render_to_drawable($darea_title->window, $darea_title->style->white_gc, 0, 0, $darea_title->allocation->width - $pixbuf_icon->get_width, 0, -1, -1, 'none', 0, 0);
+});
+
+
+
+# main page (summary) :
+
+my $summary = Gtk2::Fixed->new;
+$summary->set_has_window(1);
+$notebook_global->append_page(gtksignal_connect($summary, realize => sub { set_back_pixbuf($summary, gtkcreate_pixbuf("mcc-splash")) }));
+
+use POSIX qw(:sys_utsname_h :math_h);
+my (undef, $nodename, $release, undef, $machine) = POSIX::uname();
+$summary->put(gtkmodify_font(Gtk2::Label->new(N("Welcome to the Mandrake Control Center")), Gtk2::Pango::FontDescription->from_string('15')),
+ 80, 115); # FIXME: better center it at realize time @(summary->width - (vbox->width/2), summary->height - (vbox->height/2) )
+
+
+# left icons :
my @darea_left_list;
-my $cursor_hand = new Gtk::Gdk::Cursor 60;
-my $cursor_normal = new Gtk::Gdk::Cursor 68;
-my ($index, $left_locked, $pending_app) = (0, 0, 0);
-my $darea_left_sav;
-my $back;
-($back->[0], undef) = gtkcreate_png('mcc-left-back');
- $back->[1] = $back->[0];
-($back->[2], undef) = gtkcreate_png('mcc-left-back2');
+my ($cursor_hand, $cursor_normal) = (Gtk2::Gdk::Cursor->new('hand2'), Gtk2::Gdk::Cursor->new('left-ptr'));
+
+my $right_back_pixbuf = gtkcreate_pixbuf('mcc-core-back');
+my $left_back_pixbuf_unaltered = gtkcreate_pixbuf('mcc-left-back');
+my $left_back_pixbuf_unaltered_h = gtkcreate_pixbuf('mcc-left-back2');
+my ($back_width, $back_height) = ($left_back_pixbuf_unaltered->get_width, $left_back_pixbuf_unaltered->get_height);
+
+# 0 => unselected, 1 => highlited, 2 => selected
+my @left_back_pixbuf = ($left_back_pixbuf_unaltered, $left_back_pixbuf_unaltered, $left_back_pixbuf_unaltered_h);
+
+my ($index, $left_locked) = (0, 0);
+my $index_sav = -1;
+
+my (@curr_state, @old_state);
+my ($d_width, $d_height) = (160, 44);
+my @colors = (gtkcolor(0, 0, 0), gtkcolor(0xAA, 0xAA, 0xFF), gtkcolor(0, 0, 0));
+my $spacing = 25;
+my ($lspacing, $txt_offset);
+
# Create left icons
foreach (@tree) {
- $index++;
- my $index = $index;
- my $text = $_->[0];
-
- my $darea_left = gtkset_usize(new Gtk::DrawingArea, 160, 45);
- $darea_left->{state} = 0;
- my ($dbl_area_left, $pix, $width, $height);
- $darea_left->set_events(['exposure_mask', 'enter_notify_mask', 'leave_notify_mask', 'button_press_mask', 'button_release_mask' ]);
-
- # 0 => unselected, 1 => highlited, 2 => selected
- my @left_back_pixbuf = (
- compose_with_back($_->[1], $left_back_pixbuf_unaltered),
- compose_with_back($_->[1], $left_back_pixbuf_unaltered, 170),
- compose_with_back($_->[1], $left_back_pixbuf_unaltered_h));
- my ($pixbuf_width, $pixbuf_height) = ($left_back_pixbuf[0]->get_width, $left_back_pixbuf[0]->get_height);
- my $draw = sub {
- my ($dx, $dy) = ($darea_left->allocation->[2], $darea_left->allocation->[3]);
- my $state = $darea_left->{state};
- unless (defined($dbl_area_left)) {
- ($pix, $width, $height) = create_pix_text($darea_left, $text, $darea_left->style->font,
- max($dx-40, 0), $dy, 0, 0, $back, 160, 45, 0, 1);
- $dbl_area_left = new Gtk::Gdk::Pixmap($darea_left->window, $dx, $dy);
- }
- # Redraw if state change (selected <=> not selected)
- if (!$dbl_area_left->{state} || $state != $dbl_area_left->{state}) {
- $dbl_area_left->{state} = $state;
- $darea_left->{dbl} = $dbl_area_left;
- fill_tiled($darea_left, $dbl_area_left, $back->[$state], 40, $dy, 40, 45);
- $dbl_area_left->draw_pixmap($darea_left->style->bg_gc('normal'), $pix->[$state], 0, 0, 40, 0, $width, $height);
- $left_back_pixbuf[$state]->render_to_drawable($dbl_area_left, $darea_left->style->fg_gc('normal'), 0, 0, 8, 10,
- $pixbuf_width, $pixbuf_height, 'normal', 0, 0);
- }
- $darea_left->window->draw_pixmap($darea_left->style->bg_gc('normal'), $dbl_area_left, 0, 0, 0, 0, ($dx, $dy));
- };
- $darea_left->signal_connect(expose_event => $draw);
+ my ($text, $icon, $subtree) = @$_;
+ my $my_index = $index++;
+
+# die "gtkput(fixed_left, VBox of StockButtons there or\n (while waiting for gc to implement IconFactory) VBox of Hbox[icon|text]";
+ my $darea_left = gtkset_size_request(Gtk2::DrawingArea->new, $d_width, $d_height);
+ $darea_left->set_events([ 'exposure_mask', 'enter_notify_mask', 'leave_notify_mask', 'button_press_mask', 'button_release_mask' ]);
+
+ my $icon_pixbuf = gtkcreate_pixbuf($icon);
+ my ($icon_width, $icon_height) = ($icon_pixbuf->get_width, $icon_pixbuf->get_height);
+ if (!defined $lspacing) {
+# $lspacing = ceil(($d_height-$icon_height)/2);
+ $lspacing = ($d_height-$icon_height)/2;
+ $txt_offset = $lspacing * 2 + $icon_width;
+ $lspacing = ceil($lspacing);
+ }
+
+ my @icon_pixbufs = ($icon_pixbuf, render_shiner($icon_pixbuf, 1.89), $icon_pixbuf);
+
+ my @fonts = map { Gtk2::Pango::FontDescription->from_string($_) } '', 'Bold', 'Bold';
+ my ($lines, $widths, $heights, @dbl_area_left);
+
+ push @curr_state, 0;
+ push @old_state, -1;
+
+ $darea_left->signal_connect(expose_event => sub {
+ my (undef, $event) = @_;
+ my $curr_state = $curr_state[$my_index];
+ my $full_redraw = $curr_state != $old_state[$my_index];
+ my ($x, $y, $width, $height) = $full_redraw ? (0, 0, $d_width, $d_height) : $event->area->values;
+ # Redraw double buffer on first expose in that particular state (selected <=> not selected): render background, then icon, then text
+ unless ($dbl_area_left[$curr_state]) {
+ my $window = $darea_left->window;
+ $dbl_area_left[$curr_state] = Gtk2::Gdk::Pixmap->new($window, $d_width, $d_height, $window->get_depth);
+ my $gc = $darea_left->style->fg_gc('normal');
+ $left_back_pixbuf[$curr_state]->render_to_drawable($dbl_area_left[$curr_state], $gc, 0, 0, 0, 0, $back_width, $back_height, 'normal', 0, 0);
+ $icon_pixbufs[$curr_state]->render_to_drawable($dbl_area_left[$curr_state], $gc, 0, 0, $lspacing, $lspacing+2, $icon_width, $icon_height, 'normal', 0, 0);
+ $darea_left->style->black_gc->set_rgb_fg_color($colors[$curr_state]);
+# $darea_left->style->black_gc->set_fg_gc('normal', $colors[$curr_state]);
+# $darea_left->style->set_rgb_fg_color($colors[$curr_state]);
+
+ $darea_left->modify_font($fonts[$curr_state]);
+
+ (undef, undef, $lines, $widths, $heights) = get_text_coord($text, $darea_left, $d_width-$txt_offset, $d_height, 0, 0, 0, 0);
+ my $offset = $heights->[0]/2 if listlength(@$lines) > 1; # multi line texts are offsetted
+ mapn {
+# $_ = "<markup><span foreground=\"blue\">$_</span></markup>" if $curr_state == 1;
+ # we need Gtk2::Pango::Layout->set_markup to render in blue in highlighted state
+ $dbl_area_left[$curr_state]->draw_layout($darea_left->style->black_gc, $_[1]+$txt_offset, $_[2]-$offset, $darea_left->create_pango_layout($_[0]));
+ } $lines, $widths, $heights;
+ }
+ $old_state[$my_index] = $curr_state;
+ $darea_left->window->draw_drawable($darea_left->style->bg_gc('normal'), $dbl_area_left[$curr_state], $x, $y, $x, $y, $width, $height);
+ });
$darea_left->signal_connect(realize => sub { $darea_left->window->set_cursor($cursor_hand) });
$darea_left->signal_connect(enter_notify_event => sub {
- return if $darea_left->{state} != 0;
- $darea_left->{state} = 1;
- &$draw;
+ return if $old_state[$my_index] == -1 || $curr_state[$my_index] != 0;
+ $curr_state[$my_index] = 1;
+ $darea_left->queue_draw;
});
$darea_left->signal_connect(leave_notify_event => sub {
- return if $darea_left->{state} != 1;
- $darea_left->{state} = 0;
- &$draw;
+ return if $curr_state[$my_index] != 1;
+ $curr_state[$my_index] = 0;
+ $darea_left->queue_draw;
});
$darea_left->signal_connect(button_release_event => sub {
- $left_locked and return;
- $pending_app && !splash_warning(N("The modifications done in the current module won't be saved."), 1) and return;
- clean_socket();
- $notebook_global->show;
- $darea_left->{state} == 2 and set_page($index), return;
- foreach (@darea_left_list) {
- $_->[1]->window->set_cursor($cursor_hand);
- if ($_->[1]{state} != 0) {
- $_->[1]{state} = 0;
- $_->[1]->draw(undef);
- }
- }
- $darea_left->window->set_cursor($cursor_normal);
- $darea_left->{state} = 2;
- &$draw;
- if ($still_in_splash_screen) {
- $still_in_splash_screen = 0;
- update_exp();
- }
- set_page($index);
- $darea_left_sav = $darea_left;
+ return if $left_locked;
+ return if $pending_app && !splash_warning(N("The modifications done in the current module won't be saved."), 1);
+ # deselect previously selected darea
+ if ($index_sav != -1) {
+ $curr_state[$index_sav] = 0;
+ $darea_left_list[$index_sav]->window->set_cursor($cursor_hand);
+ $darea_left_list[$index_sav]->queue_draw;
+ } else { $still_in_splash_screen = 0 }
+ $index_sav = $my_index;
+ $curr_state[$my_index] = 2;
+ $darea_left->window->set_cursor($cursor_normal);
+ $darea_left->queue_draw;
+ set_page($my_index+1);
});
-
- push @darea_left_list, [ ($index-1)*45, $darea_left ];
-}
-
-my ($exp_frame, $emb_box, $emb_wait, $emb_socket);
-my ($global_width, $global_height) = (720, 578);
+ # push left icons
+ $fixed_left->put($darea_left, 0, $my_index*$d_height);
+ push @darea_left_list, $darea_left;
+
+
+ # Create right notebook pages :
+
+ my $fixed = Gtk2::Fixed->new;
+ $fixed->set_has_window(1);
+ $fixed = gtksignal_connect(
+ gtkput($fixed,
+ create_packtable({ col_spacings => $spacing, row_spacings => $spacing },
+ (group_by2(map {
+ my ($label, $tag) = @$_;
+ my $text = $exec_hash->{$label}->[3];
+ die "$label 's icon is missing" unless $exec_hash->{$label};
+ my $event_box = gtkadd(Gtk2::EventBox->new(), my $icon = gtkcreate_img($tag));
+ $event_box->set_events([ 'enter_notify_mask', 'leave_notify_mask', 'button_press_mask', 'button_release_mask' ]);
+ # FIXME: do ->set_pixbuf() on {enter,leave}_events
+ $event_box->signal_connect(realize => sub { $event_box->window->set_cursor($cursor_hand) });
+ $event_box->signal_connect(button_release_event => sub { compute_exec_string($tag, @{$exec_hash->{$label}}) });
+
+ # FIXME : resize sig: ->foreach; set_size_request
+
+ gtkpack(Gtk2::HBox->new(0, 0),
+ $event_box,
+ gtkset_size_request(gtktext_insert(Gtk2::TextView->new, [ [ $text, {'background_set' => 0, 'background_stipple_set' => 0 } ] ]), ($global_width-$d_width-$icon_width-$spacing*4-5)/2, -1)
+# gtkset_size_request(Gtk2::Label->new($text), ($global_width-$d_width-$icon_width-95)/2, -1)
+ );
+ } @$subtree))),
+ 0, $spacing),
+ realize => sub { set_back_pixbuf($fixed, $right_back_pixbuf) });
+
+ $notebook_global->append_page(my $w_ret = gtkhide(create_scrolled_window($fixed, undef, 'none')));
+# $w_ret->vscrollbar->set_size_request(19, undef);
+}
-# embedded processes pid will be stocked there
-my @pid_launched;
+$notebook_global->set_size_request(-1, $index * 60);
-# logdrake pid are stocked here
-my @pid_exp;
-$window_global->add(
- gtkpack_(new Gtk::VBox(0, 0),
- 0, my $title_w = get_main_menu($window_global),
- 0, my $fixed_title = gtkset_usize(new Gtk::Fixed, $global_width, 55),
- 0, new Gtk::HSeparator,
- 1, gtkpack_(new Gtk::HBox(0, 0),
- 0, my $fixed_left = new Gtk::Fixed,
- 1, gtkpack_(my $right_box = new Gtk::VBox(0, 0),
- 1, gtkpack_($emb_box = new Gtk::VBox(0, 0),
- 1, $emb_wait = gtkpack_(new Gtk::VBox(0, 0),
- 1, new Gtk::HBox(0, 0),
- 0, gtkpack_(new Gtk::HBox(0, 0),
- 1, new Gtk::VBox(0, 0),
- 0, gtkadd(gtkset_shadow_type(new Gtk::Frame, 'etched_out'),
- my $run_darea = gtkset_usize(new Gtk::DrawingArea, 128, 128)
- ),
- 1, new Gtk::VBox(0, 0),
- ),
- 0, new Gtk::Label(N("Please wait...")),
- 1, new Gtk::HBox(0, 0),
- 0, gtkadd(gtkset_layout(gtkset_border_width(new Gtk::HButtonBox, 10), 'end'),
- gtksignal_connect(new Gtk::Button(N("Cancel")), clicked => sub { Gtk->timeout_remove($timeout) if $timeout; kill('USR1', $$) }),
- )
- )
- ),
- 1, $notebook_global = new Gtk::Widget('Gtk::Notebook',
- show_border => 0,
- show_tabs => 0),
- )
- )
- )
- );
+my ($exp_frame, $emb_socket);
sub update_exp {
return if $still_in_splash_screen || $pending_app;
- if ($logs) {
+ if ($show_logs) {
if ($exp_frame) {
$exp_frame->show_all;
} else {
gtkpack__($right_box,
- gtkadd($exp_frame = gtkset_shadow_type(gtkset_usize(gtkset_border_width(new Gtk::Frame(N("Logs")), 5), 0, 120), 'etched_out')));
+ gtkadd($exp_frame = gtkset_shadow_type(gtkset_size_request(gtkset_border_width(Gtk2::Frame->new(N("Logs")), 5), 0, 120), 'etched_out')));
}
- } elsif ($logs) { $exp_frame->hide }
+ } elsif ($exp_frame) { $exp_frame->hide }
}
-#540, 420
-my ($notebook_width, $notebook_height) = (540, 420);
-$notebook_global->set_usize(40, $index * 50);
-$emb_box->set_usize(40, $index * 50);
+$emb_box->set_size_request(-1, $index * 50);
-if (defined $log_check_box) {
- $log_check_box->set_active($logs);
+if (defined $show_log_check_box) {
+ $show_log_check_box->set_active($show_logs);
$embedded_check_box->set_active($embedded);
+ $expert_wizard_check_box->set_active($expert_wizard);
} else { print STDERR "BUG with LANGUAGE $ENV{LANGUAGE}\n" }
-update_exp();
-res_socket();
-
-foreach (@darea_left_list) { $fixed_left->put($_->[1], 0, $_->[0]) }
-
-$fixed_left->signal_connect(realize => sub { $fixed_left->window->set_back_pixmap($back->[0], 0) });
+create_hidden_socket_if_needed();
-my $dbl_area;
-my ($pixmap_back, undef) = gtkcreate_png('mcc-title-back');
-my ($pixmap_icon, undef) = gtkcreate_png('mcc-title-icon');
+# default left background
+$fixed_left->set_has_window(1);
+$fixed_left->signal_connect(realize => sub { set_back_pixbuf($fixed_left, $left_back_pixbuf[0]) });
-$fixed_title->put(my $darea_title = gtkset_usize(new Gtk::DrawingArea, 335, 55), 0, 0); # 335 -> 450
-
-$fixed_title->signal_connect(realize => sub { $fixed_title->window->set_back_pixmap($pixmap_back, 0) });
-
-$darea_title->signal_connect(expose_event => sub {
- my @dim = @{$_[1]{area}};
- my ($dx, $dy) = ($darea_title->allocation->[2], $darea_title->allocation->[3]);
- unless (defined($dbl_area)) {
- $dbl_area = new Gtk::Gdk::Pixmap($darea_title->window, $dx, $dy);
- fill_tiled($darea_title, $dbl_area, $pixmap_back, 110, 55, $dx, $dy);
- $dbl_area->draw_pixmap($darea_title->style->bg_gc('normal'),
- $pixmap_icon, 0, 0, 0, 0, 325, 55);
- }
- $darea_title->window->draw_pixmap($darea_title->style->bg_gc('normal'),
- $dbl_area, $dim[0], $dim[1], $dim[0], $dim[1], $dim[2], $dim[3]);
-});
-
-
-my $pix_dbl;
-$notebook_global->append_page(my $summary_darea = new Gtk::DrawingArea);
-$summary_darea->signal_connect(size_allocate => sub { $pix_dbl = undef }); # needed when hiding emb_box
-$summary_darea->signal_connect(expose_event => sub {
- my ($dx, $dy) = ($summary_darea->allocation->[2], $summary_darea->allocation->[3]);
- unless (defined($pix_dbl)) {
- $pix_dbl = new Gtk::Gdk::Pixmap($summary_darea->window, $dx, $dy);
- my ($splash_pix, undef) = gtkcreate_png("mcc-splash");
- fill_tiled($summary_darea, $pix_dbl, $splash_pix, $notebook_width, $notebook_height, $dx, $dy);
- my $style = $summary_darea->style->copy();
- $style->font(Gtk::Gdk::Font->fontset_load(N("-*-helvetica-medium-r-normal-*-20-*-100-100-p-*-iso8859-1,*-r-*")));
- $pix_dbl->draw_string($style->font, $summary_darea->style->black_gc, 80, 115, N("Welcome to the Mandrake Control Center"));
- my ($sysname, $nodename, $release, undef, $machine) = uname();
- my $i = 0;
- foreach ([N("System:"), &mandrake_release()],
- [N("Hostname:"), $nodename],
- [N("Kernel Version:"), $release],
- [N("Machine:"), $machine]) {
- $pix_dbl->draw_string($summary_darea->style->font, $summary_darea->style->black_gc, 80, 150+$i, $_->[0]);
- $pix_dbl->draw_string($summary_darea->style->font, $summary_darea->style->black_gc, 81, 150+$i, $_->[0]);
- $pix_dbl->draw_string($summary_darea->style->font, $summary_darea->style->black_gc, 200, 150+$i, $_->[1]);
- $i+=20;
- }
- }
- $summary_darea->window->draw_pixmap ($summary_darea->style->white_gc,
- $pix_dbl, 0, 0,
- 0, 0, $dx, $dy);
- 0;
- });
+# "wait while launching a program" area :
my ($run_pixbuf, $run_counter, $run_counter_add);
-my $right_back_pixbuf = gtkcreate_png_pixbuf('mcc-core-back');
$run_darea->signal_connect(expose_event => sub {
- my $pixbuf = compose_pixbufs($run_pixbuf, $right_back_pixbuf, $run_counter);
- $pixbuf->render_to_drawable($run_darea->window, $run_darea->style->fg_gc('normal'), 0, 0, 0, 0,
- $pixbuf->get_width, $pixbuf->get_height, 'normal', 0, 0);
+ my $pixbuf = render_shiner($run_pixbuf, $run_counter);
+ my ($window, $gc, $width, $height) = ($run_darea->window, $run_darea->style->fg_gc('normal'), $pixbuf->get_width, $pixbuf->get_height);
+ $right_back_pixbuf->render_to_drawable($window, $gc, 0, 0, 0, 0, $width, $height, 'normal', 0, 0);
+ $pixbuf->render_to_drawable($window, $gc, 0, 0, 0, 0, $width, $height, 'normal', 0, 0);
$run_counter += $run_counter_add;
$run_counter_add = -$run_counter_add if $run_counter < 100;
$run_counter_add = -$run_counter_add if 245 < $run_counter;
});
+gtkflush();
-$window_global->set_usize($global_width, $global_height);
-# Create right notebook pages
-foreach (@tree) {
- $notebook_global->append_page(gtkicons_labels_widget($_->[2], $window_global, $summary_darea,
- $pixmap_back_right, $left_back_pixbuf_unaltered_h, $notebook_width, $notebook_height, 55, 50, 50, 50, 50, 50, \&compute_exec_string, $exec_hash));
-}
-gtkflush;
+$notebook_global->set_current_page(0);
$notebook_global->signal_connect(switch_page => sub {
my (undef, $tab_widget, $tab_number) = @_;
- $tab_number > 0 or return;
- $tab_widget->child->child->child->{redraw_function}->();
+ return unless $tab_number > 0;
});
-$window_global->set_usize($global_width, $global_height);
-#$window_global->set_default_size($global_width, $global_height);
-$window_global->set_position('center');
-gtkflush;
+
$window_global->show_all;
+#$darea_title->hide;
$emb_box->hide;
-my $p = $#tree + ($::isWiz ? 1 : 0);
-Gtk->timeout_remove($timer_splash);
-$notebook_global->set_page(0);
-
-$window_splash->destroy();
-$window_global->set_position(1);
$SIG{USR1} = \&sig_usr1;
$SIG{USR2} = \&sig_usr2;
$SIG{TERM} = \&quit_global;
$SIG{CHLD} = \&sig_child;
-$SIG{CONT} = sub { Gtk->main };
-Gtk->main;
+$SIG{CONT} = sub { Gtk2->main };
+
+$window_splash->destroy;
+
+eval { Gtk2->main } while (1);
-# got when child go in zombie state
+# got when child unexpectedly died and gone in zombie state
sub sig_child {
- wait; # reap zombies
- return unless $left_locked;
+ wait(); # reap zombies
+ return unless $left_locked;
kill('USR1', $$);
splash_warning(N("This program was abnomarly exited"));
-# Gtk->main
+# Gtk2->main
}
-# got when finished
+# got when child properly exited
sub sig_usr1 {
$left_locked = 0;
clean_socket();
gtkset_mousecursor_normal();
- $darea_left_sav and $darea_left_sav->{state} = 2, $darea_left_sav->draw(undef);
$notebook_global->show;
}
@@ -544,292 +611,278 @@ sub sig_usr2 {
}
+# embedded processes pid will be stocked there
+my @pid_launched;
+
+# logdrake pid are stocked here
+my @pid_exp;
+
+
sub fork_ {
my ($prog, $do_not_kill) = @_;
my $pid;
- unless ($pid = fork) {
- splash_warning(N("cannot fork: %s", $~)) unless defined $pid;
- exec($prog);
+ unless ($pid = fork()) {
+ splash_warning(N("cannot fork: %s", $~)) unless defined $pid;
+ exec($prog);
}
return if $do_not_kill;
push @pid_launched, $pid if $embedded;
-
+
}
sub compute_exec_string {
- my ($icon, $log_exp, $exec, $gtkplug, $alternate) = ($_[0], @{$_[1]});
+ my ($icon, $log_exp, $exec, $gtkplug, undef, $alternate) = @_; #($_[0], @{$_[1]});
+ $exec .= "--summary" if $expert_wizard;
if ($embedded) {
- if ($gtkplug != -1) { # not explicitely not embedded
- $notebook_global->hide;
- res_socket();
- $emb_box->show;
- $emb_socket->realize;
- $exec .= " --embedded " . $emb_socket->window->XWINDOW . " " . $$;
- }
- if ($gtkplug > 0) {
- $emb_wait->show;
- undef $run_pixbuf if $run_pixbuf; #->unref;
- $run_pixbuf = gtkcreate_png_pixbuf($icon . "_128");
- $run_counter = 255;
- $run_counter_add = -10;
- Gtk->timeout_remove($timeout) if $timeout;
- $timeout = Gtk->timeout_add(70, sub { $run_darea->draw(undef); 1 });
- $left_locked = 1;
- $pending_app = 1;
- fork_($exec);
- } elsif ($gtkplug == -1) { # explicitely not embedded
- fork_($exec, 1);
- } else { # gtkplug == 0
- $emb_socket->show;
- $SIG{CHLD} = undef;
- $emb_socket->steal(launch_xapp($alternate));
- $SIG{CHLD} = \&sig_child;
- }
+ if ($gtkplug != -1) { # not explicitely not embedded
+ $notebook_global->hide;
+ create_hidden_socket_if_needed();
+ $emb_box->show;
+ $emb_socket->realize;
+ $exec .= " --embedded " . $emb_socket->window->XWINDOW . " " . $$;
+ }
+ if ($gtkplug > 0) {
+ $emb_wait->show;
+ undef $run_pixbuf if $run_pixbuf; #->unref;
+ $run_pixbuf = gtkcreate_pixbuf($icon . "_128");
+ $run_counter = 255;
+ $run_counter_add = -10;
+ Gtk2->timeout_remove($timeout) if $timeout;
+ $timeout = Gtk2->timeout_add(70, sub { $run_darea->draw(undef); 1 });
+ $left_locked = 1;
+ $pending_app = 1;
+ fork_($exec);
+ } elsif ($gtkplug == -1) { # explicitely not embedded
+ fork_($exec, 1);
+ } else { # gtkplug == 0
+ $emb_socket->show;
+ $SIG{CHLD} = undef;
+ $emb_socket->steal(launch_xapp($exec));
+ $SIG{CHLD} = \&sig_child;
+ }
} else { # not embedded
- fork_($gtkplug == 0 ? $alternate->[0] : $alternate || $exec);
- }
- if ($embedded && $gtkplug != -1) {
- foreach (@darea_left_list) {
- $_->[1]->window->set_cursor($cursor_hand);
- if ($_->[1]{state} != 0) {
- $_->[1]{state} = 0;
- $_->[1]->draw(undef);
- }
- }
+ fork_($gtkplug == 0 ? $exec->[0] : $alternate || $exec);
}
- # start logdrake if needed
- if ($logs && $show_log) {
- my $pid;
- gtkadd($exp_frame, my $exp_socket = new Gtk::Socket);
- $exp_socket->realize;
- my $exec_log = "logdrake --explain=$log_exp --embedded " . $exp_socket->window->XWINDOW . " " . $$;
- $show_log = 0;
- if ($exec =~ /(drakfont|drakconnect|drakboot)/) { $exp_frame->hide() } # $window_global->height < 600
-# fork_($exec_log, 1);
- unless ($pid = fork) {
- splash_warning(N("cannot fork: %s", $~)) unless defined $pid;
- exec($exec_log);
- }
- push @pid_exp, $pid;
+# if ($embedded && $gtkplug != -1) {
+# foreach (@darea_left_list) {
+# $_->->window->set_cursor($cursor_hand);
+# if ($_->{state} != 0) {
+# $_->{state} = 0;
+# $_->->draw(undef);
+# }
+# }
+# }
+ # (re)start logdrake if needed
+ if ($show_logs && $freeze_log) { #FIXME && !$exp_socket
+ my $pid;
+ my $exp_socket;
+#FIXME gtkadd($exp_frame, my $exp_socket = Gtk2::Socket)->new;
+ $exp_socket->realize;
+ my $exec_log = "logdrake --explain=$log_exp --embedded " . $exp_socket->window->XWINDOW . " " . $$;
+ $freeze_log = 0;
+ if ($exec =~ /(drakfont|drakconnect|drakboot)/) { $exp_frame->hide } # $window_global->height < 600
+# fork_($exec_log, 1);
+ unless ($pid = fork()) {
+ splash_warning(N("cannot fork: %s", $~)) unless defined $pid;
+ exec($exec_log);
+ }
+ push @pid_exp, $pid;
}
}
sub launch_xapp {
- my $b = "xwininfo -root -tree -int | grep '" . $_[0][1] . "'";
- my @before = split ('\n', `$b`);
- my $mcc_pid = $$;
- fork_($_[0][0] . "; kill -USR1 $mcc_pid");
- my $res = 0;
- while (!$res) {
- my @after = split ('\n', `$b`);
- while (@after ne ($_[0][2]+@before)) {
- @after = split ('\n', `$b`);
- }
- my $i = 0;
- my $c;
- foreach (@after) {
- $c = $after[$i] if !member($after[$i], @before);
- $i++;
- }
- $c =~ /\s*([0-9]*)\s*/;
- $res = $1;
+ my ($exec, $name, $xx) = @_;
+ my $find_windows = sub { split '\n', `xwininfo -root -tree -int | grep '$name'` };
+ my @before = &$find_windows();
+ fork_("$exec; kill -USR1 $$");
+ while (1) {
+ my @after = &$find_windows();
+ while (@after ne $xx + @before) {
+ @after = &$find_windows();
+ }
+ my $c;
+ foreach (@after) { $c = $_ unless member($_, @before) };
+ $c =~ /\s*([0-9]*)\s*/;
+ return $1;
}
- $res;
}
-sub clean_socket {
+sub hide_socket_and_clean {
$emb_box->hide;
- foreach (@pid_launched) {
- kill 'TERM', $_ if defined $_;
- }
- @pid_launched = ();
- $emb_socket and $emb_socket->destroy();
$pending_app = 0;
update_exp();
}
-sub res_socket {
- clean_socket();
- gtkpack($emb_box, $emb_socket = new Gtk::Socket);
+sub clean_socket {
+ hide_socket_and_clean();
+# map { kill 'TERM', $_ if defined $_ } @pid_launched;
+ map { if__($_, kill 'TERM', $_) } @pid_launched;
+ @pid_launched = ();
+ $emb_socket and $emb_socket->destroy; # should not happen since our child should have cause the socket to be destroyes when it exited
+}
+
+sub create_hidden_socket_if_needed {
+ hide_socket_and_clean(); # clean_socket();
+ gtkpack($emb_box, $emb_socket = Gtk2::Socket->new) unless $emb_socket;
$emb_socket->hide;
$emb_wait->hide;
}
sub quit_global {
- foreach (@pid_launched,@pid_exp) { kill 'TERM', $_ if defined $_ }
+ map { if__($_, kill 'TERM', $_) } @pid_exp;
setVarsInSh($conffile, {
- EMBEDDED => bool2text($embedded),
- LOGS => bool2text($logs),
- THEME => $theme,
- });
+ EMBEDDED => bool2text($embedded),
+ LOGS => bool2text($show_logs),
+ EXPERT_WIZARD => bool2text($expert_wizard),
+ THEME => $theme,
+ });
gtkset_mousecursor_normal();
- Gtk->exit(0);
+ Gtk2->exit(0);
}
sub splash_warning {
my ($label, $cancel_button) = @_;
my $ret;
- my $win_about = new Gtk::Dialog();
- $win_about->set_position(1);
- $win_about->set_border_width(10);
-
- gtkpack__($win_about->action_area,
- gtkadd(new Gtk::HButtonBox,
- gtksignal_connect(new Gtk::Button($cancel_button ? N("OK") : N("Close")), clicked => sub { $ret = 1; Gtk->main_quit }),
- if_($cancel_button, gtksignal_connect(new Gtk::Button(N("Cancel")), clicked => sub { Gtk->main_quit })),
- )
- );
- gtkpack($win_about->vbox,
- gtkpng("warning"),
- new Gtk::Label($label),
- );
- $win_about->show_all();
- $win_about->set_modal(1);
- Gtk->main;
- $win_about->destroy();
+ my $window = Gtk2::Dialog->new;
+ $window->set_position('center-on-parent');
+ $window->set_border_width(10);
+
+ gtkpack__($window->action_area,
+ gtkadd(Gtk2::HButtonBox->new,
+ gtksignal_connect(Gtk2::Button->new($cancel_button ? N("OK") : N("Close")), clicked => sub { $ret = 1; Gtk2->main_quit }),
+ if_($cancel_button, gtksignal_connect(Gtk2::Button->new(N("Cancel")), clicked => sub { Gtk2->main_quit })),
+ )
+ );
+ gtkpack($window->vbox,
+ gtkcreate_img("warning"),
+ Gtk2::Label->new($label),
+ );
+ $window->show_all;
+ $window->set_modal(1);
+ Gtk2->main;
+ $window->destroy;
$ret;
}
sub new_dialog {
my ($title) = @_;
- my $window_about = new Gtk::Dialog();
- $window_about->set_position(1);
- $window_about->set_border_width(10);
- $window_about->set_title($title);
- $window_about->action_area->pack_start(gtkadd(new Gtk::HButtonBox,
- gtksignal_connect(new Gtk::Button(N("Close")), "clicked" => sub { $window_about->destroy() })),0,0,0);
- $window_about->set_policy(0, 0, 1);
- $window_about->set_modal(1);
- $window_about;
+ my $dialog = Gtk2::Dialog->new;
+ $dialog->set_transient_for($window_global);
+ $dialog->set_position('center-on-parent');
+ $dialog->set_border_width(10);
+ $dialog->set_title($title);
+ $dialog->action_area->pack_start(gtkadd(Gtk2::HButtonBox->new,
+ gtksignal_connect(Gtk2::Button->new(N("Close")), clicked => sub { $dialog->destroy })),0,0,0);
+ gtkset_modal($dialog, 1);
}
sub more_themes {
my $window_about = new_dialog(N("More themes"));
- my $style1 = $window_about->style->copy();
- $style1->font(Gtk::Gdk::Font->fontset_load(N("-*-helvetica-medium-r-normal-*-20-*-100-100-p-*-iso8859-1,*-r-*")));
+ my $style1 = $window_about->style->copy;
+# $style1->font(Gtk2::Gdk::Font->fontset_load(N("-*-helvetica-medium-r-normal-*-20-*-100-100-p-*-iso8859-1,*-r-*")));
gtkpack_($window_about->vbox,
- 0, gtksetstyle(new Gtk::Label(N("Getting new themes")), $style1),
- 0, gtkadd(gtkset_shadow_type(gtkset_border_width(new Gtk::Frame(N("Additional themes")), 10), 'etched_out'),
- gtkpack(new Gtk::HBox(0, 5),
- N("Get additional themes on www.damz.net"),
- )
- )
- );
- $window_about->show_all();
+ 0, gtksetstyle(Gtk2::Label->new(N("Getting new themes")), $style1),
+ 0, gtkadd(gtkset_shadow_type(gtkset_border_width(Gtk2::Frame->new(N("Additional themes")), 10), 'etched_out'),
+ gtkpack(Gtk2::HBox->new(0, 5),
+ N("Get additional themes on www.damz.net"),
+ )
+ )
+ );
+ $window_about->show_all;
}
sub about_mdk_cc {
my $window_about = new_dialog(N("About - Mandrake Control Center"));
- my $label = new Gtk::Label();
- my $style1 = $label->style->copy();
- $style1->font(Gtk::Gdk::Font->fontset_load(N("-*-helvetica-medium-r-normal-*-20-*-100-100-p-*-iso8859-1,*-r-*")));
- my $clist = new Gtk::CList(3);
- my $i = -1;
- $i++, $clist->append(@$_) foreach ([ N("Authors: "), '', ''],
- [ '', 'Thierry Vignaud', 'tvignaud@mandrakesoft.com'],
- [ '', 'Daouda Lo', 'daouda@mandrakesoft.com'],
- [ '', ''],
- [ N("Old authors: "), '', ''],
- [ '', 'Chmouel Boudjnah', 'original C version'],
- [ '', 'Damien "dam\'s" Krotkine', 'perl version'],
- [ '', 'Yves Duret', 'logdrake integration'],
- [ '', ''],
- [ N("Artwork: "),
-#-PO If your language allows it, use eacute for first "e" and egrave for 2nd.
- N("Helene Durosini"), 'ln@mandrakesoft.com'],
- [ '', 'Anh-Van Nguyen' ,'avnguyen@mandrakesoft.com'],
- );
-
- # Give our translators the ability to show their family and
+ my $tree_model = Gtk2::TreeStore->new(Gtk2::GType->STRING, Gtk2::GType->STRING, Gtk2::GType->STRING);
+ my $list = Gtk2::TreeView->new_with_model($tree_model);
+ each_index { $list->append_column(Gtk2::TreeViewColumn->new_with_attributes(undef, Gtk2::CellRendererText->new, 'text' => $::i)) } 0..2;
+ $list->set_headers_visible(0);
+
+ foreach my $row ([ N("Authors: "), '', '' ],
+ [ '', 'Chmouel Boudjnah', '(original C version' ],
+ [ '', 'Damien "dam\'s" Krotkine', '(perl version)' ],
+ [ '', 'Daouda Lo', '<daouda@mandrakesoft.com>' ],
+ [ '', 'Thierry Vignaud', '<tvignaud@mandrakesoft.com>' ],
+ [ '', 'Yves Duret', '(perl version)' ],
+ [ '', '' ],
+ [ N("Artwork: "), '', '' ],
+ [ '', 'Anh-Van Nguyen', '<avnguyen@mandrakesoft.com>' ],
+#-PO If your language allows it, use eacute for first "e" and egrave for 2nd one.
+ [ '', N("Helene Durosini"), '<ln@mandrakesoft.com>' ],
+ ) {
+ $tree_model->append_set(undef, [ map_index { $::i => $_ } @$row ])->free;
+ }
+
+ # Give our translators the ability to show their family and
# friends that thez participated ...
-#-PO Add your Name here to find it in the About section in your language.
+#-PO Add your Name here to find it in the About section in your language.
my $translator_name = N("~ * ~");
#-PO Add your E-Mail address here if you want to show it in the about doialog.
my $translator_email = N("~ @ ~");
if ($translator_name ne "~ * ~ " && 0) {
- $i++, $clist->append(@$_) foreach ([ '', ''],
- [ N("Translator: "),
- $translator_name, $translator_email],
- );
+ $list->append_set(undef, [ 0 => $_->[0], 1 => $_->[1] ])->free foreach [ '', '' ], [ N("Translator: "), $translator_name, $translator_email ];
}
- $clist->set_selectable($_, 0) foreach 0..$i;
- $clist->columns_autosize();
- $clist->set_column_justification(0, "right");
+ $list->get_selection()->set_mode('none');
gtkpack_($window_about->vbox,
- -r "$themes_dir/$theme/splash_screen_about.png" ?
- (0, gtkpng("splash_screen_about")) : (1, gtksetstyle(new Gtk::Label(N("Mandrake Control Center %s\n", $_version)), $style1),),
- 0, new Gtk::Label(''),
- 0, new Gtk::Label(N("Copyright (C) 2001-2002 Mandrakesoft SA")),
- 0, new Gtk::Label(''),
- 1, $clist,
- );
- $clist->columns_autosize();
- $window_about->show_all();
+ -r "$themes_dir/$theme/splash_screen_about.png" ?
+ (0, gtkcreate_img("splash_screen_about")) : (1, gtkmodify_font(Gtk2::Label->new(N("Mandrake Control Center %s\n", $version)), 'Bold 24'),),
+ 0, Gtk2::Label->new("\n" . N("Copyright (C) 2001-2002 Mandrakesoft SA") . "\n"),
+ 1, $list,
+ );
+ $window_about->show_all;
}
sub connect_to_site {
- my ($link,$help)=@_;
+ my ($link, $help)=@_;
my $browser = $ENV{BROWSER};
my $initial_user = $ENV{INITIAL_USER};
unless ($browser) {
- splash_warning(" ". N("Warning: No browser specified") ." ");
+ splash_warning(" " . N("Warning: No browser specified") . " ");
return;
}
if ($help) {
- fork_("$browser $link &");
+ fork_("$browser $link &");
} else {
- if ($initial_user ne "root" && $initial_user ne undef) {
- fork_("su -m -l $initial_user -c \"$browser $link &\"");
- } else {
- splash_warning(" ".N("Security Warning: I'm not allowed to connect to the internet as root user")." ");
- }
+ if ($initial_user ne "root" && $initial_user ne undef) {
+ fork_("su -m -l $initial_user -c \"$browser $link &\"");
+ } else {
+ splash_warning(" ".N("Security Warning: I'm not allowed to connect to the internet as root user")." ");
+ }
}
}
-sub get_main_menu {
- my ($window) = @_;
- my $menu = ugtk::create_factory_menu($window,
- ({ path => N("/_File"), type => '<Branch>' },
- { path => N("/_File") . N("/_Quit"), accelerator => N("<control>Q"), callback => \&quit_global },
-#-PO Don't remember to translate "_Options" the same way "Options" is (but for the underscore of course)
- { path => N("/_Options"), type => '<Branch>' },
- { path => N("/_Options") . N("/Display _Logs"), type => '<CheckItem>',
- callback => sub {
- $logs = $log_check_box->active;
- update_exp();
- }
- },
- { path => N("/_Options") . N("/_Embedded Mode"), type => '<ToggleItem>',
- callback => sub { $embedded = $embedded_check_box->active }
- },
- if_(all($themes_dir) > 1,
- { path => N("/_Themes"), type => '<Branch>' },
- (map { {path => N("/_Themes") . "/" . ($_ eq $theme ? " O " : " ") . "_$_",
- callback => sub {
- $theme eq $_ and return;
- !$pending_app || splash_warning(N("This action will restart the control center.\nAny change not applied will be lost."), 1) and sig_usr1(), exec "$0 --theme $_";
- }};
- } grep { -d "$themes_dir/$_" } all($themes_dir)),
- { path => N("/_Themes").N("/_More themes"), callback => \&more_themes }),
- { path => N("/_Help"), type => '<Branch>' },
- { path => N("/_Help").N("/_Report Bug"), callback => sub { fork_("drakbug --report drakconf &") } },
- { path => N("/_Help").N("/_About..."), callback => \&about_mdk_cc }
- ));
- my $factory = $menu->{factory};
-#-PO Don't remember to translate "Options" the same way "_Options" is (but without the underscore of course)
- $log_check_box = $factory->get_widget("<main>".N("/Options").N("/Display Logs"));
- $embedded_check_box = $factory->get_widget("<main>".N("/Options").N("/Embedded Mode"));
- return $menu;
-}
-
sub set_page {
my ($index) = @_;
- update_exp;
-# if $still_in_splash_screen;
- $notebook_global->set_page($index);
+ update_exp();
+ $notebook_global->set_current_page($index);
+}
+
+
+
+sub new_pixbuf {
+ my ($pixbuf) = @_;
+ my ($width, $height) = ($pixbuf->get_height, $pixbuf->get_width);
+ my $new_pixbuf = Gtk2::Gdk::Pixbuf->new('rgb', 1, 8, $height, $width);
+ $new_pixbuf->fill(0x00000000); # transparent white
+ $width, $height, $new_pixbuf;
+}
+
+sub render_alpha {
+ my ($pixbuf, $alpha_threshold) = @_;
+ my ($width, $height, $new_pixbuf) = new_pixbuf($pixbuf);
+ $pixbuf->composite($new_pixbuf, 0, 0, $width, $height, 0, 0, 1, 1, 'nearest', $alpha_threshold);
+ $new_pixbuf;
+}
+
+
+sub render_shiner {
+ my ($pixbuf, $shine_value) = @_;
+ my (undef, undef, $new_pixbuf) = new_pixbuf($pixbuf);
+ $pixbuf->saturate_and_pixelate($new_pixbuf, $shine_value, 0);
+ $new_pixbuf;
}
diff --git a/control-center.rc b/control-center.rc
index 74257d4d..1b7d9b55 100644
--- a/control-center.rc
+++ b/control-center.rc
@@ -1,3 +1,28 @@
+# gtkrc -- gtkrc for MCC themes
+#
+# Copyright (C) 2000, 2001 Eazel, Inc.
+#
+# 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 of the
+# License, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# $Id$
+#
+# Authors: Thierry Vignaud <tvignaud@mandrakesoft.com>
+
+
+pixmap_path "/usr/share/mcc/themes/default/"
+
style "any"
{
fontset = "-adobe-helvetica-medium-r-normal--*-120-75-75-p-*-iso8859-*,*-r-*"
@@ -27,6 +52,7 @@ style "any"
}
+
#widget_class "GtkWindow" style "window"
widget_class "*Area*" style "any"
#widget_class "*abel*" style "any"
@@ -41,3 +67,413 @@ widget_class "*Area*" style "any"
#class "GtkRadioButton" style "checkradiobutton"
#class "GtkCheckButton" style "checkradiobutton"
+
+
+
+
+
+# The syntax in the engine sections is a mess. Here are some hints:
+
+# gradient : '{' direction gradient-color-list '}'
+# | '<' INT '>' -- palette ref
+
+# direction : /* nothing */
+# | VERTICAL
+# | HORIZONTAL
+
+# gradient-color-list : color
+# : color ',' gradient-color-list
+# : color '[' weight ']' gradient-color-list
+
+# weight : FLOAT
+# | INT
+
+# color : "#RRGGBB"
+# | '{' FLOAT ',' FLOAT ',' FLOAT '}'
+# | '<' color-ext '>'
+
+# color-ext : STRING -- file in $HOME to read color from
+# | '<' INT '>' -- use indexed palette entry
+# | '<' INT ',' FLOAT '>' -- multiply palette entry
+
+# Default style for all widgets to build from
+style "default"
+{
+ GtkWidget::interior_focus = 0
+ GtkWidget::focus_padding = 0
+ GtkWidegt::focus_line_width = 3
+
+ GtkRange::slider_width = 11
+ GtkRange::stepper_size = 11
+ GtkRange::trough_border = 2
+
+ GtkScale::slider_length = 16
+ GtkCheckButton::indicator_size = 10
+ GtkCheckButton::indicator_spacing = 3
+
+ #GtkMenuBar::shadow_type = GTK_SHADOW_NONE
+ GtkToolBar::shadow_type = GTK_SHADOW_NONE
+ #GtkSpinButton::shadow_type = GTK_SHADOW_NONE
+
+ GtkOptionMenu::indicator_size = { 11, 6 }
+ GtkOptionMenu::indicator_spacing = { 30, 5, 2, 2 }
+
+ fg[NORMAL] = "#000000"
+ fg[ACTIVE] = "#000000"
+ fg[PRELIGHT] = "#000000"
+ fg[SELECTED] = "#ffffff"
+ fg[INSENSITIVE] = "#000000"
+
+ bg[NORMAL] = "#dcdcdc"
+ bg[ACTIVE] = "#ababab"
+ bg[PRELIGHT] = "#f2f2f2"
+ bg[INSENSITIVE] = "#ffffff"
+ bg[SELECTED] = "#0A5F89"
+
+ text[NORMAL] = "#000000"
+ text[ACTIVE] = "#ffffff"
+ text[PRELIGHT] = "#ffffff"
+ text[SELECTED] = "#ffffff"
+ text[INSENSITIVE] = "#ffffff"
+
+ base[NORMAL] = "#ffffff"
+ base[PRELIGHT] = "#ffffff"
+ base[INSENSITIVE] = "#ffffff"
+
+ engine "crux-engine" {
+
+ # The focus/selection color
+ palette[0] = { "#21449c" }
+
+ # The gradient used for recoloring images
+ palette[1] = { "#000000", <0>, "#ffffff" }
+
+ # Used for recolouring inactive images
+ palette[2] = { "#000000", "#888888", "#ffffff" }
+
+ # Set these colors here, so we can just reference the palette
+ bg[SELECTED] = <0>
+ base[SELECTED] = <0>
+
+ focus_color = <0>
+ insensitive_colors = "#636563", "#cecfce"
+
+ # Create the default (only) stock image table. This maps from
+ # identifiers used in the engine to reference image parts to
+ # the actual images, and sets attributes of the images
+ stock
+ {
+ "CHECK" {
+ image = "check-default.png"
+ }
+ "CHECK_FOCUS" {
+ image = "check-default-focus.png"
+ recolor = <1>
+ }
+ "CHECK_HI" {
+ image = "check-hilight.png"
+ }
+ "CHECK_HI_FOCUS" {
+ image = "check-hilight-focus.png"
+ recolor = <1>
+ }
+ "CHECK_PRESSED" {
+ image = "check-pressed.png"
+ }
+ "CHECK_PRESSED_FOCUS" {
+ image = "check-pressed-focus.png"
+ recolor = <1>
+ }
+ "CHECK_DISABLED" {
+ image = "check-insensitive.png"
+ }
+ "CHECK_ACTIVE" {
+ image = "check-active-default.png"
+ }
+ "CHECK_ACTIVE_FOCUS" {
+ image = "check-active-default-focus.png"
+ recolor = <1>
+ }
+ "CHECK_ACTIVE_HI" {
+ image = "check-active-hilight.png"
+ }
+ "CHECK_ACTIVE_HI_FOCUS" {
+ image = "check-active-hilight-focus.png"
+ recolor = <1>
+ }
+ "CHECK_ACTIVE_PRESSED" {
+ image = "check-active-pressed.png"
+ }
+ "CHECK_ACTIVE_PRESSED_FOCUS" {
+ image = "check-active-pressed-focus.png"
+ recolor = <1>
+ }
+ "CHECK_ACTIVE_DISABLED" {
+ image = "check-active-insensitive.png"
+ }
+ "OPTION" {
+ image = "radio-default.png"
+ }
+ "OPTION_FOCUS" {
+ image = "radio-default-focus.png"
+ recolor = <1>
+ }
+ "OPTION_HI" {
+ image = "radio-hilight.png"
+ }
+ "OPTION_HI_FOCUS" {
+ image = "radio-hilight-focus.png"
+ recolor = <1>
+ }
+ "OPTION_PRESSED" {
+ image = "radio-pressed.png"
+ }
+ "OPTION_PRESSED_FOCUS" {
+ image = "radio-pressed-focus.png"
+ recolor = <1>
+ }
+ "OPTION_DISABLED" {
+ image = "radio-insensitive.png"
+ }
+ "OPTION_ACTIVE" {
+ image = "radio-active-default.png"
+ }
+ "OPTION_ACTIVE_FOCUS" {
+ image = "radio-active-default-focus.png"
+ recolor = <1>
+ }
+ "OPTION_ACTIVE_HI" {
+ image = "radio-active-hilight.png"
+ }
+ "OPTION_ACTIVE_HI_FOCUS" {
+ image = "radio-active-hilight-focus.png"
+ recolor = <1>
+ }
+ "OPTION_ACTIVE_PRESSED" {
+ image = "radio-active-pressed.png"
+ }
+ "OPTION_ACTIVE_PRESSED_FOCUS" {
+ image = "radio-active-pressed-focus.png"
+ recolor = <1>
+ }
+ "OPTION_ACTIVE_DISABLED" {
+ image = "radio-active-insensitive.png"
+ }
+ "H_TROUGH" {
+ image = "scroller-h-trough.png"
+ border = { 28, 28, 2, 2 }
+ }
+ "V_TROUGH" {
+ image = "scroller-v-trough.png"
+ border = { 2, 2, 28, 28 }
+ }
+ "ARROW_UP" {
+ image = "scroller-arrow-up.png"
+ }
+ "ARROW_UP_HI" {
+ image = "scroller-arrow-up-hilight.png"
+ }
+ "ARROW_UP_ACTIVE" {
+ image = "scroller-arrow-up-pressed.png"
+ }
+ "ARROW_DOWN" {
+ image = "scroller-arrow-down.png"
+ }
+ "ARROW_DOWN_HI" {
+ image = "scroller-arrow-down-hilight.png"
+ }
+ "ARROW_DOWN_ACTIVE" {
+ image = "scroller-arrow-down-pressed.png"
+ }
+ "ARROW_RIGHT" {
+ image = "scroller-arrow-right.png"
+ }
+ "ARROW_RIGHT_HI" {
+ image = "scroller-arrow-right-hilight.png"
+ }
+ "ARROW_RIGHT_ACTIVE" {
+ image = "scroller-arrow-right-pressed.png"
+ }
+ "ARROW_LEFT" {
+ image = "scroller-arrow-left.png"
+ }
+ "ARROW_LEFT_HI" {
+ image = "scroller-arrow-left-hilight.png"
+ }
+ "ARROW_LEFT_ACTIVE" {
+ image = "scroller-arrow-left-pressed.png"
+ }
+ "H_SCROLLBAR" {
+ image = "scroller-h.png"
+ border = { 3, 3, 1, 1 }
+ recolor = <1>
+ }
+ "H_SCROLLBAR_HI" {
+ image = "scroller-h-hilight.png"
+ border = { 3, 3, 1, 1 }
+ recolor = <1>
+ }
+ "H_SCROLLBAR_INACTIVE" {
+ image = "scroller-h.png"
+ border = { 3, 3, 1, 1 }
+ recolor = <2>
+ }
+ "H_SCROLLBAR_THUMB" {
+ image = "scroller-h-thumb.png"
+ recolor = <1>
+ }
+ "H_SCROLLBAR_THUMB_HI" {
+ image = "scroller-h-thumb-hilight.png"
+ recolor = <1>
+ }
+ "H_SCROLLBAR_THUMB_INACTIVE" {
+ image = "scroller-h-thumb.png"
+ recolor = <2>
+ }
+ "V_SCROLLBAR" {
+ image = "scroller-v.png"
+ border = { 1, 1, 3, 3 }
+ recolor = <1>
+ }
+ "V_SCROLLBAR_HI" {
+ image = "scroller-v-hilight.png"
+ border = { 1, 1, 3, 3 }
+ recolor = <1>
+ }
+ "V_SCROLLBAR_INACTIVE" {
+ image = "scroller-v.png"
+ border = { 1, 1, 3, 3 }
+ recolor = <2>
+ }
+ "V_SCROLLBAR_THUMB" {
+ image = "scroller-v-thumb.png"
+ recolor = <1>
+ }
+ "V_SCROLLBAR_THUMB_HI" {
+ image = "scroller-v-thumb-hilight.png"
+ recolor = <1>
+ }
+ "V_SCROLLBAR_THUMB_INACTIVE" {
+ image = "scroller-v-thumb.png"
+ recolor = <2>
+ }
+ "PROGRESS_BAR" {
+ image = "progressbar.png"
+ border = { 4, 4, 1, 1 }
+ recolor = <1>
+ }
+ "PROGRESS_BAR_LEFT" {
+ image = "progressbar-left.png"
+ }
+ "PROGRESS_BAR_RIGHT" {
+ image = "progressbar-right.png"
+ border = { 0, 0, 2, 0 }
+ }
+ "PROGRESS_BAR_INACTIVE" {
+ image = "progressbar.png"
+ border = { 4, 4, 1, 1 }
+ recolor = <2>
+ }
+ "PROGRESS_TROUGH" {
+ image = "progressbar_trough.png"
+ border = { 6, 4, 6, 4 }
+ }
+ "H_SLIDER_THUMB" {
+ image = "slider_h_thumb.png"
+ border = { 4, 4, 1, 1 }
+ recolor = <1>
+ }
+ "H_SLIDER_THUMB_INACTIVE" {
+ image = "slider_h_thumb.png"
+ border = { 4, 4, 1, 1 }
+ recolor = <2>
+ }
+ "H_SLIDER_TROUGH" {
+ image = "slider_h_trough.png"
+ border = { 6, 6, 0, 0 }
+ }
+ "H_SLIDER_TROUGH_ACTIVE" {
+ image = "slider_h_trough_focus.png"
+ border = { 6, 6, 0, 0 }
+ recolor = <1>
+ }
+ "V_SLIDER_THUMB" {
+ image = "slider_v_thumb.png"
+ border = { 1, 1, 4, 4 }
+ recolor = <1>
+ }
+ "V_SLIDER_THUMB_INACTIVE" {
+ image = "slider_v_thumb.png"
+ border = { 1, 1, 4, 4 }
+ recolor = <2>
+ }
+ "V_SLIDER_TROUGH" {
+ image = "slider_v_trough.png"
+ border = { 0, 0, 6, 6 }
+ }
+ "V_SLIDER_TROUGH_ACTIVE" {
+ image = "slider_v_trough_focus.png"
+ border = { 0, 0, 6, 6 }
+ recolor = <1>
+ }
+ "TAB_TOP" {
+ image = "tab_usel.png"
+ border = { 4, 4, 10, 5 }
+ }
+ "TAB_TOP_LEFT" {
+ image = "tab_usel-left.png"
+ border = { 4, 4, 10, 5 }
+ }
+ "TAB_TOP_ACTIVE" {
+ image = "tab_sel.png"
+ border = { 4, 14, 10, 5 }
+ }
+ "TAB_BOTTOM" {
+ image = "tab_usel-bottom.png"
+ border = { 4, 4, 10, 5 }
+ }
+ "TAB_BOTTOM_LEFT" {
+ image = "tab_usel-bottom-left.png"
+ border = { 4, 4, 10, 5 }
+ }
+ "TAB_BOTTOM_ACTIVE" {
+ image = "tab_sel-bottom.png"
+ border = { 4, 4, 10, 5 }
+ }
+ "SPIN_ARROW_UP" {
+ image = "arrow_up-spinner.png"
+ }
+ "SPIN_ARROW_DOWN" {
+ image = "arrow_down-spinner.png"
+ }
+ }
+ }
+}
+
+# common default
+#class "GtkWidget" style "default"
+
+
+
+# MCC right icons: keep parent background on transparent parts
+style "eventbox"
+{
+ # Causes the parent-relative feature of gdk_window_set_back_pixmap ()
+ # to be used.
+ bg_pixmap[NORMAL] = "<parent>"
+ bg_pixmap[INSENSITIVE] = "<parent>"
+ bg_pixmap[PRELIGHT] = "<parent>"
+ bg_pixmap[SELECTED] = "<parent>"
+ bg_pixmap[ACTIVE] = "<parent>"
+ engine "crux-engine" {}
+}
+
+# Ensure that there are no holes in tool bars, etc..
+class "GtkEventBox" style "eventbox"
+class "GtkSocket" style "eventbox"
+#class "GtkNotebook" style "eventbox"
+
+
+# These don't work right with GTK2, ends up drawing black
+#class "GtkPlug" style "eventbox"
+
diff --git a/drakconf.spec b/drakconf.spec
index 2ad9e5cb..a9347530 100644
--- a/drakconf.spec
+++ b/drakconf.spec
@@ -1,39 +1,38 @@
# Changed by Makefile of cvs.
# do not edit here, but in cvs/soft/control-center
-Summary: The Mandrake Control Center
-Name: drakconf
-Version: 9.1
-Release: 0.3mdk
+Summary: The Mandrake Control Center
+Name: drakconf
+Version: 9.1
+Release: 0.4mdk
# get the source from our cvs repository (see
# http://www.linuxmandrake.com/en/cvs.php3)
-Source0: %name-%version.tar.bz2
-Source1: drakconf16.png.bz2
-Source2: drakconf32.png.bz2
-Source3: drakconf48.png.bz2
-License: GPL
-Group: System/Configuration/Other
-Url: http://www.mandrakelinux.com/en/cvs.php3
-Obsoletes: DrakConf
-Provides: DrakConf
+Source0: %name-%version.tar.bz2
+Source1: drakconf16.png.bz2
+Source2: drakconf32.png.bz2
+Source3: drakconf48.png.bz2
+License: GPL
+Group: System/Configuration/Other
+Url: http://www.mandrakelinux.com/en/cvs.php3
+Obsoletes: DrakConf
+Provides: DrakConf
BuildRequires: gettext
-Requires: mandrake-release, drakxtools >= 1.1.12-2mdk, gtk+mdk >= 0.1.6-10mdk
-Requires: menudrake >= 0.6.5-2mdk, harddrake-ui >= 1.1.8-16mdk
-Requires: perl-GTK, perl-GTK-GdkImlib, usermode
-Requires: popt >= 1.6.3-9mdk
-Requires: XFree86-100dpi-fonts
-Requires: rxvt, drakcronat >= 0.1.2-9mdk, draksec >= 0.1-4mdk, perl-GTK-GdkPixbuf, userdrake
-BuildRoot: %_tmppath/%name-%version-buildroot
+Requires: mandrake-release, drakxtools >= 9.1-0.4mdk
+#gtk+mdk >= 0.1.6-10mdk
+Requires: harddrake-ui >= 9.1-0.4mdk, popt >= 1.6.3-9mdk, usermode
+Requires: perl-GTK2, gtk-engines2, XFree86-100dpi-fonts
+Requires: drakcronat >= 0.1.2-9mdk, draksec >= 0.1-4mdk, menudrake >= 0.6.5-2mdk, rxvt, userdrake
+BuildRoot: %_tmppath/%name-%version-buildroot
%description
drakconf includes the Mandrake Control Center which is an interface to
multiple utilities from DrakXtools.
%package themes
-Summary: Mandrake Control Center Themes
-Release: %{release}plf
-Requires: drakconf >= %version
-Group: System/Configuration/Other
+Summary: Mandrake Control Center Themes
+Release: %{release}plf
+Requires: drakconf >= %version
+Group: System/Configuration/Other
%description themes
This package contains fancy themes for the standard Mandrake Control
@@ -109,6 +108,10 @@ rm -rf $RPM_BUILD_ROOT
%_datadir/mcc/themes/kde
%changelog
+* Thu Dec 19 2002 Thierry Vignaud <tvignaud@mandrakesoft.com> 9.1-0.4mdk
+- gtk+2 port
+- lot of cleaning
+
* Wed Nov 27 2002 Thierry Vignaud <tvignaud@mandrakesoft.com> 9.1-0.3mdk
- fix bad side effect of c-z by using a wrapper
- make mcc more robust against embeded prog crashes