diff options
Diffstat (limited to 'perl-install/standalone/harddrake2')
-rwxr-xr-x | perl-install/standalone/harddrake2 | 418 |
1 files changed, 262 insertions, 156 deletions
diff --git a/perl-install/standalone/harddrake2 b/perl-install/standalone/harddrake2 index 8621622d2..9210f5ca7 100755 --- a/perl-install/standalone/harddrake2 +++ b/perl-install/standalone/harddrake2 @@ -1,17 +1,24 @@ #!/usr/bin/perl +# -*- coding: utf-8 -*- +use utf8; use strict; use diagnostics; use lib qw(/usr/lib/libDrakX); use standalone; +use MDK::Common; # help perl_checker use common; # i18n: IMPORTANT: to get correct namespace (drakconf instead of only libDrakX) BEGIN { unshift @::textdomains, 'drakconf' } -use ugtk2 qw(:create :helpers :wrappers); +use mygtk3 qw(gtknew); #- do not import gtkadd which conflicts with ugtk3 version +use ugtk3 qw(:create :helpers :wrappers); use interactive; -use harddrake::data; #- needs to stay after use-ugtk2 as long as this module defines globals containing some N() +use modules::parameters; +use harddrake::data; #- needs to stay after use-ugtk3 as long as this module defines globals containing some N() +use fsedit; +use pkgs; use POSIX qw(:sys_wait_h); @@ -37,19 +44,20 @@ my %fields = "description" => [ N("Description"), N("this field describes the device") ], "device" => [ N("Old device file"), N("old static device name used in dev package") ], - "devfs_device" => [ N("New devfs device"), - N("new dynamic device name generated by core kernel devfs") ], "driver" => [ #-PO: here "module" is the "jargon term" for a kernel driver N("Module"), N("the module of the GNU/Linux kernel that handles the device") ], "extended_partitions" => [ N("Extended partitions"), N("the number of extended partitions") ], "geometry" => [ N("Geometry"), N("Cylinder/head/sectors geometry of the disk") ], "host" => [ N("Disk controller"), N("the disk controller on the host side") ], + "info" => [ N("Identifier"), N("usually the device serial number") ], "media_type" => [ N("Media class"), N("class of hardware device") ], "Model" => [ N("Model"), N("hard disk model") ], "port" => [ N("Port"), N("network printer port") ], "primary_partitions" => [ N("Primary partitions"), N("the number of the primary partitions") ], "Vendor" => [ N("Vendor"), N("the vendor name of the device") ], + "pci_domain" => [ N("PCI domain"), N("the PCI domain of the device") ], + "pci_revision" => [ N("PCI revision"), N("the PCI domain of the device") ], "pci_bus" => [ N("Bus PCI #"), N("the PCI bus on which the device is plugged") ], "pci_device" => [ N("PCI device #"), N("PCI device number") ], "pci_function" => [ N("PCI function #"), N("PCI function number") ], @@ -61,25 +69,23 @@ my %fields = }, CPU => { + "system type" => [ "Sytem Type", "Name of the system" ], + "BogoMIPS" => [ N("Bogomips"), N("the GNU/Linux kernel needs to run a calculation loop at boot time to initialize a timer counter. Its result is stored as bogomips as a way to \"benchmark\" the cpu.") ], "bogomips" => [ N("Bogomips"), N("the GNU/Linux kernel needs to run a calculation loop at boot time to initialize a timer counter. Its result is stored as bogomips as a way to \"benchmark\" the cpu.") ], "cache size" => [ N("Cache size"), N("size of the (second level) cpu cache") ], - "coma_bug" => [ - #-PO: here "comas" is the medical coma, not the lexical coma!! - N("Coma bug"), N("whether this cpu has the Cyrix 6x86 Coma bug") ], "cpu family" => [ N("Cpuid family"), N("family of the cpu (eg: 6 for i686 class)") ], "cpuid level" => [ N("Cpuid level"), N("information level that can be obtained through the cpuid instruction") ], "cpu MHz" => [ N("Frequency (MHz)"), N("the CPU frequency in MHz (Megahertz which in first approximation may be coarsely assimilated to number of instructions the cpu is able to execute per second)") ], "flags" => [ N("Flags"), N("CPU flags reported by the kernel") ], - "fdiv_bug" => [ N("Fdiv bug"), - N("Early Intel Pentium chips manufactured have a bug in their floating point processor which did not achieve the required precision when performing a Floating point DIVision (FDIV)") ], - "fpu" => [ N("Is FPU present"), N("yes means the processor has an arithmetic coprocessor") ], - "fpu_exception" => [ N("Whether the FPU has an irq vector"), N("yes means the arithmetic coprocessor has an exception vector attached") ], - "f00f_bug" => [ N("F00f bug"), N("early pentiums were buggy and freezed when decoding the F00F bytecode") ], - "hlt_bug" => [ N("Halt bug"), - N("Some of the early i486DX-100 chips cannot reliably return to operating mode after the \"halt\" instruction is used") ], + "cpu cores" => [ N("Cores"), N("CPU cores") ], + "core id" => [ N("Core ID"), N("Core ID") ], + "physical id" => [ N("Physical ID"), N("Physical ID") ], + "apicid" => [ N("ACPI ID"), N("ACPI ID") ], + "siblings" => [ N("Siblings"), N("Siblings") ], "level" => [ N("Level"), N("sub generation of the cpu") ], "model" => [ N("Model"), N("generation of the cpu (eg: 8 for Pentium III, ...)") ], "model name" => [ N("Model name"), N("official vendor name of the cpu") ], + "cpu model" => [ N("Model name"), N("official vendor name of the cpu") ], "name" => [ N("Name"), N("the name of the CPU") ], "processor" => [ N("Processor ID"), N("the number of the processor") ], "stepping" => [ N("Model stepping"), N("stepping of the cpu (sub model (generation) number)") ], @@ -94,7 +100,8 @@ my %fields = { channel => [ N("Channel"), N("EIDE/SCSI channel") ], info => [ N("Disk identifier"), N("usually the disk serial number") ], - lun => [ N("Logical unit number"), N("the SCSI target number (LUN). SCSI devices connected to a host are uniquely identified by a + id => [ N("Target id number"), N("the SCSI target identifier") ], + lun => [ N("Logical unit number"), N("the SCSI Logical Unit Number (LUN). SCSI devices connected to a host are uniquely identified by a channel number, a target id and a logical unit number") ], }, MEMORY => @@ -107,24 +114,29 @@ channel number, a target id and a logical unit number") ], 'Current Speed' => [ N("Speed"), N("Speed of the memory bank") ], 'Bank Connections' => [ N("Bank connections"), '' ], 'Socket Designation' => [ N("Name"), N("Socket designation of the memory bank") ], + # for Memory Device: + 'Locator' => [ N("Location"), ], + 'Size' => [ N("Size"), N("Size of the memory device") ], + 'Speed' => [ N("Speed"), N("Speed of the memory bank") ], }, MOUSE => { "device" => [ N("Device file"), N("the device file used to communicate with the kernel driver for the mouse") ], - EMULATEWHEEL => [ N("Emulated wheel"), N("whether the wheel is emulated or not") ], + EmulateWheel => [ N("Emulated wheel"), N("whether the wheel is emulated or not") ], MOUSETYPE => [ N("Type"), N("the type of the mouse") ], name => [ N("Name"), N("the name of the mouse") ], nbuttons => [ N("Number of buttons"), N("the number of buttons the mouse has") ], type => [ N("Bus"), N("the type of bus on which the mouse is connected") ], - XMOUSETYPE => [ N("Mouse protocol used by X11"), N("the protocol that the graphical desktop use with the mouse") ], + Protocol => [ N("Mouse protocol used by X11"), N("the protocol that the graphical desktop use with the mouse") ], } ); +my $identification = N("Identification"); my %groups = ( generic => { - N("Identification") => [ qw(Vendor model description info media_type) ], - N("Connection") => [ qw(bus pci_bus pci_device pci_function vendor id subvendor subid) ], + $identification => [ qw(Vendor model description info media_type) ], + N("Connection") => [ qw(bus pci_domain pci_bus pci_device pci_function pci_revision vendor id subvendor subid) ], }, AUDIO => { @@ -132,23 +144,22 @@ my %groups = ( }, CPU => { - N("Identification") => [ qw(processor vendor_id), "model name", "cpu family", qw(model level stepping) ], + $identification => [ qw(processor vendor_id), "model name", "cpu family", qw(model level stepping), "cpuid level" ], + N("Cores") => [ 'cpu cores', 'core id', 'physical id', 'apicid', 'siblings' ], N("Performances") => [ "cpu MHz", "cache size", "bogomips" ], - N("Bugs") => [ qw(fdiv_bug coma_bug f00f_bug hlt_bug) ], - N("FPU") => [ qw(fpu fpu_exception) ], }, HARDDISK => { - N("Identification") => [ qw(Vendor Model description info media_type) ], - N("Connection") => [ qw(bus channel lun) ], + $identification => [ qw(Vendor Model description info media_type) ], + N("Connection") => [ qw(bus channel lun id) ], N("Bus identification") => [ qw(vendor id subvendor subid) ], - N("Device") => [ qw(device devfs_device) ], + N("Device") => [ qw(device) ], N("Partitions") => [ qw(primary_partitions extended_partitions) ], }, MOUSE => { - N("Identification") => [ qw(name type MOUSETYPE XMOUSETYPE) ], - N("Features") => [ qw(EMULATEWHEEL nbuttons) ], + $identification => [ qw(name type MOUSETYPE Protocol) ], + N("Features") => [ qw(EmulateWheel nbuttons) ], }, ); @@ -168,121 +179,112 @@ my ($current_device, $current_class, $current_configurator); my %sysh = distrib(); my $distro_name = $sysh{system}; -my %menus = ( - 'options' => - #-PO: please keep all "/" characters !!! - N("/_Options"), - 'help' => N("/_Help") - ); - my %menu_options = ( - 'PRINTERS_DETECTION' => [ $menus{options}, N("/Autodetect _printers") ], - 'MODEMS_DETECTION' => [ $menus{options}, N("/Autodetect _modems") ], - 'JAZZ_DETECTION' => [ $menus{options}, N("/Autodetect _jaz drives") ], + 'MODEMS_DETECTION' => N("Autodetect _modems"), + 'PARALLEL_ZIP_DETECTION' => N("Autodetect parallel _zip drives"), ); +$ugtk3::wm_icon = "harddrake"; +$w = ugtk3->new(N("Hardware Configuration")); +# fake diagnostics pragma: +local $::main_window = $w->{real_window}; + +my $has_help = -x "/usr/sbin/drakhelp_inst"; +my $ui = gtknew('UIManager', actions => [ + # [name, stock_id, value, label, accelerator, tooltip, callback] + [ 'FileMenu', undef, N("_File") ], + [ 'Quit', undef, N("_Quit"), N("<control>Q"), undef, \&quit_global ], + [ 'OptionsMenu', undef, N("_Options") ], + [ 'HelpMenu', undef, N("_Help") ], + if_($has_help, [ 'Help', undef, N("_Help"), N("<control>H"), undef, \&run_help ]), + [ 'Fields description', undef, N("_Fields description"), undef, undef, \&fields_help ], + [ 'Report Bug', undef, N("_Report Bug"), undef, undef, \&run_drakbug ], + [ 'About', undef, N("_About..."), '', undef, \&about ], + ], + toggle_actions => [ + [ 'MODEMS_DETECTION', undef, $menu_options{MODEMS_DETECTION}, undef, undef, \&handle_modem_option ], + [ 'PARALLEL_ZIP_DETECTION', undef, $menu_options{PARALLEL_ZIP_DETECTION}, undef, undef, \&handle_zip_option ], + ], + string => + join("\n", + qq(<ui> + <menubar name='MenuBar'> + <menu action='FileMenu'> + <menuitem action='Quit'/> + </menu> + <menu action='OptionsMenu'> + <menuitem action='MODEMS_DETECTION'/> + <menuitem action='PARALLEL_ZIP_DETECTION'/> + </menu> + <menu action='HelpMenu'>), + if_($has_help, "<menuitem action='Help'/>"), + qq( + <menuitem action='Fields description'/> + <menuitem action='Report Bug'/> + <menuitem action='About'/> + </menu> + </menubar> +</ui>))); -my @menu_items = - ( - [ N("/_File"), undef, undef, undef, '<Branch>' ], - [ N("/_File") . N("/_Quit"), N("<control>Q"), \&quit_global, undef, '<Item>' ], - [ join('', @{$menu_options{PRINTERS_DETECTION}}), undef, - sub { $options{PRINTERS_DETECTION} = $check_boxes{PRINTERS_DETECTION}->get_active }, undef, '<CheckItem>' ], - [ join('', @{$menu_options{MODEMS_DETECTION}}), undef, - sub { $options{MODEMS_DETECTION} = $check_boxes{MODEMS_DETECTION}->get_active }, undef, '<CheckItem>' ], - [ join('', @{$menu_options{JAZZ_DETECTION}}), undef, - sub { $options{JAZZ_DETECTION} = $check_boxes{JAZZ_DETECTION}->get_active }, undef, '<CheckItem>' ], - [ $menus{help}, undef, undef, undef, '<Branch>' ], - if_(-x "/usr/sbin/drakhelp_inst", - [ $menus{help} . N("/_Help"), undef, sub { unless (fork()) { exec("drakhelp --id harddrake") } }, undef, '<Item>' ], - ), - [ $menus{help} . N("/_Fields description"), undef, sub { - if ($current_device) { - create_dialog(N("Harddrake help"), - N("Description of the fields:\n\n") - . join("\n\n", map { - my $info = lookup_field($_); - if_($info->[0], formatAlaTeX(qq(<span foreground="royalblue3">$info->[0]:</span> $info->[1]))); - } sort keys %$current_device), - { use_markup => 1, if_(!$::isEmbedded, transient => $w->{real_window}), height => 400, scroll => 1 }); - - } else { - create_dialog(N("Select a device!"), N("Once you've selected a device, you'll be able to see the device information in fields displayed on the right frame (\"Information\")"), { if_(!$::isEmbedded, transient => $w->{real_window}) }); - } - }, - undef, '<Item>' - ], - if_(!-e "/etc/sysconfig/oem", - [ $menus{help} . N("/_Report Bug"), undef, sub { unless (fork()) { exec("drakbug --report harddrake2 &") } }, undef, '<Item>' ], - ), - [ $menus{help} . N("/_About..."), undef, sub { - create_dialog(N("About Harddrake"), -#-PO: Do not alter the <span ..> and </span> tags - N("This is HardDrake, a %s hardware configuration tool.\n<span foreground=\"royalblue3\">Version:</span> %s -<span foreground=\"royalblue3\">Author:</span> Thierry Vignaud <tvignaud\@mandrakesoft.com>\n\n", $distro_name, $harddrake::data::version) . "\n" . - formatAlaTeX($::license), { use_markup => 1, if_(!$::isEmbedded, transient => $w->{real_window}) }); - }, undef, '<Item>' - ] - ); - -$ugtk2::wm_icon = "harddrake"; $in = 'interactive'->vnew('su'); #require_root_capability(); -my $wait = $in->wait_message(N("Please wait"), N("Detection in progress")); -gtkflush(); - %options = getVarsFromSh($conffile); +$options{MDV_ONLINE} ||= []; # Build the gui add_icon_path('/usr/share/pixmaps/harddrake2/'); -$w = ugtk2->new(N("Harddrake2")); -local $::main_window; # fake diagnostics pragma -my ($menubar, $factory); -if ($::isEmbedded) { - ($menubar, $factory) = create_factory_menu($::Plug, @menu_items); -} else { - $::main_window = $w->{real_window}; - ($menubar, $factory) = create_factory_menu($w->{rwindow}, @menu_items); - $w->{window}->set_size_request(805, 550); -} +$::noborderWhenEmbedded = 1; + -my $tree_model = Gtk2::TreeStore->new("Gtk2::Gdk::Pixbuf", "Glib::String", "Glib::Int"); -$w->{window}->add(gtkpack_(0, Gtk2::VBox->new(0, 0), +my $menubar = $ui->get_widget('/MenuBar'); +$w->{window}->set_size_request(805, 550) if !$::isEmbedded; + +my $tree_model = Gtk3::TreeStore->new("Gtk3::Gdk::Pixbuf", "Glib::String", "Glib::Int"); +$w->{window}->add(gtkpack_(0, Gtk3::VBox->new(0, 0), 0, $menubar, - 0, Gtk2::Banner->new("/usr/share/mcc/themes/default/harddrake-mdk.png", translate("Hardware")), - 1, create_hpaned(gtkadd(Gtk2::Frame->new(N("Detected hardware")), - create_scrolled_window(gtkset_size_request(my $tree = Gtk2::TreeView->new_with_model($tree_model), $::isEmbedded ? 250 : 350, -1), ['automatic', 'automatic'])), - gtkpack_(0, Gtk2::VBox->new(0, 0), - 1, gtkadd(my $frame = Gtk2::Frame->new(N("Information")), - create_scrolled_window(my $text = Gtk2::TextView->new)), - 0, my $module_cfg_button = gtksignal_connect(Gtk2::Button->new(N("Configure module")), + 0, Gtk3::Banner->new("/usr/share/mcc/themes/default/harddrake-mdk.png", translate("Hardware")), + 1, create_hpaned(my $f = gtkadd(Gtk3::Frame->new(N("Detected hardware")), + create_scrolled_window(gtkset_size_request(my $tree = Gtk3::TreeView->new_with_model($tree_model), 350, -1), ['automatic', 'automatic'])), + gtkpack_(0, Gtk3::VBox->new(0, 0), + 1, gtkadd(my $frame = Gtk3::Frame->new(N("Information")), + create_scrolled_window(my $text = Gtk3::TextView->new)), + 0, my $module_cfg_button = gtksignal_connect(Gtk3::Button->new(N("Set current driver options")), clicked => sub { local $SIG{CHLD} = undef; require modules::interactive; modules::interactive::config_window($in, $current_device); - gtkset_mousecursor_normal(); }), - 0, my $config_button = gtksignal_connect(Gtk2::Button->new(N("Run config tool")), + 0, my $config_button = gtksignal_connect(Gtk3::Button->new(N("Run config tool")), # we've a configurator, let's add a button for it and show it clicked => sub { return 1 if defined $pid; - if ($pid = fork()) { - } else { - exec($current_configurator) or die "$current_configurator missing\n"; - } + run_program::raw({ detach => 1 }, $current_configurator); }) ), ), ) ); +$f->set_size_request(350, -1); $text->set_wrap_mode('word'); $frame->set_size_request(300, 450) unless $::isEmbedded; # $tree->set_column_auto_resize(0, 1); my (@data, @configurators); -$tree->append_column(Gtk2::TreeViewColumn->new_with_attributes(undef, Gtk2::CellRendererPixbuf->new, 'pixbuf' => 0)); -$tree->append_column(my $textcolumn = Gtk2::TreeViewColumn->new_with_attributes(undef, Gtk2::CellRendererText->new, 'text' => 1)); +$tree->append_column(my $textcolumn = Gtk3::TreeViewColumn->new); +$textcolumn->pack_start(my $img_renderer = Gtk3::CellRendererPixbuf->new, 0); +$textcolumn->set_attributes($img_renderer, pixbuf => 0); + +$textcolumn->pack_start(my $text_renderer = Gtk3::CellRendererText->new, 1); +$textcolumn->set_attributes($text_renderer, text => 1); + $tree->set_headers_visible(0); + +sub fill_default_text { + my ($text) = @_; + $text->get_buffer->set_text(N("Click on a device in the tree on the left in order to display its information here.")); +} + +my %has_parameter; $tree->get_selection->signal_connect('changed' => sub { my ($select) = @_; my ($model, $iter) = $select->get_selected; @@ -291,7 +293,6 @@ $tree->get_selection->signal_connect('changed' => sub { ($current_device, $current_class) = @{$data[$idx]}; if ($idx ne -1) { - use Gtk2::Pango; my %device_fields = map { # The U+200E character is to force LTR display, as what what follows the colon is always in LTR (device names, paths, etc), # this ensures proper displaying of names like /dev/fd0 (otherwise it gets 'dev/fd0/'). @@ -299,7 +300,7 @@ $tree->get_selection->signal_connect('changed' => sub { my $field = lookup_field($_); if_($_ && $field->[0], $_ => [ - [ $field->[0] . ": \x{200e}", { 'foreground' => 'royalblue3', 'weight' => Gtk2::Pango->PANGO_WEIGHT_BOLD } ], + [ $field->[0] . ": \x{200e}", { 'foreground' => 'royalblue3', 'weight' => 'bold' } ], [ ($current_device->{$_} =~ /^(unknown)/ ? N("unknown") : $current_device->{$_} =~ /^(Unknown)/ ? N("Unknown") : $current_device->{$_} eq 'yes' ? N("Yes") : @@ -311,9 +312,9 @@ $tree->get_selection->signal_connect('changed' => sub { my ($grouped, $ungrouped) = partition { my $field = $_; member($field, map { @$_ } values %groups); - } keys %device_fields; + } sort keys %device_fields; my @formated; - foreach my $group (N("Identification"), grep { $_ ne N("Identification") } keys %groups) { + foreach my $group ($identification, grep { $_ ne $identification } keys %groups) { my @fields = @{$groups{$group}}; # have we at least a member in that group? next unless any { member($_, @fields) } @$grouped; @@ -329,19 +330,39 @@ $tree->get_selection->signal_connect('changed' => sub { } # if we've valid driver, let's offer to configure it, else hide buttons - show_hide(defined($current_device->{driver}) && $current_device->{driver} !~ /^unknown|^Bad|^Card|^Hsf|^Removable:|\|/, $module_cfg_button); + show_hide(defined($current_device->{driver}) && $current_device->{driver} !~ /^unknown|^Bad|^Card|^Hsf|^kbd|^Mouse:USB|^mouse\d|^Removable:|\|/, $module_cfg_button); $current_configurator = $configurators[$idx]; show_hide($current_configurator && -x first(split /\s+/, $current_configurator), $config_button); # strip arguments for -x test + + # hide module configuration button if needed: + my $driver = $current_device->{driver}; + if (!defined $has_parameter{$driver}) { + local $SIG{CHLD} = undef; + $has_parameter{$driver} ||= to_bool(scalar modules::parameters::parameters($driver)); + } + show_hide($has_parameter{$driver}, $module_cfg_button); + return 1; } } - $text->get_buffer->set_text(N("Click on a device in the left tree in order to display its information here.")); + # No device is selected: + fill_default_text($text); undef $current_device; $config_button->hide; $module_cfg_button->hide; }); +$w->{rwindow}->add_accel_group($ui->get_accel_group); +# show the main window earlier (so that sub dialogs can use main +# window's icon and so that no Gtk+ critical message got displayed): +$w->{rwindow}->show_all; +my $flush_guard = Gtk3::GUI_Update_Guard->new; +$_->hide foreach $module_cfg_button, $config_button; # hide buttons while no device +my $wait = $in->wait_message(N("Please wait"), N("Detection in progress")); +gtkflush() if !$::isEmbedded; + + my $index = 0; my @classes; @@ -350,14 +371,10 @@ my @classes; foreach my $hw_class (@harddrake::data::tree) { my ($Ident, $title, $icon, $configurator, $detector) = @$hw_class{qw(class string icon configurator detector)}; next if ref($detector) ne "CODE"; #skip class witouth detector - # blacklist agp controllers b/c string is not yet translated: - next if $Ident eq 'AGP'; - next if $Ident =~ /(MODEM|PRINTER)/ && $::testing; - next if $Ident =~ /JAZZ/ && !$options{JAZZ_DETECTION}; - next if $Ident =~ /MODEM/ && !$options{MODEMS_DETECTION}; - next if $Ident =~ /PRINTER/ && !$options{PRINTERS_DETECTION}; - - my @devices = &$detector; + next if $Ident =~ /MODEM/ && $::testing; + $detect_devices::detect_serial_modem = 0 if $Ident =~ /MODEM/ && !$options{MODEMS_DETECTION}; + + my @devices = $detector->(\%options); next unless @devices; # Skip empty class (no devices) push @classes, [ $Ident, $title, $icon, $configurator, @devices ]; } @@ -376,7 +393,7 @@ foreach (@classes) { # we really should test for $title there: if ($_->{bus} && $_->{bus} eq "PCI") { # do not display unknown driver for system bridges that're managed by kernel core: - delete $_->{driver} if $_->{driver} eq "unknown" && ($Ident =~ /^ATA_STORAGE|BRIDGE|SMB_CONTROLLER$/ || $_->{description} =~ /3Com.*5610/); + delete $_->{driver} if $_->{driver} eq "unknown" && ($Ident =~ /^ATA_STORAGE|BRIDGE|SMB_CONTROLLER|MEMORY_OTHER $/ || $_->{description} =~ /3Com.*5610/); } rename_field($_, 'usb_description', 'description'); # split description into manufacturer/description @@ -397,19 +414,12 @@ foreach (@classes) { $_->{capacity} =~ s/DVD/$dvd/; } $configurator .= harddrake::data::set_removable_configurator($Ident, $_); - if ($Ident eq "AUDIO") { - require harddrake::sound; - my $alter = harddrake::sound::get_alternative($_->{driver}); - if (my $alternative_drivers = $alter->[0] ne 'unknown' && join(', ', @$alter)) { - $_->{alternative_drivers} = $alternative_drivers; - } - } if ($Ident eq "HARDDISK") { my $hd = $_; my $info = find { $_->{device} eq $hd->{device} } @{$all_hds->{hds}}; $hd->{geometry} = join('/', map { $info->{geom}{$_} } qw(cylinders heads sectors)) . " (CHS)"; - $hd->{primary_partitions} = @{$info->{primary}{normal}}; - $hd->{extended_partitions} = @{$info->{extended}}; + $hd->{primary_partitions} = @{$info->{primary}{normal}} if $info->{primary}{normal}; + $hd->{extended_partitions} = @{$info->{extended}} if $info->{extended}; $hd->{primary_partitions} .= " (" . join(', ', map { $_->{device} }@{$info->{primary}{normal}}) . ")" if $hd->{primary_partitions}; if ($hd->{extended_partitions}) { $hd->{extended_partitions} .= " (" . join(', ', map { $_->{normal}{device} }@{$info->{extended}}) . ")"; @@ -417,42 +427,63 @@ foreach (@classes) { delete $hd->{extended_partitions} if $hd->{extended_partitions} eq '0'; } } - $_->{EMULATEWHEEL} = bool2yesno($_->{EMULATEWHEEL}) if $Ident eq "MOUSE"; + $_->{EmulateWheel} = bool2yesno($_->{EmulateWheel}) if $Ident eq "MOUSE"; rename_field($_, 'usb_bus', 'bus'); rename_field($_, 'usb_driver', 'driver'); rename_field($_, 'usb_id', 'id'); rename_field($_, 'usb_media_type', 'media_type'); + force_rename_field($_, 'nice_media_type', 'media_type'); rename_field($_, 'usb_pci_bus', 'bus'); + force_rename_field($_, 'nice_bus', 'bus'); rename_field($_, 'usb_vendor', 'vendor'); rename_field($_, 'vendor_name', 'Vendor'); - foreach my $i (qw(auxmouse devfs_prefix unsafe val wacom)) { delete $_->{$i} } + foreach my $i (qw(synaptics unsafe val wacom)) { delete $_->{$i} } my $custom_id = harddrake::data::custom_id($_, $title); - foreach my $field (qw(devfs_device device)) { + foreach my $field (qw(device)) { $_->{$field} = "/dev/$_->{$field}" if $_->{$field}; } + format_bus_ids($_); + if ($_->{pci_revision}) { + $_->{pci_revision} = sprintf("0x%02x", $_->{pci_revision}); + } else { + delete $_->{pci_revision};# if $_->{pci_revision} eq "0x0000"; + } + $tree_model->append_set($parent_iter, [ 1 => $custom_id, 2 => $index++ ]); push @data, [ $_, $Ident ]; push @configurators, $configurator; } - $tree->expand_row($tree_model->get_path($parent_iter), 1) unless $title eq N("Unknown/Others"); } -$SIG{CHLD} = sub { - undef $pid; +undef $flush_guard; + +sub format_bus_ids { + my ($device) = @_; + # do not vivify ids: + return if !($device->{vendor} && $device->{id}); + foreach my $field (qw(vendor id subvendor subid)) { + next if !$device->{$field}; + $device->{$field} = sprintf("0x%04x", $device->{$field}); + delete $device->{$field} if $device->{$field} eq "0xffff"; # 0xffff equals to '*' + } +} + +sub reap_children() { # reap zombies my $child_pid; - do { $child_pid = waitpid(-1, POSIX::WNOHANG) } until $child_pid > 0; -}; + do { $child_pid = waitpid(-1, POSIX::WNOHANG); undef $pid if $pid == $child_pid } until $child_pid > 0; +} + +$SIG{CHLD} = \&reap_children; $w->{rwindow}->signal_connect(delete_event => \&quit_global); $w->{rwindow}->set_position('center') unless $::isEmbedded; foreach (keys %menu_options) { - my $title = strip_first_underscore(@{$menu_options{$_}}); $options{$_} = 0 unless defined($options{$_}); # force detection by default - $check_boxes{$_} = $factory->get_widget("<main>" . $title); + $check_boxes{$_} = $ui->get_widget('/MenuBar/OptionsMenu/' . $_); $check_boxes{$_}->set_active($options{$_}); # restore saved values } @@ -460,28 +491,94 @@ $textcolumn->set_min_width(350); #$textcolumn->set_minmax_width(400); $textcolumn->set_sizing('GTK_TREE_VIEW_COLUMN_AUTOSIZE');#GROW_ONLY #$tree->columns_autosize(); -$tree->signal_connect(realize => sub { $tree->get_selection->select_path(Gtk2::TreePath->new_first) }); -$w->{rwindow}->show_all; +$tree->signal_connect(realize => sub { $tree->get_selection->select_path(Gtk3::TreePath->new_first) }); + +{ + $SIG{CHLD} = undef; + #local $SIG{CHLD} = sub {}; + + # do no try to install too generic hw packages: + my @blacklist = [ qw(dmraid mdadm) ]; + if (my @packages = difference2([ pkgs::detect_hardware_packages($in->do_pkgs) ], @blacklist)) { + @packages = difference2(\@packages, [ $in->do_pkgs->are_installed(@packages) ]); + # we use uniq() because on biarch machines, we got packages twice: + my @packages2install = uniq($in->do_pkgs->are_available(@packages)); + + undef $wait; + + if (@packages2install && $in->ask_yesorno(N("Warning"), N("The following packages need to be installed:\n") . join(', ', @packages2install))) { + $in->do_pkgs->install(@packages2install); + } + } +} +$SIG{CHLD} = \&reap_children; undef $wait; -gtkset_mousecursor_normal(); -$_->hide foreach $module_cfg_button, $config_button; # hide buttons while no device + +# fill in default right text since no device is selected on startup: +fill_default_text($text); + $w->main; +sub about() { + my $license = formatAlaTeX(translate($::license)); + $license =~ s/\n/\n\n/sg; # nicer formatting + my $w = gtknew('AboutDialog', name => N("Harddrake"), + version => mageia_release_info()->{version}, + logo => '/usr/share/icons/harddrake.png', + copyright => N("Copyright (C) %s by %s", '2001-2008', 'Mandriva') . "\n" . N("Copyright (C) %s by %s", '2011', N("Mageia")), + license => $license, wrap_license => 1, + comments => N("This is HardDrake, a %s hardware configuration tool.", $distro_name), + website => 'http://www.mageia.org', + website_label => N("Mageia"), + authors => [ 'Thierry Vignaud <thierry.vignaud.com>' ], + translator_credits => + #-PO: put here name(s) and email(s) of translator(s) (eg: "John Smith <jsmith@nowhere.com>") + N("_: Translator(s) name(s) & email(s)\n"), + transient_for => $::main_window, modal => 1, position_policy => 'center-on-parent', + ); + $w->show_all; + $w->run; +} + +sub fields_help() { + if ($current_device) { + create_dialog(N("Harddrake help"), + '<big><b>' . N("Description of the fields:\n\n") . '</b></big>' + . join("\n\n", map { + my $info = lookup_field($_); + if_($info->[0], formatAlaTeX(qq(<span foreground="royalblue3">$info->[0]:</span> $info->[1]))); + } sort keys %$current_device), + { use_markup => 1, transient => $w->{real_window}, height => 400, scroll => 1 }); + } else { + create_dialog(N("Select a device!"), N("Once you've selected a device, you'll be able to see the device information in fields displayed on the right frame (\"Information\")"), { transient => $w->{real_window} }); + } +} sub quit_global() { kill(15, $pid) if $pid; setVarsInSh($conffile, \%options) if !$::testing; - ugtk2->exit(0); + ugtk3->exit(0); } -sub show_hide { - my ($bool, $button) = @_; - if ($bool) { $button->show } else { $button->hide } +sub run_drakbug() { + run_program::raw({ detach => 1 }, 'drakbug', '--report', 'harddrake'); +} + +sub run_help() { + run_program::raw({ detach => 1 }, 'drakhelp', '--id', 'harddrake'); +} + +sub handle_modem_option() { + $options{MODEMS_DETECTION} = $check_boxes{MODEMS_DETECTION}->get_active; } +sub handle_zip_option() { + $options{PARALLEL_ZIP_DETECTION} = $check_boxes{PARALLEL_ZIP_DETECTION}->get_active; +} -sub strip_first_underscore { - join '', map { s/_//; $_ } @_; +sub show_hide { + my ($bool, $button) = @_; + if ($bool) { $button->show } else { $button->hide } } sub lookup_field { @@ -492,9 +589,18 @@ sub lookup_field { sub titleFormat { my ($title) = @_; - [ $title . "\n", { 'weight' => Gtk2::Pango->PANGO_WEIGHT_BOLD, scale => Gtk2::Pango->PANGO_SCALE_LARGE } ]; + [ $title . "\n", { 'weight' => 'bold', scale => 1.4399999999999 } ]; # Pango->PANGO_SCALE_LARGE +} + +sub force_rename_field { + my ($dev, $new_field, $field) = @_; + if ($dev->{$new_field}) { + delete $dev->{$field}; + rename_field($dev, $new_field, $field); + } } + sub rename_field { my ($dev, $field, $new_field) = @_; if ($dev->{$field}) { |