diff options
Diffstat (limited to 'views/touchui/touch_factory.cc')
-rw-r--r-- | views/touchui/touch_factory.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/views/touchui/touch_factory.cc b/views/touchui/touch_factory.cc new file mode 100644 index 0000000..8608782 --- /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 |