File: source_mtdev.py

package info (click to toggle)
mtdev 1.1.2-1
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 1,488 kB
  • sloc: sh: 11,043; ansic: 1,442; python: 85; makefile: 57
file content (137 lines) | stat: -rw-r--r-- 4,168 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# Multitouch device related problems
# Author: Ara Pulido <ara@ubuntu.com>
# (C) 2010 Canonical Ltd.
# License: GPL v2 or later.

from glob import glob
from subprocess import Popen, PIPE
import sys
import apport.hookutils
import time
import os

# See linux/input.h
ABS_MT_POSITION_X = 0x35

# scan-for-mt-devices written by Marc Tardif, 
# based on a script by Henrik Rydberg
class Input(object):

    def __init__(self, path):
        self.path = path

    @property
    def device(self):
        base = os.path.basename(self.path)
        return os.path.join("/dev", "input", base)

    @property
    def name(self):
        path = os.path.join(self.path, "device", "name")
        return read_line(path)

    def get_capabilities(self):
        path = os.path.join(self.path, "device", "capabilities", "abs")
        line = read_line(path)
        capabilities = []
        long_bit = getconf("LONG_BIT")
        for i, word in enumerate(line.split(" ")):
            word = int(word, 16)
            subcapabilities = [bool(word & 1<<i) for i in range(long_bit)]
            capabilities[:0] = subcapabilities

        return capabilities

    def has_capability(self, capability):
        capabilities = self.get_capabilities()
        return len(capabilities) > capability and capabilities[capability]


def getconf(var):
    output = Popen(["getconf", var], stdout=PIPE).communicate()[0]
    return int(output)

def get_inputs(path):
    event_glob = os.path.join(path, "event*")
    for event_path in glob(event_glob):
        yield Input(event_path)

def read_line(path):
    f = open(path)
    try:
        return f.readline().strip()
    finally:
        f.close()

def scan_for_mt_devices(report):

    capability = ABS_MT_POSITION_X
    input = "/sys/class/input"

    inputs = get_inputs(input)
    inputs = [i for i in inputs if i.has_capability(capability)]

    report['MtDevices'] = ''

    if inputs:
        for input in inputs:
            report['MtDevices'] += "%s: %s\n" % (input.name, input.device)

        return 0
    else:
        report['MtDevices'] += "No capable devices found..."
        return 1

##################################

description = 'Multitouch device problem'
RELATED_PACKAGES = ['xserver-xorg', 'xserver-xorg-video-intel', 'xserver-xorg-video-ati', 'libmtdev1', 'libutouch-grail1', 'libutouch-geis1']


def add_info(report, ui):

    report.setdefault('Tags', '')
    report['Tags'] += ' hci touch'

    # Capture hardware
    apport.hookutils.attach_hardware(report)
    report['PciDisplay'] = apport.hookutils.pci_devices(apport.hookutils.PCI_DISPLAY)
    
    # Attach the results of scan mt devices
    scan_for_mt_devices(report)

    # Only collect the following data if X11 is available
    if os.environ.get('DISPLAY'):
        # For resolution/multi-head bugs
        report['Xrandr'] = apport.hookutils.command_output(['xrandr', '--verbose'])
        apport.hookutils.attach_file_if_exists(report,
                              os.path.expanduser('~/.config/monitors.xml'),
                              'monitors.xml')

    # Attach the Xorg logs and config    
    apport.hookutils.attach_file_if_exists(report, '/etc/X11/xorg.conf', 'XorgConf')
    apport.hookutils.attach_file(report, '/var/log/Xorg.0.log', 'XorgLog')
    apport.hookutils.attach_file_if_exists(report, '/var/log/Xorg.0.log.old', 'XorgLogOld')
    apport.hookutils.attach_file_if_exists(report, '/var/log/gdm/:0.log', 'GdmLog')
    apport.hookutils.attach_file_if_exists(report, '/var/log/gdm/:0.log.1', 'GdmLogOld')


    # Attach the output of xinput
    report['XInput'] = apport.hookutils.command_output(['xinput', 'input'])

    # Attach the output of lsinput
    report['LsInput'] = apport.hookutils.root_command_output(["lsinput"])

    # Attach descriptors
    attach_descriptors(report)

    apport.hookutils.attach_related_packages(report, RELATED_PACKAGES)

def attach_descriptors(report):
    path = '/sys/kernel/debug/hid/*/rdesc'
    for desc in glob(path):
        name = desc.split('/')[5]
        name = name.replace(":", "").replace(".", "")
        report[name] = apport.hookutils.root_command_output(["cat", desc])