diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-07-22 15:08:00 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-07-25 13:22:41 +1000 |
commit | 500950a925c3b8f6c7235ae4a1dfc7892f955581 (patch) | |
tree | f262b9fc9a8375fa3fdc5fabe9f109a2b78707e7 | |
parent | 65c6551a0abf626af631ebeb72520e0c31267790 (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-x | XOrg/InputDevice.pm | 66 | ||||
-rwxr-xr-x | XOrg/xinput.pm | 176 |
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: |