blob: b6ae9429d3ec7634e66e32a61b8544746189838b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
// 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.
#ifndef UI_AURA_DESKTOP_H_
#define UI_AURA_DESKTOP_H_
#pragma once
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/message_loop.h"
#include "base/task.h"
#include "ui/aura/aura_export.h"
#include "ui/aura/cursor.h"
#include "ui/aura/root_window.h"
#include "ui/base/events.h"
#include "ui/gfx/compositor/compositor.h"
#include "ui/gfx/native_widget_types.h"
namespace gfx {
class Size;
}
namespace aura {
class DesktopHost;
class MouseEvent;
// Desktop is responsible for hosting a set of windows.
class AURA_EXPORT Desktop : public ui::CompositorDelegate {
public:
Desktop();
~Desktop();
// Initializes the desktop.
void Init();
// Initializes |default_parent()| for testing.
void CreateDefaultParentForTesting();
// Shows the desktop host.
void Show();
// Sets the size of the desktop.
void SetSize(const gfx::Size& size);
gfx::Size GetSize() const;
// Shows the specified cursor.
void SetCursor(gfx::NativeCursor cursor);
// Shows the desktop host and runs an event loop for it.
void Run();
// Draws the necessary set of windows.
void Draw();
// Handles a mouse event. Returns true if handled.
bool OnMouseEvent(const MouseEvent& event);
// Handles a key event. Returns true if handled.
bool OnKeyEvent(const KeyEvent& event);
// Called when the host changes size.
void OnHostResized(const gfx::Size& size);
// Compositor we're drawing to.
ui::Compositor* compositor() { return compositor_.get(); }
Window* window() { return window_.get(); }
// The window where windows created without an explicitly specified parent are
// parented.
Window* default_parent() { return default_parent_; }
void set_default_parent(Window* default_parent) {
default_parent_ = default_parent;
}
static void set_compositor_factory_for_testing(ui::Compositor*(*factory)()) {
compositor_factory_ = factory;
}
static ui::Compositor* (*compositor_factory())() {
return compositor_factory_;
}
// Sets the active window to |window| and the focused window to |to_focus|.
// If |to_focus| is NULL, |window| is focused.
void SetActiveWindow(Window* window, Window* to_focus);
Window* active_window() { return active_window_; }
// Activates the topmost window. Does nothing if the topmost window is already
// active.
void ActivateTopmostWindow();
// Deactivates |window| and activates the topmost window. Does nothing if
// |window| is not a topmost window, or there are no other suitable windows to
// activate.
void Deactivate(Window* window);
// Invoked from RootWindow when |window| is being destroyed.
void WindowDestroying(Window* window);
// Returns the desktop's dispatcher. The result should only be passed to
// MessageLoopForUI::Run() or MessageLoopForUI::RunAllPendingWithDispatcher(),
// or used to dispatch an event by |Dispatch(const NativeEvent&)| on it.
// It must never be stored.
MessageLoop::Dispatcher* GetDispatcher();
static Desktop* GetInstance();
private:
// Returns the topmost window to activate. This ignores |ignore|.
Window* GetTopmostWindowToActivate(Window* ignore);
// Overridden from ui::CompositorDelegate
virtual void ScheduleDraw();
scoped_refptr<ui::Compositor> compositor_;
scoped_ptr<internal::RootWindow> window_;
Window* default_parent_;
scoped_ptr<DesktopHost> host_;
static Desktop* instance_;
// Used to schedule painting.
ScopedRunnableMethodFactory<Desktop> schedule_paint_;
// Factory used to create Compositors. Settable by tests.
static ui::Compositor*(*compositor_factory_)();
Window* active_window_;
// Are we in the process of being destroyed? Used to avoid processing during
// destruction.
bool in_destructor_;
DISALLOW_COPY_AND_ASSIGN(Desktop);
};
} // namespace aura
#endif // UI_AURA_DESKTOP_H_
|