summaryrefslogtreecommitdiffstats
path: root/perl-install/mouse.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/mouse.pm')
-rw-r--r--perl-install/mouse.pm318
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;
}