Chromium Code Reviews| Index: ui/views/controls/menu/menu_controller.cc |
| diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc |
| index d3b8e3fe9a0b433aaa8b12d13135cccf51967335..ac880a1aea68ce00963519bd8670c652857146b4 100644 |
| --- a/ui/views/controls/menu/menu_controller.cc |
| +++ b/ui/views/controls/menu/menu_controller.cc |
| @@ -27,12 +27,16 @@ |
| #if defined(USE_AURA) |
| #include "ui/aura/client/dispatcher_client.h" |
| #include "ui/aura/env.h" |
| +#include "ui/aura/event.h" |
| #include "ui/aura/root_window.h" |
| #elif defined(TOOLKIT_USES_GTK) |
| #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" |
| #endif |
| -using base::Time; |
| +#if defined(USE_AURA) && defined(USE_X11) |
| +#include <X11/Xlib.h> |
| +#endif |
| + |
| using base::TimeDelta; |
| using ui::OSExchangeData; |
| @@ -163,7 +167,7 @@ class MenuController::MenuScrollTask { |
| if (new_menu == submenu_ && is_scrolling_up_ == new_is_up) |
| return; |
| - start_scroll_time_ = Time::Now(); |
| + start_scroll_time_ = base::Time::Now(); |
| start_y_ = part.submenu->GetVisibleBounds().y(); |
| submenu_ = new_menu; |
| is_scrolling_up_ = new_is_up; |
| @@ -190,7 +194,7 @@ class MenuController::MenuScrollTask { |
| DCHECK(submenu_); |
| gfx::Rect vis_rect = submenu_->GetVisibleBounds(); |
| const int delta_y = static_cast<int>( |
| - (Time::Now() - start_scroll_time_).InMilliseconds() * |
| + (base::Time::Now() - start_scroll_time_).InMilliseconds() * |
| pixels_per_second_ / 1000); |
| vis_rect.set_y(is_scrolling_up_ ? |
| std::max(0, start_y_ - delta_y) : |
| @@ -208,7 +212,7 @@ class MenuController::MenuScrollTask { |
| base::RepeatingTimer<MenuScrollTask> scrolling_timer_; |
| // Time we started scrolling at. |
| - Time start_scroll_time_; |
| + base::Time start_scroll_time_; |
| // How many pixels to scroll per second. |
| int pixels_per_second_; |
| @@ -785,7 +789,7 @@ void MenuController::SetSelectionOnPointerDown(SubmenuView* source, |
| // We're going to close and we own the mouse capture. We need to repost the |
| // mouse down, otherwise the window the user clicked on won't get the |
| // event. |
| -#if defined(OS_WIN) && !defined(USE_AURA) |
| +#if defined(OS_WIN) || defined(USE_AURA) |
| RepostEvent(source, event); |
| // NOTE: not reposting on linux seems fine. |
| #endif |
| @@ -1836,7 +1840,7 @@ bool MenuController::SelectByChar(char16 character) { |
| return false; |
| } |
| -#if defined(OS_WIN) && !defined(USE_AURA) |
| +#if defined(OS_WIN) |
| void MenuController::RepostEvent(SubmenuView* source, |
| const LocatedEvent& event) { |
| if (!state_.item) { |
| @@ -1904,6 +1908,42 @@ void MenuController::RepostEvent(SubmenuView* source, |
| } |
| } |
| } |
| +#elif defined(USE_AURA) |
| +void MenuController::RepostEvent(SubmenuView* source, |
| + const LocatedEvent& event) { |
| + if (!state_.item) { |
| + // We some times get an event after closing all the menus. Ignore it. |
| + // Make sure the menu is in fact not visible. If the menu is visible, then |
| + // we're in a bad state where we think the menu isn't visibile but it is. |
| + DCHECK(!source->GetWidget()->IsVisible()); |
| + return; |
| + } |
| + |
| + // Release the capture. |
| + SubmenuView* submenu = state_.item->GetRootMenuItem()->GetSubmenu(); |
| + submenu->ReleaseCapture(); |
| + |
| + gfx::Point screen_loc(event.location()); |
| + View::ConvertPointToScreen(source->GetScrollViewContainer(), &screen_loc); |
| + |
| + XEvent xevent; |
| + xevent.type = ButtonPress; |
| + xevent.xbutton.x = screen_loc.x(); |
| + xevent.xbutton.y = screen_loc.y(); |
| + xevent.xbutton.state = 0; |
| + xevent.xbutton.same_screen = True; |
| + int flags = event.flags(); |
| + if (flags & ui::EF_LEFT_MOUSE_BUTTON) |
| + xevent.xbutton.button = 1; |
| + else if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) |
| + xevent.xbutton.button = 2; |
| + else if (flags & ui::EF_RIGHT_MOUSE_BUTTON) |
| + xevent.xbutton.button = 3; |
| + else |
| + return; |
| + |
| + aura::RootWindow::GetInstance()->PostNativeEvent(&xevent); |
| +} |
| #endif // defined(OS_WIN) |
|
Ben Goodger (Google)
2012/02/24 23:26:15
// defined(USE_AURA)
sadrul
2012/02/24 23:30:28
Done.
|
| void MenuController::SetDropMenuItem( |