window_event_dispatcher.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/capture_client.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/cursor_client.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/event_client.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/focus_client.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ui/aura/window_delegate.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_targeter.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_tracker.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_tree_host.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/dip_util.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/events/event.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/events/gestures/gesture_recognizer.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/events/gestures/gesture_types.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ui::EventDispatchDetails DispatchDetails; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |target| has a non-client (frame) component at |location|, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in window coordinates. 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool IsNonClientLocation(Window* target, const gfx::Point& location) { 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!target->delegate()) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int hit_test_code = target->delegate()->GetNonClientComponent(location); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hit_test_code != HTCLIENT && hit_test_code != HTNOWHERE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Window* ConsumerToWindow(ui::GestureConsumer* consumer) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return consumer ? static_cast<Window*>(consumer) : NULL; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetLastMouseLocation(const Window* root_window, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location_in_root) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client::ScreenPositionClient* client = 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client::GetScreenPositionClient(root_window); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location_in_screen = location_in_root; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->ConvertPointToScreen(root_window, &location_in_screen); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Env::GetInstance()->set_last_mouse_location(location_in_screen); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Env::GetInstance()->set_last_mouse_location(location_in_root); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsEventCandidateForHold(const ui::Event& event) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.type() == ui::ET_TOUCH_MOVED) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.type() == ui::ET_MOUSE_DRAGGED) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.IsMouseEvent() && (event.flags() & ui::EF_IS_SYNTHESIZED)) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowEventDispatcher, public: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowEventDispatcher::WindowEventDispatcher(WindowTreeHost* host) 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : host_(host), 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_ids_down_(0), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_(NULL), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_(NULL), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch_target_(NULL), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_dispatch_target_(NULL), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) synthesize_mouse_move_(false), 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) move_hold_count_(0), 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dispatching_held_event_(false), 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer_manager_(this), 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) repost_event_factory_(this), 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_event_factory_(this) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureRecognizer::Get()->AddGestureEventHelper(this); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Env::GetInstance()->AddObserver(this); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WindowEventDispatcher::~WindowEventDispatcher() { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("shutdown", "WindowEventDispatcher::Destructor"); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Env::GetInstance()->RemoveObserver(this); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::GestureRecognizer::Get()->RemoveGestureEventHelper(this); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::RepostEvent(const ui::LocatedEvent& event) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(event.type() == ui::ET_MOUSE_PRESSED || 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.type() == ui::ET_GESTURE_TAP_DOWN); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We allow for only one outstanding repostable event. This is used 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in exiting context menus. A dropped repost request is allowed. 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (event.type() == ui::ET_MOUSE_PRESSED) { 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) held_repostable_event_.reset( 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new ui::MouseEvent( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const ui::MouseEvent&>(event), 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<aura::Window*>(event.target()), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window())); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoop::current()->PostNonNestableTask( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IgnoreResult(&WindowEventDispatcher::DispatchHeldEvents), 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repost_event_factory_.GetWeakPtr())); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(event.type() == ui::ET_GESTURE_TAP_DOWN); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_repostable_event_.reset(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(rbyers): Reposing of gestures is tricky to get 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // right, so it's not yet supported. crbug.com/170987. 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnMouseEventsEnableStateChanged(bool enabled) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send entered / exited so that visual state can be updated to match 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mouse events state. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostSynthesizeMouseMove(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mazda): Add code to disable mouse events when |enabled| == false. 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::DispatchCancelModeEvent() { 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::CancelModeEvent event; 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Window* focused_window = client::GetFocusClient(window())->GetFocusedWindow(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focused_window && !window()->Contains(focused_window)) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focused_window = NULL; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details = 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchEvent(focused_window ? focused_window : window(), &event); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::DispatchGestureEvent(ui::GestureEvent* event) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchDetails details = DispatchHeldEvents(); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (details.dispatcher_destroyed) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Window* target = GetGestureTarget(event); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->ConvertLocationToTarget(window(), target); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchDetails details = DispatchEvent(target, event); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (details.dispatcher_destroyed) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WindowEventDispatcher::DispatchMouseExitAtPoint(const gfx::Point& point) { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::MouseEvent event(ui::ET_MOUSE_EXITED, point, point, ui::EF_NONE, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EF_NONE); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchDetails details = 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchMouseEnterOrExit(event, ui::ET_MOUSE_EXITED); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (details.dispatcher_destroyed) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::ProcessedTouchEvent(ui::TouchEvent* event, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Window* window, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EventResult result) { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ui::GestureRecognizer::Gestures> gestures; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gestures.reset(ui::GestureRecognizer::Get()-> 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ProcessTouchEventForGesture(*event, result, window)); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DispatchDetails details = ProcessGestures(gestures.get()); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (details.dispatcher_destroyed) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::HoldPointerMoves() { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!move_hold_count_) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_event_factory_.InvalidateWeakPtrs(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++move_hold_count_; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0("ui", "WindowEventDispatcher::HoldPointerMoves", 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::ReleasePointerMoves() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --move_hold_count_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(move_hold_count_, 0); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!move_hold_count_ && held_move_event_) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't want to call DispatchHeldEvents directly, because this might be 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called from a deep stack while another event, in which case dispatching 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // another one may not be safe/expected. Instead we post a task, that we 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may cancel if HoldPointerMoves is called again before it executes. 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostNonNestableTask( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, base::Bind( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IgnoreResult(&WindowEventDispatcher::DispatchHeldEvents), 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_event_factory_.GetWeakPtr())); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT_ASYNC_END0("ui", "WindowEventDispatcher::HoldPointerMoves", this); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point WindowEventDispatcher::GetLastMouseLocationInRoot() const { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point location = Env::GetInstance()->last_mouse_location(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client::ScreenPositionClient* client = 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client::GetScreenPositionClient(window()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->ConvertPointFromScreen(window(), &location); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return location; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnHostLostMouseGrab() { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ = NULL; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_ = NULL; 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WindowEventDispatcher::OnCursorMovedToRootLocation( 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Point& root_location) { 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetLastMouseLocation(window(), root_location); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synthesize_mouse_move_ = false; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnPostNotifiedWindowDestroying(Window* window) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWindowHidden(window, WINDOW_DESTROYED); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowEventDispatcher, private: 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Window* WindowEventDispatcher::window() { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host_->window(); 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Window* WindowEventDispatcher::window() const { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host_->window(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::TransformEventForDeviceScaleFactor( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::LocatedEvent* event) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->UpdateForRootTransform(host_->GetInverseRootTransform()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::DispatchMouseExitToHidingWindow(Window* window) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The mouse capture is intentionally ignored. Think that a mouse enters 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to a window, the window sets the capture, the mouse exits the window, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and then it releases the capture. In that case OnMouseExited won't 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be called. So it is natural not to emit OnMouseExited even though 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |window| is the capture window. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point last_mouse_location = GetLastMouseLocationInRoot(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window->Contains(mouse_moved_handler_) && 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->ContainsPointInRoot(last_mouse_location)) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchMouseExitAtPoint(last_mouse_location); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventDispatchDetails WindowEventDispatcher::DispatchMouseEnterOrExit( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::MouseEvent& event, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EventType type) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.type() != ui::ET_MOUSE_CAPTURE_CHANGED && 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(event.flags() & ui::EF_IS_SYNTHESIZED)) { 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetLastMouseLocation(window(), event.root_location()); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mouse_moved_handler_ || !mouse_moved_handler_->delegate() || 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !window()->Contains(mouse_moved_handler_)) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return DispatchDetails(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |event| may be an event in the process of being dispatched to a target (in 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which case its locations will be in the event's target's coordinate 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // system), or a synthetic event created in root-window (in which case, the 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event's target will be NULL, and the event will be in the root-window's 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // coordinate system. 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = static_cast<Window*>(event.target()); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!target) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target = window(); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::MouseEvent translated_event(event, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target, 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse_moved_handler_, 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) type, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.flags() | ui::EF_IS_SYNTHESIZED); 2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return DispatchEvent(mouse_moved_handler_, &translated_event); 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventDispatchDetails WindowEventDispatcher::ProcessGestures( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureRecognizer::Gestures* gestures) { 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DispatchDetails details; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gestures || gestures->empty()) 2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return details; 2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Window* target = GetGestureTarget(gestures->get().at(0)); 2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < gestures->size(); ++i) { 2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::GestureEvent* event = gestures->get().at(i); 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event->ConvertLocationToTarget(window(), target); 2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) details = DispatchEvent(target, event); 2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (details.dispatcher_destroyed || details.target_destroyed) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return details; 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnWindowHidden(Window* invisible, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowHiddenReason reason) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the window the mouse was pressed in becomes invisible, it should no 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // longer receive mouse events. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (invisible->Contains(mouse_pressed_handler_)) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ = NULL; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (invisible->Contains(mouse_moved_handler_)) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_ = NULL; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If events are being dispatched from a nested message-loop, and the target 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the outer loop is hidden or moved to another dispatcher during 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dispatching events in the inner loop, then reset the target for the outer 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // loop. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (invisible->Contains(old_dispatch_target_)) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_dispatch_target_ = NULL; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invisible->CleanupGestureState(); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not clear the capture, and the |event_dispatch_target_| if the 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window is moving across hosts, because the target itself is actually still 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visible and clearing them stops further event processing, which can cause 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unexpected behaviors. See crbug.com/157583 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reason != WINDOW_MOVING) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't ask |invisible| here, because invisible may have been removed 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the window hierarchy already by the time this function is called 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (OnWindowDestroyed). 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client::CaptureClient* capture_client = 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client::GetCaptureClient(host_->window()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window* capture_window = 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capture_client ? capture_client->GetCaptureWindow() : NULL; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (invisible->Contains(event_dispatch_target_)) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch_target_ = NULL; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the ancestor of the capture window is hidden, release the capture. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this may delete the window so do not use capture_window 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after this. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (invisible->Contains(capture_window) && invisible != window()) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capture_window->ReleaseCapture(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Window* WindowEventDispatcher::GetGestureTarget(ui::GestureEvent* event) { 3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Window* target = NULL; 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!event->IsEndingEvent()) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window that received the start event (e.g. scroll begin) needs to 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receive the end event (e.g. scroll end). 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) target = client::GetCaptureWindow(window()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!target) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = ConsumerToWindow( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureRecognizer::Get()->GetTargetForGestureEvent(*event)); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return target; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// WindowEventDispatcher, aura::client::CaptureDelegate implementation: 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::UpdateCapture(Window* old_capture, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window* new_capture) { 3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |mouse_moved_handler_| may have been set to a Window in a different root 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (see below). Clear it here to ensure we don't end up referencing a stale 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window. 3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (mouse_moved_handler_ && !window()->Contains(mouse_moved_handler_)) 3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch mouse_moved_handler_ = NULL; 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (old_capture && old_capture->GetRootWindow() == window() && 3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch old_capture->delegate()) { 3647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Send a capture changed event with bogus location data. 3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::MouseEvent event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(), 3667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::Point(), 0, 0); 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DispatchDetails details = DispatchEvent(old_capture, &event); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_capture->delegate()->OnCaptureLost(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_capture) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make all subsequent mouse events go to the capture window. We shouldn't 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to send an event here as OnCaptureLost() should take care of that. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_moved_handler_ || Env::GetInstance()->IsMouseButtonDown()) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_ = new_capture; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure mouse_moved_handler gets updated. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details = SynthesizeMouseMoveEvent(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ = NULL; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnOtherRootGotCapture() { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_ = NULL; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_pressed_handler_ = NULL; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::SetNativeCapture() { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->SetCapture(); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::ReleaseNativeCapture() { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->ReleaseCapture(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WindowEventDispatcher, ui::EventProcessor implementation: 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::EventTarget* WindowEventDispatcher::GetRootTarget() { 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window(); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::PrepareEventForDispatch(ui::Event* event) { 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dispatching_held_event_) { 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The held events are already in |window()|'s coordinate system. So it is 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // not necessary to apply the transform to convert from the host's 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // coordinate system to |window()|'s coordinate system. 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->IsMouseEvent() || 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->IsScrollEvent() || 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->IsTouchEvent() || 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->IsGestureEvent()) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformEventForDeviceScaleFactor(static_cast<ui::LocatedEvent*>(event)); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowEventDispatcher, ui::EventDispatcherDelegate implementation: 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WindowEventDispatcher::CanDispatchToTarget(ui::EventTarget* target) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event_dispatch_target_ == target; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventDispatchDetails WindowEventDispatcher::PreDispatchEvent( 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EventTarget* target, 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Event* event) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window* target_window = static_cast<Window*>(target); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(window()->Contains(target_window)); 435868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!dispatching_held_event_) { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool can_be_held = IsEventCandidateForHold(*event); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!move_hold_count_ || !can_be_held) { 4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (can_be_held) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_move_event_.reset(); 441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DispatchDetails details = DispatchHeldEvents(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed || details.target_destroyed) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return details; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->IsMouseEvent()) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreDispatchMouseEvent(target_window, static_cast<ui::MouseEvent*>(event)); 4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else if (event->IsScrollEvent()) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreDispatchLocatedEvent(target_window, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<ui::ScrollEvent*>(event)); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (event->IsTouchEvent()) { 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PreDispatchTouchEvent(target_window, static_cast<ui::TouchEvent*>(event)); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) old_dispatch_target_ = event_dispatch_target_; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_dispatch_target_ = static_cast<Window*>(target); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return DispatchDetails(); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventDispatchDetails WindowEventDispatcher::PostDispatchEvent( 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EventTarget* target, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target || target != event_dispatch_target_) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details.target_destroyed = true; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_dispatch_target_ = old_dispatch_target_; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_dispatch_target_ = NULL; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!event_dispatch_target_ || window()->Contains(event_dispatch_target_)); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.IsTouchEvent() && !details.target_destroyed) { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do not let 'held' touch events contribute to any gestures unless it is 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // being dispatched. 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dispatching_held_event_ || !held_move_event_ || 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !held_move_event_->IsTouchEvent()) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TouchEvent orig_event(static_cast<const ui::TouchEvent&>(event), 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<Window*>(event.target()), window()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the list of GestureEvents from GestureRecognizer. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::GestureRecognizer::Gestures> gestures; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gestures.reset(ui::GestureRecognizer::Get()-> 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessTouchEventForGesture(orig_event, event.result(), 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<Window*>(target))); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ProcessGestures(gestures.get()); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return details; 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WindowEventDispatcher, ui::GestureEventHelper implementation: 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WindowEventDispatcher::CanDispatchToConsumer( 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::GestureConsumer* consumer) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window* consumer_window = ConsumerToWindow(consumer); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (consumer_window && consumer_window->GetRootWindow() == window()); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::DispatchCancelTouchEvent(ui::TouchEvent* event) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details = OnEventFromSource(event); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowEventDispatcher, WindowObserver implementation: 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void WindowEventDispatcher::OnWindowDestroying(Window* window) { 5100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!host_->window()->Contains(window)) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchMouseExitToHidingWindow(window); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynthesizeMouseMoveAfterChangeToWindow(window); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnWindowDestroyed(Window* window) { 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We observe all windows regardless of what root Window (if any) they're 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // attached to. 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) observer_manager_.Remove(window); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnWindowAddedToRootWindow(Window* attached) { 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!observer_manager_.IsObserving(attached)) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_manager_.Add(attached); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_->window()->Contains(attached)) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynthesizeMouseMoveAfterChangeToWindow(attached); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnWindowRemovingFromRootWindow(Window* detached, 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Window* new_root) { 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!host_->window()->Contains(detached)) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(client::GetCaptureWindow(window()) != window()); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchMouseExitToHidingWindow(detached); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SynthesizeMouseMoveAfterChangeToWindow(detached); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Hiding the window releases capture which can implicitly destroy the window 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // so the window may no longer be valid after this call. 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWindowHidden(detached, new_root ? WINDOW_MOVING : WINDOW_HIDDEN); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::OnWindowVisibilityChanging(Window* window, 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible) { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!host_->window()->Contains(window)) 551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DispatchMouseExitToHidingWindow(window); 554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WindowEventDispatcher::OnWindowVisibilityChanged(Window* window, 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!host_->window()->Contains(window)) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window->ContainsPointInRoot(GetLastMouseLocationInRoot())) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostSynthesizeMouseMove(); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hiding the window releases capture which can implicitly destroy the window 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the window may no longer be valid after this call. 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!visible) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWindowHidden(window, WINDOW_HIDDEN); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnWindowBoundsChanged(Window* window, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& old_bounds, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& new_bounds) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_->window()->Contains(window)) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window == host_->window()) { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT1("ui", "WindowEventDispatcher::OnWindowBoundsChanged(root)", 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "size", new_bounds.size().ToString()); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details = DispatchHeldEvents(); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synthesize_mouse_move_ = false; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window->IsVisible() && !window->ignore_events()) { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect old_bounds_in_root = old_bounds, new_bounds_in_root = new_bounds; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window::ConvertRectToTarget(window->parent(), host_->window(), 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &old_bounds_in_root); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Window::ConvertRectToTarget(window->parent(), host_->window(), 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &new_bounds_in_root); 5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Point last_mouse_location = GetLastMouseLocationInRoot(); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (old_bounds_in_root.Contains(last_mouse_location) != 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_bounds_in_root.Contains(last_mouse_location)) { 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSynthesizeMouseMove(); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::OnWindowTransforming(Window* window) { 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_->window()->Contains(window)) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynthesizeMouseMoveAfterChangeToWindow(window); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void WindowEventDispatcher::OnWindowTransformed(Window* window) { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_->window()->Contains(window)) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynthesizeMouseMoveAfterChangeToWindow(window); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowEventDispatcher, EnvObserver implementation: 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::OnWindowInitialized(Window* window) { 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) observer_manager_.Add(window); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowEventDispatcher, private: 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventDispatchDetails WindowEventDispatcher::DispatchHeldEvents() { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!held_repostable_event_ && !held_move_event_) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DispatchDetails(); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!dispatching_held_event_); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatching_held_event_ = true; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails dispatch_details; 6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (held_repostable_event_) { 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (held_repostable_event_->type() == ui::ET_MOUSE_PRESSED) { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::MouseEvent> mouse_event( 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<ui::MouseEvent*>(held_repostable_event_.release())); 6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dispatch_details = OnEventFromSource(mouse_event.get()); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(rbyers): GESTURE_TAP_DOWN not yet supported: crbug.com/170987. 6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (dispatch_details.dispatcher_destroyed) 6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return dispatch_details; 6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (held_move_event_) { 6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If a mouse move has been synthesized, the target location is suspect, 6484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // so drop the held mouse event. 6494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (held_move_event_->IsTouchEvent() || 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (held_move_event_->IsMouseEvent() && !synthesize_mouse_move_)) { 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatch_details = OnEventFromSource(held_move_event_.get()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatch_details.dispatcher_destroyed) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_move_event_.reset(); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatch_details.dispatcher_destroyed) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatching_held_event_ = false; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dispatch_details; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::PostSynthesizeMouseMove() { 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (synthesize_mouse_move_) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synthesize_mouse_move_ = true; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoop::current()->PostNonNestableTask( 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(base::IgnoreResult( 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &WindowEventDispatcher::SynthesizeMouseMoveEvent), 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_event_factory_.GetWeakPtr())); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowEventDispatcher::SynthesizeMouseMoveAfterChangeToWindow( 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window* window) { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window->IsVisible() && 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->ContainsPointInRoot(GetLastMouseLocationInRoot())) { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PostSynthesizeMouseMove(); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventDispatchDetails WindowEventDispatcher::SynthesizeMouseMoveEvent() { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!synthesize_mouse_move_) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return details; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synthesize_mouse_move_ = false; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point root_mouse_location = GetLastMouseLocationInRoot(); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window()->bounds().Contains(root_mouse_location)) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return details; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point host_mouse_location = root_mouse_location; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_->ConvertPointToHost(&host_mouse_location); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent event(ui::ET_MOUSE_MOVED, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_mouse_location, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_mouse_location, 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EF_IS_SYNTHESIZED, 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0); 6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return OnEventFromSource(&event); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::PreDispatchLocatedEvent(Window* target, 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LocatedEvent* event) { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int flags = event->flags(); 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsNonClientLocation(target, event->location())) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags |= ui::EF_IS_NON_CLIENT; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->set_flags(flags); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatching_held_event_ && 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event->IsMouseEvent() || event->IsScrollEvent()) && 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(event->flags() & ui::EF_IS_SYNTHESIZED)) { 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->type() != ui::ET_MOUSE_CAPTURE_CHANGED) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLastMouseLocation(window(), event->root_location()); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) synthesize_mouse_move_ = false; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WindowEventDispatcher::PreDispatchMouseEvent(Window* target, 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent* event) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client::CursorClient* cursor_client = client::GetCursorClient(window()); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We allow synthesized mouse exit events through even if mouse events are 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled. This ensures that hover state, etc on controls like buttons is 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cleared. 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cursor_client && 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !cursor_client->IsMouseEventsEnabled() && 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event->flags() & ui::EF_IS_SYNTHESIZED) && 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event->type() != ui::ET_MOUSE_EXITED)) { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->SetHandled(); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEventCandidateForHold(*event) && !dispatching_held_event_) { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (move_hold_count_) { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(event->flags() & ui::EF_IS_SYNTHESIZED) && 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->type() != ui::ET_MOUSE_CAPTURE_CHANGED) { 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLastMouseLocation(window(), event->root_location()); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) held_move_event_.reset(new ui::MouseEvent(*event, target, window())); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We may have a held event for a period between the time move_hold_count_ 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // fell to 0 and the DispatchHeldEvents executes. Since we're going to 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dispatch the new event directly below, we can reset the old one. 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) held_move_event_.reset(); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kMouseButtonFlagMask = ui::EF_LEFT_MOUSE_BUTTON | 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::EF_MIDDLE_MOUSE_BUTTON | 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EF_RIGHT_MOUSE_BUTTON; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_EXITED: 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target || target == window()) { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details = 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchMouseEnterOrExit(*event, ui::ET_MOUSE_EXITED); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed) { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->SetHandled(); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_ = NULL; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_MOVED: 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send an exit to the current |mouse_moved_handler_| and an enter to 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |target|. Take care that both us and |target| aren't destroyed during 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dispatch. 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target != mouse_moved_handler_) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* old_mouse_moved_handler = mouse_moved_handler_; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowTracker live_window; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_window.Add(target); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchDetails details = 770868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DispatchMouseEnterOrExit(*event, ui::ET_MOUSE_EXITED); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->SetHandled(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 774868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 775868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // If the |mouse_moved_handler_| changes out from under us, assume a 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nested message loop ran and we don't need to do anything. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_moved_handler_ != old_mouse_moved_handler) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->SetHandled(); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!live_window.Contains(target) || details.target_destroyed) { 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_ = NULL; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->SetHandled(); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_window.Remove(target); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_moved_handler_ = target; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details = DispatchMouseEnterOrExit(*event, ui::ET_MOUSE_ENTERED); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details.dispatcher_destroyed || details.target_destroyed) { 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->SetHandled(); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_PRESSED: 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't set the mouse pressed handler for non client mouse down events. 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are only sent by Windows and are not always followed with non 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // client mouse up events which causes subsequent mouse events to be 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sent to the wrong target. 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(event->flags() & ui::EF_IS_NON_CLIENT) && !mouse_pressed_handler_) 80290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_pressed_handler_ = target; 80390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Env::GetInstance()->set_mouse_button_flags( 80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) event->flags() & kMouseButtonFlagMask); 805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) case ui::ET_MOUSE_RELEASED: 80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mouse_pressed_handler_ = NULL; 8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Env::GetInstance()->set_mouse_button_flags(event->flags() & 8091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) kMouseButtonFlagMask & ~event->changed_button_flags()); 8101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) break; 81190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default: 8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PreDispatchLocatedEvent(target, event); 81690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 81790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WindowEventDispatcher::PreDispatchTouchEvent(Window* target, 81990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::TouchEvent* event) { 82090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) switch (event->type()) { 8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::ET_TOUCH_PRESSED: 8221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) touch_ids_down_ |= (1 << event->touch_id()); 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Env::GetInstance()->set_touch_down(touch_ids_down_ != 0); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Handle ET_TOUCH_CANCELLED only if it has a native event. 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_TOUCH_CANCELLED: 8284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!event->HasNativeEvent()) 8294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // fallthrough 8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::ET_TOUCH_RELEASED: 8324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) touch_ids_down_ = (touch_ids_down_ | (1 << event->touch_id())) ^ 8334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (1 << event->touch_id()); 834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Env::GetInstance()->set_touch_down(touch_ids_down_ != 0); 835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 83690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 837f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case ui::ET_TOUCH_MOVED: 838f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (move_hold_count_ && !dispatching_held_event_) { 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) held_move_event_.reset(new ui::TouchEvent(*event, target, window())); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event->SetHandled(); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 849868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PreDispatchLocatedEvent(target, event); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace aura 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)