Index: views/touchui/touch_factory.cc |
diff --git a/views/touchui/touch_factory.cc b/views/touchui/touch_factory.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..86087829e9818d14123cf787ae3b5aea301537fb |
--- /dev/null |
+++ b/views/touchui/touch_factory.cc |
@@ -0,0 +1,79 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "views/touchui/touch_factory.h" |
+ |
+#include <gdk/gdkx.h> |
+#include <X11/extensions/XInput2.h> |
+ |
+#include "base/logging.h" |
+ |
+namespace views { |
+ |
+// static |
+TouchFactory* TouchFactory::GetInstance() { |
+ return Singleton<TouchFactory>::get(); |
+} |
+ |
+TouchFactory::TouchFactory() |
+ : touch_device_lookup_(), |
+ touch_device_list_() { |
+} |
+ |
+void TouchFactory::SetTouchDeviceList( |
+ const std::vector<unsigned int>& devices) { |
+ touch_device_lookup_.reset(); |
+ touch_device_list_.clear(); |
+ for (std::vector<unsigned int>::const_iterator iter = devices.begin(); |
+ iter != devices.end(); ++iter) { |
+ DCHECK(*iter < touch_device_lookup_.size()); |
+ touch_device_lookup_[*iter] = true; |
+ touch_device_list_.push_back(*iter); |
+ } |
+} |
+ |
+bool TouchFactory::IsTouchDevice(unsigned deviceid) { |
+ return deviceid < touch_device_lookup_.size() ? |
+ touch_device_lookup_[deviceid] : false; |
+} |
+ |
+bool TouchFactory::GrabTouchDevices(Display* display, ::Window window) { |
+ if (touch_device_list_.empty()) |
+ return true; |
+ |
+ unsigned char mask[(XI_LASTEVENT + 7) / 8]; |
+ bool success = true; |
+ |
+ memset(mask, 0, sizeof(mask)); |
+ XISetMask(mask, XI_ButtonPress); |
+ XISetMask(mask, XI_ButtonRelease); |
+ XISetMask(mask, XI_Motion); |
+ |
+ XIEventMask evmask; |
+ evmask.mask_len = sizeof(mask); |
+ evmask.mask = mask; |
+ for (std::vector<int>::const_iterator iter = |
+ touch_device_list_.begin(); |
+ iter != touch_device_list_.end(); ++iter) { |
+ evmask.deviceid = *iter; |
+ Status status = XIGrabDevice(display, *iter, window, CurrentTime, None, |
+ GrabModeAsync, GrabModeAsync, False, &evmask); |
+ success = success && status == GrabSuccess; |
+ } |
+ |
+ return success; |
+} |
+ |
+bool TouchFactory::UngrabTouchDevices(Display* display) { |
+ bool success = true; |
+ for (std::vector<int>::const_iterator iter = |
+ touch_device_list_.begin(); |
+ iter != touch_device_list_.end(); ++iter) { |
+ Status status = XIUngrabDevice(display, *iter, CurrentTime); |
+ success = success && status == GrabSuccess; |
+ } |
+ return success; |
+} |
+ |
+} // namespace views |