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 "ui/views/widget/native_widget_aura.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkRegion.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/cursor_client.h" 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ui/aura/client/focus_client.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/screen_position_client.h" 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_types.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme_aura.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/drag_utils.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/input_method_bridge.h" 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/views/ime/null_input_method.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/drop_helper.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_delegate.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/tooltip_manager_aura.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_aura_utils.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/views/widget/window_reorderer.h" 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/wm/core/shadow_types.h" 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/window_util.h" 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h" 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/drag_drop_client.h" 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/window_move_client.h" 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/wm/public/window_types.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_gdi_object.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/win_util.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util_win.h" 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(USE_X11) && !defined(OS_CHROMEOS) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" 55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 56558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_window_tree_host.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetRestoreBounds(aura::Window* window, const gfx::Rect& bounds) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window->SetProperty(aura::client::kRestoreBoundsKey, new gfx::Rect(bounds)); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, public: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidgetAura::NativeWidgetAura(internal::NativeWidgetDelegate* delegate) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delegate_(delegate), 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_(new aura::Window(this)), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroying_(false), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_(gfx::kNullCursor), 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci saved_window_state_(ui::SHOW_STATE_DEFAULT), 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci close_widget_factory_(this) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetFocusChangeObserver(window_, this); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetActivationChangeObserver(window_, this); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void NativeWidgetAura::RegisterNativeWidgetForWindow( 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) internal::NativeWidgetPrivate* native_widget, 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) aura::Window* window) { 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window->set_user_data(native_widget); 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, internal::NativeWidgetPrivate implementation: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::InitNativeWidget(const Widget::InitParams& params) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Aura needs to know which desktop (Ash or regular) will manage this widget. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See Widget::InitParams::context for details. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(params.parent || params.context); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ownership_ = params.ownership; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RegisterNativeWidgetForWindow(this, window_); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetType(GetAuraWindowTypeForWidgetType(params.type)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetProperty(aura::client::kShowStateKey, params.show_state); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.type == Widget::InitParams::TYPE_BUBBLE) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetHideOnDeactivate(window_, true); 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_->SetTransparent( 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity == Widget::InitParams::TRANSLUCENT_WINDOW); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Init(params.layer_type); 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (params.shadow_type == Widget::InitParams::SHADOW_TYPE_NONE) 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetShadowType(window_, wm::SHADOW_TYPE_NONE); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else if (params.shadow_type == Widget::InitParams::SHADOW_TYPE_DROP) 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetShadowType(window_, wm::SHADOW_TYPE_RECTANGULAR); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.type == Widget::InitParams::TYPE_CONTROL) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Show(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) delegate_->OnNativeWidgetCreated(false); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect window_bounds = params.bounds; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView parent = params.parent; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView context = params.context; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!params.child) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the transient child before the window is added. This way the 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LayoutManager knows the window has a transient parent. 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (parent && parent->type() != ui::wm::WINDOW_TYPE_UNKNOWN) { 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::AddTransientChild(parent, window_); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!context) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context = parent; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent = NULL; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetAlwaysOnTop before SetParent so that always-on-top container is used. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetAlwaysOnTop(params.keep_on_top); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure we have a real |window_bounds|. 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent && window_bounds == gfx::Rect()) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a parent is specified but no bounds are given, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use the origin of the parent's display so that the widget 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be added to the same display as the parent. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = gfx::Screen::GetScreenFor(parent)-> 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDisplayNearestWindow(parent).bounds(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_bounds.set_origin(bounds.origin()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set properties before adding to the parent so that its layout manager sees 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the correct values. 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnSizeConstraintsChanged(); 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->AddChild(window_); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::client::ParentWindowWithContext( 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) window_, context->GetRootWindow(), window_bounds); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Start observing property changes. 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window_->AddObserver(this); 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait to set the bounds until we have a parent. That way we can know our 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true state/bounds (the LayoutManager may enforce a particular 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state/bounds). 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsMaximized()) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRestoreBounds(window_, window_bounds); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBounds(window_bounds); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->set_ignore_events(!params.accept_events); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(GetWidget()->GetRootView()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.type != Widget::InitParams::TYPE_TOOLTIP) 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) tooltip_manager_.reset(new views::TooltipManagerAura(GetWidget())); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_helper_.reset(new DropHelper(GetWidget()->GetRootView())); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.type != Widget::InitParams::TYPE_TOOLTIP && 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.type != Widget::InitParams::TYPE_POPUP) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetDragDropDelegate(window_, this); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetActivationDelegate(window_, this); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) window_reorderer_.reset(new WindowReorderer(window_, 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetWidget()->GetRootView())); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NonClientFrameView* NativeWidgetAura::CreateNonClientFrameView() { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::ShouldUseNativeFrame() const { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is only one frame type for aura. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool NativeWidgetAura::ShouldWindowContentsBeTransparent() const { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::FrameTypeChanged() { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is called when the Theme has changed; forward the event to the root 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // widget. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->ThemeChanged(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->GetRootView()->SchedulePaint(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* NativeWidgetAura::GetWidget() { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AsWidget(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Widget* NativeWidgetAura::GetWidget() const { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->AsWidget(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView NativeWidgetAura::GetNativeView() const { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow NativeWidgetAura::GetNativeWindow() const { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* NativeWidgetAura::GetTopLevelWidget() { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWidgetPrivate* native_widget = GetTopLevelNativeWidget(GetNativeView()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget ? native_widget->GetWidget() : NULL; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::Compositor* NativeWidgetAura::GetCompositor() const { 2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ ? window_->layer()->GetCompositor() : NULL; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::Compositor* NativeWidgetAura::GetCompositor() { 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ ? window_->layer()->GetCompositor() : NULL; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::Layer* NativeWidgetAura::GetLayer() { 2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ ? window_->layer() : NULL; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void NativeWidgetAura::ReorderNativeViews() { 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) window_reorderer_->ReorderChildWindows(); 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::ViewRemoved(View* view) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drop_helper_.get() != NULL); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_helper_->ResetTargetViewIfEquals(view); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetNativeWindowProperty(const char* name, void* value) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetNativeWindowProperty(name, value); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* NativeWidgetAura::GetNativeWindowProperty(const char* name) const { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_ ? window_->GetNativeWindowProperty(name) : NULL; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TooltipManager* NativeWidgetAura::GetTooltipManager() const { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tooltip_manager_.get(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetCapture() { 2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetCapture(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::ReleaseCapture() { 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->ReleaseCapture(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::HasCapture() const { 2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ && window_->HasCapture(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputMethod* NativeWidgetAura::CreateInputMethod() { 2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return NULL; 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (switches::IsTextInputFocusManagerEnabled()) 278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return new NullInputMethod(); 279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = window_->GetRootWindow(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InputMethod* host = 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_window->GetProperty(aura::client::kRootWindowInputMethodKey); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new InputMethodBridge(this, host, true); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal::InputMethodDelegate* NativeWidgetAura::GetInputMethodDelegate() { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ui::InputMethod* NativeWidgetAura::GetHostInputMethod() { 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) aura::Window* root_window = window_->GetRootWindow(); 292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return root_window->GetProperty(aura::client::kRootWindowInputMethodKey); 293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::CenterWindow(const gfx::Size& size) { 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect parent_bounds(window_->parent()->GetBoundsInRootWindow()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When centering window, we take the intersection of the host and 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the parent. We assume the root window represents the visible 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rect of a single screen. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = gfx::Screen::GetScreenFor(window_)-> 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDisplayNearestWindow(window_).work_area(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::ScreenPositionClient* screen_position_client = 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetScreenPositionClient(window_->GetRootWindow()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screen_position_client) { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point origin = work_area.origin(); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_position_client->ConvertPointFromScreen(window_->GetRootWindow(), 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &origin); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.set_origin(origin); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_bounds.Intersect(work_area); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |window_|'s transient parent's bounds are big enough to fit it, then we 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // center it with respect to the transient parent. 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (wm::GetTransientParent(window_)) { 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect transient_parent_rect = 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::GetTransientParent(window_)->GetBoundsInRootWindow(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transient_parent_rect.Intersect(work_area); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (transient_parent_rect.height() >= size.height() && 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transient_parent_rect.width() >= size.width()) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_bounds = transient_parent_rect; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect window_bounds( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_bounds.x() + (parent_bounds.width() - size.width()) / 2, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_bounds.y() + (parent_bounds.height() - size.height()) / 2, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.width(), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.height()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't size the window bigger than the parent, otherwise the user may not be 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // able to close or move it. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_bounds.AdjustToFit(parent_bounds); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the bounds back relative to the parent. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point origin = window_bounds.origin(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(window_->GetRootWindow(), 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->parent(), &origin); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_bounds.set_origin(origin); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(window_bounds); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::GetWindowPlacement( 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* bounds, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::WindowShowState* show_state) const { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The interface specifies returning restored bounds, not current bounds. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *bounds = GetRestoredBounds(); 3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *show_state = window_ ? window_->GetProperty(aura::client::kShowStateKey) : 3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ui::SHOW_STATE_DEFAULT; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool NativeWidgetAura::SetWindowTitle(const base::string16& title) { 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!window_) 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (window_->title() == title) 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window_->SetTitle(title); 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetWindowIcons(const gfx::ImageSkia& window_icon, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& app_icon) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Aura doesn't have window icons. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::InitModalType(ui::ModalType modal_type) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (modal_type != ui::MODAL_TYPE_NONE) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetProperty(aura::client::kModalKey, modal_type); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect NativeWidgetAura::GetWindowBoundsInScreen() const { 3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ ? window_->GetBoundsInScreen() : gfx::Rect(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect NativeWidgetAura::GetClientAreaBoundsInScreen() const { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // View-to-screen coordinate system transformations depend on this returning 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the full window bounds, for example View::ConvertPointToScreen(). 3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ ? window_->GetBoundsInScreen() : gfx::Rect(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect NativeWidgetAura::GetRestoredBounds() const { 3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return gfx::Rect(); 3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restored bounds should only be relevant if the window is minimized or 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // maximized. However, in some places the code expects GetRestoredBounds() 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to return the current window bounds if the window is not in either state. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsMinimized() || IsMaximized() || IsFullscreen()) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore bounds are in screen coordinates, no need to convert. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* restore_bounds = 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->GetProperty(aura::client::kRestoreBoundsKey); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (restore_bounds) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *restore_bounds; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetBoundsInScreen(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetBounds(const gfx::Rect& bounds) { 4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 4023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = window_->GetRootWindow(); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::ScreenPositionClient* screen_position_client = 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetScreenPositionClient(root); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (screen_position_client) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Display dst_display = 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(window_)->GetDisplayMatching(bounds); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_position_client->SetBounds(window_, bounds, dst_display); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(bounds); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetSize(const gfx::Size& size) { 4193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetBounds(gfx::Rect(window_->bounds().origin(), size)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::StackAbove(gfx::NativeView native_view) { 4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_ && window_->parent() && 4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->parent() == native_view->parent()) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->parent()->StackChildAbove(window_, native_view); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::StackAtTop() { 4303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 4313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->parent()->StackChildAtTop(window_); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::StackBelow(gfx::NativeView native_view) { 4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_ && window_->parent() && 4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->parent() == native_view->parent()) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->parent()->StackChildBelow(window_, native_view); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetShape(gfx::NativeRegion region) { 4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (window_) 4426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window_->layer()->SetAlphaShape(make_scoped_ptr(region)); 4436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) else 4446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delete region; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Close() { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |window_| may already be deleted by parent window. This can happen 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when this widget is child widget or has transient parent 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and ownership is WIDGET_OWNS_NATIVE_WIDGET. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(window_ || 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ownership_ == Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SuppressPaint(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Hide(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_NONE); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!close_widget_factory_.HasWeakPtrs()) { 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->PostTask( 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NativeWidgetAura::CloseNow, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) close_widget_factory_.GetWeakPtr())); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::CloseNow() { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete window_; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Show() { 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShowWithWindowState(ui::SHOW_STATE_NORMAL); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Hide() { 4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->Hide(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::ShowMaximizedWithBounds( 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& restored_bounds) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRestoreBounds(window_, restored_bounds); 483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ShowWithWindowState(ui::SHOW_STATE_MAXIMIZED); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::ShowWithWindowState(ui::WindowShowState state) { 4873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 4883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state == ui::SHOW_STATE_MAXIMIZED || state == ui::SHOW_STATE_FULLSCREEN) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetProperty(aura::client::kShowStateKey, state); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Show(); 493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (delegate_->CanActivate()) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state != ui::SHOW_STATE_INACTIVE) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Activate(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetInitialFocus() should be always be called, even for 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // SHOW_STATE_INACTIVE. If the window has to stay inactive, the method will 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // do the right thing. 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetInitialFocus(state); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::IsVisible() const { 5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ && window_->IsVisible(); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Activate() { 5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't necessarily have a root window yet. This can happen with 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constrained windows. 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_->GetRootWindow()) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetActivationClient(window_->GetRootWindow())->ActivateWindow( 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_->GetProperty(aura::client::kDrawAttentionKey)) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetProperty(aura::client::kDrawAttentionKey, false); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Deactivate() { 5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 5233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetActivationClient(window_->GetRootWindow())->DeactivateWindow( 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::IsActive() const { 529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return window_ && wm::IsActiveWindow(window_); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetAlwaysOnTop(bool on_top) { 5333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 5343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetProperty(aura::client::kAlwaysOnTopKey, on_top); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool NativeWidgetAura::IsAlwaysOnTop() const { 5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return window_ && window_->GetProperty(aura::client::kAlwaysOnTopKey); 5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NativeWidgetAura::SetVisibleOnAllWorkspaces(bool always_visible) { 542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Not implemented on chromeos or for child widgets. 543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Maximize() { 5463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 5473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Minimize() { 5513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 5523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::IsMaximized() const { 5563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ && window_->GetProperty(aura::client::kShowStateKey) == 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SHOW_STATE_MAXIMIZED; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::IsMinimized() const { 5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ && window_->GetProperty(aura::client::kShowStateKey) == 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SHOW_STATE_MINIMIZED; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::Restore() { 5663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 5673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetFullscreen(bool fullscreen) { 5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_ || IsFullscreen() == fullscreen) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to do. 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save window state before entering full screen so that it could restored 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when exiting full screen. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) saved_window_state_ = window_->GetProperty(aura::client::kShowStateKey); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetProperty( 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::kShowStateKey, 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen ? ui::SHOW_STATE_FULLSCREEN : saved_window_state_); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::IsFullscreen() const { 5853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return window_ && window_->GetProperty(aura::client::kShowStateKey) == 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SHOW_STATE_FULLSCREEN; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetOpacity(unsigned char opacity) { 5903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 5913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->layer()->SetOpacity(opacity / 255.0); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetUseDragFrame(bool use_drag_frame) { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::FlashFrame(bool flash) { 5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 6003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetProperty(aura::client::kDrawAttentionKey, flash); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::RunShellDrag(View* view, 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::OSExchangeData& data, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int operation, 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DragEventSource source) { 6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) views::RunShellDrag(window_, data, location, operation, source); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SchedulePaintInRect(const gfx::Rect& rect) { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SchedulePaintInRect(rect); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetCursor(gfx::NativeCursor cursor) { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_ = cursor; 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::CursorClient* cursor_client = 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetCursorClient(window_->GetRootWindow()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cursor_client) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_client->SetCursor(cursor); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool NativeWidgetAura::IsMouseEventsEnabled() const { 6263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 6287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::CursorClient* cursor_client = 6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::client::GetCursorClient(window_->GetRootWindow()); 6307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return cursor_client ? cursor_client->IsMouseEventsEnabled() : true; 6317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::ClearNativeFocus() { 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::FocusClient* client = aura::client::GetFocusClient(window_); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_ && client && window_->Contains(client->GetFocusedWindow())) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client->ResetFocusWithinActiveWindow(window_); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect NativeWidgetAura::GetWorkAreaBoundsInScreen() const { 6403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!window_) 6413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return gfx::Rect(); 6423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return gfx::Screen::GetScreenFor(window_)-> 6433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetDisplayNearestWindow(window_).work_area(); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::MoveLoopResult NativeWidgetAura::RunMoveLoop( 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Vector2d& drag_offset, 64868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Widget::MoveLoopSource source, 64968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Widget::MoveLoopEscapeBehavior escape_behavior) { 65068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // |escape_behavior| is only needed on windows when running the native message 65168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // loop. 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!window_ || !window_->GetRootWindow()) 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Widget::MOVE_LOOP_CANCELED; 6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WindowMoveClient* move_client = 6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::GetWindowMoveClient(window_->GetRootWindow()); 6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!move_client) 6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Widget::MOVE_LOOP_CANCELED; 6585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetCapture(); 6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WindowMoveSource window_move_source = 6615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source == Widget::MOVE_LOOP_SOURCE_MOUSE ? 6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_MOUSE : 6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WINDOW_MOVE_SOURCE_TOUCH; 6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (move_client->RunMoveLoop(window_, drag_offset, window_move_source) == 6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::MOVE_SUCCESSFUL) { 6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Widget::MOVE_LOOP_SUCCESSFUL; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Widget::MOVE_LOOP_CANCELED; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::EndMoveLoop() { 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!window_ || !window_->GetRootWindow()) 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::WindowMoveClient* move_client = 6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::client::GetWindowMoveClient(window_->GetRootWindow()); 6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (move_client) 6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) move_client->EndMoveLoop(); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::SetVisibilityChangedAnimationsEnabled(bool value) { 6813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (window_) 6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_->SetProperty(aura::client::kAnimationsDisabledKey, !value); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::NativeTheme* NativeWidgetAura::GetNativeTheme() const { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS) 6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return DesktopWindowTreeHost::GetNativeTheme(window_); 688558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#else 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeThemeAura::instance(); 690558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 693116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid NativeWidgetAura::OnRootViewLayout() { 694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 696116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool NativeWidgetAura::IsTranslucentWindowOpacitySupported() const { 697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 69858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 69958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid NativeWidgetAura::OnSizeConstraintsChanged() { 7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_->SetProperty(aura::client::kCanMaximizeKey, 7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetWidget()->widget_delegate()->CanMaximize()); 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_->SetProperty(aura::client::kCanResizeKey, 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetWidget()->widget_delegate()->CanResize()); 7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void NativeWidgetAura::RepostNativeEvent(gfx::NativeEvent native_event) { 708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnEvent(native_event); 709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, views::InputMethodDelegate implementation: 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::DispatchKeyEventPostIME(const ui::KeyEvent& key) { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = GetWidget()->GetFocusManager(); 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnKeyEvent(const_cast<ui::KeyEvent*>(&key)); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key.handled() || !focus_manager) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager->OnKeyEvent(key); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, aura::WindowDelegate implementation: 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size NativeWidgetAura::GetMinimumSize() const { 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetMinimumSize(); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size NativeWidgetAura::GetMaximumSize() const { 7305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // If a window have a maximum size, the window should not be 7315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // maximizable. 7325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK(delegate_->GetMaximumSize().IsEmpty() || 7335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu !window_->GetProperty(aura::client::kCanMaximizeKey)); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_->GetMaximumSize(); 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::OnBoundsChanged(const gfx::Rect& old_bounds, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& new_bounds) { 7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Assume that if the old bounds was completely empty a move happened. This 7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // handles the case of a maximize animation acquiring the layer (acquiring a 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // layer results in clearing the bounds). 7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (old_bounds.origin() != new_bounds.origin() || 7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (old_bounds == gfx::Rect(0, 0, 0, 0) && !new_bounds.IsEmpty())) { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnNativeWidgetMove(); 7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_bounds.size() != new_bounds.size()) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnNativeWidgetSizeChanged(new_bounds.size()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor NativeWidgetAura::GetCursor(const gfx::Point& point) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cursor_; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeWidgetAura::GetNonClientComponent(const gfx::Point& point) const { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->GetNonClientComponent(point); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::ShouldDescendIntoChildForEventHandling( 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* child, 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location) { 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::WidgetDelegate* widget_delegate = GetWidget()->widget_delegate(); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_delegate && 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !widget_delegate->ShouldDescendIntoChildForEventHandling(child, location)) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't descend into |child| if there is a view with a Layer that contains 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the point and is stacked above |child|s layer. 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<ui::Layer*> Layers; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Layers& root_layers(delegate_->GetRootLayers()); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root_layers.empty()) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layers::const_iterator child_layer_iter( 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::find(window_->layer()->children().begin(), 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->layer()->children().end(), child->layer())); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_layer_iter == window_->layer()->children().end()) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<ui::Layer*>::const_reverse_iterator i = root_layers.rbegin(); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != root_layers.rend(); ++i) { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Layer* layer = *i; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (layer->visible() && layer->bounds().Contains(location)) { 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layers::const_iterator root_layer_iter( 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::find(window_->layer()->children().begin(), 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->layer()->children().end(), layer)); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root_layer_iter > child_layer_iter) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::CanFocus() { 794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ShouldActivate(); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::OnCaptureLost() { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnMouseCaptureLost(); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::OnPaint(gfx::Canvas* canvas) { 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnNativeWidgetPaint(canvas); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::OnDeviceScaleFactorChanged(float device_scale_factor) { 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Repainting with new scale factor will paint the content at the right scale. 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NativeWidgetAura::OnWindowDestroying(aura::Window* window) { 8106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window_->RemoveObserver(this); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnNativeWidgetDestroying(); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the aura::Window is destroyed, we can no longer show tooltips. 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tooltip_manager_.reset(); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NativeWidgetAura::OnWindowDestroyed(aura::Window* window) { 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = NULL; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnNativeWidgetDestroyed(); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::OnWindowTargetVisibilityChanged(bool visible) { 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->OnNativeWidgetVisibilityChanged(visible); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetAura::HasHitTestMask() const { 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delegate_->HasHitTestMask(); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::GetHitTestMask(gfx::Path* mask) const { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(mask); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->GetHitTestMask(mask); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// NativeWidgetAura, aura::WindowObserver implementation: 8396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 8406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void NativeWidgetAura::OnWindowPropertyChanged(aura::Window* window, 8416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const void* key, 8426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) intptr_t old) { 8436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (key == aura::client::kShowStateKey) 8446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate_->OnNativeWidgetWindowShowStateChanged(); 8456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 8466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 8476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, ui::EventHandler implementation: 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeWidgetAura::OnKeyEvent(ui::KeyEvent* event) { 8513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(window_); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->is_char()) { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a ui::InputMethod object is attached to the root window, character 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events are handled inside the object and are not passed to this function. 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If such object is not attached, character events might be sent (e.g. on 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows). In this case, we just skip these. 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Renderer may send a key event back to us if the key event wasn't handled, 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the window may be invisible by that time. 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window_->IsVisible()) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InputMethod* input_method = GetWidget()->GetInputMethod(); 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!input_method) 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_method->DispatchKeyEvent(*event); 867010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (switches::IsTextInputFocusManagerEnabled()) { 868010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FocusManager* focus_manager = GetWidget()->GetFocusManager(); 869010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) delegate_->OnKeyEvent(event); 870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!event->handled() && focus_manager) 871010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) focus_manager->OnKeyEvent(*event); 872010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeWidgetAura::OnMouseEvent(ui::MouseEvent* event) { 8773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(window_); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(window_->IsVisible()); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event->type() == ui::ET_MOUSEWHEEL) { 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnMouseEvent(event); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event->handled()) 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tooltip_manager_.get()) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tooltip_manager_->UpdateTooltip(); 8871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) TooltipManagerAura::UpdateTooltipManagerForCapture(GetWidget()); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnMouseEvent(event); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeWidgetAura::OnScrollEvent(ui::ScrollEvent* event) { 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnScrollEvent(event); 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeWidgetAura::OnGestureEvent(ui::GestureEvent* event) { 8963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(window_); 897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(window_->IsVisible() || event->IsEndingEvent()); 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnGestureEvent(event); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NativeWidgetAura, aura::client::ActivationDelegate implementation: 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NativeWidgetAura::ShouldActivate() const { 905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return delegate_->CanActivate(); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NativeWidgetAura, aura::client::ActivationChangeObserver implementation: 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeWidgetAura::OnWindowActivated(aura::Window* gained_active, 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* lost_active) { 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(window_ == gained_active || window_ == lost_active); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetWidget()->GetFocusManager()) { 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_ == gained_active) 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWidget()->GetFocusManager()->RestoreFocusedView(); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (window_ == lost_active) 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWidget()->GetFocusManager()->StoreFocusedView(true); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnNativeWidgetActivationChanged(window_ == gained_active); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NativeWidgetAura, aura::client::FocusChangeObserver: 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NativeWidgetAura::OnWindowFocused(aura::Window* gained_focus, 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* lost_focus) { 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_ == gained_focus) { 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In aura, it is possible for child native widgets to take input and focus, 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this differs from the behavior on windows. 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetWidget()->GetInputMethod()) // Null in tests. 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWidget()->GetInputMethod()->OnFocus(); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->OnNativeFocus(lost_focus); 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (window_ == lost_focus) { 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // GetInputMethod() recreates the input method if it's previously been 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destroyed. If we get called during destruction, the input method will be 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // gone, and creating a new one and telling it that we lost the focus will 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // trigger a DCHECK (the new input method doesn't think that we have the 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // focus and doesn't expect a blur). OnBlur() shouldn't be called during 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destruction unless WIDGET_OWNS_NATIVE_WIDGET is set (which is just the 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // case in tests). 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!destroying_) { 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetWidget()->GetInputMethod()) 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWidget()->GetInputMethod()->OnBlur(); 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(ownership_, Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET); 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delegate_->OnNativeBlur(gained_focus); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, aura::WindowDragDropDelegate implementation: 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::OnDragEntered(const ui::DropTargetEvent& event) { 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drop_helper_.get() != NULL); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_drop_operation_ = drop_helper_->OnDragOver(event.data(), 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), event.source_operations()); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeWidgetAura::OnDragUpdated(const ui::DropTargetEvent& event) { 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drop_helper_.get() != NULL); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_drop_operation_ = drop_helper_->OnDragOver(event.data(), 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), event.source_operations()); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return last_drop_operation_; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetAura::OnDragExited() { 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drop_helper_.get() != NULL); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_helper_->OnDragExit(); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeWidgetAura::OnPerformDrop(const ui::DropTargetEvent& event) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drop_helper_.get() != NULL); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return drop_helper_->OnDrop(event.data(), event.location(), 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_drop_operation_); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, protected: 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidgetAura::~NativeWidgetAura() { 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroying_ = true; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete delegate_; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseNow(); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeWidgetAura, private: 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void NativeWidgetAura::SetInitialFocus(ui::WindowShowState show_state) { 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window does not get keyboard messages unless we focus it. 9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!GetWidget()->SetInitialFocus(show_state)) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->Focus(); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, public: 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 1004f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) || (defined(USE_X11) && !defined(OS_CHROMEOS)) 1005558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid CloseWindow(aura::Window* window) { 1006558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (window) { 1007558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch Widget* widget = Widget::GetWidgetForNativeView(window); 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (widget && widget->is_secondary_widget()) 1009c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // To avoid the delay in shutdown caused by using Close which may wait 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // for animations, use CloseNow. Because this is only used on secondary 1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // widgets it seems relatively safe to skip the extra processing of 1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Close. 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget->CloseNow(); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1015558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 1016f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 1017f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1018558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) 1019558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochBOOL CALLBACK WindowCallbackProc(HWND hwnd, LPARAM lParam) { 1020558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch aura::Window* root_window = 10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DesktopWindowTreeHostWin::GetContentWindowForHWND(hwnd); 1022558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CloseWindow(root_window); 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TRUE; 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1026558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::CloseAllSecondaryWidgets() { 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, 0); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1033558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 10343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#if defined(USE_X11) && !defined(OS_CHROMEOS) 1035558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::vector<aura::Window*> open_windows = 10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DesktopWindowTreeHostX11::GetAllOpenWindows(); 1037558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch std::for_each(open_windows.begin(), open_windows.end(), CloseWindow); 10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DesktopWindowTreeHostX11::CleanUpWindowList(); 1039558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::ConvertRect(const Widget* source, 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* target, 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* rect) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internal::NativeWidgetPrivate, public: 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidgetPrivate* NativeWidgetPrivate::CreateNativeWidget( 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetDelegate* delegate) { 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new NativeWidgetAura(delegate); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeView( 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView native_view) { 10623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Cast must match type supplied to RegisterNativeWidgetForWindow(). 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<NativeWidgetPrivate*>(native_view->user_data()); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeWindow( 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow native_window) { 10693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Cast must match type supplied to RegisterNativeWidgetForWindow(). 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<NativeWidgetPrivate*>(native_window->user_data()); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget( 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView native_view) { 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = native_view; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWidgetPrivate* top_level_native_widget = NULL; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (window) { 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWidgetPrivate* native_widget = GetNativeWidgetForNativeView(window); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_widget) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_level_native_widget = native_widget; 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window = window->parent(); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return top_level_native_widget; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view, 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::Widgets* children) { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Code expects widget for |native_view| to be added to |children|. 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeWidgetPrivate* native_widget = static_cast<NativeWidgetPrivate*>( 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNativeWidgetForNativeView(native_view)); 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_widget && native_widget->GetWidget()) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) children->insert(native_widget->GetWidget()); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const aura::Window::Windows& child_windows = native_view->children(); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (aura::Window::Windows::const_iterator i = child_windows.begin(); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != child_windows.end(); ++i) { 11013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GetAllChildWidgets((*i), children); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// static 1106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void NativeWidgetPrivate::GetAllOwnedWidgets(gfx::NativeView native_view, 1107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Widget::Widgets* owned) { 1108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const aura::Window::Windows& transient_children = 1109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) wm::GetTransientChildren(native_view); 1110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) for (aura::Window::Windows::const_iterator i = transient_children.begin(); 1111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) i != transient_children.end(); ++i) { 1112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NativeWidgetPrivate* native_widget = static_cast<NativeWidgetPrivate*>( 1113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetNativeWidgetForNativeView(*i)); 1114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (native_widget && native_widget->GetWidget()) 1115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) owned->insert(native_widget->GetWidget()); 1116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GetAllOwnedWidgets((*i), owned); 1117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 1119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view, 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView new_parent) { 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_view != new_parent); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView previous_parent = native_view->parent(); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_parent == new_parent) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::Widgets widgets; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAllChildWidgets(native_view, &widgets); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First notify all the widgets that they are being disassociated 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from their previous parent. 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (Widget::Widgets::iterator it = widgets.begin(); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != widgets.end(); ++it) { 1136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) (*it)->NotifyNativeViewHierarchyWillChange(); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_parent) { 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_parent->AddChild(native_view); 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The following looks weird, but it's the equivalent of what aura has 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // always done. (The previous behaviour of aura::Window::SetParent() used 11441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // NULL as a special value that meant ask the WindowTreeClient where things 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should go.) 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This probably isn't strictly correct, but its an invariant that a Window 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in use will be attached to a RootWindow, so we can't just call 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RemoveChild here. The only possible thing that could assign a RootWindow 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in this case is the stacking client of the current RootWindow. This 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // matches our previous behaviour; the global stacking client would almost 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // always reattach the window to the same RootWindow. 11531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = native_view->GetRootWindow(); 11541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::client::ParentWindowWithContext( 11551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) native_view, root_window, root_window->GetBoundsInScreen()); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And now, notify them that they have a brand new parent. 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (Widget::Widgets::iterator it = widgets.begin(); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != widgets.end(); ++it) { 1161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) (*it)->NotifyNativeViewHierarchyChanged(); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool NativeWidgetPrivate::IsMouseButtonDown() { 11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return aura::Env::GetInstance()->IsMouseButtonDown(); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 11715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liugfx::FontList NativeWidgetPrivate::GetWindowTitleFontList() { 11725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_WIN) 11735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NONCLIENTMETRICS ncm; 11745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::win::GetNonClientMetrics(&ncm); 11755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu l10n_util::AdjustUIFont(&(ncm.lfCaptionFont)); 11765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::win::ScopedHFONT caption_font(CreateFontIndirect(&(ncm.lfCaptionFont))); 11775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return gfx::FontList(gfx::Font(caption_font)); 11785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#else 11795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return gfx::FontList(); 11805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif 11815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 11825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 1185