OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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 <linux/input.h> |
| 6 |
| 7 #include "ui/events/ozone/evdev/event_converter_evdev.h" |
| 8 |
| 9 #include "base/files/file_path.h" |
| 10 #include "base/logging.h" |
| 11 #include "base/message_loop/message_loop.h" |
| 12 #include "base/trace_event/trace_event.h" |
| 13 #include "ui/events/devices/input_device.h" |
| 14 |
| 15 namespace ui { |
| 16 |
| 17 EventConverterEvdev::EventConverterEvdev(int fd, |
| 18 const base::FilePath& path, |
| 19 int id, |
| 20 InputDeviceType type, |
| 21 const std::string& name, |
| 22 uint16_t vendor_id, |
| 23 uint16_t product_id) |
| 24 : fd_(fd), |
| 25 path_(path), |
| 26 input_device_(id, type, name, vendor_id, product_id) { |
| 27 } |
| 28 |
| 29 EventConverterEvdev::~EventConverterEvdev() { |
| 30 DCHECK(!enabled_); |
| 31 DCHECK(!watching_); |
| 32 if (fd_ >= 0) |
| 33 close(fd_); |
| 34 } |
| 35 |
| 36 void EventConverterEvdev::Start() { |
| 37 base::MessageLoopForUI::current()->WatchFileDescriptor( |
| 38 fd_, true, base::MessagePumpLibevent::WATCH_READ, &controller_, this); |
| 39 watching_ = true; |
| 40 } |
| 41 |
| 42 void EventConverterEvdev::Stop() { |
| 43 controller_.StopWatchingFileDescriptor(); |
| 44 watching_ = false; |
| 45 } |
| 46 |
| 47 void EventConverterEvdev::SetEnabled(bool enabled) { |
| 48 if (enabled == enabled_) |
| 49 return; |
| 50 if (enabled) { |
| 51 TRACE_EVENT1("evdev", "EventConverterEvdev::OnEnabled", "path", |
| 52 path_.value()); |
| 53 OnEnabled(); |
| 54 } else { |
| 55 TRACE_EVENT1("evdev", "EventConverterEvdev::OnDisabled", "path", |
| 56 path_.value()); |
| 57 OnDisabled(); |
| 58 } |
| 59 enabled_ = enabled; |
| 60 } |
| 61 |
| 62 void EventConverterEvdev::OnStopped() { |
| 63 } |
| 64 |
| 65 void EventConverterEvdev::OnEnabled() { |
| 66 } |
| 67 |
| 68 void EventConverterEvdev::OnDisabled() { |
| 69 } |
| 70 |
| 71 void EventConverterEvdev::OnFileCanWriteWithoutBlocking(int fd) { |
| 72 NOTREACHED(); |
| 73 } |
| 74 |
| 75 bool EventConverterEvdev::HasKeyboard() const { |
| 76 return false; |
| 77 } |
| 78 |
| 79 bool EventConverterEvdev::HasMouse() const { |
| 80 return false; |
| 81 } |
| 82 |
| 83 bool EventConverterEvdev::HasTouchpad() const { |
| 84 return false; |
| 85 } |
| 86 |
| 87 bool EventConverterEvdev::HasTouchscreen() const { |
| 88 return false; |
| 89 } |
| 90 |
| 91 bool EventConverterEvdev::HasCapsLockLed() const { |
| 92 return false; |
| 93 } |
| 94 |
| 95 gfx::Size EventConverterEvdev::GetTouchscreenSize() const { |
| 96 NOTREACHED(); |
| 97 return gfx::Size(); |
| 98 } |
| 99 |
| 100 int EventConverterEvdev::GetTouchPoints() const { |
| 101 NOTREACHED(); |
| 102 return 0; |
| 103 } |
| 104 |
| 105 void EventConverterEvdev::SetKeyFilter(bool enable_filter, |
| 106 std::vector<DomCode> allowed_keys) { |
| 107 NOTREACHED(); |
| 108 } |
| 109 |
| 110 void EventConverterEvdev::SetCapsLockLed(bool enabled) { |
| 111 if (!HasCapsLockLed()) |
| 112 return; |
| 113 |
| 114 input_event events[2]; |
| 115 memset(&events, 0, sizeof(events)); |
| 116 |
| 117 events[0].type = EV_LED; |
| 118 events[0].code = LED_CAPSL; |
| 119 events[0].value = enabled; |
| 120 |
| 121 events[1].type = EV_SYN; |
| 122 events[1].code = SYN_REPORT; |
| 123 events[1].value = 0; |
| 124 |
| 125 ssize_t written = write(fd_, events, sizeof(events)); |
| 126 |
| 127 if (written < 0) { |
| 128 if (errno != ENODEV) |
| 129 PLOG(ERROR) << "cannot set leds for " << path_.value() << ":"; |
| 130 Stop(); |
| 131 } else if (written != sizeof(events)) { |
| 132 LOG(ERROR) << "short write setting leds for " << path_.value(); |
| 133 Stop(); |
| 134 } |
| 135 } |
| 136 |
| 137 base::TimeDelta EventConverterEvdev::TimeDeltaFromInputEvent( |
| 138 const input_event& event) { |
| 139 return base::TimeDelta::FromMicroseconds(event.time.tv_sec * 1000000 + |
| 140 event.time.tv_usec); |
| 141 } |
| 142 } // namespace ui |
OLD | NEW |