Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(524)

Unified Diff: ui/aura/desktop.cc

Issue 8771015: Rename Desktop->RootWindow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/aura/desktop.h ('k') | ui/aura/desktop_host.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura/desktop.cc
===================================================================
--- ui/aura/desktop.cc (revision 113260)
+++ ui/aura/desktop.cc (working copy)
@@ -1,611 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/aura/desktop.h"
-
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/message_loop.h"
-#include "base/string_number_conversions.h"
-#include "base/string_split.h"
-#include "ui/aura/aura_switches.h"
-#include "ui/aura/client/stacking_client.h"
-#include "ui/aura/desktop_host.h"
-#include "ui/aura/desktop_observer.h"
-#include "ui/aura/event.h"
-#include "ui/aura/event_filter.h"
-#include "ui/aura/focus_manager.h"
-#include "ui/aura/screen_aura.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_delegate.h"
-#include "ui/base/hit_test.h"
-#include "ui/gfx/compositor/compositor.h"
-#include "ui/gfx/compositor/layer.h"
-#include "ui/gfx/compositor/layer_animator.h"
-
-#ifdef USE_WEBKIT_COMPOSITOR
-#include "ui/gfx/compositor/compositor_cc.h"
-#endif
-
-using std::string;
-using std::vector;
-
-namespace aura {
-
-namespace {
-
-// Default bounds for the host window.
-static const int kDefaultHostWindowX = 200;
-static const int kDefaultHostWindowY = 200;
-static const int kDefaultHostWindowWidth = 1280;
-static const int kDefaultHostWindowHeight = 1024;
-
-// Returns true if |target| has a non-client (frame) component at |location|,
-// in window coordinates.
-bool IsNonClientLocation(Window* target, const gfx::Point& location) {
- if (!target->delegate())
- return false;
- int hit_test_code = target->delegate()->GetNonClientComponent(location);
- return hit_test_code != HTCLIENT && hit_test_code != HTNOWHERE;
-}
-
-class DefaultStackingClient : public StackingClient {
- public:
- explicit DefaultStackingClient(Desktop* desktop) : desktop_(desktop) {}
- virtual ~DefaultStackingClient() {}
-
- private:
-
- // Overridden from StackingClient:
- virtual void AddChildToDefaultParent(Window* window) OVERRIDE {
- desktop_->AddChild(window);
- }
- virtual bool CanActivateWindow(Window* window) const OVERRIDE {
- return window->parent() == desktop_;
- }
- virtual Window* GetTopmostWindowToActivate(Window* ignore) const OVERRIDE {
- Window::Windows::const_reverse_iterator i;
- for (i = desktop_->children().rbegin();
- i != desktop_->children().rend();
- ++i) {
- if (*i == ignore)
- continue;
- return *i;
- }
- return NULL;
- }
-
- Desktop* desktop_;
-
- DISALLOW_COPY_AND_ASSIGN(DefaultStackingClient);
-};
-
-typedef std::vector<EventFilter*> EventFilters;
-
-void GetEventFiltersToNotify(Window* target, EventFilters* filters) {
- Window* window = target->parent();
- while (window) {
- if (window->event_filter())
- filters->push_back(window->event_filter());
- window = window->parent();
- }
-}
-
-} // namespace
-
-Desktop* Desktop::instance_ = NULL;
-bool Desktop::use_fullscreen_host_window_ = false;
-
-////////////////////////////////////////////////////////////////////////////////
-// Desktop, public:
-
-// static
-Desktop* Desktop::GetInstance() {
- if (!instance_) {
- instance_ = new Desktop;
- instance_->Init();
- }
- return instance_;
-}
-
-// static
-void Desktop::DeleteInstance() {
- delete instance_;
- instance_ = NULL;
-}
-
-void Desktop::SetStackingClient(StackingClient* stacking_client) {
- stacking_client_.reset(stacking_client);
-}
-
-void Desktop::ShowDesktop() {
- host_->Show();
-}
-
-void Desktop::SetHostSize(const gfx::Size& size) {
- host_->SetSize(size);
- // Requery the location to constrain it within the new desktop size.
- last_mouse_location_ = host_->QueryMouseLocation();
-}
-
-gfx::Size Desktop::GetHostSize() const {
- gfx::Rect rect(host_->GetSize());
- layer()->transform().TransformRect(&rect);
- return rect.size();
-}
-
-void Desktop::SetCursor(gfx::NativeCursor cursor) {
- last_cursor_ = cursor;
- // A lot of code seems to depend on NULL cursors actually showing an arrow,
- // so just pass everything along to the host.
- host_->SetCursor(cursor);
-}
-
-void Desktop::Run() {
- ShowDesktop();
- MessageLoopForUI::current()->Run();
-}
-
-void Desktop::Draw() {
- compositor_->Draw(false);
-}
-
-bool Desktop::DispatchMouseEvent(MouseEvent* event) {
- static const int kMouseButtonFlagMask =
- ui::EF_LEFT_BUTTON_DOWN |
- ui::EF_MIDDLE_BUTTON_DOWN |
- ui::EF_RIGHT_BUTTON_DOWN;
-
- event->UpdateForTransform(layer()->transform());
-
- last_mouse_location_ = event->location();
-
- Window* target =
- mouse_pressed_handler_ ? mouse_pressed_handler_ : capture_window_;
- if (!target)
- target = GetEventHandlerForPoint(event->location());
- switch (event->type()) {
- case ui::ET_MOUSE_MOVED:
- HandleMouseMoved(*event, target);
- break;
- case ui::ET_MOUSE_PRESSED:
- if (!mouse_pressed_handler_)
- mouse_pressed_handler_ = target;
- mouse_button_flags_ = event->flags() & kMouseButtonFlagMask;
- break;
- case ui::ET_MOUSE_RELEASED:
- mouse_pressed_handler_ = NULL;
- mouse_button_flags_ = event->flags() & kMouseButtonFlagMask;
- break;
- default:
- break;
- }
- if (target && target->delegate()) {
- int flags = event->flags();
- gfx::Point location_in_window = event->location();
- Window::ConvertPointToWindow(this, target, &location_in_window);
- if (IsNonClientLocation(target, location_in_window))
- flags |= ui::EF_IS_NON_CLIENT;
- MouseEvent translated_event(*event, this, target, event->type(), flags);
- return ProcessMouseEvent(target, &translated_event);
- }
- return false;
-}
-
-bool Desktop::DispatchKeyEvent(KeyEvent* event) {
- if (focused_window_) {
- KeyEvent translated_event(*event);
- return ProcessKeyEvent(focused_window_, &translated_event);
- }
- return false;
-}
-
-bool Desktop::DispatchTouchEvent(TouchEvent* event) {
- event->UpdateForTransform(layer()->transform());
- bool handled = false;
- Window* target =
- touch_event_handler_ ? touch_event_handler_ : capture_window_;
- if (!target)
- target = GetEventHandlerForPoint(event->location());
- if (target) {
- TouchEvent translated_event(*event, this, target);
- ui::TouchStatus status = ProcessTouchEvent(target, &translated_event);
- if (status == ui::TOUCH_STATUS_START)
- touch_event_handler_ = target;
- else if (status == ui::TOUCH_STATUS_END ||
- status == ui::TOUCH_STATUS_CANCEL)
- touch_event_handler_ = NULL;
- handled = status != ui::TOUCH_STATUS_UNKNOWN;
- }
- return handled;
-}
-
-void Desktop::OnHostResized(const gfx::Size& size) {
- // The compositor should have the same size as the native desktop host.
- compositor_->WidgetSizeChanged(size);
-
- // The layer, and all the observers should be notified of the
- // transformed size of the desktop.
- gfx::Rect bounds(size);
- layer()->transform().TransformRect(&bounds);
- SetBounds(gfx::Rect(bounds.size()));
- FOR_EACH_OBSERVER(DesktopObserver, observers_,
- OnDesktopResized(bounds.size()));
-}
-
-void Desktop::OnNativeScreenResized(const gfx::Size& size) {
- if (use_fullscreen_host_window_)
- SetHostSize(size);
-}
-
-void Desktop::SetActiveWindow(Window* window, Window* to_focus) {
- if (!window)
- return;
- // The stacking client may impose rules on what window configurations can be
- // activated or deactivated.
- if (!stacking_client_->CanActivateWindow(window))
- return;
- // The window may not be activate-able.
- if (!window->CanActivate())
- return;
- // Nothing may actually have changed.
- if (active_window_ == window)
- return;
-
- Window* old_active = active_window_;
- active_window_ = window;
- // Invoke OnLostActive after we've changed the active window. That way if the
- // delegate queries for active state it doesn't think the window is still
- // active.
- if (old_active && old_active->delegate())
- old_active->delegate()->OnLostActive();
- if (active_window_) {
- active_window_->parent()->StackChildAtTop(active_window_);
- if (active_window_->delegate())
- active_window_->delegate()->OnActivated();
- active_window_->GetFocusManager()->SetFocusedWindow(
- to_focus ? to_focus : active_window_);
- }
- FOR_EACH_OBSERVER(DesktopObserver, observers_,
- OnActiveWindowChanged(active_window_));
-}
-
-void Desktop::ActivateTopmostWindow() {
- SetActiveWindow(stacking_client_->GetTopmostWindowToActivate(NULL), NULL);
-}
-
-void Desktop::Deactivate(Window* window) {
- // The stacking client may impose rules on what window configurations can be
- // activated or deactivated.
- if (!window || !stacking_client_->CanActivateWindow(window))
- return;
- if (active_window_ != window)
- return;
-
- Window* to_activate = stacking_client_->GetTopmostWindowToActivate(window);
- if (to_activate)
- SetActiveWindow(to_activate, NULL);
-}
-
-void Desktop::WindowInitialized(Window* window) {
- FOR_EACH_OBSERVER(DesktopObserver, observers_, OnWindowInitialized(window));
-}
-
-void Desktop::WindowDestroying(Window* window) {
- // Update the focused window state if the window was focused.
- if (focused_window_ == window)
- SetFocusedWindow(NULL);
-
- // When a window is being destroyed it's likely that the WindowDelegate won't
- // want events, so we reset the mouse_pressed_handler_ and capture_window_ and
- // don't sent it release/capture lost events.
- if (mouse_pressed_handler_ == window)
- mouse_pressed_handler_ = NULL;
- if (mouse_moved_handler_ == window)
- mouse_moved_handler_ = NULL;
- if (capture_window_ == window)
- capture_window_ = NULL;
- if (touch_event_handler_ == window)
- touch_event_handler_ = NULL;
-
- if (in_destructor_ || window != active_window_)
- return;
-
- // Reset active_window_ before invoking SetActiveWindow so that we don't
- // attempt to notify it while running its destructor.
- active_window_ = NULL;
- SetActiveWindow(stacking_client_->GetTopmostWindowToActivate(window), NULL);
-}
-
-MessageLoop::Dispatcher* Desktop::GetDispatcher() {
- return host_.get();
-}
-
-void Desktop::AddObserver(DesktopObserver* observer) {
- observers_.AddObserver(observer);
-}
-
-void Desktop::RemoveObserver(DesktopObserver* observer) {
- observers_.RemoveObserver(observer);
-}
-
-bool Desktop::IsMouseButtonDown() const {
- return mouse_button_flags_ != 0;
-}
-
-void Desktop::PostNativeEvent(const base::NativeEvent& native_event) {
- host_->PostNativeEvent(native_event);
-}
-
-void Desktop::ConvertPointToNativeScreen(gfx::Point* point) const {
- gfx::Point location = host_->GetLocationOnNativeScreen();
- point->Offset(location.x(), location.y());
-}
-
-void Desktop::SetCapture(Window* window) {
- if (capture_window_ == window)
- return;
-
- if (capture_window_ && capture_window_->delegate())
- capture_window_->delegate()->OnCaptureLost();
- capture_window_ = window;
-
- if (capture_window_) {
- // Make all subsequent mouse events and touch go to the capture window. We
- // shouldn't need to send an event here as OnCaptureLost should take care of
- // that.
- if (mouse_pressed_handler_)
- mouse_pressed_handler_ = capture_window_;
- if (touch_event_handler_)
- touch_event_handler_ = capture_window_;
- } else {
- // When capture is lost, we must reset the event handlers.
- mouse_pressed_handler_ = NULL;
- touch_event_handler_ = NULL;
- }
-}
-
-void Desktop::ReleaseCapture(Window* window) {
- if (capture_window_ != window)
- return;
- SetCapture(NULL);
-}
-
-void Desktop::SetTransform(const ui::Transform& transform) {
- Window::SetTransform(transform);
-
- // If the layer is not animating, then we need to update the host size
- // immediately.
- if (!layer()->GetAnimator()->is_animating())
- OnHostResized(host_->GetSize());
-}
-
-#if !defined(NDEBUG)
-void Desktop::ToggleFullScreen() {
- host_->ToggleFullScreen();
-}
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-// Desktop, private:
-
-Desktop::Desktop()
- : Window(NULL),
- host_(aura::DesktopHost::Create(GetInitialHostWindowBounds())),
- ALLOW_THIS_IN_INITIALIZER_LIST(
- stacking_client_(new DefaultStackingClient(this))),
- ALLOW_THIS_IN_INITIALIZER_LIST(schedule_paint_factory_(this)),
- active_window_(NULL),
- mouse_button_flags_(0),
- last_cursor_(kCursorNull),
- in_destructor_(false),
- screen_(new ScreenAura),
- capture_window_(NULL),
- mouse_pressed_handler_(NULL),
- mouse_moved_handler_(NULL),
- focused_window_(NULL),
- touch_event_handler_(NULL) {
- SetName("RootWindow");
- gfx::Screen::SetInstance(screen_);
- host_->SetDesktop(this);
- last_mouse_location_ = host_->QueryMouseLocation();
-
- if (ui::Compositor::compositor_factory()) {
- compositor_ = (*ui::Compositor::compositor_factory())(this);
- } else {
-#ifdef USE_WEBKIT_COMPOSITOR
- ui::CompositorCC::Initialize(false);
-#endif
- compositor_ = ui::Compositor::Create(this, host_->GetAcceleratedWidget(),
- host_->GetSize());
- }
- DCHECK(compositor_.get());
-}
-
-Desktop::~Desktop() {
- in_destructor_ = true;
- // Make sure to destroy the compositor before terminating so that state is
- // cleared and we don't hit asserts.
- compositor_ = NULL;
-#ifdef USE_WEBKIT_COMPOSITOR
- if (!ui::Compositor::compositor_factory())
- ui::CompositorCC::Terminate();
-#endif
- if (instance_ == this)
- instance_ = NULL;
-}
-
-void Desktop::HandleMouseMoved(const MouseEvent& event, Window* target) {
- if (target == mouse_moved_handler_)
- return;
-
- // Send an exited event.
- if (mouse_moved_handler_ && mouse_moved_handler_->delegate()) {
- MouseEvent translated_event(event, this, mouse_moved_handler_,
- ui::ET_MOUSE_EXITED, event.flags());
- ProcessMouseEvent(mouse_moved_handler_, &translated_event);
- }
- mouse_moved_handler_ = target;
- // Send an entered event.
- if (mouse_moved_handler_ && mouse_moved_handler_->delegate()) {
- MouseEvent translated_event(event, this, mouse_moved_handler_,
- ui::ET_MOUSE_ENTERED, event.flags());
- ProcessMouseEvent(mouse_moved_handler_, &translated_event);
- }
-}
-
-bool Desktop::ProcessMouseEvent(Window* target, MouseEvent* event) {
- if (!target->IsVisible())
- return false;
-
- EventFilters filters;
- GetEventFiltersToNotify(target, &filters);
- for (EventFilters::const_reverse_iterator it = filters.rbegin();
- it != filters.rend(); ++it) {
- if ((*it)->PreHandleMouseEvent(target, event))
- return true;
- }
-
- return target->delegate()->OnMouseEvent(event);
-}
-
-bool Desktop::ProcessKeyEvent(Window* target, KeyEvent* event) {
- if (!target->IsVisible())
- return false;
-
- EventFilters filters;
- GetEventFiltersToNotify(target, &filters);
- for (EventFilters::const_reverse_iterator it = filters.rbegin();
- it != filters.rend(); ++it) {
- if ((*it)->PreHandleKeyEvent(target, event))
- return true;
- }
-
- return target->delegate()->OnKeyEvent(event);
-}
-
-ui::TouchStatus Desktop::ProcessTouchEvent(Window* target, TouchEvent* event) {
- if (!target->IsVisible())
- return ui::TOUCH_STATUS_UNKNOWN;
-
- EventFilters filters;
- GetEventFiltersToNotify(target, &filters);
- for (EventFilters::const_reverse_iterator it = filters.rbegin();
- it != filters.rend(); ++it) {
- ui::TouchStatus status = (*it)->PreHandleTouchEvent(target, event);
- if (status != ui::TOUCH_STATUS_UNKNOWN)
- return status;
- }
-
- return target->delegate()->OnTouchEvent(event);
-}
-
-void Desktop::ScheduleDraw() {
- if (!schedule_paint_factory_.HasWeakPtrs()) {
- MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&Desktop::Draw, schedule_paint_factory_.GetWeakPtr()));
- }
-}
-
-bool Desktop::CanFocus() const {
- return IsVisible();
-}
-
-internal::FocusManager* Desktop::GetFocusManager() {
- return this;
-}
-
-Desktop* Desktop::GetDesktop() {
- return this;
-}
-
-void Desktop::WindowDetachedFromDesktop(Window* detached) {
- DCHECK(capture_window_ != this);
-
- // If the ancestor of the capture window is detached,
- // release the capture.
- if (detached->Contains(capture_window_) && detached != this)
- ReleaseCapture(capture_window_);
-
- // If the ancestor of the focused window is detached,
- // release the focus.
- if (detached->Contains(focused_window_))
- SetFocusedWindow(NULL);
-
- // If the ancestor of any event handler windows are detached, release the
- // pointer to those windows.
- if (detached->Contains(mouse_pressed_handler_))
- mouse_pressed_handler_ = NULL;
- if (detached->Contains(mouse_moved_handler_))
- mouse_moved_handler_ = NULL;
- if (detached->Contains(touch_event_handler_))
- touch_event_handler_ = NULL;
-}
-
-void Desktop::OnLayerAnimationEnded(
- const ui::LayerAnimationSequence* animation) {
- OnHostResized(host_->GetSize());
-}
-
-void Desktop::OnLayerAnimationScheduled(
- const ui::LayerAnimationSequence* animation) {
-}
-
-void Desktop::OnLayerAnimationAborted(
- const ui::LayerAnimationSequence* animation) {
-}
-
-void Desktop::SetFocusedWindow(Window* focused_window) {
- if (focused_window == focused_window_ ||
- (focused_window && !focused_window->CanFocus())) {
- return;
- }
- if (focused_window_ && focused_window_->delegate())
- focused_window_->delegate()->OnBlur();
- focused_window_ = focused_window;
- if (focused_window_ && focused_window_->delegate())
- focused_window_->delegate()->OnFocus();
-}
-
-Window* Desktop::GetFocusedWindow() {
- return focused_window_;
-}
-
-bool Desktop::IsFocusedWindow(const Window* window) const {
- return focused_window_ == window;
-}
-
-void Desktop::Init() {
- Window::Init(ui::Layer::LAYER_HAS_NO_TEXTURE);
- SetBounds(gfx::Rect(host_->GetSize()));
- Show();
- compositor()->SetRootLayer(layer());
-}
-
-gfx::Rect Desktop::GetInitialHostWindowBounds() const {
- gfx::Rect bounds(kDefaultHostWindowX, kDefaultHostWindowY,
- kDefaultHostWindowWidth, kDefaultHostWindowHeight);
-
- const string size_str = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- switches::kAuraHostWindowSize);
- vector<string> parts;
- base::SplitString(size_str, 'x', &parts);
- int parsed_width = 0, parsed_height = 0;
- if (parts.size() == 2 &&
- base::StringToInt(parts[0], &parsed_width) && parsed_width > 0 &&
- base::StringToInt(parts[1], &parsed_height) && parsed_height > 0) {
- bounds.set_size(gfx::Size(parsed_width, parsed_height));
- } else if (use_fullscreen_host_window_) {
- bounds = gfx::Rect(DesktopHost::GetNativeScreenSize());
- }
-
- return bounds;
-}
-
-} // namespace aura
« no previous file with comments | « ui/aura/desktop.h ('k') | ui/aura/desktop_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698