Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(390)

Unified Diff: ui/views/events/event_win.cc

Issue 6286013: V2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/events/event.cc ('k') | ui/views/layout/fill_layout.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/events/event_win.cc
===================================================================
--- ui/views/events/event_win.cc (revision 0)
+++ ui/views/events/event_win.cc (revision 0)
@@ -0,0 +1,195 @@
+// 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 "ui/views/events/event.h"
+
+#include <windowsx.h>
+
+#include "base/logging.h"
+#include "ui/base/keycodes/keyboard_code_conversion_win.h"
+
+namespace ui {
+
+namespace {
+
+// Returns a mask corresponding to the set of modifier keys that are currently
+// pressed. Windows key messages don't come with control key state as parameters
+// as with mouse messages, so we need to explicitly ask for these states.
+int GetKeyStateFlags() {
+ int flags = 0;
+ if (GetKeyState(VK_MENU) & 0x80)
+ flags |= Event::EF_ALT_DOWN;
+ if (GetKeyState(VK_SHIFT) & 0x80)
+ flags |= Event::EF_SHIFT_DOWN;
+ if (GetKeyState(VK_CONTROL) & 0x80)
+ flags |= Event::EF_CONTROL_DOWN;
+ return flags;
+}
+
+// Convert windows message identifiers to Event types.
+Event::EventType EventTypeFromNative(NativeEvent native_event) {
+ switch (native_event.message) {
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ return Event::ET_KEY_PRESSED;
+ case WM_KEYUP:
+ case WM_SYSKEYUP:
+ return Event::ET_KEY_RELEASED;
+ case WM_LBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ case WM_NCLBUTTONDOWN:
+ case WM_NCMBUTTONDOWN:
+ case WM_NCRBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ return Event::ET_MOUSE_PRESSED;
+ case WM_LBUTTONDBLCLK:
+ case WM_LBUTTONUP:
+ case WM_MBUTTONDBLCLK:
+ case WM_MBUTTONUP:
+ case WM_NCLBUTTONDBLCLK:
+ case WM_NCLBUTTONUP:
+ case WM_NCMBUTTONDBLCLK:
+ case WM_NCMBUTTONUP:
+ case WM_NCRBUTTONDBLCLK:
+ case WM_NCRBUTTONUP:
+ case WM_RBUTTONDBLCLK:
+ case WM_RBUTTONUP:
+ return Event::ET_MOUSE_RELEASED;
+ case WM_MOUSEMOVE:
+ case WM_NCMOUSEMOVE:
+ return Event::ET_MOUSE_MOVED;
+ case WM_MOUSEWHEEL:
+ return Event::ET_MOUSEWHEEL;
+ case WM_MOUSELEAVE:
+ case WM_NCMOUSELEAVE:
+ return Event::ET_MOUSE_EXITED;
+ default:
+ NOTREACHED();
+ }
+ return Event::ET_UNKNOWN;
+}
+
+bool IsClientMouseEvent(NativeEvent native_event) {
+ return native_event.message == WM_MOUSELEAVE ||
+ (native_event.message >= WM_MOUSEFIRST &&
+ native_event.message <= WM_MOUSELAST);
+}
+
+bool IsNonClientMouseEvent(NativeEvent native_event) {
+ return native_event.message == WM_NCMOUSELEAVE ||
+ (native_event.message >= WM_NCMOUSEMOVE &&
+ native_event.message <= WM_NCMBUTTONDBLCLK);
+}
+
+gfx::Point MousePositionFromNative(NativeEvent native_event) {
+ if (IsClientMouseEvent(native_event)) {
+ // Client message. The position is contained in the LPARAM.
+ return gfx::Point(GET_X_LPARAM(native_event.lParam),
+ GET_Y_LPARAM(native_event.lParam));
+ }
+ DCHECK(IsNonClientMouseEvent(native_event));
+ // Non-client message. The position is contained in a POINTS structure in
+ // LPARAM, and is in screen coordinates so we have to convert to client.
+ POINT native_point = { GET_X_LPARAM(native_event.lParam),
+ GET_Y_LPARAM(native_event.lParam) };
+ ScreenToClient(native_event.hwnd, &native_point);
+ return gfx::Point(native_point);
+}
+
+int MouseEventFlagsFromNative(NativeEvent native_event) {
+ int flags = 0;
+
+ // Check if the event occurred in the non-client area.
+ if (IsNonClientMouseEvent(native_event))
+ flags |= MouseEvent::EF_IS_NON_CLIENT;
+
+ // Check for double click events.
+ switch (native_event.message) {
+ case WM_NCLBUTTONDBLCLK:
+ case WM_NCMBUTTONDBLCLK:
+ case WM_NCRBUTTONDBLCLK:
+ case WM_LBUTTONDBLCLK:
+ case WM_MBUTTONDBLCLK:
+ case WM_RBUTTONDBLCLK:
+ flags |= MouseEvent::EF_IS_DOUBLE_CLICK;
+ break;
+ }
+
+ // Check for pressed buttons.
+ if (IsClientMouseEvent(native_event)) {
+ if (native_event.wParam & MK_LBUTTON)
+ flags |= Event::EF_LEFT_BUTTON_DOWN;
+ if (native_event.wParam & MK_MBUTTON)
+ flags |= Event::EF_MIDDLE_BUTTON_DOWN;
+ if (native_event.wParam & MK_RBUTTON)
+ flags |= Event::EF_RIGHT_BUTTON_DOWN;
+ } else if (IsNonClientMouseEvent(native_event)) {
+ switch (native_event.message) {
+ case WM_NCLBUTTONDOWN:
+ flags |= Event::EF_LEFT_BUTTON_DOWN;
+ break;
+ case WM_NCMBUTTONDOWN:
+ flags |= Event::EF_MIDDLE_BUTTON_DOWN;
+ break;
+ case WM_NCRBUTTONDOWN:
+ flags |= Event::EF_RIGHT_BUTTON_DOWN;
+ break;
+ }
+ }
+
+ // Finally make sure the key state flags are included.
+ return flags | GetKeyStateFlags();
+}
+
+int MouseWheelEventFlagsFromNative(NativeEvent native_event) {
+ int native_flags = GET_KEYSTATE_WPARAM(native_event.wParam);
+ int flags = 0;
+ if (native_flags & MK_CONTROL)
+ flags |= Event::EF_CONTROL_DOWN;
+ if (native_flags & MK_SHIFT)
+ flags |= Event::EF_SHIFT_DOWN;
+ if (GetKeyState(VK_MENU) < 0)
+ flags |= Event::EF_ALT_DOWN;
+ if (native_flags & MK_LBUTTON)
+ flags |= Event::EF_LEFT_BUTTON_DOWN;
+ if (native_flags & MK_MBUTTON)
+ flags |= Event::EF_MIDDLE_BUTTON_DOWN;
+ if (native_flags & MK_RBUTTON)
+ flags |= Event::EF_RIGHT_BUTTON_DOWN;
+ return flags;
+}
+
+} // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+// KeyEvent, public:
+
+KeyEvent::KeyEvent(NativeEvent native_event)
+ : Event(EventTypeFromNative(native_event), GetKeyStateFlags()),
+ key_code_(KeyboardCodeForWindowsKeyCode(native_event.wParam)),
+ repeat_count_(native_event.lParam & 0xFFFF),
+ message_flags_((native_event.lParam & 0xFFFF0000) >> 16) {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// MouseEvent, public:
+
+MouseEvent::MouseEvent(NativeEvent native_event)
+ : LocatedEvent(EventTypeFromNative(native_event),
+ MousePositionFromNative(native_event),
+ MouseEventFlagsFromNative(native_event)) {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// MouseWheelEvent, public:
+
+MouseWheelEvent::MouseWheelEvent(NativeEvent native_event)
+ : LocatedEvent(ET_MOUSEWHEEL,
+ MousePositionFromNative(native_event),
+ MouseWheelEventFlagsFromNative(native_event)),
+ offset_(GET_WHEEL_DELTA_WPARAM(native_event.wParam)) {
+}
+
+} // namespace ui
+
Property changes on: ui\views\events\event_win.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « ui/views/events/event.cc ('k') | ui/views/layout/fill_layout.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698