| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 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 "views/events/event.h" | |
| 6 | |
| 7 #include <gdk/gdk.h> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" | |
| 11 #include "ui/gfx/point.h" | |
| 12 | |
| 13 namespace { | |
| 14 | |
| 15 unsigned int GetGdkStateFromNative(GdkEvent* gdk_event) { | |
| 16 switch (gdk_event->type) { | |
| 17 case GDK_KEY_PRESS: | |
| 18 case GDK_KEY_RELEASE: | |
| 19 return gdk_event->key.state; | |
| 20 case GDK_BUTTON_PRESS: | |
| 21 case GDK_2BUTTON_PRESS: | |
| 22 case GDK_3BUTTON_PRESS: | |
| 23 case GDK_BUTTON_RELEASE: | |
| 24 return gdk_event->button.state; | |
| 25 case GDK_SCROLL: | |
| 26 return gdk_event->scroll.state; | |
| 27 case GDK_MOTION_NOTIFY: | |
| 28 return gdk_event->motion.state; | |
| 29 case GDK_ENTER_NOTIFY: | |
| 30 case GDK_LEAVE_NOTIFY: | |
| 31 return gdk_event->crossing.state; | |
| 32 default: | |
| 33 NOTREACHED(); | |
| 34 break; | |
| 35 } | |
| 36 return 0; | |
| 37 } | |
| 38 | |
| 39 int GetFlagsFromGdkState(unsigned int state) { | |
| 40 int flags = 0; | |
| 41 flags |= (state & GDK_LOCK_MASK) ? ui::EF_CAPS_LOCK_DOWN : 0; | |
| 42 flags |= (state & GDK_CONTROL_MASK) ? ui::EF_CONTROL_DOWN : 0; | |
| 43 flags |= (state & GDK_SHIFT_MASK) ? ui::EF_SHIFT_DOWN : 0; | |
| 44 flags |= (state & GDK_MOD1_MASK) ? ui::EF_ALT_DOWN : 0; | |
| 45 flags |= (state & GDK_BUTTON1_MASK) ? ui::EF_LEFT_BUTTON_DOWN : 0; | |
| 46 flags |= (state & GDK_BUTTON2_MASK) ? ui::EF_MIDDLE_BUTTON_DOWN : 0; | |
| 47 flags |= (state & GDK_BUTTON3_MASK) ? ui::EF_RIGHT_BUTTON_DOWN : 0; | |
| 48 return flags; | |
| 49 } | |
| 50 | |
| 51 //////////////////////////////////////////////////////////////////////////////// | |
| 52 // These functions mirror ui/base/events.h, but GTK is in the midst of removal. | |
| 53 | |
| 54 ui::EventType EventTypeFromNative(GdkEvent* gdk_event) { | |
| 55 // Add new event types as necessary. | |
| 56 switch (gdk_event->type) { | |
| 57 case GDK_2BUTTON_PRESS: | |
| 58 case GDK_3BUTTON_PRESS: | |
| 59 case GDK_BUTTON_PRESS: | |
| 60 return ui::ET_MOUSE_PRESSED; | |
| 61 case GDK_BUTTON_RELEASE: | |
| 62 return ui::ET_MOUSE_RELEASED; | |
| 63 case GDK_DRAG_MOTION: | |
| 64 return ui::ET_MOUSE_DRAGGED; | |
| 65 case GDK_ENTER_NOTIFY: | |
| 66 return ui::ET_MOUSE_ENTERED; | |
| 67 case GDK_KEY_PRESS: | |
| 68 return ui::ET_KEY_PRESSED; | |
| 69 case GDK_KEY_RELEASE: | |
| 70 return ui::ET_KEY_RELEASED; | |
| 71 case GDK_LEAVE_NOTIFY: | |
| 72 return ui::ET_MOUSE_EXITED; | |
| 73 case GDK_MOTION_NOTIFY: | |
| 74 if (gdk_event->motion.state & GDK_BUTTON1_MASK || | |
| 75 gdk_event->motion.state & GDK_BUTTON2_MASK || | |
| 76 gdk_event->motion.state & GDK_BUTTON3_MASK || | |
| 77 gdk_event->motion.state & GDK_BUTTON4_MASK || | |
| 78 gdk_event->motion.state & GDK_BUTTON5_MASK) { | |
| 79 return ui::ET_MOUSE_DRAGGED; | |
| 80 } | |
| 81 return ui::ET_MOUSE_MOVED; | |
| 82 case GDK_SCROLL: | |
| 83 return ui::ET_MOUSEWHEEL; | |
| 84 default: | |
| 85 NOTREACHED(); | |
| 86 break; | |
| 87 } | |
| 88 return ui::ET_UNKNOWN; | |
| 89 } | |
| 90 | |
| 91 int EventFlagsFromNative(GdkEvent* gdk_event) { | |
| 92 int flags = GetFlagsFromGdkState(GetGdkStateFromNative(gdk_event)); | |
| 93 if (gdk_event->type == GDK_2BUTTON_PRESS) | |
| 94 flags |= ui::EF_IS_DOUBLE_CLICK; | |
| 95 if (gdk_event->type == GDK_BUTTON_PRESS || | |
| 96 gdk_event->type == GDK_2BUTTON_PRESS || | |
| 97 gdk_event->type == GDK_3BUTTON_PRESS || | |
| 98 gdk_event->type == GDK_BUTTON_RELEASE) { | |
| 99 switch (gdk_event->button.button) { | |
| 100 case 1: | |
| 101 return flags | ui::EF_LEFT_BUTTON_DOWN; | |
| 102 case 2: | |
| 103 return flags | ui::EF_MIDDLE_BUTTON_DOWN; | |
| 104 case 3: | |
| 105 return flags | ui::EF_RIGHT_BUTTON_DOWN; | |
| 106 } | |
| 107 } | |
| 108 return flags; | |
| 109 } | |
| 110 | |
| 111 gfx::Point EventLocationFromNative(GdkEvent* gdk_event) { | |
| 112 double x = 0, y = 0; | |
| 113 if (gdk_event_get_coords(gdk_event, &x, &y)) | |
| 114 return gfx::Point(static_cast<int>(x), static_cast<int>(y)); | |
| 115 return gfx::Point(); | |
| 116 } | |
| 117 | |
| 118 ui::KeyboardCode KeyboardCodeFromNative(GdkEvent* gdk_event) { | |
| 119 DCHECK(gdk_event->type == GDK_KEY_PRESS || | |
| 120 gdk_event->type == GDK_KEY_RELEASE); | |
| 121 return ui::KeyboardCodeFromGdkEventKey(&gdk_event->key); | |
| 122 } | |
| 123 | |
| 124 int GetMouseWheelOffset(GdkEvent* gdk_event) { | |
| 125 DCHECK(gdk_event->type == GDK_SCROLL); | |
| 126 int offset = (gdk_event->scroll.direction == GDK_SCROLL_UP || | |
| 127 gdk_event->scroll.direction == GDK_SCROLL_LEFT) ? 1 : -1; | |
| 128 return offset; | |
| 129 } | |
| 130 | |
| 131 } // namespace | |
| 132 | |
| 133 namespace views { | |
| 134 | |
| 135 //////////////////////////////////////////////////////////////////////////////// | |
| 136 // Event, protected: | |
| 137 | |
| 138 Event::Event(GdkEvent* gdk_event, ui::EventType type, int flags) | |
| 139 : native_event_(NULL), | |
| 140 gdk_event_(gdk_event), | |
| 141 type_(type), | |
| 142 time_stamp_(base::Time::NowFromSystemTime()), | |
| 143 flags_(flags) { | |
| 144 } | |
| 145 | |
| 146 //////////////////////////////////////////////////////////////////////////////// | |
| 147 // LocatedEvent, protected: | |
| 148 | |
| 149 LocatedEvent::LocatedEvent(GdkEvent* gdk_event) | |
| 150 : Event(gdk_event, | |
| 151 EventTypeFromNative(gdk_event), | |
| 152 EventFlagsFromNative(gdk_event)), | |
| 153 location_(EventLocationFromNative(gdk_event)) { | |
| 154 } | |
| 155 | |
| 156 //////////////////////////////////////////////////////////////////////////////// | |
| 157 // KeyEvent, public: | |
| 158 | |
| 159 KeyEvent::KeyEvent(GdkEvent* gdk_event) | |
| 160 : Event(gdk_event, | |
| 161 EventTypeFromNative(gdk_event), | |
| 162 EventFlagsFromNative(gdk_event)), | |
| 163 key_code_(KeyboardCodeFromNative(gdk_event)), | |
| 164 character_(0), | |
| 165 unmodified_character_(0) { | |
| 166 } | |
| 167 | |
| 168 //////////////////////////////////////////////////////////////////////////////// | |
| 169 // MouseEvent, public: | |
| 170 | |
| 171 MouseEvent::MouseEvent(GdkEvent* gdk_event) | |
| 172 : LocatedEvent(gdk_event) { | |
| 173 } | |
| 174 | |
| 175 //////////////////////////////////////////////////////////////////////////////// | |
| 176 // MouseWheelEvent, public: | |
| 177 | |
| 178 MouseWheelEvent::MouseWheelEvent(GdkEvent* gdk_event) | |
| 179 : MouseEvent(gdk_event), | |
| 180 offset_(kWheelDelta * GetMouseWheelOffset(gdk_event)) { | |
| 181 } | |
| 182 | |
| 183 } // namespace views | |
| OLD | NEW |