Home | History | Annotate | Download | only in aura
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/aura/window_targeter.h"
      6 
      7 #include "ui/aura/client/capture_client.h"
      8 #include "ui/aura/client/event_client.h"
      9 #include "ui/aura/client/focus_client.h"
     10 #include "ui/aura/root_window.h"
     11 #include "ui/aura/window.h"
     12 #include "ui/aura/window_delegate.h"
     13 #include "ui/events/event_target.h"
     14 
     15 namespace aura {
     16 
     17 WindowTargeter::WindowTargeter() {}
     18 WindowTargeter::~WindowTargeter() {}
     19 
     20 ui::EventTarget* WindowTargeter::FindTargetForEvent(ui::EventTarget* root,
     21                                                     ui::Event* event) {
     22   if (event->IsKeyEvent()) {
     23     Window* window = static_cast<Window*>(root);
     24     Window* root_window = window->GetRootWindow();
     25     const ui::KeyEvent& key = static_cast<const ui::KeyEvent&>(*event);
     26     if (key.key_code() == ui::VKEY_UNKNOWN)
     27       return NULL;
     28     client::EventClient* event_client = client::GetEventClient(root_window);
     29     client::FocusClient* focus_client = client::GetFocusClient(root_window);
     30     Window* focused_window = focus_client->GetFocusedWindow();
     31     if (event_client &&
     32         !event_client->CanProcessEventsWithinSubtree(focused_window)) {
     33       focus_client->FocusWindow(NULL);
     34       return NULL;
     35     }
     36     return focused_window ? focused_window : window;
     37   }
     38   return EventTargeter::FindTargetForEvent(root, event);
     39 }
     40 
     41 bool WindowTargeter::SubtreeShouldBeExploredForEvent(
     42     ui::EventTarget* root,
     43     const ui::LocatedEvent& event) {
     44   Window* window = static_cast<Window*>(root);
     45   if (!window->IsVisible())
     46     return false;
     47   if (window->ignore_events())
     48     return false;
     49   client::EventClient* client = client::GetEventClient(window->GetRootWindow());
     50   if (client && !client->CanProcessEventsWithinSubtree(window))
     51     return false;
     52 
     53   Window* parent = window->parent();
     54   if (parent && parent->delegate_ && !parent->delegate_->
     55       ShouldDescendIntoChildForEventHandling(window, event.location())) {
     56     return false;
     57   }
     58   return window->bounds().Contains(event.location());
     59 }
     60 
     61 ui::EventTarget* WindowTargeter::FindTargetForLocatedEvent(
     62     ui::EventTarget* root,
     63     ui::LocatedEvent* event) {
     64   Window* window = static_cast<Window*>(root);
     65   if (!window->parent()) {
     66     Window* target = FindTargetInRootWindow(window, *event);
     67     if (target) {
     68       window->ConvertEventToTarget(target, event);
     69       return target;
     70     }
     71   }
     72   return EventTargeter::FindTargetForLocatedEvent(root, event);
     73 }
     74 
     75 Window* WindowTargeter::FindTargetInRootWindow(Window* root_window,
     76                                                const ui::LocatedEvent& event) {
     77   DCHECK_EQ(root_window, root_window->GetRootWindow());
     78 
     79   // Mouse events should be dispatched to the window that processed the
     80   // mouse-press events (if any).
     81   if (event.IsScrollEvent() || event.IsMouseEvent()) {
     82     WindowEventDispatcher* dispatcher = root_window->GetDispatcher();
     83     if (dispatcher->mouse_pressed_handler())
     84       return dispatcher->mouse_pressed_handler();
     85   }
     86 
     87   // All events should be directed towards the capture window (if any).
     88   Window* capture_window = client::GetCaptureWindow(root_window);
     89   if (capture_window)
     90     return capture_window;
     91 
     92   return NULL;
     93 }
     94 
     95 }  // namespace aura
     96