From 89a0b8ea361cfbb76ab7134bbde229ddc26aa385 Mon Sep 17 00:00:00 2001 From: Till Kamppeter Date: Thu, 20 Oct 2005 14:05:54 +0000 Subject: - Updated printerdrake to the state of Mandriva 2006: o HPLIP support o Gutenprint support o support for several other new drivers o Printer communication error handling o Main window of printerdrake comes up faster o Many bug fixes and detail improvements --- perl-install/standalone/printerdrake | 284 ++++++++++++++++++++++------------- 1 file changed, 180 insertions(+), 104 deletions(-) (limited to 'perl-install/standalone/printerdrake') diff --git a/perl-install/standalone/printerdrake b/perl-install/standalone/printerdrake index f6965dfbf..bb01d456f 100755 --- a/perl-install/standalone/printerdrake +++ b/perl-install/standalone/printerdrake @@ -1,9 +1,9 @@ #!/usr/bin/perl # -# Copyright (C) 2003-2004 MandrakeSoft +# Copyright (C) 2003-2005 Mandriva # -# Till Kamppeter -# Daouda Lo +# Till Kamppeter +# Daouda Lo # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License Version 2 as @@ -20,6 +20,11 @@ # use strict; + +# i18n: IMPORTANT: to get correct namespace (printerdrake instead of +# libDrakX) +BEGIN { unshift @::textdomains, 'drakconf' } + use lib qw(/usr/lib/libDrakX); use standalone; @@ -37,64 +42,55 @@ use Gtk2::Gdk::Keysyms; use modules; use c; -my $companyname = "Mandrakesoft"; -my $distroname = "Mandrakelinux"; -my $domainname = "mandrakesoft.com"; +my %sysh = distrib(); +my $distroname = $sysh{system}; + +my $domainname = "mandriva.com"; my $pixdir = '/usr/share/libDrakX/pixmaps/'; +my $refreshinterval = 5; + local $_ = join '', @ARGV; my $printer; +$ugtk2::wm_icon = "printerdrake"; my $in = 'interactive'->vnew('su', if_(!$::isEmbedded, 'printer-mdk')); my $commandline = $_; -exit 0 unless printer::printerdrake::first_time_dialog($printer, $in); +# Suppress some wait messages to avoid windows popping up if no new print +# queue has to be set up +$commandline =~ /-onlyautoqueue/ and $::autoqueue = 1; # Data structure for GTK2 main window my $us = {}; -$us->{VERSION} = '0.1'; - -# GTK2 splash screen -my $window_splash; -if (0 && !$::isInstall && !$::isEmbedded) { - $window_splash = Gtk2::Window->new('popup'); -#BUG $window_splash->signal_connect(delete_event => \&quit_global); - $window_splash->set_title(N("Printerdrake") . $us->{VERSION}); - $window_splash->set_position('center_always'); - $window_splash->add(gtkadd(gtkset_shadow_type(Gtk2::Frame->new, 'etched_out'), - gtkpack(Gtk2::VBox->new(0, 0), - gtkcreate_img("$pixdir/about.png"), - Gtk2::Label->new(N("Loading printer configuration... Please wait")) - ) - ) - ); - $window_splash->show_all; - gtkflush(); -} - -#my $wait = $in->wait_message(N("Please wait"), -# N("Loading printer configuration... ")); -#gtkflush(); +$us->{VERSION} = '2006'; # Check whether Foomatic is installed and install it if necessary #printer::printerdrake::install_foomatic($in); -my $w = $in->wait_message(N("Printerdrake"), - N("Reading data of installed printers...")); +my $w = $::autoqueue || + $in->wait_message(N("Printerdrake"), + N("Reading data of installed printers...")); # Get what was installed before eval { $printer = printer::main::getinfo('') }; +undef $w; + +exit 0 unless printer::printerdrake::first_time_dialog($printer, $in, undef); + # Were we in expert mode last time? $printer->{expert} = printer::main::get_usermode(); # Choose the spooler by command line options -$commandline =~ /-expert/ and $printer->{expert} = 1; +$::expert and $printer->{expert} = 1; $commandline =~ /-cups/ and $printer->{SPOOLER} = 'cups' and printer::main::read_configured_queues($printer); +$commandline =~ /-rcups/ and + $printer->{SPOOLER} = 'rcups' and printer::main::read_configured_queues($printer); $commandline =~ /-lpr/ and $printer->{SPOOLER} = 'lpd' and printer::main::read_configured_queues($printer); $commandline =~ /-lpd/ and @@ -103,29 +99,32 @@ $commandline =~ /-lprng/ and $printer->{SPOOLER} = 'lprng' and printer::main::read_configured_queues($printer); $commandline =~ /-pdq/ and $printer->{SPOOLER} = 'pdq' and printer::main::read_configured_queues($printer); --r '/etc/modules.conf' and modules::mergein_conf('/etc/modules.conf'); - -undef $w; if ($::isInstall) { # Interactive main window for installation - printer::printerdrake::main($printer, $in, 1); + printer::printerdrake::main($printer, $::o->{security}, $in, 1, undef); exit(); } +require security::level; +my $security = security::level::get(); + # Do not let printerdrake ask for the spooler $printer->{SPOOLER} ||= 'cups'; # Initialization -printer::printerdrake::init($printer, $in); +printer::printerdrake::init($printer, $security, $in, undef); + +# Stop here when we are supposed to only automatically set up print queues +$commandline =~ /-onlyautoqueue/ and exit 0; # GTK2 main window -my $error = 0; my $stringsearch = ''; -sub HelpSystem() { exec("drakhelp --id printerdrake") unless fork() }; +sub HelpSystem() { exec("drakhelp --id printerdrake") unless fork() } +$::noborderWhenEmbedded = 1; $us->{wnd} = ugtk2->new(N("%s Printer Management Tool", $distroname) . " " . $us->{VERSION}); gtkset_size_request($us->{wnd}{rwindow}, 660, 460); @@ -133,13 +132,14 @@ if (!$::isEmbedded) { $us->{wnd}{rwindow}->set_position('center'); } $us->{wnd}{window}->signal_connect(delete_event => \&QuitGlobal); -my $ltree_model = Gtk2::ListStore->new("Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String"); -my $rtree_model = Gtk2::ListStore->new("Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String"); +my $ltree_model = Gtk2::ListStore->new("Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String"); +my $rtree_model = Gtk2::ListStore->new("Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String", "Glib::String"); my ($localtree, $remotetree); $localtree = CreateTree($ltree_model); $remotetree = CreateTree($rtree_model); # slightly verbatimed from control-center my %options = ( + 'add' => [ N("/_Actions"), N("/_Add Printer") ], 'default' => [ N("/_Actions"), N("/Set as _Default") ], 'edit' => [ N("/_Actions"), N("/_Edit") ], 'delete' => [ N("/_Actions"), N("/_Delete") ], @@ -168,19 +168,18 @@ my ($menu, $factory) = create_factory_menu($::isEmbedded ? $::Plug : $us->{wnd}{ %printer::main::thedb = (); }, undef, '' ], + [ N("/_Options") . N("/Configure _Auto Administration"), undef, \&ConfigAutoAdmin, undef, '', 'gtk-autoadmin' ], [ N("/_Help"), undef, undef, undef, '' ], if_(-x "/usr/sbin/drakhelp_inst", - [ N("/_Help").N("/_Help"), undef, sub { HelpSystem() }, undef, '', 'gtk-help' ], + [ N("/_Help") . N("/_Help"), undef, sub { HelpSystem() }, undef, '', 'gtk-help' ], ), if_(!-e "/etc/sysconfig/oem", - [ N("/_Help").N("/_Report Bug"), undef, sub { system("$ENV{BROWSER} https://qa.$domainname &") }, undef, '', 'gtk-stop' ], + [ N("/_Help") . N("/_Report Bug"), undef, sub { system("$ENV{BROWSER} https://qa.$domainname &") }, undef, '', 'gtk-stop' ], ), - [ N("/_Help").N("/_About..."), undef, \&About, undef, '', 'gtk-preferences' ] + [ N("/_Help") . N("/_About..."), undef, \&About, undef, '', 'gtk-preferences' ] ) ); -%buttorcheck = map { - $_ => $factory->get_widget("
" . join '', map { s/_//; $_ } @{$options{$_}}) -}('default', 'edit', 'delete', 'expert'); +%buttorcheck = map { $_ => $factory->get_widget("
" . join '', map { s/_//; $_ } @{$options{$_}}) } ('add', 'default', 'edit', 'delete', 'expert'); if (defined $buttorcheck{expert}) { $buttorcheck{expert}->set_active($printer->{expert}); @@ -194,80 +193,100 @@ my $searchBox = gtkpack_(Gtk2::HBox->new(0,5), 1, Gtk2::Label->new(""), 0, Gtk2::Label->new(N("Search:")), 0, gtksignal_connect($filter = Gtk2::Entry->new, - key_press_event => sub { $_[1]->keyval == $Gtk2::Gdk::Keysyms{Return} and Refresh($filter->get_text) }), + key_press_event => sub { $_[1]->keyval == $Gtk2::Gdk::Keysyms{Return} and do { $stringsearch = $filter->get_text; Refresh($stringsearch) };}), 0, my $fbut = Gtk2::Button->new(N("Apply filter")), ); gtkappend_page(my $nb = Gtk2::Notebook->new, gtkpack(create_scrolled_window($localtree)), gtkshow(Gtk2::Label->new(N("Configured on this machine")))); gtkappend_page($nb, gtkpack(create_scrolled_window($remotetree)), gtkshow(Gtk2::Label->new(N("Configured on other machines")))); $nb->set_show_border(0); + +my @extra_widgets; +if ($::isEmbedded) { + push @extra_widgets, 0, Gtk2::Banner->new("/usr/share/mcc/themes/default/printer-mcc-mdk.png", + #-PO: do not translate, this is already translated in mcc + translate("Printers")); +} + $us->{wnd}{window}->add(gtkpack_(Gtk2::VBox->new(0, 0), 0, $menu, + @extra_widgets, 0, $toolb, 0, $searchBox, 0, Gtk2::HSeparator->new, 1, $nb)); -my @lcolsize = (1, 1, 1, 1, 1, 1, -1); -my @rcolsize = (1, 1, 1, 1, 1, -1); +my @lcolsize = (1, 1, 1, 1, 1, 1, 1, -1); +my @rcolsize = (1, 1, 1, 1, 1, 1, -1); each_index { my $col = Gtk2::TreeViewColumn->new_with_attributes($_, Gtk2::CellRendererText->new, 'text' => $::i); $col->set_sort_column_id($::i); $col->set_min_width($lcolsize[$::i]); $localtree->append_column($col); -} (N("Def."), N("Printer Name"), N("Model"), N("Connection Type"), N("Description"), N("Location")); +} (N("Def."), N("Printer Name"), N("State"), N("Model"), N("Connection Type"), N("Description"), N("Location")); each_index { my $col = Gtk2::TreeViewColumn->new_with_attributes($_, Gtk2::CellRendererText->new, 'text' => $::i); $col->set_sort_column_id($::i); $col->set_min_width($rcolsize[$::i]); $remotetree->append_column($col); -} (N("Def."), N("Printer Name"), N("Server Name"), N("Description"), N("Location")); +} (N("Def."), N("Printer Name"), N("State"), N("Server Name"), N("Description"), N("Location")); my @toolbwg = map { $toolb->append_item($_->[0], $_->[1], $_->[2], Gtk2::Image->new_from_file($pixdir . $_->[2] . '.png'), $_->[3], $toolb); # $toolb->append_space; -#-PO "Add Printer" is a button text and the translation has to be AS SHORT AS POSSIBLE -} ( [ N("Add Printer"), N("Add a new printer to the system"), 'printer_add', \&AddPrinter ], -#-PO "Set as default" is a button text and the translation has to be AS SHORT AS POSSIBLE - [ N("Set as default"), N("Set selected printer as the default printer"), 'printer_default', \&SetAsDefault ], -#-PO "Edit" is a button text and the translation has to be AS SHORT AS POSSIBLE - [ N("Edit"), N("Edit selected printer"), 'printer_conf', \&Edit ], -#-PO "Delete" is a button text and the translation has to be AS SHORT AS POSSIBLE - [ N("Delete"), N("Delete selected printer"), 'printer_del', \&Delete ], -#-PO "Refresh" is a button text and the translation has to be AS SHORT AS POSSIBLE - [ N("Refresh"), N("Refresh the list"), 'refresh', sub { Refresh($stringsearch) } ], -#-PO "Configure CUPS" is a button text and the translation has to be AS SHORT AS POSSIBLE - [ N("Configure CUPS"), N("Configure CUPS printing system"), 'cups_config', \&ConfigCUPS ] +} ([ + # FIXME: then "add printer" should be a simple verb as suggested in Human Guidelines!!! + #-PO: "Add Printer" is a button text and the translation has to be AS SHORT AS POSSIBLE + N("Add Printer"), N("Add a new printer to the system"), 'printer_add', \&AddPrinter ], + [ + #-PO: "Set as default" is a button text and the translation has to be AS SHORT AS POSSIBLE + N("Set as default"), N("Set selected printer as the default printer"), 'printer_default', \&SetAsDefault ], + [ + #-PO: "Edit" is a button text and the translation has to be AS SHORT AS POSSIBLE + N("Edit"), N("Edit selected printer"), 'printer_conf', \&Edit ], + [ + #-PO: "Delete" is a button text and the translation has to be AS SHORT AS POSSIBLE + N("Delete"), N("Delete selected printer"), 'printer_del', \&Delete ], + [ + #-PO: "Refresh" is a button text and the translation has to be AS SHORT AS POSSIBLE + N("Refresh"), N("Refresh the list"), 'refresh', sub { Refresh($stringsearch) } ], + [ + #-PO: "Configure CUPS" is a button text and the translation has to be AS SHORT AS POSSIBLE + N("Configure CUPS"), N("Configure CUPS printing system"), 'cups_config', \&ConfigCUPS ] ); -my ($_tbadd, $tbdefault, $tbedit, $tbdel, $_tbref, $_tbconfig) = @toolbwg; +my ($tbadd, $tbdefault, $tbedit, $tbdel, $_tbref, $_tbconfig) = @toolbwg; GrayDelEdit(); +foreach ($tbadd, $buttorcheck{add}) { defined $_ and $_->set_sensitive($printer->{SPOOLER} ne "rcups") } +$localtree->parent->parent->set_sensitive($printer->{SPOOLER} ne "rcups"); +$nb->set_current_page(1) if $printer->{SPOOLER} eq "rcups"; $fbut->signal_connect('clicked', sub { $stringsearch = $filter->get_text; Refresh($stringsearch) }); Refresh($stringsearch); $nb->signal_connect('switch-page' => sub { NotebookSwitch() }); $us->{wnd}{rwindow}->show_all; set_selection($printer->{DEFAULT}); -#undef $wait; -if (0 && !$::isInstall && !$::isEmbedded) { - $window_splash->destroy; - undef $window_splash; -} gtkset_mousecursor_normal(); # Prevent subwindows to embed themselves in the mcc which has already the # main window embedded +my $isEmbedded = $::isEmbedded; local $::isEmbedded = 0; -Gtk2->main; +# Auto refresh +my $refreshing = 0; +Glib::Timeout->add($refreshinterval * 1000, + sub { Refresh($stringsearch); 1 }); + +$us->{wnd}->main; ugtk2->exit; sub GrayDelEdit() { - foreach ($tbdefault, $tbedit, $tbdel, $buttorcheck{default}, $buttorcheck{edit}, $buttorcheck{delete}) { defined $_ and $_->set_sensitive(0) }; + foreach ($tbdefault, $tbedit, $tbdel, $buttorcheck{default}, $buttorcheck{edit}, $buttorcheck{delete}) { defined $_ and $_->set_sensitive(0) } } sub TreeUnselect { my $treev = shift; $treev->get_selection->unselect_all; - GrayDelEdit() + GrayDelEdit(); } sub NotebookSwitch() { TreeUnselect($localtree); @@ -276,38 +295,48 @@ sub NotebookSwitch() { } sub RefreshLocalPrintersFull { - my ($strfilt) = @_; + my ($strfilt, @allprinters) = @_; my @printers; defined $printer and @printers = keys %{$printer->{configured}}; $ltree_model->clear; + return if $printer->{SPOOLER} eq "rcups"; my @LocalReal; - LOOP: foreach my $p (@printers) { + foreach my $p (@printers) { # Apply string search to all fields, not only the printer name + my $state = ($printer->{SPOOLER} !~ /cups/ ? N("Unknown") : + ((any { + ($_->{queuename} eq $p) && + ($_->{state} eq "enabled"); + } @allprinters) ? N("Enabled") : N("Disabled"))); my $connect = printer::main::connectionstr($printer->{configured}{$p}{queuedata}{connect}); my $model = $printer->{configured}{$p}{queuedata}{make} . ' ' . $printer->{configured}{$p}{queuedata}{model}; my $description = $printer->{configured}{$p}{queuedata}{desc}; my $location = $printer->{configured}{$p}{queuedata}{loc}; - my $searchstr = "$p|$model|$connect|$description|$location"; - push(@LocalReal, $p) if $searchstr =~ /\Q$strfilt/i; - }; + my $searchstr = "$p|$state|$model|$connect|$description|$location"; + push(@LocalReal, $p) if !$strfilt || ($searchstr =~ /\Q$strfilt/i); + } foreach my $p (sort { lc($a) cmp lc($b) } @LocalReal) { + my $state = ($printer->{SPOOLER} !~ /cups/ ? N("Unknown") : + ((any { + ($_->{queuename} eq $p) && + ($_->{state} eq "enabled"); + } @allprinters) ? N("Enabled") : N("Disabled"))); my $connect = printer::main::connectionstr($printer->{configured}{$p}{queuedata}{connect}); my $description = $printer->{configured}{$p}{queuedata}{desc}; my $location = $printer->{configured}{$p}{queuedata}{loc}; my $model = $printer->{configured}{$p}{queuedata}{make} . ' ' . $printer->{configured}{$p}{queuedata}{model}; my $default = ($p eq $printer->{DEFAULT} ? "X" : ""); - $ltree_model->append_set([ 0 => $default, 1 => $p, 2 => $model, - 3 => $connect, 4 => $description, - 5 => $location ]); + $ltree_model->append_set([ 0 => $default, 1 => $p, 2 => $state, + 3 => $model, + 4 => $connect, 5 => $description, + 6 => $location ]); } } sub RefreshRemotePrintersFull { - my ($strfilt) = @_; - my @printers; - defined $printer and @printers = printer::cups::lpstat_lpv(); + my ($strfilt, @printers) = @_; $rtree_model->clear; my @RemoteReal; LOOP: foreach my $p (@printers) { @@ -315,38 +344,50 @@ sub RefreshRemotePrintersFull { next LOOP if defined($printer->{configured}{$p->{queuename}}); # Apply string search to all fields, not only the printer name my $queue = $p->{queuename}; - my $server = $p->{ipp}; + my $state = ($p->{state} eq "enabled" ? + N("Enabled") : N("Disabled")); + my $server = $p->{ipp} || $printer->{remote_cups_server}; my $description = $p->{description}; my $location = $p->{location}; - my $searchstr = "$queue|$server|$description|$location"; + my $searchstr = "$queue|$state|$server|$description|$location"; # All remaining to which the search term applies - push(@RemoteReal, $p) if $searchstr =~ /\Q$strfilt/i; - }; + push(@RemoteReal, $p) if !$strfilt || ($searchstr =~ /\Q$strfilt/i); + } foreach my $p (sort { lc($a->{queuename}) cmp lc($b->{queuename}) } @RemoteReal) { my $queue = $p->{queuename}; - my $server = $p->{ipp}; + my $state = ($p->{state} eq "enabled" ? + N("Enabled") : N("Disabled")); + my $server = $p->{ipp} || $printer->{remote_cups_server}; my $description = $p->{description}; my $location = $p->{location}; my $default = ($queue eq $printer->{DEFAULT} ? "X" : ""); $rtree_model->append_set([ 0 => $default, 1 => $queue, - 2 => $server, 3 => $description, - 4 => $location ]); + 2 => $state, 3 => $server, + 4 => $description, + 5 => $location ]); } } sub Refresh { + # Do not have ourselves recalled if we are already running + return if $refreshing; + $refreshing = 1; my ($strfilt) = @_; my $selection = get_selection(); - RefreshLocalPrintersFull($strfilt); - RefreshRemotePrintersFull($strfilt); + printer::services::wait_for_cups() if ($printer->{SPOOLER} eq "cups"); + my @printers; + defined $printer and @printers = printer::cups::lpstat_lpv(); + RefreshLocalPrintersFull($strfilt, @printers); + RefreshRemotePrintersFull($strfilt, @printers); GrayDelEdit(); set_selection($selection); + $refreshing = 0; } sub AddPrinter() { deactivate_mainwindow(); - if (printer::printerdrake::add_printer($printer, $in)) { + if (printer::printerdrake::add_printer($printer, $in, undef)) { Refresh($stringsearch); set_selection($printer->{QUEUE}); } else { @@ -390,7 +431,17 @@ sub Delete() { sub ConfigCUPS() { deactivate_mainwindow(); - printer::printerdrake::config_cups($printer, $in); + printer::printerdrake::config_cups($printer, $security, $in, undef); + foreach ($tbadd, $buttorcheck{add}) { defined $_ and $_->set_sensitive($printer->{SPOOLER} ne "rcups") } + $localtree->parent->parent->set_sensitive($printer->{SPOOLER} ne "rcups"); + $nb->set_current_page(1) if $printer->{SPOOLER} eq "rcups"; + Refresh($stringsearch); + activate_mainwindow(); +} + +sub ConfigAutoAdmin() { + deactivate_mainwindow(); + printer::printerdrake::config_auto_admin($printer, $in); Refresh($stringsearch); activate_mainwindow(); } @@ -398,7 +449,6 @@ sub ConfigCUPS() { sub deactivate_mainwindow() { $us->{wnd}{rwindow}->set_sensitive(0); gtkset_mousecursor_wait(); - $error = 0; } sub activate_mainwindow() { @@ -470,7 +520,7 @@ sub GetNameEntFromIter { my (undef, $iter) = $tree->get_selection->get_selected; return undef if !defined($iter); my $name = $model->get($iter, $rank); - $name + $name; } sub CreateTree { @@ -479,18 +529,39 @@ sub CreateTree { $tree->get_selection->set_mode('browse'); $tree->set_headers_visible(1); $tree->set_rules_hint(1); - $tree->get_selection->signal_connect('changed' => sub { foreach ($tbdefault, $tbedit, $tbdel, $buttorcheck{default}, $buttorcheck{edit}, $buttorcheck{delete}) { $_->set_sensitive(1) } }); + $tree->get_selection->signal_connect('changed' => sub { + my (undef, $_event) = @_; + my (undef, $iter) = $tree->get_selection->get_selected; + return unless $iter; + foreach ($tbdefault, $tbedit, $tbdel, $buttorcheck{default}, $buttorcheck{edit}, $buttorcheck{delete}) { $_->set_sensitive(1) } + my $queue = $tree_model->get($iter, 1); + if (!defined($printer->{configured}{$queue})) { + foreach ($tbdel, $buttorcheck{delete}) { + $_->set_sensitive(0); + } + } + if ($queue eq $printer->{DEFAULT}) { + foreach ($tbdefault, $buttorcheck{default}) { + $_->set_sensitive(0); + } + } + }); $tree->signal_connect(button_press_event => sub { my (undef, $event) = @_; my (undef, $iter) = $tree->get_selection->get_selected; return unless $iter; - foreach ($tbdefault, $tbedit, $tbdel, $buttorcheck{default}, $buttorcheck{edit}, $buttorcheck{delete}) { $_->set_sensitive(1) }; + foreach ($tbdefault, $tbedit, $tbdel, $buttorcheck{default}, $buttorcheck{edit}, $buttorcheck{delete}) { $_->set_sensitive(1) } my $queue = $tree_model->get($iter, 1); if (!defined($printer->{configured}{$queue})) { foreach ($tbdel, $buttorcheck{delete}) { $_->set_sensitive(0); } } + if ($queue eq $printer->{DEFAULT}) { + foreach ($tbdefault, $buttorcheck{default}) { + $_->set_sensitive(0); + } + } Edit() if $event->type eq '2button-press'; }); $tree->signal_connect(key_press_event => sub { @@ -499,13 +570,13 @@ sub CreateTree { return unless $iter; Edit() if $event->keyval == $Gtk2::Gdk::Keysyms{Return}; }); - $tree + $tree; } sub NewDialog { my ($title, $o_no_button) = @_; my $dialog = gtkset_border_width(Gtk2::Dialog->new, 10); - $dialog->set_transient_for($us->{wnd}{rwindow}); + $dialog->set_transient_for($us->{wnd}{real_window}); $dialog->set_position('center-on-parent'); $dialog->set_title($title); $dialog->action_area->pack_start(gtkadd(Gtk2::HButtonBox->new, @@ -522,13 +593,18 @@ sub About() { $list->can_focus(0); 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: "), 'Till Kamppeter', "" ], ['', '', '']) { + foreach my $row ([ '', '', '' ], [ N("Authors: "), 'Till Kamppeter', "" ], [ '', '', '' ]) { $tree_model->append_set(undef, [ map_index { $::i => $_ } @$row ]); } $list->get_selection->set_mode('none'); gtkpack_($window_about->vbox, -r "$pixdir/about-printerdrake.png" ? - (0, Gtk2::Image->new_from_file("$pixdir/about-printerdrake.png")) : (1, gtkmodify_font(Gtk2::Label->new(N("Printer Management \n") . $us->{VERSION}), 'Bold 18'),), + (0, Gtk2::Image->new_from_file("$pixdir/about-printerdrake.png")) : + (1, gtkset_markup(Gtk2::Label->new, + qq() . + #-PO: here %s is the version number + N("Printer Management %s", $us->{VERSION}) . ""), + ), 1, $list, ); $window_about->show_all; -- cgit v1.2.1