Commit a08747c1 authored by shinyak@google.com's avatar shinyak@google.com

NOTE:

The last goal of this series of patches is to unexpose WindowOpenDisposition in ui and base modules.

This patch introduces the platform independent (key or mouse) events for mac. It provides a conversion function from mac event to the platform independent events.

After this patch is landed, I will upload the main patch of this series. It will remove the code where WindowOpenDisposition is exposed to ui/base level, and will introduce (context menu) handlers with platform independent event flags.

See also http://codereview.chromium.org/6893046/

BUG=93700
TEST=EventUtilsTest


Review URL: http://codereview.chromium.org/7792048

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98936 0039d316-1c4b-4281-b951-d872f2087c98
parent 4360b01d
...@@ -13,8 +13,8 @@ WindowOpenDisposition DispositionFromEventFlags(int event_flags) { ...@@ -13,8 +13,8 @@ WindowOpenDisposition DispositionFromEventFlags(int event_flags) {
(event_flags & ui::EF_MIDDLE_BUTTON_DOWN) != 0, (event_flags & ui::EF_MIDDLE_BUTTON_DOWN) != 0,
(event_flags & ui::EF_ALT_DOWN) != 0, (event_flags & ui::EF_ALT_DOWN) != 0,
(event_flags & ui::EF_CONTROL_DOWN) != 0, (event_flags & ui::EF_CONTROL_DOWN) != 0,
false /* meta_key */, (event_flags & ui::EF_COMMAND_DOWN) != 0,
(event_flags & ui::EF_SHIFT_DOWN) != 0); (event_flags & ui::EF_SHIFT_DOWN) != 0);
} }
} } // namespace browser
// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -12,6 +12,16 @@ ...@@ -12,6 +12,16 @@
namespace event_utils { namespace event_utils {
// Retrieves a bitsum of ui::EventFlags represented by |event|,
int EventFlagsFromNSEvent(NSEvent* event);
// Retrieves a bitsum of ui::EventFlags represented by |event|,
// but instead use the modifier flags given by |modifiers|,
// which is the same format as |-NSEvent modifierFlags|. This allows
// substitution of the modifiers without having to create a new event from
// scratch.
int EventFlagsFromNSEventWithModifiers(NSEvent* event, NSUInteger modifiers);
// Retrieves the WindowOpenDisposition used to open a link from a user gesture // Retrieves the WindowOpenDisposition used to open a link from a user gesture
// represented by |event|. For example, a Cmd+Click would mean open the // represented by |event|. For example, a Cmd+Click would mean open the
// associated link in a background tab. // associated link in a background tab.
......
// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#import "chrome/browser/ui/cocoa/event_utils.h" #import "chrome/browser/ui/cocoa/event_utils.h"
#include "chrome/browser/event_disposition.h"
#include "content/browser/disposition_utils.h" #include "content/browser/disposition_utils.h"
#include "ui/base/events.h"
namespace {
bool isLeftButtonEvent(NSEvent* event) {
NSEventType type = [event type];
return type == NSLeftMouseDown ||
type == NSLeftMouseDragged ||
type == NSLeftMouseUp;
}
bool isRightButtonEvent(NSEvent* event) {
NSEventType type = [event type];
return type == NSRightMouseDown ||
type == NSRightMouseDragged ||
type == NSRightMouseUp;
}
bool isMiddleButtonEvent(NSEvent* event) {
if ([event buttonNumber] != 2)
return false;
NSEventType type = [event type];
return type == NSOtherMouseDown ||
type == NSOtherMouseDragged ||
type == NSOtherMouseUp;
}
} // namespace
namespace event_utils { namespace event_utils {
// Retrieves a bitsum of ui::EventFlags from NSEvent.
int EventFlagsFromNSEvent(NSEvent* event) {
NSUInteger modifiers = [event modifierFlags];
return EventFlagsFromNSEventWithModifiers(event, modifiers);
}
int EventFlagsFromNSEventWithModifiers(NSEvent* event, NSUInteger modifiers) {
int flags = 0;
flags |= (modifiers & NSAlphaShiftKeyMask) ? ui::EF_CAPS_LOCK_DOWN : 0;
flags |= (modifiers & NSShiftKeyMask) ? ui::EF_SHIFT_DOWN : 0;
flags |= (modifiers & NSControlKeyMask) ? ui::EF_CONTROL_DOWN : 0;
flags |= (modifiers & NSAlternateKeyMask) ? ui::EF_ALT_DOWN : 0;
flags |= (modifiers & NSCommandKeyMask) ? ui::EF_COMMAND_DOWN : 0;
flags |= isLeftButtonEvent(event) ? ui::EF_LEFT_BUTTON_DOWN : 0;
flags |= isRightButtonEvent(event) ? ui::EF_RIGHT_BUTTON_DOWN : 0;
flags |= isMiddleButtonEvent(event) ? ui::EF_MIDDLE_BUTTON_DOWN : 0;
return flags;
}
WindowOpenDisposition WindowOpenDispositionFromNSEvent(NSEvent* event) { WindowOpenDisposition WindowOpenDispositionFromNSEvent(NSEvent* event) {
NSUInteger modifiers = [event modifierFlags]; NSUInteger modifiers = [event modifierFlags];
return WindowOpenDispositionFromNSEventWithFlags(event, modifiers); return WindowOpenDispositionFromNSEventWithFlags(event, modifiers);
} }
WindowOpenDisposition WindowOpenDispositionFromNSEventWithFlags( WindowOpenDisposition WindowOpenDispositionFromNSEventWithFlags(
NSEvent* event, NSUInteger flags) { NSEvent* event, NSUInteger modifiers) {
return disposition_utils::DispositionFromClick( int event_flags = EventFlagsFromNSEventWithModifiers(event, modifiers);
[event buttonNumber] == 2, return browser::DispositionFromEventFlags(event_flags);
flags & NSAlternateKeyMask,
flags & NSControlKeyMask,
flags & NSCommandKeyMask,
flags & NSShiftKeyMask);
} }
} // namespace event_utils } // namespace event_utils
// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "chrome/browser/ui/cocoa/test_event_utils.h" #include "chrome/browser/ui/cocoa/test_event_utils.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h" #include "testing/platform_test.h"
#include "ui/base/events.h"
// We provide a donor class with a specially modified |modifierFlags| // We provide a donor class with a specially modified |modifierFlags|
// implementation that we swap with NSEvent's. This is because we can't create a // implementation that we swap with NSEvent's. This is because we can't create a
...@@ -58,4 +59,64 @@ TEST_F(EventUtilsTest, TestWindowOpenDispositionFromNSEvent) { ...@@ -58,4 +59,64 @@ TEST_F(EventUtilsTest, TestWindowOpenDispositionFromNSEvent) {
EXPECT_EQ(NEW_WINDOW, event_utils::WindowOpenDispositionFromNSEvent(me)); EXPECT_EQ(NEW_WINDOW, event_utils::WindowOpenDispositionFromNSEvent(me));
} }
TEST_F(EventUtilsTest, TestEventFlagsFromNSEvent) {
// Left click.
NSEvent* left = test_event_utils::MakeMouseEvent(NSLeftMouseUp, 0);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN,
event_utils::EventFlagsFromNSEvent(left));
// Right click.
NSEvent* right = test_event_utils::MakeMouseEvent(NSRightMouseUp, 0);
EXPECT_EQ(ui::EF_RIGHT_BUTTON_DOWN,
event_utils::EventFlagsFromNSEvent(right));
// Middle click.
NSEvent* middle = test_event_utils::MakeMouseEvent(NSOtherMouseUp, 0);
EXPECT_EQ(ui::EF_MIDDLE_BUTTON_DOWN,
event_utils::EventFlagsFromNSEvent(middle));
// Caps + Left
NSEvent* caps = test_event_utils::MakeMouseEvent(
NSLeftMouseUp, NSAlphaShiftKeyMask);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN | ui::EF_CAPS_LOCK_DOWN,
event_utils::EventFlagsFromNSEvent(caps));
// Shift + Left
NSEvent* shift = test_event_utils::MakeMouseEvent(
NSLeftMouseUp, NSShiftKeyMask);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN | ui::EF_SHIFT_DOWN,
event_utils::EventFlagsFromNSEvent(shift));
// Ctrl + Left
NSEvent* ctrl = test_event_utils::MakeMouseEvent(
NSLeftMouseUp, NSControlKeyMask);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN | ui::EF_CONTROL_DOWN,
event_utils::EventFlagsFromNSEvent(ctrl));
// Alt + Left
NSEvent* alt = test_event_utils::MakeMouseEvent(
NSLeftMouseUp, NSAlternateKeyMask);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN | ui::EF_ALT_DOWN,
event_utils::EventFlagsFromNSEvent(alt));
// Cmd + Left
NSEvent* cmd = test_event_utils::MakeMouseEvent(
NSLeftMouseUp, NSCommandKeyMask);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN | ui::EF_COMMAND_DOWN,
event_utils::EventFlagsFromNSEvent(cmd));
// Shift + Ctrl + Left
NSEvent* shiftctrl = test_event_utils::MakeMouseEvent(
NSLeftMouseUp, NSShiftKeyMask | NSControlKeyMask);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN | ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
event_utils::EventFlagsFromNSEvent(shiftctrl));
// Cmd + Alt + Right
NSEvent* cmdalt = test_event_utils::MakeMouseEvent(
NSLeftMouseUp, NSCommandKeyMask | NSAlternateKeyMask);
EXPECT_EQ(ui::EF_LEFT_BUTTON_DOWN | ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
event_utils::EventFlagsFromNSEvent(cmdalt));
}
} // namespace } // namespace
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment