Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: ui/events/ozone/evdev/event_device_info.cc

Issue 58473003: evdev: Fix crashing with touch devices (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/events/ozone/evdev/event_device_info.h"
6
7 #include <linux/input.h>
8
9 #include "base/threading/thread_restrictions.h"
10
11 namespace ui {
12
13 namespace {
14
15 bool GetEventBits(int fd, unsigned int type, void* buf, unsigned int size) {
16 return ioctl(fd, EVIOCGBIT(type, size), buf) < 0;
17 }
18
19 bool BitIsSet(const unsigned long* bits, unsigned int bit) {
20 return (bits[bit / EVDEV_LONG_BITS] & (1UL << (bit % EVDEV_LONG_BITS)));
21 }
22
23 } // namespace
24
25 EventDeviceInfo::EventDeviceInfo() {
26 memset(ev_bits_, 0, sizeof(ev_bits_));
27 memset(key_bits_, 0, sizeof(key_bits_));
28 memset(rel_bits_, 0, sizeof(rel_bits_));
29 memset(abs_bits_, 0, sizeof(abs_bits_));
30 memset(msc_bits_, 0, sizeof(msc_bits_));
31 memset(sw_bits_, 0, sizeof(sw_bits_));
32 memset(led_bits_, 0, sizeof(led_bits_));
33 memset(prop_bits_, 0, sizeof(prop_bits_));
34 }
35
36 EventDeviceInfo::~EventDeviceInfo() {}
37
38 bool EventDeviceInfo::Initialize(int fd) {
39 base::ThreadRestrictions::AssertIOAllowed();
40
41 if (GetEventBits(fd, 0, ev_bits_, sizeof(ev_bits_)))
42 return false;
43
44 if (GetEventBits(fd, EV_KEY, key_bits_, sizeof(key_bits_)))
45 return false;
46
47 if (GetEventBits(fd, EV_REL, rel_bits_, sizeof(rel_bits_)))
48 return false;
49
50 if (GetEventBits(fd, EV_ABS, abs_bits_, sizeof(abs_bits_)))
51 return false;
52
53 if (GetEventBits(fd, EV_MSC, msc_bits_, sizeof(msc_bits_)))
54 return false;
55
56 if (GetEventBits(fd, EV_SW, sw_bits_, sizeof(sw_bits_)))
57 return false;
58
59 if (GetEventBits(fd, EV_LED, led_bits_, sizeof(led_bits_)))
60 return false;
61
62 if (ioctl(fd, EVIOCGPROP(sizeof(prop_bits_)), prop_bits_))
rjkroege 2013/11/04 23:39:46 you are not using the same ioctl as I was? And i
spang 2013/11/05 00:10:02 I am above in GetEventbits; this one is different.
63 return false;
64
65 return true;
66 }
67
68 bool EventDeviceInfo::HasEventType(unsigned int type) const {
69 if (type > EV_MAX)
70 return false;
71 return BitIsSet(ev_bits_, type);
72 }
73
74 bool EventDeviceInfo::HasKeyEvent(unsigned int code) const {
75 if (code > KEY_MAX)
76 return false;
77 return BitIsSet(key_bits_, code);
78 }
79
80 bool EventDeviceInfo::HasRelEvent(unsigned int code) const {
81 if (code > REL_MAX)
82 return false;
83 return BitIsSet(rel_bits_, code);
84 }
85
86 bool EventDeviceInfo::HasAbsEvent(unsigned int code) const {
87 if (code > ABS_MAX)
88 return false;
89 return BitIsSet(abs_bits_, code);
90 }
91
92 bool EventDeviceInfo::HasMscEvent(unsigned int code) const {
93 if (code > MSC_MAX)
94 return false;
95 return BitIsSet(msc_bits_, code);
96 }
97
98 bool EventDeviceInfo::HasSwEvent(unsigned int code) const {
99 if (code > SW_MAX)
100 return false;
101 return BitIsSet(sw_bits_, code);
102 }
103
104 bool EventDeviceInfo::hasLedEvent(unsigned int code) const {
105 if (code > LED_MAX)
106 return false;
107 return BitIsSet(led_bits_, code);
108 }
109
110 bool EventDeviceInfo::HasProp(unsigned int code) const {
111 if (code > INPUT_PROP_MAX)
112 return false;
113 return BitIsSet(prop_bits_, code);
114 }
115
116 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698