diff options
author | damien <damien@mandriva.com> | 2000-11-28 16:56:52 +0000 |
---|---|---|
committer | damien <damien@mandriva.com> | 2000-11-28 16:56:52 +0000 |
commit | 0880c7ba8ce88e87fa600aeb367a8f88a3ae71e7 (patch) | |
tree | 33f7ac905998f9ad6d85090f777ee4c0d0c67032 /perl-install/mouse.pm | |
parent | d5c526273db473a7d87a26000585900fc10dda7d (diff) | |
download | drakx-topic/unlabeled-1.1.1.tar drakx-topic/unlabeled-1.1.1.tar.gz drakx-topic/unlabeled-1.1.1.tar.bz2 drakx-topic/unlabeled-1.1.1.tar.xz drakx-topic/unlabeled-1.1.1.zip |
branch to build the firewall install.topic/unlabeled-1.1.1
Diffstat (limited to 'perl-install/mouse.pm')
-rw-r--r-- | perl-install/mouse.pm | 318 |
1 files changed, 262 insertions, 56 deletions
diff --git a/perl-install/mouse.pm b/perl-install/mouse.pm index 3386654db..e6c6f3cc8 100644 --- a/perl-install/mouse.pm +++ b/perl-install/mouse.pm @@ -1,4 +1,4 @@ -package mouse; +package mouse; # $Id$ use diagnostics; use strict; @@ -6,74 +6,280 @@ use strict; #-###################################################################################### #- misc imports #-###################################################################################### -use common qw(:common :system :functional); +use common qw(:common :system :functional :file); +use modules; +use detect_devices; +use run_program; +use devices; +use commands; +use modules; use log; -my @mouses_fields = qw(nbuttons device MOUSETYPE XMOUSETYPE FULLNAME); -my @mouses = ( - [ 0, "none", "none", "Microsoft", __("No Mouse") ], - [ 2, "ttyS", "pnp", "Auto", __("Microsoft Rev 2.1A or higher (serial)") ], - [ 3, "ttyS", "logim", "MouseMan", __("Logitech CC Series (serial)") ], - [ 5, "ttyS", "pnp", "IntelliMouse", __("Logitech MouseMan+/FirstMouse+ (serial)") ], - [ 5, "ttyS", "ms3", "IntelliMouse", __("ASCII MieMouse (serial)") ], - [ 5, "ttyS", "ms3", "IntelliMouse", __("Genius NetMouse (serial)") ], - [ 5, "ttyS", "ms3", "IntelliMouse", __("Microsoft IntelliMouse (serial)") ], - [ 2, "ttyS", "MMSeries", "MMSeries", __("MM Series (serial)") ], - [ 2, "ttyS", "MMHitTab", "MMHittab", __("MM HitTablet (serial)") ], - [ 3, "ttyS", "Logitech", "Logitech", __("Logitech Mouse (serial, old C7 type)") ], - [ 3, "ttyS", "MouseMan", "MouseMan", __("Logitech MouseMan/FirstMouse (serial)") ], - [ 2, "ttyS", "Microsoft", "Microsoft", __("Generic Mouse (serial)") ], - [ 2, "ttyS", "Microsoft", "Microsoft", __("Microsoft compatible (serial)") ], - [ 3, "ttyS", "Microsoft", "Microsoft", __("Generic 3 Button Mouse (serial)") ], - [ 2, "ttyS", "MouseSystems", "MouseSystems", __("Mouse Systems (serial)") ], - [ 2, "psaux", "ps/2", "PS/2", __("Generic Mouse (PS/2)") ], - [ 3, "psaux", "ps/2", "PS/2", __("Logitech MouseMan/FirstMouse (ps/2)") ], - [ 3, "psaux", "ps/2", "PS/2", __("Generic 3 Button Mouse (PS/2)") ], - [ 2, "psaux", "ps/2", "GlidePointPS/2", __("ALPS GlidePoint (PS/2)") ], - [ 5, "psaux", "ps/2", "MouseManPlusPS/2", __("Logitech MouseMan+/FirstMouse+ (PS/2)") ], - [ 5, "psaux", "ps/2", "ThinkingMousePS/2", __("Kensington Thinking Mouse (PS/2)") ], - [ 5, "psaux", "ps/2", "NetMousePS/2", __("ASCII MieMouse (PS/2)") ], - [ 5, "psaux", "netmouse", "NetMousePS/2", __("Genius NetMouse (PS/2)") ], - [ 5, "psaux", "netmouse", "NetMousePS/2", __("Genius NetMouse Pro (PS/2)") ], - [ 5, "psaux", "netmouse", "NetScrollPS/2", __("Genius NetScroll (PS/2)") ], - [ 5, "psaux", "imps2", "IMPS/2", __("Microsoft IntelliMouse (PS/2)") ], - [ 2, "atibm", "Busmouse", "BusMouse", __("ATI Bus Mouse") ], - [ 2, "inportbm", "Busmouse", "BusMouse", __("Microsoft Bus Mouse") ], - [ 3, "logibm", "Busmouse", "BusMouse", __("Logitech Bus Mouse") ], +my @mouses_fields = qw(nbuttons MOUSETYPE XMOUSETYPE name); + +my %mice = + arch() =~ /^sparc/ ? +( + 'sunmouse' => + [ [ 'sunmouse' ], + [ [ 3, 'sun', 'sun', __("Sun - Mouse") ] + ]] +) : +( + 'PS/2' => + [ [ 'psaux' ], + [ [ 2, 'ps/2', 'PS/2', __("Standard") ], + [ 5, 'ps/2', 'MouseManPlusPS/2', __("Logitech MouseMan+") ], + [ 5, 'imps2', 'IMPS/2', __("Generic PS2 Wheel Mouse") ], + [ 5, 'ps/2', 'GlidePointPS/2', __("GlidePoint") ], + '', + [ 5, 'ps/2', 'ThinkingMousePS/2', __("Kensington Thinking Mouse") ], + [ 5, 'netmouse', 'NetMousePS/2', __("Genius NetMouse") ], + [ 5, 'netmouse', 'NetScrollPS/2', __("Genius NetScroll") ], + ]], + + 'USB' => + [ [ 'usbmouse' ], + [ [ 2, 'ps/2', 'PS/2', __("Generic") ], + [ 5, 'ps/2', 'IMPS/2', __("Wheel") ], + ]], + + __("serial") => + [ [ map { "ttyS$_" } 0..3 ], + [ [ 2, 'Microsoft', 'Microsoft', __("Generic 2 Button Mouse") ], + [ 3, 'Microsoft', 'Microsoft', __("Generic 3 Button Mouse") ], + [ 5, 'ms3', 'IntelliMouse', __("Microsoft IntelliMouse") ], + [ 3, 'MouseMan', 'MouseMan', __("Logitech MouseMan") ], + [ 2, 'MouseSystems', 'MouseSystems', __("Mouse Systems") ], + '', + [ 3, 'logim', 'MouseMan', __("Logitech CC Series") ], + [ 5, 'pnp', 'IntelliMouse', __("Logitech MouseMan+/FirstMouse+") ], + [ 5, 'ms3', 'IntelliMouse', __("Genius NetMouse") ], + [ 2, 'MMSeries', 'MMSeries', __("MM Series") ], + [ 2, 'MMHitTab', 'MMHittab', __("MM HitTablet") ], + [ 3, 'Logitech', 'Logitech', __("Logitech Mouse (serial, old C7 type)") ], + [ 3, 'Microsoft', 'ThinkingMouse', __("Kensington Thinking Mouse") ], + ]], + + __("busmouse") => + [ [ arch() eq 'ppc' ? 'adbmouse' : ('atibm', 'inportbm', 'logibm') ], + [ [ 2, 'Busmouse', 'BusMouse', __("2 buttons") ], + [ 3, 'Busmouse', 'BusMouse', __("3 buttons") ], + ]], + + __("none") => + [ [ 'none' ], + [ [ 0, 'none', 'Microsoft', __("No mouse") ], + ]], ); -map_index { - my %l; @l{@mouses_fields} = @$_; - $mouses[$::i] = \%l; -} @mouses; -sub names { map { $_->{FULLNAME} } @mouses } -sub name2mouse { - my ($name) = @_; - foreach (@mouses) { - return { %$_ } if $name eq $_->{FULLNAME}; +sub xmouse2xId { + #- xmousetypes must be sorted as found in /usr/include/X11/extensions/xf86misc.h + #- so that first mean "0", etc + my @xmousetypes = ( + "Microsoft", + "MouseSystems", + "MMSeries", + "Logitech", + "BusMouse", #MouseMan, + "Logitech", + "PS/2", + "MMHittab", + "GlidePoint", + "IntelliMouse", + "ThinkingMouse", + "IMPS/2", + "ThinkingMousePS/2", + "MouseManPlusPS/2", + "GlidePointPS/2", + "NetMousePS/2", + "NetScrollPS/2", + "SysMouse", + "Auto", + "AceCad", + "WSMouse", + "USB", + ); + my ($id) = @_; + $id = 'BusMouse' if $id eq 'MouseMan'; + my $i; map_index { $_ eq $id and $i = $::i } @xmousetypes; $i; +} + +sub raw2mouse { + my ($type, $raw) = @_; + $raw or return; + + my %l; @l{@mouses_fields} = @$raw; + +{ %l, type => $type }; +} + +sub fullnames { + map_each { + my $type = $::a; + grep {$_} map { + if ($_) { + my $l = raw2mouse($type, $_); + "$type|$l->{name}"; + } else { + $type .= "|[" . _("Other") . "]"; + ''; + } + } @{$::b->[1]} + } %mice; +} + +sub fullname2mouse { + my ($fname, %opts) = @_; + my ($type, @l) = split '\|', $fname; + my ($name) = pop @l; + $opts{device} ||= $mice{$type}[0][0]; + foreach (@{$mice{$type}[1]}) { + my $l = raw2mouse($type, $_); + $name eq $l->{name} and return { %$l, %opts }; } - die "$name not found"; + die "$fname not found ($type, $name)"; } -sub serial_ports_names { - map { "ttyS" . ($_ - 1) . " / COM$_" } 1..4; +sub serial_ports() { map { "ttyS$_" } 0..7 } +sub serial_port2text { + $_[0] =~ /ttyS (\d+)/x; + "$_[0] / COM" . ($1 + 1); } -sub serial_ports_names2dev { - local ($_) = @_; - /(\w+)/; + +sub read { + my ($prefix) = @_; + my %mouse = getVarsFromSh "$prefix/etc/sysconfig/mouse"; + eval { add2hash_(\%mouse, fullname2mouse($mouse{FULLNAME})) }; + $mouse{device} = readlink "$prefix/dev/mouse" or log::l("reading $prefix/dev/mouse symlink failed"); + $mouse{nbuttons} = $mouse{XEMU3} eq "yes" ? 2 : $mouse{WHEEL} eq "yes" ? 5 : 3; + \%mouse; +} + +sub write { + my ($prefix, $mouse) = @_; + local $mouse->{FULLNAME} = qq("$mouse->{type}|$mouse->{name}"); + local $mouse->{XEMU3} = bool2yesno($mouse->{nbuttons} < 3); + local $mouse->{WHEEL} = bool2yesno($mouse->{nbuttons} > 3); + setVarsInSh("$prefix/etc/sysconfig/mouse", $mouse, qw(MOUSETYPE XMOUSETYPE FULLNAME XEMU3 WHEEL device)); + symlinkf $mouse->{device}, "$prefix/dev/mouse" or log::l("creating $prefix/dev/mouse symlink failed"); } -sub read($) { getVarsFromSh $_[0]; } +sub mouseconfig { + my ($t, $mouse, $wacom); -sub write($;$) { - my ($mouse, $prefix) = @_; - setVarsInSh("$prefix/etc/sysconfig/mouse", $mouse, qw(MOUSETYPE XMOUSETYPE FULLNAME XEMU3)); - symlink $mouse->{device}, "$prefix/dev/mouse" or log::l("creating $prefix/dev/mouse symlink failed"); + #- Whouah! probing all devices from ttyS0 to ttyS3 once a time! + detect_devices::probeSerialDevices(); + + #- check new probing methods keep everything used here intact! + foreach (0..3) { + $t = detect_devices::probeSerial("/dev/ttyS$_"); + if ($t->{CLASS} eq 'MOUSE') { + $t->{MFG} ||= $t->{MANUFACTURER}; + + $mouse = fullname2mouse("serial|Microsoft IntelliMouse") if $t->{MFG} eq 'MSH' && $t->{MODEL} eq '0001'; + $mouse = fullname2mouse("serial|Logitech MouseMan") if $t->{MFG} eq 'LGI' && $t->{MODEL} =~ /^80/; + $mouse = fullname2mouse("serial|Genius NetMouse") if $t->{MFG} eq 'KYE' && $t->{MODEL} eq '0003'; + + $mouse ||= fullname2mouse("serial|Generic 2 Button Mouse"); #- generic by default. + $mouse->{device} = "ttyS$_"; + last; + } elsif ($t->{CLASS} eq "PEN" || $t->{MANUFACTURER} eq "WAC") { + $wacom = "ttyS$_"; + } + } + $mouse, $wacom; } sub detect() { - my %l; - @l{qw(FULLNAME nbuttons MOUSETYPE XMOUSETYPE device)} = split("\n", `mouseconfig --nointeractive 2>/dev/null`) or die "mouseconfig failed"; - \%l; + if (arch() =~ /^sparc/) { + return fullname2mouse("sunmouse|Sun - Mouse"); + } + if (arch() eq "ppc") { + return fullname2mouse(detect_devices::hasMousePS2("usbmouse") ? + "USB|Generic" : + # No need to search for an ADB mouse. If I did, the PPC kernel would + # find one whether or not I had one installed! So.. default to it. + "busmouse|2 buttons"); + } + + if ($::isStandalone) { + detect_devices::hasMousePS2("psaux") and return fullname2mouse("PS/2|Standard", unsafe => 1); + } + + #- probe serial device to make sure a wacom has been detected. + eval { commands::modprobe("serial") }; + my ($r, $wacom) = mouseconfig(); return ($r, $wacom) if $r; + + if (!$::isStandalone) { + detect_devices::hasMousePS2("psaux") and return fullname2mouse("PS/2|Standard", unsafe => 1), $wacom; + } + + if (modules::get_alias("usb-interface") && detect_devices::hasUsbMouse()) { + eval { + modules::load("usbmouse"); + modules::load("mousedev"); + }; + !$@ && detect_devices::tryOpen("usbmouse") and return fullname2mouse("USB|Generic"), $wacom; + eval { + modules::unload("mousedev"); + modules::unload("usbmouse"); + } + } + + #- in case only a wacom has been found, assume an inexistant mouse (necessary). + $wacom and return { CLASS => 'MOUSE', + nbuttons => 2, + device => "nothing", + MOUSETYPE => "Microsoft", + XMOUSETYPE => "Microsoft"}, $wacom; + + #- defaults to generic serial mouse on ttyS0. + #- Oops? using return let return a hash ref, if not using it, it return a list directly :-) + return fullname2mouse("serial|Generic 2 Button Mouse", unsafe => 1); +} + +#- write_conf : write the mouse infos into the Xconfig files. +#- input : +#- $mouse : the hashtable containing the informations +#- $mouse input +#- $mouse->{nbuttons} : number of buttons : integer +#- $mouse->{device} : device of the mouse : string : ex 'psaux' +#- $mouse->{XMOUSETYPE} : type of the mouse for gpm : string : ex 'PS/2' +#- $mouse->{type} : type (generic ?) of the mouse : string : ex 'PS/2' +#- $mouse->{name} : name of the mouse : string : ex 'Standard' +#- $mouse->{MOUSETYPE} : type of the mouse : string : ex "ps/2" +#- $mouse->{XEMU3} : emulate 3rd button : string : 'yes' or 'no' +sub write_conf { + my ($mouse) = @_; + + mouse::write('', $mouse); + modules::write_conf('') if $mouse->{device} eq "usbmouse" && !$::testing; + + my $f = "/etc/X11/XF86Config"; + my $g = "/etc/X11/XF86Config-4"; + + my @zaxis = ( + $mouse->{nbuttons} > 3 ? [ "ZAxisMapping", "4 5" ] : (), + $mouse->{nbuttons} > 5 ? [ "ZAxisMapping", "6 7" ] : (), + $mouse->{nbuttons} < 3 ? ([ "Emulate3Buttons" ], [ "Emulate3Timeout", "50" ]) : () + ); + + my $zaxis = join('', map { qq(\n $_->[0]) . ($_->[1] && qq( $_->[1])) } @zaxis); + substInFile { + if (/^Section\s+"Pointer"/ .. /^EndSection/) { + $_ = '' if /(ZAxisMapping|Emulate3)/; #- remove existing line + s|^(\s*Protocol\s+).*|$1"$mouse->{XMOUSETYPE}"|; + s|^(\s*Device\s+).*|$1"/dev/mouse"$zaxis|; + } + } $f if -e $f && !$::testing; + + $zaxis = join('', map { qq(\n Option "$_->[0]") . ($_->[1] && qq( "$_->[1]")) } @zaxis); + substInFile { + if (/Identifier\s+"Mouse1"/ .. /^EndSection/) { + $_ = '' if /(ZAxisMapping|Emulate3)/; #- remove existing line + s|^(\s*Option\s+"Protocol"\s+).*|$1"$mouse->{XMOUSETYPE}"|; + s|^(\s*Option\s+"Device"\s+).*|$1"/dev/mouse"$zaxis|; + } + } $g if -e $g && !$::testing; } |