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

Unified Diff: ui/events/ozone/evdev/event_factory_evdev.cc

Issue 616633002: [Ozone-Evdev] Propagate touchscreen device information to DeviceDataManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 6 years, 3 months 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 side-by-side diff with in-line comments
Download patch
Index: ui/events/ozone/evdev/event_factory_evdev.cc
diff --git a/ui/events/ozone/evdev/event_factory_evdev.cc b/ui/events/ozone/evdev/event_factory_evdev.cc
index 7dc288fc76554faced493aace085ca541eea1f16..139411c8bad78c2de79824ef71542e993c7fcafb 100644
--- a/ui/events/ozone/evdev/event_factory_evdev.cc
+++ b/ui/events/ozone/evdev/event_factory_evdev.cc
@@ -12,6 +12,7 @@
#include "base/task_runner.h"
#include "base/thread_task_runner_handle.h"
#include "base/threading/worker_pool.h"
+#include "ui/events/device_data_manager.h"
#include "ui/events/ozone/device/device_event.h"
#include "ui/events/ozone/device/device_manager.h"
#include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
@@ -47,20 +48,21 @@ bool UseGesturesLibraryForDevice(const EventDeviceInfo& devinfo) {
scoped_ptr<EventConverterEvdev> CreateConverter(
int fd,
const base::FilePath& path,
- const EventDeviceInfo& devinfo,
+ scoped_ptr<EventDeviceInfo> devinfo,
const EventDispatchCallback& dispatch,
EventModifiersEvdev* modifiers,
CursorDelegateEvdev* cursor) {
#if defined(USE_EVDEV_GESTURES)
// Touchpad or mouse: use gestures library.
// EventReaderLibevdevCros -> GestureInterpreterLibevdevCros -> DispatchEvent
- if (UseGesturesLibraryForDevice(devinfo)) {
+ if (UseGesturesLibraryForDevice(*devinfo.get())) {
spang 2014/09/29 23:54:35 .get() is unnecessary
dnicoara 2014/09/30 18:23:27 Done.
scoped_ptr<GestureInterpreterLibevdevCros> gesture_interp = make_scoped_ptr(
new GestureInterpreterLibevdevCros(modifiers, cursor, dispatch));
scoped_ptr<EventReaderLibevdevCros> libevdev_reader =
make_scoped_ptr(new EventReaderLibevdevCros(
fd,
path,
+ devinfo.Pass(),
gesture_interp.PassAs<EventReaderLibevdevCros::Delegate>()));
return libevdev_reader.PassAs<EventConverterEvdev>();
}
@@ -68,13 +70,13 @@ scoped_ptr<EventConverterEvdev> CreateConverter(
// Touchscreen: use TouchEventConverterEvdev.
scoped_ptr<EventConverterEvdev> converter;
- if (devinfo.HasAbsXY())
+ if (devinfo->HasAbsXY())
return make_scoped_ptr<EventConverterEvdev>(
- new TouchEventConverterEvdev(fd, path, devinfo, dispatch));
+ new TouchEventConverterEvdev(fd, path, devinfo.Pass(), dispatch));
// Everything else: use KeyEventConverterEvdev.
- return make_scoped_ptr<EventConverterEvdev>(
- new KeyEventConverterEvdev(fd, path, modifiers, dispatch));
+ return make_scoped_ptr<EventConverterEvdev>(new KeyEventConverterEvdev(
+ fd, path, devinfo.Pass(), modifiers, dispatch));
}
// Open an input device. Opening may put the calling thread to sleep, and
@@ -87,6 +89,7 @@ void OpenInputDevice(
const base::FilePath& path,
EventModifiersEvdev* modifiers,
CursorDelegateEvdev* cursor,
+ int device_id,
scoped_refptr<base::TaskRunner> reply_runner,
const EventDispatchCallback& dispatch,
base::Callback<void(scoped_ptr<EventConverterEvdev>)> reply_callback) {
@@ -105,15 +108,15 @@ void OpenInputDevice(
if (ioctl(fd, EVIOCSCLOCKID, &clk))
PLOG(ERROR) << "failed to set CLOCK_MONOTONIC";
- EventDeviceInfo devinfo;
- if (!devinfo.Initialize(fd)) {
+ scoped_ptr<EventDeviceInfo> devinfo(new EventDeviceInfo(device_id));
+ if (!devinfo->Initialize(fd)) {
LOG(ERROR) << "failed to get device information for " << path.value();
close(fd);
return;
}
scoped_ptr<EventConverterEvdev> converter =
- CreateConverter(fd, path, devinfo, dispatch, modifiers, cursor);
+ CreateConverter(fd, path, devinfo.Pass(), dispatch, modifiers, cursor);
// Reply with the constructed converter.
reply_runner->PostTask(FROM_HERE,
@@ -131,10 +134,10 @@ void CloseInputDevice(const base::FilePath& path,
} // namespace
-EventFactoryEvdev::EventFactoryEvdev(
- CursorDelegateEvdev* cursor,
- DeviceManager* device_manager)
- : device_manager_(device_manager),
+EventFactoryEvdev::EventFactoryEvdev(CursorDelegateEvdev* cursor,
+ DeviceManager* device_manager)
+ : last_allocated_device_id_(0),
+ device_manager_(device_manager),
cursor_(cursor),
dispatch_callback_(
base::Bind(base::IgnoreResult(&EventFactoryEvdev::DispatchUiEvent),
@@ -163,6 +166,8 @@ void EventFactoryEvdev::AttachInputDevice(
// Add initialized device to map.
converters_[path] = converter.release();
converters_[path]->Start();
+
+ NotifyHotplugEventObserver(converters_[path], true);
}
void EventFactoryEvdev::OnDeviceEvent(const DeviceEvent& event) {
@@ -181,6 +186,7 @@ void EventFactoryEvdev::OnDeviceEvent(const DeviceEvent& event) {
event.path(),
&modifiers_,
cursor_,
+ ++last_allocated_device_id_,
spang 2014/09/29 23:54:35 Make a function for this: NextDeviceId()
dnicoara 2014/09/30 18:23:27 Done.
ui_task_runner_,
dispatch_callback_,
base::Bind(&EventFactoryEvdev::AttachInputDevice,
@@ -219,6 +225,8 @@ void EventFactoryEvdev::DetachInputDevice(const base::FilePath& path) {
// on UI since the polling happens on UI.
converter->Stop();
+ NotifyHotplugEventObserver(converter.get(), false);
+
// Dispatch task to close from the worker pool, since close may block.
base::WorkerPool::PostTask(
FROM_HERE,
@@ -240,4 +248,35 @@ void EventFactoryEvdev::WarpCursorTo(gfx::AcceleratedWidget widget,
}
}
+void EventFactoryEvdev::NotifyHotplugEventObserver(
+ EventConverterEvdev* converter, bool created) {
spang 2014/09/29 23:54:35 const EventConverterEvdev&
dnicoara 2014/09/30 18:23:27 Done.
+ EventDeviceInfo* device_info = converter->device_info();
+ // For now the only information propagated is related to touchscreens. Ignore
+ // events for everything but touchscreens.
+ if (!device_info->HasAbsXY() || !device_info->IsMappedToScreen())
spang 2014/09/29 23:54:35 Can you unify add/remove & just iterate the EventC
dnicoara 2014/09/30 18:23:27 Done.
+ return;
+
+ DeviceHotplugEventObserver* observer = DeviceDataManager::GetInstance();
+ std::vector<TouchscreenDevice> touchscreens =
+ DeviceDataManager::GetInstance()->touchscreen_devices();
+ if (created) {
+ touchscreens.push_back(TouchscreenDevice(
+ device_info->id(),
+ gfx::Size(device_info->GetAbsMaximum(ABS_MT_POSITION_X) -
+ device_info->GetAbsMinimum(ABS_MT_POSITION_X) + 1,
+ device_info->GetAbsMaximum(ABS_MT_POSITION_Y) -
+ device_info->GetAbsMinimum(ABS_MT_POSITION_Y) + 1),
+ false));
+ } else {
+ for (size_t i = 0; i < touchscreens.size(); ++i) {
+ if (touchscreens[i].id == device_info->id()) {
+ touchscreens.erase(touchscreens.begin() + i);
+ break;
+ }
+ }
+ }
+
+ observer->OnTouchscreenDevicesUpdated(touchscreens);
+}
+
} // namespace ui

Powered by Google App Engine
This is Rietveld 408576698