diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-26 18:14:45 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-26 18:14:45 +0000 |
commit | a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a (patch) | |
tree | 521a058f131d900136105ce2ce3c368991de5ad1 /views/events | |
parent | 3a1381d637b14d103c581990451f92877107893e (diff) | |
download | chromium_src-a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a.zip chromium_src-a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a.tar.gz chromium_src-a4f857f0cafb41c3d7c3fd50c6b39c99e629b48a.tar.bz2 |
Wayland support for views. views_desktop on Wayland.
This CL depends on:
* http://codereview.chromium.org/7457023
* http://codereview.chromium.org/7467007
* http://codereview.chromium.org/7473010
Wayland requires newer libraries than Ubuntu currently provides. I've created a
list of required dependencies:
https://sites.google.com/a/google.com/chrome_on_wayland/home/wayland-build-dependencies
BUG=
TEST=Built Chrome to verify that Wayland dependencies and changes don't interfere with
the usual build.
Review URL: http://codereview.chromium.org/7464027
Patch from Daniel Nicoara <dnicoara@chromium.org>.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98453 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views/events')
-rw-r--r-- | views/events/event_wayland.cc | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/views/events/event_wayland.cc b/views/events/event_wayland.cc new file mode 100644 index 0000000..92b5482 --- /dev/null +++ b/views/events/event_wayland.cc @@ -0,0 +1,215 @@ +// 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/events/event.h" + +#include <X11/Xlib.h> + +#include "base/logging.h" +#include "ui/base/keycodes/keyboard_code_conversion_x.h" +#include "ui/wayland/events/wayland_event.h" + +namespace views { + +namespace { + +static int kWheelScrollAmount = 53; + +ui::EventType EventTypeFromNative(NativeEvent native_event) { + switch (native_event->type) { + case ui::WAYLAND_BUTTON: + switch (native_event->button.button) { + case ui::LEFT_BUTTON: + case ui::RIGHT_BUTTON: + case ui::MIDDLE_BUTTON: + return native_event->button.state ? ui::ET_MOUSE_PRESSED + : ui::ET_MOUSE_RELEASED; + case ui::SCROLL_UP: + case ui::SCROLL_DOWN: + return ui::ET_MOUSEWHEEL; + default: + break; + } + break; + case ui::WAYLAND_KEY: + return native_event->key.state ? ui::ET_KEY_PRESSED + : ui::ET_KEY_RELEASED; + case ui::WAYLAND_MOTION: + return ui::ET_MOUSE_MOVED; + case ui::WAYLAND_POINTER_FOCUS: + return native_event->pointer_focus.state ? ui::ET_MOUSE_ENTERED + : ui::ET_MOUSE_EXITED; + case ui::WAYLAND_KEYBOARD_FOCUS: + return ui::ET_UNKNOWN; + default: + break; + } + return ui::ET_UNKNOWN; +} + +gfx::Point GetMouseEventLocation(NativeEvent native_event) { + switch (native_event->type) { + case ui::WAYLAND_BUTTON: + return gfx::Point(native_event->button.x, native_event->button.y); + case ui::WAYLAND_MOTION: + return gfx::Point(native_event->motion.x, native_event->motion.y); + case ui::WAYLAND_POINTER_FOCUS: + return gfx::Point(native_event->pointer_focus.x, + native_event->pointer_focus.y); + default: + return gfx::Point(0, 0); + } +} + +int GetEventFlagsFromState(unsigned int state) { + int flags = 0; + if (state & ControlMask) + flags |= ui::EF_CONTROL_DOWN; + if (state & ShiftMask) + flags |= ui::EF_SHIFT_DOWN; + if (state & Mod1Mask) + flags |= ui::EF_ALT_DOWN; + if (state & LockMask) + flags |= ui::EF_CAPS_LOCK_DOWN; + if (state & Button1Mask) + flags |= ui::EF_LEFT_BUTTON_DOWN; + if (state & Button2Mask) + flags |= ui::EF_MIDDLE_BUTTON_DOWN; + if (state & Button3Mask) + flags |= ui::EF_RIGHT_BUTTON_DOWN; + + return flags; +} + +int GetButtonEventFlagsFromNativeEvent(NativeEvent native_event) { + // TODO(dnicoara): Need to add double click. + int flags = 0; + switch (native_event->button.button) { + case ui::LEFT_BUTTON: + return flags | ui::EF_LEFT_BUTTON_DOWN; + case ui::MIDDLE_BUTTON: + return flags | ui::EF_MIDDLE_BUTTON_DOWN; + case ui::RIGHT_BUTTON: + return flags | ui::EF_RIGHT_BUTTON_DOWN; + } + return flags; +} + +int GetEventFlagsFromNativeEvent(NativeEvent native_event) { + switch (native_event->type) { + case ui::WAYLAND_BUTTON: + return GetButtonEventFlagsFromNativeEvent(native_event) | + GetEventFlagsFromState(native_event->button.modifiers); + case ui::WAYLAND_KEY: + return GetEventFlagsFromState(native_event->key.modifiers); + case ui::WAYLAND_MOTION: + return GetEventFlagsFromState(native_event->motion.modifiers); + case ui::WAYLAND_KEYBOARD_FOCUS: + return GetEventFlagsFromState(native_event->keyboard_focus.modifiers); + default: + return 0; + } +} + +int GetMouseWheelOffset(NativeEvent native_event) { + if (native_event->button.button == ui::SCROLL_UP) { + return kWheelScrollAmount; + } else { + return -kWheelScrollAmount; + } +} + +} // namespace + +//////////////////////////////////////////////////////////////////////////////// +// Event, private: + +void Event::Init() { + native_event_ = NULL; + native_event_2_ = NULL; +} + +void Event::InitWithNativeEvent(NativeEvent native_event) { + native_event_ = native_event; + // TODO(dnicoara): Remove once we rid views of Gtk/Gdk. + native_event_2_ = NULL; +} + +void Event::InitWithNativeEvent2(NativeEvent2 native_event_2, + FromNativeEvent2) { + native_event_2_ = NULL; + // TODO(dnicoara): Remove once we rid views of Gtk/Gdk. + native_event_2_ = native_event_2; +} + +//////////////////////////////////////////////////////////////////////////////// +// MouseEvent, public: + +MouseEvent::MouseEvent(NativeEvent native_event) + : LocatedEvent(native_event) { +} + +MouseEvent::MouseEvent(NativeEvent2 native_event_2, + FromNativeEvent2 from_native) + : LocatedEvent(native_event_2, from_native) { + // TODO(dnicoara): Remove once we rid views of Gtk/Gdk. + NOTREACHED(); +} + +//////////////////////////////////////////////////////////////////////////////// +// LocatedEvent, protected: + +LocatedEvent::LocatedEvent(NativeEvent native_event) + : Event(native_event, EventTypeFromNative(native_event), + GetEventFlagsFromNativeEvent(native_event)), + location_(GetMouseEventLocation(native_event)) { +} + +LocatedEvent::LocatedEvent(NativeEvent2 native_event_2, + FromNativeEvent2 from_native) + : Event(native_event_2, ui::ET_UNKNOWN, 0, from_native) { + // TODO(dnicoara) Remove once we rid views of Gtk. + NOTREACHED(); +} + +////////////////////////////////////////////////////////////////////////////// +// KeyEvent, public: + + +KeyEvent::KeyEvent(NativeEvent native_event) + : Event(native_event, EventTypeFromNative(native_event), + GetEventFlagsFromNativeEvent(native_event)), + key_code_(ui::KeyboardCodeFromXKeysym(native_event->key.sym)) { +} + +KeyEvent::KeyEvent(NativeEvent2 native_event_2, FromNativeEvent2 from_native) + : Event(native_event_2, ui::ET_UNKNOWN, 0, from_native) { + // TODO(dnicoara) Remove once we rid views of Gtk. + NOTREACHED(); +} + +uint16 KeyEvent::GetCharacter() const { + return GetCharacterFromKeyCode(key_code_, flags()); +} + +uint16 KeyEvent::GetUnmodifiedCharacter() const { + return GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); +} + +////////////////////////////////////////////////////////////////////////////// +// MouseWheelEvent, public: + +MouseWheelEvent::MouseWheelEvent(NativeEvent native_event) + : MouseEvent(native_event), + offset_(GetMouseWheelOffset(native_event)) { +} + +MouseWheelEvent::MouseWheelEvent(NativeEvent2 native_event_2, + FromNativeEvent2 from_native) + : MouseEvent(native_event_2, from_native) { + // TODO(dnicoara) Remove once we rid views of Gtk. + NOTREACHED(); +} + +} // namespace views |