| // Copyright 2013 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/event_utils.h" |
| |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "ui/aura/client/screen_position_client.h" |
| #include "ui/aura/root_window.h" |
| #include "ui/events/event.h" |
| #include "ui/gfx/point.h" |
| #include "ui/views/views_delegate.h" |
| |
| using aura::client::ScreenPositionClient; |
| |
| namespace views { |
| |
| bool RepostLocatedEvent(gfx::NativeWindow window, |
| const ui::LocatedEvent& event) { |
| if (!window) |
| return false; |
| |
| #if defined(OS_WIN) |
| if (ViewsDelegate::views_delegate && |
| !ViewsDelegate::views_delegate->IsWindowInMetro(window)) { |
| return RepostLocatedEventWin( |
| window->GetDispatcher()->host()->GetAcceleratedWidget(), event); |
| } |
| #endif |
| aura::Window* root_window = window->GetRootWindow(); |
| |
| gfx::Point root_loc(event.location()); |
| ScreenPositionClient* spc = |
| aura::client::GetScreenPositionClient(root_window); |
| if (!spc) |
| return false; |
| |
| spc->ConvertPointFromScreen(root_window, &root_loc); |
| |
| scoped_ptr<ui::LocatedEvent> relocated; |
| if (event.IsMouseEvent()) { |
| const ui::MouseEvent& orig = static_cast<const ui::MouseEvent&>(event); |
| relocated.reset(new ui::MouseEvent(orig)); |
| } else if (event.IsGestureEvent()) { |
| // TODO(rbyers): Gesture event repost is tricky to get right |
| // crbug.com/170987. |
| return false; |
| } else { |
| NOTREACHED(); |
| return false; |
| } |
| relocated->set_location(root_loc); |
| relocated->set_root_location(root_loc); |
| |
| root_window->GetDispatcher()->RepostEvent(*relocated); |
| return true; |
| } |
| |
| } // namespace views |