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/widget.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/default_theme_provider.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_font_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager_factory.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/view_storage.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/widget_focus_manager.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/input_method.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_delegate.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_private.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/root_view.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/tooltip_manager.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/widget/widget_deletion_observer.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_observer.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/custom_frame_view.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/menu/menu_controller.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |view| has a layer the layer is added to |layers|. Else this recurses 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// through the children. This is used to build a list of the layers created by 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// views that are direct children of the Widgets layer. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BuildRootLayers(View* view, std::vector<ui::Layer*>* layers) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view->layer()) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layers->push_back(view->layer()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < view->child_count(); ++i) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildRootLayers(view->child_at(i), layers); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a native widget implementation. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// First, use the supplied one if non-NULL. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finally, make a default one. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidget* CreateNativeWidget(NativeWidget* native_widget, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::NativeWidgetDelegate* delegate) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!native_widget) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_widget = 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::NativeWidgetPrivate::CreateNativeWidget(delegate); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A default implementation of WidgetDelegate, used by Widget when no 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WidgetDelegate is supplied. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DefaultWidgetDelegate : public WidgetDelegate { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DefaultWidgetDelegate(Widget* widget, const Widget::InitParams& params) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : widget_(widget), 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) can_activate_(!params.child && 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.type != Widget::InitParams::TYPE_POPUP) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DefaultWidgetDelegate() {} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from WidgetDelegate: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DeleteDelegate() OVERRIDE { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual Widget* GetWidget() OVERRIDE { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const Widget* GetWidget() const OVERRIDE { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanActivate() const OVERRIDE { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return can_activate_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_activate_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DefaultWidgetDelegate); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, InitParams: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::InitParams::InitParams() 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(TYPE_WINDOW), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate(NULL), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child(false), 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch opacity((ViewsDelegate::views_delegate && 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ViewsDelegate::views_delegate->UseTransparentWindows()) ? 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TRANSLUCENT_WINDOW : INFER_OPACITY), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accept_events(true), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) can_activate(true), 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keep_on_top(false), 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ownership(NATIVE_WIDGET_OWNS_WIDGET), 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mirror_origin_in_rtl(false), 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_dropshadow(false), 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_standard_frame(false), 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) use_system_default_icon(false), 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_state(ui::SHOW_STATE_DEFAULT), 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_buffer(false), 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent(NULL), 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget(NULL), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_root_window_host(NULL), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_level(false), 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_type(ui::LAYER_TEXTURED), 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context(NULL) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::InitParams::InitParams(Type type) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type(type), 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate(NULL), 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child(type == TYPE_CONTROL), 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opacity(((type == TYPE_WINDOW || type == TYPE_PANEL) && 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ViewsDelegate::views_delegate && 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ViewsDelegate::views_delegate->UseTransparentWindows()) ? 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TRANSLUCENT_WINDOW : INFER_OPACITY), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accept_events(true), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) can_activate(type != TYPE_POPUP && type != TYPE_MENU), 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keep_on_top(type == TYPE_MENU), 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ownership(NATIVE_WIDGET_OWNS_WIDGET), 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mirror_origin_in_rtl(false), 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_dropshadow(false), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remove_standard_frame(false), 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) use_system_default_icon(false), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_state(ui::SHOW_STATE_DEFAULT), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_buffer(false), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent(NULL), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget(NULL), 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_root_window_host(NULL), 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top_level(false), 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_type(ui::LAYER_TEXTURED), 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context(NULL) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, public: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::Widget() 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : native_widget_(NULL), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_(NULL), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_(NULL), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dragged_view_(NULL), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_secondary_widget_(true), 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_type_(FRAME_TYPE_DEFAULT), 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disable_inactive_rendering_(false), 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_closed_(false), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) saved_show_state_(ui::SHOW_STATE_DEFAULT), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_on_creation_(true), 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_top_level_(false), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_initialized_(false), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_destroyed_(false), 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_mouse_button_pressed_(false), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_touch_down_(false), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_was_move_(false), 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layers_dirty_(false), 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) movement_disabled_(false) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget::~Widget() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestroyRootView(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete native_widget_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_widget_destroyed_) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Destroying a widget with a live native widget. " 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Widget probably should use WIDGET_OWNS_NATIVE_WIDGET ownership."; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::CreateWindow(WidgetDelegate* delegate) { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateWindowWithBounds(delegate, gfx::Rect()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithBounds(WidgetDelegate* delegate, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds) { 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* widget = new Widget; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.bounds = bounds; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = delegate; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.top_level = true; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return widget; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithParent(WidgetDelegate* delegate, 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeWindow parent) { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateWindowWithParentAndBounds(delegate, parent, gfx::Rect()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::CreateWindowWithParentAndBounds(WidgetDelegate* delegate, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow parent, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget = new Widget; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget::InitParams params; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.delegate = delegate; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.parent = parent; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.bounds = bounds; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->Init(params); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return widget; 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithContext(WidgetDelegate* delegate, 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView context) { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return CreateWindowWithContextAndBounds(delegate, context, gfx::Rect()); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget* Widget::CreateWindowWithContextAndBounds(WidgetDelegate* delegate, 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView context, 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds) { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget* widget = new Widget; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = delegate; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.context = context; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = bounds; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetWidgetForNativeView(gfx::NativeView native_view) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate* native_widget = 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate::GetNativeWidgetForNativeView(native_view); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget ? native_widget->GetWidget() : NULL; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetWidgetForNativeWindow(gfx::NativeWindow native_window) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate* native_widget = 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate::GetNativeWidgetForNativeWindow( 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_window); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget ? native_widget->GetWidget() : NULL; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetTopLevelWidgetForNativeView(gfx::NativeView native_view) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate* native_widget = 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate::GetTopLevelNativeWidget(native_view); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget ? native_widget->GetWidget() : NULL; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::GetAllChildWidgets(gfx::NativeView native_view, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widgets* children) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate::GetAllChildWidgets(native_view, children); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ReparentNativeView(gfx::NativeView native_view, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView new_parent) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate::ReparentNativeView(native_view, new_parent); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Widget::GetLocalizedContentsWidth(int col_resource_id) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::GetLocalizedContentsWidthForFont(col_resource_id, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Widget::GetLocalizedContentsHeight(int row_resource_id) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::GetLocalizedContentsHeightForFont(row_resource_id, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::BaseFont)); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size Widget::GetLocalizedContentsSize(int col_resource_id, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row_resource_id) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(GetLocalizedContentsWidth(col_resource_id), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocalizedContentsHeight(row_resource_id)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::RequiresNonClientView(InitParams::Type type) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return type == InitParams::TYPE_WINDOW || 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == InitParams::TYPE_PANEL || 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == InitParams::TYPE_BUBBLE; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::Init(const InitParams& in_params) { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("views", "Widget::Init"); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitParams params = in_params; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_top_level_ = params.top_level || 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!params.child && 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.type != InitParams::TYPE_CONTROL && 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.type != InitParams::TYPE_TOOLTIP); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.top_level = is_top_level_; 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (params.opacity == InitParams::INFER_OPACITY) { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // By default, make all top-level windows but the main window transparent 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // initially so that they can be made to fade in. 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (is_top_level_ && params.type != InitParams::TYPE_WINDOW) 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = InitParams::TRANSLUCENT_WINDOW; 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = InitParams::OPAQUE_WINDOW; 323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = InitParams::OPAQUE_WINDOW; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ViewsDelegate::views_delegate) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ViewsDelegate::views_delegate->OnBeforeWidgetInit(¶ms, this); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_ = params.delegate ? 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.delegate : new DefaultWidgetDelegate(this, params); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ownership_ = params.ownership; 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_widget_ = CreateNativeWidget(params.native_widget, this)-> 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AsNativeWidgetPrivate(); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view_.reset(CreateRootView()); 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) default_theme_provider_.reset(new ui::DefaultThemeProvider); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.type == InitParams::TYPE_MENU) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_mouse_button_pressed_ = 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::NativeWidgetPrivate::IsMouseButtonDown(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->InitNativeWidget(params); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RequiresNonClientView(params.type)) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_ = new NonClientView; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->SetFrameView(CreateNonClientFrameView()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the ClientView, add it to the NonClientView and add the 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NonClientView to the RootView. This will cause everything to be parented. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->set_client_view(widget_delegate_->CreateClientView(this)); 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) non_client_view_->SetOverlayView(widget_delegate_->CreateOverlayView()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetContentsView(non_client_view_); 3512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Initialize the window's title before setting the window's initial bounds; 3522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // the frame view's preferred height may depend on the presence of a title. 3532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch UpdateWindowTitle(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetInitialBounds(params.bounds); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params.show_state == ui::SHOW_STATE_MAXIMIZED) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Maximize(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (params.show_state == ui::SHOW_STATE_MINIMIZED) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Minimize(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (params.delegate) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetContentsView(params.delegate->GetContentsView()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetInitialBoundsForFramelessWindow(params.bounds); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_initialized_ = true; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unconverted methods (see header) -------------------------------------------- 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView Widget::GetNativeView() const { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetNativeView(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow Widget::GetNativeWindow() const { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetNativeWindow(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::AddObserver(WidgetObserver* observer) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::RemoveObserver(WidgetObserver* observer) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasObserver(WidgetObserver* observer) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return observers_.HasObserver(observer); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void Widget::ViewHierarchyChanged( 393a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const View::ViewHierarchyChangedDetails& details) { 394a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!details.is_add) { 395a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (details.child == dragged_view_) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dragged_view_ = NULL; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = GetFocusManager(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focus_manager) 399a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) focus_manager->ViewRemoved(details.child); 400a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ViewStorage::GetInstance()->ViewRemoved(details.child); 401a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) native_widget_->ViewRemoved(details.child); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::NotifyNativeViewHierarchyChanged(bool attached, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView native_view) { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attached) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FocusManager* focus_manager = GetFocusManager(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We are being removed from a window hierarchy. Treat this as 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the root_view_ being removed. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focus_manager) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager->ViewRemoved(root_view_.get()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->NotifyNativeViewHierarchyChanged(attached, native_view); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converted methods (see header) ---------------------------------------------- 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::GetTopLevelWidget() { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_cast<Widget*>( 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const Widget*>(this)->GetTopLevelWidget()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Widget* Widget::GetTopLevelWidget() const { 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetTopLevelNativeWidget doesn't work during destruction because 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // property is gone after gobject gets deleted. Short circuit here 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for toplevel so that InputMethod can remove itself from 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focus manager. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return is_top_level() ? this : native_widget_->GetTopLevelWidget(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetContentsView(View* view) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not SetContentsView() again if it is already set to the same view. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view == GetContentsView()) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->SetContentsView(view); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (non_client_view_ != view) { 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |non_client_view_| can only be non-NULL here if RequiresNonClientView() 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // was true when the widget was initialized. Creating widgets with non 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // client views and then setting the contents view can cause subtle 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // problems on Windows, where the native widget thinks there is still a 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |non_client_view_|. If you get this error, either use a different type 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when initializing the widget, or don't call SetContentsView(). 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!non_client_view_); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_ = NULL; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetContentsView() { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_view_->GetContentsView(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetWindowBoundsInScreen() const { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetWindowBoundsInScreen(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetClientAreaBoundsInScreen() const { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetClientAreaBoundsInScreen(); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetRestoredBounds() const { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetRestoredBounds(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetBounds(const gfx::Rect& bounds) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetBounds(bounds); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetSize(const gfx::Size& size) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetSize(size); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::CenterWindow(const gfx::Size& size) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->CenterWindow(size); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetBoundsConstrained(const gfx::Rect& bounds) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetDisplayNearestPoint( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.origin()).work_area(); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (work_area.IsEmpty()) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBounds(bounds); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inset the work area slightly. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.Inset(10, 10, 10, 10); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.AdjustToFit(bounds); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBounds(work_area); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetVisibilityChangedAnimationsEnabled(bool value) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetVisibilityChangedAnimationsEnabled(value); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Widget::MoveLoopResult Widget::RunMoveLoop(const gfx::Vector2d& drag_offset, 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MoveLoopSource source) { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return native_widget_->RunMoveLoop(drag_offset, source); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::EndMoveLoop() { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->EndMoveLoop(); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackAboveWidget(Widget* widget) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->StackAbove(widget->GetNativeView()); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackAbove(gfx::NativeView native_view) { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->StackAbove(native_view); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackAtTop() { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->StackAtTop(); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::StackBelow(gfx::NativeView native_view) { 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->StackBelow(native_view); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetShape(gfx::NativeRegion shape) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetShape(shape); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Close() { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_closed_) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It appears we can hit this code path if you close a modal dialog then 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // close the last browser before the destructor is hit, which triggers 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invoking Close again. 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool can_close = true; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (non_client_view_) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) can_close = non_client_view_->CanClose(); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (can_close) { 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveWindowPlacement(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // During tear-down the top-level focus manager becomes unavailable to 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GTK tabbed panes and their children, so normal deregistration via 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |FormManager::ViewRemoved()| calls are fouled. We clear focus here 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to avoid these redundant steps and to avoid accessing deleted views 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that may have been in focus. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_top_level() && focus_manager_.get()) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_manager_->SetFocusedView(NULL); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetClosing(this)); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Close(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_closed_ = true; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::CloseNow() { 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetClosing(this)); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->CloseNow(); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool Widget::IsClosed() const { 5587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return widget_closed_; 5597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Show() { 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TRACE_EVENT0("views", "Widget::Show"); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (non_client_view_) { 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On the Mac the FullScreenBookmarkBar test is different then for any other 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // OS. Since the new maximize logic from ash does not apply to the mac, we 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // continue to ignore the fullscreen mode here. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED && 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !initial_restored_bounds_.IsEmpty()) { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->ShowMaximizedWithBounds(initial_restored_bounds_); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->ShowWithWindowState(saved_show_state_); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // While initializing, the kiosk mode will go to full screen before the 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // widget gets shown. In that case we stay in full screen mode, regardless 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of the |saved_show_state_| member. 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED && 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !initial_restored_bounds_.IsEmpty() && 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !IsFullscreen()) { 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_widget_->ShowMaximizedWithBounds(initial_restored_bounds_); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_widget_->ShowWithWindowState( 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IsFullscreen() ? ui::SHOW_STATE_FULLSCREEN : saved_show_state_); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |saved_show_state_| only applies the first time the window is shown. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we don't reset the value the window may be shown maximized every time 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is subsequently shown after being hidden. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) saved_show_state_ = ui::SHOW_STATE_NORMAL; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Show(); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Hide() { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Hide(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ShowInactive() { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this gets called with saved_show_state_ == ui::SHOW_STATE_MAXIMIZED, 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call SetBounds()with the restored bounds to set the correct size. This 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normally should not happen, but if it does we should avoid showing unsized 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // windows. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED && 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !initial_restored_bounds_.IsEmpty()) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBounds(initial_restored_bounds_); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) saved_show_state_ = ui::SHOW_STATE_NORMAL; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->ShowWithWindowState(ui::SHOW_STATE_INACTIVE); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Activate() { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Activate(); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Deactivate() { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Deactivate(); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsActive() const { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->IsActive(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::DisableInactiveRendering() { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetInactiveRenderingDisabled(true); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetAlwaysOnTop(bool on_top) { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetAlwaysOnTop(on_top); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Maximize() { 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Maximize(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Minimize() { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Minimize(); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::Restore() { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->Restore(); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsMaximized() const { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->IsMaximized(); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsMinimized() const { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->IsMinimized(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetFullscreen(bool fullscreen) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetFullscreen(fullscreen); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsFullscreen() const { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->IsFullscreen(); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetOpacity(unsigned char opacity) { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetOpacity(opacity); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetUseDragFrame(bool use_drag_frame) { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetUseDragFrame(use_drag_frame); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::FlashFrame(bool flash) { 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->FlashFrame(flash); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetRootView() { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_view_.get(); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const View* Widget::GetRootView() const { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_view_.get(); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsVisible() const { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->IsVisible(); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ThemeProvider* Widget::GetThemeProvider() const { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* root_widget = GetTopLevelWidget(); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root_widget && root_widget != this) { 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt to get the theme provider, and fall back to the default theme 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provider if not found. 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ThemeProvider* provider = root_widget->GetThemeProvider(); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (provider) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return provider; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider = root_widget->default_theme_provider_.get(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (provider) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return provider; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_theme_provider_.get(); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::NativeTheme* Widget::GetNativeTheme() const { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetNativeTheme(); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusManager* Widget::GetFocusManager() { 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* toplevel_widget = GetTopLevelWidget(); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return toplevel_widget ? toplevel_widget->focus_manager_.get() : NULL; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FocusManager* Widget::GetFocusManager() const { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Widget* toplevel_widget = GetTopLevelWidget(); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return toplevel_widget ? toplevel_widget->focus_manager_.get() : NULL; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputMethod* Widget::GetInputMethod() { 716ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return const_cast<InputMethod*>( 717ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const_cast<const Widget*>(this)->GetInputMethod()); 718ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 719ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 720ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst InputMethod* Widget::GetInputMethod() const { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_top_level()) { 722ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!input_method_.get()) 723ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch input_method_ = const_cast<Widget*>(this)->CreateInputMethod().Pass(); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return input_method_.get(); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 726ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const Widget* toplevel = GetTopLevelWidget(); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If GetTopLevelWidget() returns itself which is not toplevel, 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the widget is detached from toplevel widget. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): Fix GetTopLevelWidget() to return NULL 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if there is no toplevel. We probably need to add GetTopMostWidget() 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to replace some use cases. 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (toplevel && toplevel != this) ? toplevel->GetInputMethod() : NULL; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::RunShellDrag(View* view, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::OSExchangeData& data, 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int operation, 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DragEventSource source) { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dragged_view_ = view; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->RunShellDrag(view, data, location, operation, source); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the view is removed during the drag operation, dragged_view_ is set to 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL. 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view && dragged_view_ == view) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dragged_view_ = NULL; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view->OnDragDone(); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SchedulePaintInRect(const gfx::Rect& rect) { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SchedulePaintInRect(rect); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetCursor(gfx::NativeCursor cursor) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetCursor(cursor); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)bool Widget::IsMouseEventsEnabled() const { 7607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return native_widget_->IsMouseEventsEnabled(); 7617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetNativeWindowProperty(const char* name, void* value) { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetNativeWindowProperty(name, value); 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void* Widget::GetNativeWindowProperty(const char* name) const { 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetNativeWindowProperty(name); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::UpdateWindowTitle() { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!non_client_view_) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the native frame's text. We do this regardless of whether or not 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the native frame is being used, since this also updates the taskbar, etc. 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 window_title = widget_delegate_->GetWindowTitle(); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::AdjustStringForLocaleDirection(&window_title); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetWindowTitle(window_title); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->UpdateWindowTitle(); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the non-client view is rendering its own title, it'll need to relayout 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // now and to get a paint update later on. 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->Layout(); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::UpdateWindowIcon() { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (non_client_view_) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->UpdateWindowIcon(); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetWindowIcons(widget_delegate_->GetWindowIcon(), 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->GetWindowAppIcon()); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusTraversable* Widget::GetFocusTraversable() { 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<internal::RootView*>(root_view_.get()); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ThemeChanged() { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->ThemeChanged(); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::LocaleChanged() { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->LocaleChanged(); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetFocusTraversableParent(FocusTraversable* parent) { 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->SetFocusTraversableParent(parent); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetFocusTraversableParentView(View* parent_view) { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->SetFocusTraversableParentView(parent_view); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ClearNativeFocus() { 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->ClearNativeFocus(); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NonClientFrameView* Widget::CreateNonClientFrameView() { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonClientFrameView* frame_view = 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->CreateNonClientFrameView(this); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame_view) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_view = native_widget_->CreateNonClientFrameView(); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame_view && ViewsDelegate::views_delegate) { 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_view = 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewsDelegate::views_delegate->CreateDefaultNonClientFrameView(this); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame_view) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame_view; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomFrameView* custom_frame_view = new CustomFrameView; 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_frame_view->Init(this); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return custom_frame_view; 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::ShouldUseNativeFrame() const { 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame_type_ != FRAME_TYPE_DEFAULT) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame_type_ == FRAME_TYPE_FORCE_NATIVE; 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->ShouldUseNativeFrame(); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::DebugToggleFrameType() { 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (frame_type_ == FRAME_TYPE_DEFAULT) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_type_ = ShouldUseNativeFrame() ? FRAME_TYPE_FORCE_CUSTOM : 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_TYPE_FORCE_NATIVE; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_type_ = frame_type_ == FRAME_TYPE_FORCE_CUSTOM ? 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRAME_TYPE_FORCE_NATIVE : FRAME_TYPE_FORCE_CUSTOM; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FrameTypeChanged(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::FrameTypeChanged() { 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->FrameTypeChanged(); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::Compositor* Widget::GetCompositor() const { 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetCompositor(); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::Compositor* Widget::GetCompositor() { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetCompositor(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)ui::Layer* Widget::GetLayer() { 86590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return native_widget_->GetLayer(); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 868868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void Widget::ReorderNativeViews() { 869868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) native_widget_->ReorderNativeViews(); 870868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 871868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::UpdateRootLayers() { 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the layers requires traversing the tree, and since nearly any 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mutation of the tree can trigger this call we delay until absolutely 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // necessary. 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_layers_dirty_ = true; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const NativeWidget* Widget::native_widget() const { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeWidget* Widget::native_widget() { 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetCapture(View* view) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (internal::NativeWidgetPrivate::IsMouseButtonDown()) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_mouse_button_pressed_ = true; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (internal::NativeWidgetPrivate::IsTouchDown()) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_touch_down_ = true; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->SetMouseHandler(view); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!native_widget_->HasCapture()) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetCapture(); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ReleaseCapture() { 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_widget_->HasCapture()) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->ReleaseCapture(); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasCapture() { 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->HasCapture(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::TooltipTextChanged(View* view) { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TooltipManager* manager = native_widget_private()->GetTooltipManager(); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (manager) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager->TooltipTextChanged(view); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::SetInitialFocus() { 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* v = widget_delegate_->GetInitiallyFocusedView(); 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!focus_on_creation_) { 915c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If not focusing the window now, tell the focus manager which view to 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // focus when the window is restored. 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (v) 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) focus_manager_->SetStoredFocusView(v); 919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->RequestFocus(); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!v; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetChildViewParent() { 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetContentsView() ? GetContentsView() : GetRootView(); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect Widget::GetWorkAreaBoundsInScreen() const { 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return native_widget_->GetWorkAreaBoundsInScreen(); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Widget::SynthesizeMouseMoveEvent() { 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) last_mouse_event_was_move_ = false; 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::MouseEvent mouse_event(ui::ET_MOUSE_MOVED, 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) last_mouse_event_position_, 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) last_mouse_event_position_, 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::EF_IS_SYNTHESIZED); 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_view_->OnMouseMoved(mouse_event); 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnOwnerClosing() { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, NativeWidgetDelegate implementation: 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsModal() const { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_delegate_->GetModalType() != ui::MODAL_TYPE_NONE; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsDialogBox() const { 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!widget_delegate_->AsDialogDelegate(); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::CanActivate() const { 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_delegate_->CanActivate(); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::IsInactiveRenderingDisabled() const { 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return disable_inactive_rendering_; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::EnableInactiveRendering() { 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetInactiveRenderingDisabled(false); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetActivationChanged(bool active) { 970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // On windows we may end up here before we've completed initialization (from 971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // an WM_NCACTIVATE). If that happens the WidgetDelegate likely doesn't know 972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the Widget and will crash attempting to access it. 973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!active && native_widget_initialized_) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveWindowPlacement(); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWidgetActivationChanged(this, active)); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeFocus(gfx::NativeView old_focused_view) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(old_focused_view, 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNativeView()); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeBlur(gfx::NativeView new_focused_view) { 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(GetNativeView(), 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_focused_view); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetVisibilityChanged(bool visible) { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* root = GetRootView(); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root) 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root->PropagateVisibilityNotifications(root, visible); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnWidgetVisibilityChanged(this, visible)); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetCompositor() && root && root->layer()) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->layer()->SetVisible(visible); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1000868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void Widget::OnNativeWidgetCreated(bool desktop_widget) { 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_top_level()) 1002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) focus_manager_.reset(FocusManagerFactory::Create(this, desktop_widget)); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->InitModalType(widget_delegate_->GetModalType()); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetCreated(this)); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetDestroying() { 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tell the focus manager (if any) that root_view is being removed 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in case that the focused view is under this root view. 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFocusManager()) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFocusManager()->ViewRemoved(root_view_.get()); 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetDestroying(this)); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (non_client_view_) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->WindowClosing(); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->WindowClosing(); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetDestroyed() { 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetDestroyed(this)); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->DeleteDelegate(); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_ = NULL; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_destroyed_ = true; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size Widget::GetMinimumSize() { 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return non_client_view_ ? non_client_view_->GetMinimumSize() : gfx::Size(); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size Widget::GetMaximumSize() { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return non_client_view_ ? non_client_view_->GetMaximumSize() : gfx::Size(); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetMove() { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->OnWidgetMove(); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetBoundsChanged( 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWindowBoundsInScreen())); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_->SetSize(new_size); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Size changed notifications can fire prior to full initialization 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // i.e. during session restore. Avoid saving session state during these 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // startup procedures. 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_widget_initialized_) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SaveWindowPlacement(); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetBoundsChanged( 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetWindowBoundsInScreen())); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetBeginUserBoundsChange() { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->OnWindowBeginUserBoundsChange(); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetEndUserBoundsChange() { 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->OnWindowEndUserBoundsChange(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasFocusManager() const { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!focus_manager_.get(); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::OnNativeWidgetPaintAccelerated(const gfx::Rect& dirty_region) { 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Compositor* compositor = GetCompositor(); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!compositor) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compositor->ScheduleRedrawRect(dirty_region); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnNativeWidgetPaint(gfx::Canvas* canvas) { 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Linux Aura, we can get here during Init() because of the 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // SetInitialBounds call. 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (native_widget_initialized_) 1081eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetRootView()->Paint(canvas); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Widget::GetNonClientComponent(const gfx::Point& point) { 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int component = non_client_view_ ? 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->NonClientHitTest(point) : 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HTNOWHERE; 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (movement_disabled_ && (component == HTCAPTION || component == HTSYSMENU)) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return HTNOWHERE; 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return component; 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnKeyEvent(ui::KeyEvent* event) { 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<internal::RootView*>(GetRootView())-> 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DispatchKeyEvent(event); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnMouseEvent(ui::MouseEvent* event) { 11017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!IsMouseEventsEnabled()) 11027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 11037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* root_view = GetRootView(); 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (event->type()) { 1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case ui::ET_MOUSE_PRESSED: { 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_was_move_ = false; 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // We may get deleted by the time we return from OnMousePressed. So we 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // use an observer to make sure we are still alive. 1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WidgetDeletionObserver widget_deletion_observer(this); 11127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure we're still visible before we attempt capture as the mouse 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // press processing may have made the window hide (as happens with menus). 11157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // It is possible for a View to show a context menu on mouse-press. Since 11177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the menu does a capture and starts a nested message-loop, the release 11187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // would go to the menu. The next click (i.e. both mouse-press and release 11197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // events) also go to the menu. The menu (and the nested message-loop) 11207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // gets closed after this second release event. The code then resumes from 11217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // here. So make sure that the mouse-button is still down before doing a 11227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // capture. 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (root_view && root_view->OnMousePressed(*event) && 11247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch widget_deletion_observer.IsWidgetAlive() && IsVisible() && 11257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch internal::NativeWidgetPrivate::IsMouseButtonDown()) { 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_mouse_button_pressed_ = true; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!native_widget_->HasCapture()) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetCapture(); 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_RELEASED: 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_was_move_ = false; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_mouse_button_pressed_ = false; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release capture first, to avoid confusion if OnMouseReleased blocks. 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_widget_->HasCapture() && 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShouldReleaseCaptureOnMouseReleased()) { 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->ReleaseCapture(); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_view) 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->OnMouseReleased(*event); 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((event->flags() & ui::EF_IS_NON_CLIENT) == 0) 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_MOVED: 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_DRAGGED: 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_widget_->HasCapture() && is_mouse_button_pressed_) { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_was_move_ = false; 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_view) 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->OnMouseDragged(*event); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!last_mouse_event_was_move_ || 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_mouse_event_position_ != event->location()) { 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_mouse_event_position_ = event->location(); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_was_move_ = true; 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_view) 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->OnMouseMoved(*event); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_EXITED: 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_mouse_event_was_move_ = false; 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_view) 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->OnMouseExited(*event); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSEWHEEL: 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_view && root_view->OnMouseWheel( 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const ui::MouseWheelEvent&>(*event))) 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::OnMouseCaptureLost() { 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_mouse_button_pressed_ || is_touch_down_) { 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) View* root_view = GetRootView(); 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_view) 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_view->OnMouseCaptureLost(); 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_touch_down_ = false; 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_mouse_button_pressed_ = false; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnTouchEvent(ui::TouchEvent* event) { 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<internal::RootView*>(GetRootView())-> 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchTouchEvent(event); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnScrollEvent(ui::ScrollEvent* event) { 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<internal::RootView*>(GetRootView())-> 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchScrollEvent(event); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Widget::OnGestureEvent(ui::GestureEvent* event) { 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_TAP_DOWN: 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_touch_down_ = true; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We explicitly don't capture here. Not capturing enables multiple 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // widgets to get tap events at the same time. Views (such as tab 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dragging) may explicitly capture. 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_GESTURE_END: 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->details().touch_points() == 1) { 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_touch_down_ = false; 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShouldReleaseCaptureOnMouseReleased()) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseCapture(); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<internal::RootView*>(GetRootView())->DispatchGestureEvent(event); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::ExecuteCommand(int command_id) { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_delegate_->ExecuteWindowsCommand(command_id); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputMethod* Widget::GetInputMethodDirect() { 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return input_method_.get(); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::vector<ui::Layer*>& Widget::GetRootLayers() { 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root_layers_dirty_) { 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_layers_dirty_ = false; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_layers_.clear(); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildRootLayers(GetRootView(), &root_layers_); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_layers_; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::HasHitTestMask() const { 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_delegate_->WidgetHasHitTestMask(); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::GetHitTestMask(gfx::Path* mask) const { 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(mask); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->GetWidgetHitTestMask(mask); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Widget* Widget::AsWidget() { 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Widget* Widget::AsWidget() const { 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, FocusTraversable implementation: 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusSearch* Widget::GetFocusSearch() { 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_view_->GetFocusSearch(); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FocusTraversable* Widget::GetFocusTraversableParent() { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We are a proxy to the root view, so we should be bypassed when traversing 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up and as a result this should not be called. 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* Widget::GetFocusTraversableParentView() { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We are a proxy to the root view, so we should be bypassed when traversing 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up and as a result this should not be called. 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, protected: 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal::RootView* Widget::CreateRootView() { 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new internal::RootView(this); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::DestroyRootView() { 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_ = NULL; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_view_.reset(); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Input method has to be destroyed before focus manager. 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_.reset(); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Widget, private: 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::ShouldReleaseCaptureOnMouseReleased() const { 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetInactiveRenderingDisabled(bool value) { 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value == disable_inactive_rendering_) 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disable_inactive_rendering_ = value; 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (non_client_view_) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) non_client_view_->SetInactiveRenderingDisabled(value); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->SetInactiveRenderingDisabled(value); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SaveWindowPlacement() { 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The window delegate does the actual saving for us. It seems like (judging 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by go/crash) that in some circumstances we can end up here after 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WM_DESTROY, at which point the window delegate is likely gone. So just 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bail. 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_delegate_) 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds; 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->GetWindowPlacement(&bounds, &show_state); 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_delegate_->SaveWindowPlacement(bounds, show_state); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetInitialBounds(const gfx::Rect& bounds) { 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!non_client_view_) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect saved_bounds; 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetSavedWindowPlacement(&saved_bounds, &saved_show_state_)) { 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (saved_show_state_ == ui::SHOW_STATE_MAXIMIZED) { 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're going to maximize, wait until Show is invoked to set the 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bounds. That way we avoid a noticeable resize. 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_restored_bounds_ = saved_bounds; 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (!saved_bounds.IsEmpty()) { 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the saved bounds are valid, use them. 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBounds(saved_bounds); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds.IsEmpty()) { 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No initial bounds supplied, so size the window to its content and 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // center over its parent. 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->CenterWindow(non_client_view_->GetPreferredSize()); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the supplied initial bounds. 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBoundsConstrained(bounds); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::SetInitialBoundsForFramelessWindow(const gfx::Rect& bounds) { 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds.IsEmpty()) { 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* contents_view = GetContentsView(); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(contents_view); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No initial bounds supplied, so size the window to its content and 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // center over its parent if preferred size is provided. 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = contents_view->GetPreferredSize(); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!size.IsEmpty()) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_widget_->CenterWindow(size); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the supplied initial bounds. 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetBoundsConstrained(bounds); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Widget::GetSavedWindowPlacement(gfx::Rect* bounds, 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::WindowShowState* show_state) { 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First we obtain the window's saved show-style and store it. We need to do 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this here, rather than in Show() because by the time Show() is called, 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window's size will have been reset (below) and the saved maximized 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state will have been lost. Sadly there's no way to tell on Windows when 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a window is restored from maximized state, so we can't more accurately 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // track maximized state independently of sizing information. 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the window's placement from the controller. 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_delegate_->GetSavedWindowPlacement(bounds, show_state)) { 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_delegate_->ShouldRestoreWindowSize()) { 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->set_size(non_client_view_->GetPreferredSize()); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size minimum_size = GetMinimumSize(); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the bounds are at least the minimum size. 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds->width() < minimum_size.width()) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->set_width(minimum_size.width()); 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds->height() < minimum_size.height()) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds->set_height(minimum_size.height()); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1387ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochscoped_ptr<InputMethod> Widget::CreateInputMethod() { 1388ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<InputMethod> input_method(native_widget_->CreateInputMethod()); 1389ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (input_method.get()) 1390ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch input_method->Init(this); 1391ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return input_method.Pass(); 1392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 1393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Widget::ReplaceInputMethod(InputMethod* input_method) { 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_.reset(input_method); 1396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_method->SetDelegate(native_widget_->GetInputMethodDelegate()); 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method->Init(this); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internal::NativeWidgetPrivate, NativeWidget implementation: 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal::NativeWidgetPrivate* NativeWidgetPrivate::AsNativeWidgetPrivate() { 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 1411