15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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 "ash/wm/overlay_event_filter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/partial_screenshot_view.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_delegate.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OverlayEventFilter::OverlayEventFilter()
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(NULL) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OverlayEventFilter::~OverlayEventFilter() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = NULL;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OverlayEventFilter::OnKeyEvent(ui::KeyEvent* event) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!delegate_)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not consume a translated key event which is generated by an IME (e.g.,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::VKEY_PROCESSKEY) since the key event is generated in response to a key
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // press or release before showing the ovelay. This is important not to
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // confuse key event handling JavaScript code in a page.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() == ui::ET_TRANSLATED_KEY_PRESS ||
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event->type() == ui::ET_TRANSLATED_KEY_RELEASE) {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_ && delegate_->IsCancelingKeyEvent(event))
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Cancel();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // Pass key events only when they are sent to a child of the delegate's
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = static_cast<aura::Window*>(event->target());
43d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  if (!delegate_ || !delegate_->GetWindow() ||
44d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      !delegate_->GetWindow()->Contains(target))
45d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    event->StopPropagation();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverlayEventFilter::OnLoginStateChanged(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user::LoginStatus status) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cancel();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverlayEventFilter::OnAppTerminating() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cancel();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverlayEventFilter::OnLockStateChanged(bool locked) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cancel();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverlayEventFilter::Activate(Delegate* delegate) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverlayEventFilter::Deactivate() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = NULL;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverlayEventFilter::Cancel() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->Cancel();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
75