Index: views/event_x.cc |
diff --git a/views/event_x.cc b/views/event_x.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..69101bb7a864cf19dbda3d12ac7deeef121883ed |
--- /dev/null |
+++ b/views/event_x.cc |
@@ -0,0 +1,117 @@ |
+// Copyright (c) 2010 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/event.h" |
+ |
+#include <gdk/gdkx.h> |
+ |
+#include "app/keyboard_code_conversion_x.h" |
+#include "views/widget/root_view.h" |
+#include "views/widget/widget_gtk.h" |
+ |
+namespace views { |
+ |
+namespace { |
+ |
+int GetEventFlagsFromXState(unsigned int state) { |
+ int flags = 0; |
+ if (state & ControlMask) |
+ flags |= Event::EF_CONTROL_DOWN; |
+ if (state & ShiftMask) |
+ flags |= Event::EF_SHIFT_DOWN; |
+ if (state & Mod1Mask) |
+ flags |= Event::EF_ALT_DOWN; |
+ if (state & Button1Mask) |
+ flags |= Event::EF_LEFT_BUTTON_DOWN; |
+ if (state & Button2Mask) |
+ flags |= Event::EF_MIDDLE_BUTTON_DOWN; |
+ if (state & Button3Mask) |
+ flags |= Event::EF_RIGHT_BUTTON_DOWN; |
+ |
+ return flags; |
+} |
+ |
+// Get the event flag for the button in XButtonEvent. During a KeyPress event, |
+// |state| in XButtonEvent does not include the button that has just been |
+// pressed. Instead |state| contains flags for the buttons (if any) that had |
+// already been pressed before the current button, and |button| stores the most |
+// current pressed button. So, if you press down left mouse button, and while |
+// pressing it down, press down the right mouse button, then for the latter |
+// event, |state| would have Button1Mask set but not Button3Mask, and |button| |
+// would be 3. |
+int GetEventFlagsForButton(int button) { |
+ switch (button) { |
+ case 1: |
+ return Event::EF_LEFT_BUTTON_DOWN; |
+ case 2: |
+ return Event::EF_MIDDLE_BUTTON_DOWN; |
+ case 3: |
+ return Event::EF_RIGHT_BUTTON_DOWN; |
+ } |
+ |
+ DLOG(WARNING) << "Unexpected button (" << button << ") received."; |
+ return 0; |
+} |
+ |
+Event::EventType GetMouseEventType(XEvent* xev) { |
+ switch (xev->type) { |
+ case ButtonPress: |
+ return Event::ET_MOUSE_PRESSED; |
+ case ButtonRelease: |
+ return Event::ET_MOUSE_RELEASED; |
+ case MotionNotify: |
+ if (xev->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) { |
+ return Event::ET_MOUSE_DRAGGED; |
+ } |
+ return Event::ET_MOUSE_MOVED; |
+ } |
+ |
+ return Event::ET_UNKNOWN; |
+} |
+ |
+gfx::Point GetMouseEventLocation(XEvent* xev) { |
+ switch (xev->type) { |
+ case ButtonPress: |
+ case ButtonRelease: |
+ return gfx::Point(xev->xbutton.x, xev->xbutton.y); |
+ |
+ case MotionNotify: |
+ return gfx::Point(xev->xmotion.x, xev->xmotion.y); |
+ } |
+ |
+ return gfx::Point(); |
+} |
+ |
+int GetMouseEventFlags(XEvent* xev) { |
+ switch (xev->type) { |
+ case ButtonPress: |
+ case ButtonRelease: |
+ return GetEventFlagsFromXState(xev->xbutton.state) | |
+ GetEventFlagsForButton(xev->xbutton.button); |
+ |
+ case MotionNotify: |
+ return GetEventFlagsFromXState(xev->xmotion.state); |
+ } |
+ |
+ return 0; |
+} |
+ |
+} // namespace |
+ |
+KeyEvent::KeyEvent(XEvent* xev) |
+ : Event(xev->type == KeyPress ? |
+ Event::ET_KEY_PRESSED : Event::ET_KEY_RELEASED, |
+ GetEventFlagsFromXState(xev->xkey.state)), |
+ key_code_(app::KeyboardCodeFromXKeyEvent(xev)), |
+ repeat_count_(0), |
+ message_flags_(0) { |
+} |
+ |
+MouseEvent::MouseEvent(XEvent* xev) |
+ : LocatedEvent(GetMouseEventType(xev), |
+ GetMouseEventLocation(xev), |
+ GetMouseEventFlags(xev)) { |
+} |
+ |
+} // namespace views |