summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-07-22 15:08:00 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-07-25 13:22:41 +1000
commit500950a925c3b8f6c7235ae4a1dfc7892f955581 (patch)
treef262b9fc9a8375fa3fdc5fabe9f109a2b78707e7
parent65c6551a0abf626af631ebeb72520e0c31267790 (diff)
XOrg: add two modules representing input devices and the xinput tool
xinput currently only wraps device names in xinput --list. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rwxr-xr-xXOrg/InputDevice.pm66
-rwxr-xr-xXOrg/xinput.pm176
2 files changed, 242 insertions, 0 deletions
diff --git a/XOrg/InputDevice.pm b/XOrg/InputDevice.pm
new file mode 100755
index 0000000..33d62be
--- /dev/null
+++ b/XOrg/InputDevice.pm
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+# Copyright © 2011 by Red Hat, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Authors: Peter Hutterer <peter.hutterer@redhat.com>
+
+
+# Generic input device class
+
+package InputDevice;
+
+use warnings;
+use strict;
+
+# Class methods
+sub TYPE_MASTER_POINTER { return 1; }
+sub TYPE_MASTER_KEYBOARD { return 2; }
+sub TYPE_SLAVE { return 3; }
+sub TYPE_FLOATING_SLAVE { return 4; }
+
+# Instance methods
+sub new {
+ my $class = shift;
+ my $self = {@_};
+ bless ($self, $class);
+ return $self;
+}
+
+sub name {
+ my $self = shift;
+ my $name = shift;
+ $self->{name} = $name if defined $name;
+ return $self->{name};
+}
+
+sub id {
+ my $self = shift;
+ my $id = shift;
+ $self->{id} = $id if defined $id;
+ return $self->{id};
+}
+
+sub attachment {
+ my $self = shift;
+ my $attachment = shift;
+ $self->{attachment} = $attachment if defined $attachment;
+ return $self->{attachment};
+}
+
+1;
+
+# vim: set noexpandtab shiftwidth=8 tabstop=8:
diff --git a/XOrg/xinput.pm b/XOrg/xinput.pm
new file mode 100755
index 0000000..960b0af
--- /dev/null
+++ b/XOrg/xinput.pm
@@ -0,0 +1,176 @@
+#!/usr/bin/perl
+
+# Copyright © 2011 by Red Hat, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Authors: Peter Hutterer <peter.hutterer@redhat.com>
+
+
+# Parser for xinput output
+#
+# Parses the output from git://anongit.freedesktoip.org/git/xorg/app/xinput
+# and makes it available via various subs.
+
+package xinput;
+
+use InputDevice;
+
+use warnings;
+use strict;
+
+# Instance methods
+# Parameters:
+# device: the device name of the device this instance should apply to
+sub new {
+ my $class = shift;
+ my $self = {@_};
+ bless ($self, $class);
+ return $self;
+}
+
+# Run xinput list, collect output, save and return as array.
+# Output is cached, calling list multiple times will not query the X Server
+# again
+sub _list {
+ my $self = shift;
+ my @output;
+
+ if (defined $self->{list_output}) {
+ return @{$self->{list_output}};
+ }
+
+ open XINPUT, "xinput list --long |";
+ @output = <XINPUT>;
+ $self->{list_output} = [@output];
+ $self->_parse_list(\@output);
+
+ return @output;
+}
+
+# Return True if the device is present in the xinput list output
+# Arguments:
+# The device name, if missing the internal device name is picked.
+sub is_present {
+ my $self = shift;
+ my $device = shift;
+
+ $device = $self->{device} if (not defined $device);
+ my @devices = $self->get_devices;
+
+ for (@devices) {
+ return 1 if $_->name eq $device;
+ }
+
+ return 0;
+}
+
+# Parse xinput list output
+# Arguments:
+# array reference to xinput list output, otherwise internal output is
+# taken
+sub _parse_list {
+ my $self = shift;
+ my $ref = shift;
+ my @output;
+ my @devices;
+ my $current_master;
+
+ if (defined $ref) {
+ @output = @{$ref};
+ } else {
+ @output = $self->_list;
+ }
+
+ for my $line (@output) {
+ chomp $line;
+ my $type;
+ $type = InputDevice::TYPE_MASTER_POINTER if ($line =~ /⎡ /);
+ $type = InputDevice::TYPE_MASTER_KEYBOARD if ($line =~ /⎣ /);
+ $type = InputDevice::TYPE_FLOATING_SLAVE if ($line =~ /∼ /);
+ $type = InputDevice::TYPE_SLAVE if ($line =~ /[| ] ↳ /);
+
+ next if (not defined $type);
+
+ if ($line =~ / ([⎡⎣∼]|[| ] ↳)[ ] # first chars depend on type
+ ([^ ]+) # device name
+ [ ]+ # separator tab
+ id=([0-9]+) # device ID, ignore the rest
+ /x) {
+ my $name = $2;
+ $name =~ s/^\s+|\s+$//g; # strip whitespace
+ my $dev = InputDevice->new(
+ name => $name,
+ id => $3,
+ type => $type,
+ );
+
+ if ($type == InputDevice::TYPE_MASTER_POINTER or
+ $type == InputDevice::TYPE_MASTER_KEYBOARD) {
+ $current_master = $dev;
+ } elsif ($type == InputDevice::TYPE_SLAVE) {
+ $dev->attachment($current_master);
+ }
+
+ push @devices, $dev;
+ } else {
+ # some other line, skip
+ }
+ }
+
+ @{$self->{devices}} = @devices;
+}
+
+# Return an array of InputDevices
+sub get_devices {
+ my $self = shift;
+
+ $self->_list if (not defined $self->{devices});
+ return @{$self->{devices}};
+}
+
+# Return the number of devices
+sub get_num_devices {
+ my $self = shift;
+ return scalar $self->get_devices;
+}
+
+# Return a string with all devices in some machine-readable format
+sub print_tree {
+ my $self = shift;
+ my @devices = $self->get_devices;
+ my $str;
+
+ $str = "Devices in tree: ".scalar @devices."\n";
+ for my $i (0 ... scalar $#devices) {
+ next if $devices[$i]->attachment;
+
+ $str .= "{ ".$devices[$i]->name."\n";
+
+ for my $dev (@devices) {
+ next if not defined $dev->attachment;
+ if ($dev->attachment->name eq $devices[$i]->name) {
+ $str .= " {".$dev->name."}\n";
+ }
+ }
+ $str .= "}\n";
+ }
+
+ return $str;
+}
+
+1;
+
+# vim: set noexpandtab shiftwidth=8 tabstop=8: