OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/view_manager/display_manager.h" | 5 #include "components/view_manager/display_manager.h" |
6 | 6 |
7 #include "base/numerics/safe_conversions.h" | 7 #include "base/numerics/safe_conversions.h" |
8 #include "components/view_manager/display_manager_factory.h" | 8 #include "components/view_manager/display_manager_factory.h" |
9 #include "components/view_manager/gles2/gpu_state.h" | 9 #include "components/view_manager/gles2/gpu_state.h" |
10 #include "components/view_manager/native_viewport/onscreen_context_provider.h" | 10 #include "components/view_manager/native_viewport/onscreen_context_provider.h" |
11 #include "components/view_manager/public/interfaces/gpu.mojom.h" | 11 #include "components/view_manager/public/interfaces/gpu.mojom.h" |
12 #include "components/view_manager/public/interfaces/quads.mojom.h" | 12 #include "components/view_manager/public/interfaces/quads.mojom.h" |
13 #include "components/view_manager/public/interfaces/surfaces.mojom.h" | 13 #include "components/view_manager/public/interfaces/surfaces.mojom.h" |
14 #include "components/view_manager/server_view.h" | 14 #include "components/view_manager/server_view.h" |
15 #include "components/view_manager/view_coordinate_conversions.h" | 15 #include "components/view_manager/view_coordinate_conversions.h" |
16 #include "mojo/application/public/cpp/application_connection.h" | 16 #include "mojo/application/public/cpp/application_connection.h" |
17 #include "mojo/application/public/cpp/application_impl.h" | 17 #include "mojo/application/public/cpp/application_impl.h" |
18 #include "mojo/converters/geometry/geometry_type_converters.h" | 18 #include "mojo/converters/geometry/geometry_type_converters.h" |
19 #include "mojo/converters/input_events/input_events_type_converters.h" | |
20 #include "mojo/converters/input_events/mojo_extended_key_event_data.h" | |
19 #include "mojo/converters/surfaces/surfaces_type_converters.h" | 21 #include "mojo/converters/surfaces/surfaces_type_converters.h" |
20 #include "mojo/converters/surfaces/surfaces_utils.h" | 22 #include "mojo/converters/surfaces/surfaces_utils.h" |
21 #include "mojo/converters/transform/transform_type_converters.h" | 23 #include "mojo/converters/transform/transform_type_converters.h" |
24 #include "ui/events/event.h" | |
25 #include "ui/events/event_utils.h" | |
26 #include "ui/platform_window/platform_window.h" | |
27 #include "ui/platform_window/stub/stub_window.h" | |
28 | |
29 #if defined(OS_WIN) | |
30 #include "ui/platform_window/win/win_window.h" | |
31 #elif defined(USE_X11) | |
32 #include "ui/platform_window/x11/x11_window.h" | |
33 #elif defined(OS_ANDROID) | |
34 #include "ui/platform_window/android/platform_window_android.h" | |
35 #endif | |
22 | 36 |
23 using mojo::Rect; | 37 using mojo::Rect; |
24 using mojo::Size; | 38 using mojo::Size; |
25 | 39 |
26 namespace view_manager { | 40 namespace view_manager { |
27 namespace { | 41 namespace { |
28 | 42 |
29 void DrawViewTree(mojo::Pass* pass, | 43 void DrawViewTree(mojo::Pass* pass, |
30 const ServerView* view, | 44 const ServerView* view, |
31 const gfx::Vector2d& parent_to_root_origin_offset, | 45 const gfx::Vector2d& parent_to_root_origin_offset, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
65 | 79 |
66 auto sqs = mojo::CreateDefaultSQS(view->bounds().size()); | 80 auto sqs = mojo::CreateDefaultSQS(view->bounds().size()); |
67 sqs->blend_mode = mojo::SK_XFERMODE_kSrcOver_Mode; | 81 sqs->blend_mode = mojo::SK_XFERMODE_kSrcOver_Mode; |
68 sqs->opacity = combined_opacity; | 82 sqs->opacity = combined_opacity; |
69 sqs->quad_to_target_transform = mojo::Transform::From(node_transform); | 83 sqs->quad_to_target_transform = mojo::Transform::From(node_transform); |
70 | 84 |
71 pass->quads.push_back(surface_quad.Pass()); | 85 pass->quads.push_back(surface_quad.Pass()); |
72 pass->shared_quad_states.push_back(sqs.Pass()); | 86 pass->shared_quad_states.push_back(sqs.Pass()); |
73 } | 87 } |
74 | 88 |
89 float ConvertUIWheelValueToMojoValue(int offset) { | |
90 // Mojo's event type takes a value between -1 and 1. Normalize by allowing | |
91 // up to 20 of ui's offset. This is a bit arbitrary. | |
92 return std::max( | |
93 -1.0f, std::min(1.0f, static_cast<float>(offset) / | |
94 (20 * static_cast<float>( | |
95 ui::MouseWheelEvent::kWheelDelta)))); | |
96 } | |
97 | |
75 } // namespace | 98 } // namespace |
76 | 99 |
77 // static | 100 // static |
78 DisplayManagerFactory* DisplayManager::factory_ = nullptr; | 101 DisplayManagerFactory* DisplayManager::factory_ = nullptr; |
79 | 102 |
80 // static | 103 // static |
81 DisplayManager* DisplayManager::Create( | 104 DisplayManager* DisplayManager::Create( |
82 bool is_headless, | 105 bool is_headless, |
83 mojo::ApplicationImpl* app_impl, | 106 mojo::ApplicationImpl* app_impl, |
84 const scoped_refptr<gles2::GpuState>& gpu_state) { | 107 const scoped_refptr<gles2::GpuState>& gpu_state) { |
(...skipping 16 matching lines...) Expand all Loading... | |
101 new native_viewport::OnscreenContextProvider(gpu_state)), | 124 new native_viewport::OnscreenContextProvider(gpu_state)), |
102 weak_factory_(this) { | 125 weak_factory_(this) { |
103 metrics_.size_in_pixels = mojo::Size::New(); | 126 metrics_.size_in_pixels = mojo::Size::New(); |
104 metrics_.size_in_pixels->width = 800; | 127 metrics_.size_in_pixels->width = 800; |
105 metrics_.size_in_pixels->height = 600; | 128 metrics_.size_in_pixels->height = 600; |
106 } | 129 } |
107 | 130 |
108 void DefaultDisplayManager::Init(DisplayManagerDelegate* delegate) { | 131 void DefaultDisplayManager::Init(DisplayManagerDelegate* delegate) { |
109 delegate_ = delegate; | 132 delegate_ = delegate; |
110 | 133 |
111 platform_viewport_ = | 134 gfx::Rect bounds(metrics_.size_in_pixels.To<gfx::Size>()); |
112 native_viewport::PlatformViewport::Create(this, is_headless_).Pass(); | 135 if (is_headless_) { |
113 platform_viewport_->Init(gfx::Rect(metrics_.size_in_pixels.To<gfx::Size>())); | 136 platform_window_.reset(new ui::StubWindow(this)); |
114 platform_viewport_->Show(); | 137 } else { |
138 #if defined(OS_WIN) | |
139 platform_window_.reset(new ui::WinWindow(this, bounds)); | |
140 #elif defined(USE_X11) | |
141 platform_window_.reset(new ui::X11Window(this)); | |
142 #elif defined(OS_ANDROID) | |
143 platform_window_.reset(new ui::PlatformWindowAndroid(this)); | |
144 #else | |
145 NOTREACHED() << "Unsupported platform"; | |
146 #endif | |
147 } | |
148 platform_window_->SetBounds(bounds); | |
149 platform_window_->Show(); | |
115 | 150 |
116 mojo::ContextProviderPtr context_provider; | 151 mojo::ContextProviderPtr context_provider; |
117 context_provider_->Bind(GetProxy(&context_provider).Pass()); | 152 context_provider_->Bind(GetProxy(&context_provider).Pass()); |
118 mojo::DisplayFactoryPtr display_factory; | 153 mojo::DisplayFactoryPtr display_factory; |
119 mojo::URLRequestPtr request(mojo::URLRequest::New()); | 154 mojo::URLRequestPtr request(mojo::URLRequest::New()); |
120 request->url = mojo::String::From("mojo:surfaces_service"); | 155 request->url = mojo::String::From("mojo:surfaces_service"); |
121 app_impl_->ConnectToService(request.Pass(), &display_factory); | 156 app_impl_->ConnectToService(request.Pass(), &display_factory); |
122 display_factory->Create(context_provider.Pass(), | 157 display_factory->Create(context_provider.Pass(), |
123 nullptr, // returner - we never submit resources. | 158 nullptr, // returner - we never submit resources. |
124 GetProxy(&display_)); | 159 GetProxy(&display_)); |
125 } | 160 } |
126 | 161 |
127 DefaultDisplayManager::~DefaultDisplayManager() { | 162 DefaultDisplayManager::~DefaultDisplayManager() { |
128 // Destroy before |platform_viewport_| because this will destroy | 163 // Destroy before |platform_window_| because this will destroy |
129 // CommandBufferDriver objects that contain child windows. Otherwise if this | 164 // CommandBufferDriver objects that contain child windows. Otherwise if this |
130 // class destroys its window first, X errors will occur. | 165 // class destroys its window first, X errors will occur. |
131 context_provider_.reset(); | 166 context_provider_.reset(); |
132 | 167 |
133 // Destroy the NativeViewport early on as it may call us back during | 168 // Destroy the NativeViewport early on as it may call us back during |
msw
2015/07/07 17:23:02
nit: update NativeViewport reference? (i see other
sadrul
2015/07/07 18:59:14
Done.
| |
134 // destruction and we want to be in a known state. | 169 // destruction and we want to be in a known state. |
135 platform_viewport_.reset(); | 170 platform_window_.reset(); |
136 } | 171 } |
137 | 172 |
138 void DefaultDisplayManager::SchedulePaint(const ServerView* view, | 173 void DefaultDisplayManager::SchedulePaint(const ServerView* view, |
139 const gfx::Rect& bounds) { | 174 const gfx::Rect& bounds) { |
140 DCHECK(view); | 175 DCHECK(view); |
141 if (!view->IsDrawn()) | 176 if (!view->IsDrawn()) |
142 return; | 177 return; |
143 const gfx::Rect root_relative_rect = | 178 const gfx::Rect root_relative_rect = |
144 ConvertRectBetweenViews(view, delegate_->GetRootView(), bounds); | 179 ConvertRectBetweenViews(view, delegate_->GetRootView(), bounds); |
145 if (root_relative_rect.IsEmpty()) | 180 if (root_relative_rect.IsEmpty()) |
146 return; | 181 return; |
147 dirty_rect_.Union(root_relative_rect); | 182 dirty_rect_.Union(root_relative_rect); |
148 WantToDraw(); | 183 WantToDraw(); |
149 } | 184 } |
150 | 185 |
151 void DefaultDisplayManager::SetViewportSize(const gfx::Size& size) { | 186 void DefaultDisplayManager::SetViewportSize(const gfx::Size& size) { |
152 platform_viewport_->SetBounds(gfx::Rect(size)); | 187 platform_window_->SetBounds(gfx::Rect(size)); |
153 } | 188 } |
154 | 189 |
155 const mojo::ViewportMetrics& DefaultDisplayManager::GetViewportMetrics() { | 190 const mojo::ViewportMetrics& DefaultDisplayManager::GetViewportMetrics() { |
156 return metrics_; | 191 return metrics_; |
157 } | 192 } |
158 | 193 |
159 void DefaultDisplayManager::Draw() { | 194 void DefaultDisplayManager::Draw() { |
160 gfx::Rect rect(metrics_.size_in_pixels.To<gfx::Size>()); | 195 gfx::Rect rect(metrics_.size_in_pixels.To<gfx::Size>()); |
161 auto pass = mojo::CreateDefaultPass(1, rect); | 196 auto pass = mojo::CreateDefaultPass(1, rect); |
162 pass->damage_rect = Rect::From(dirty_rect_); | 197 pass->damage_rect = Rect::From(dirty_rect_); |
(...skipping 18 matching lines...) Expand all Loading... | |
181 | 216 |
182 void DefaultDisplayManager::WantToDraw() { | 217 void DefaultDisplayManager::WantToDraw() { |
183 if (draw_timer_.IsRunning() || frame_pending_) | 218 if (draw_timer_.IsRunning() || frame_pending_) |
184 return; | 219 return; |
185 | 220 |
186 draw_timer_.Start( | 221 draw_timer_.Start( |
187 FROM_HERE, base::TimeDelta(), | 222 FROM_HERE, base::TimeDelta(), |
188 base::Bind(&DefaultDisplayManager::Draw, base::Unretained(this))); | 223 base::Bind(&DefaultDisplayManager::Draw, base::Unretained(this))); |
189 } | 224 } |
190 | 225 |
191 void DefaultDisplayManager::OnAcceleratedWidgetAvailable( | 226 void DefaultDisplayManager::UpdateMetrics(const gfx::Size& size, |
192 gfx::AcceleratedWidget widget, | 227 float device_pixel_ratio) { |
193 float device_pixel_ratio) { | 228 if (metrics_.size_in_pixels.To<gfx::Size>() == size && |
194 context_provider_->SetAcceleratedWidget(widget); | 229 metrics_.device_pixel_ratio == device_pixel_ratio) |
195 OnMetricsChanged(metrics_.size_in_pixels.To<gfx::Size>(), device_pixel_ratio); | |
196 } | |
197 | |
198 void DefaultDisplayManager::OnAcceleratedWidgetDestroyed() { | |
199 context_provider_->SetAcceleratedWidget(gfx::kNullAcceleratedWidget); | |
msw
2015/07/07 17:23:02
q: OnAcceleratedWidgetDestroyed wasn't called, but
sadrul
2015/07/07 18:59:14
Yeah, looks like it's not called anymore. I wonder
msw
2015/07/07 19:26:43
It might, but it doesn't seem necessary, at least
sadrul
2015/07/07 19:49:11
Sounds good. Thanks
| |
200 } | |
201 | |
202 void DefaultDisplayManager::OnEvent(mojo::EventPtr event) { | |
203 delegate_->OnEvent(event.Pass()); | |
204 } | |
205 | |
206 void DefaultDisplayManager::OnMetricsChanged(const gfx::Size& size, | |
207 float device_scale_factor) { | |
208 if ((metrics_.size_in_pixels.To<gfx::Size>() == size) && | |
209 (metrics_.device_pixel_ratio == device_scale_factor)) { | |
210 return; | 230 return; |
211 } | |
212 | |
213 mojo::ViewportMetrics metrics; | 231 mojo::ViewportMetrics metrics; |
214 metrics.size_in_pixels = mojo::Size::From(size); | 232 metrics.size_in_pixels = mojo::Size::From(size); |
215 metrics.device_pixel_ratio = device_scale_factor; | 233 metrics.device_pixel_ratio = device_pixel_ratio; |
216 | 234 |
217 delegate_->GetRootView()->SetBounds(gfx::Rect(size)); | 235 delegate_->GetRootView()->SetBounds(gfx::Rect(size)); |
218 delegate_->OnViewportMetricsChanged(metrics_, metrics); | 236 delegate_->OnViewportMetricsChanged(metrics_, metrics); |
219 | 237 |
220 metrics_.size_in_pixels = metrics.size_in_pixels.Clone(); | 238 metrics_.size_in_pixels = metrics.size_in_pixels.Clone(); |
221 metrics_.device_pixel_ratio = metrics.device_pixel_ratio; | 239 metrics_.device_pixel_ratio = metrics.device_pixel_ratio; |
222 } | 240 } |
223 | 241 |
224 void DefaultDisplayManager::OnDestroyed() { | 242 void DefaultDisplayManager::OnBoundsChanged(const gfx::Rect& new_bounds) { |
243 UpdateMetrics(new_bounds.size(), metrics_.device_pixel_ratio); | |
244 } | |
245 | |
246 void DefaultDisplayManager::OnDamageRect(const gfx::Rect& damaged_region) { | |
247 } | |
248 | |
249 void DefaultDisplayManager::DispatchEvent(ui::Event* event) { | |
250 mojo::EventPtr mojo_event(mojo::Event::From(*event)); | |
251 if (event->IsMouseWheelEvent()) { | |
252 // Mojo's event type has a different meaning for wheel events. Convert | |
253 // between the two. | |
254 ui::MouseWheelEvent* wheel_event = | |
255 static_cast<ui::MouseWheelEvent*>(event); | |
256 DCHECK(mojo_event->pointer_data); | |
257 mojo_event->pointer_data->horizontal_wheel = | |
258 ConvertUIWheelValueToMojoValue(wheel_event->x_offset()); | |
259 mojo_event->pointer_data->horizontal_wheel = | |
260 ConvertUIWheelValueToMojoValue(wheel_event->y_offset()); | |
261 } | |
262 delegate_->OnEvent(mojo_event.Pass()); | |
263 | |
264 switch (event->type()) { | |
265 case ui::ET_MOUSE_PRESSED: | |
266 case ui::ET_TOUCH_PRESSED: | |
267 platform_window_->SetCapture(); | |
268 break; | |
269 case ui::ET_MOUSE_RELEASED: | |
270 case ui::ET_TOUCH_RELEASED: | |
271 platform_window_->ReleaseCapture(); | |
272 break; | |
273 default: | |
274 break; | |
275 } | |
276 | |
277 #if defined(USE_X11) | |
278 // We want to emulate the WM_CHAR generation behaviour of Windows. | |
279 // | |
280 // On Linux, we've previously inserted characters by having | |
281 // InputMethodAuraLinux take all key down events and send a character event | |
282 // to the TextInputClient. This causes a mismatch in code that has to be | |
283 // shared between Windows and Linux, including blink code. Now that we're | |
284 // trying to have one way of doing things, we need to standardize on and | |
285 // emulate Windows character events. | |
286 // | |
287 // This is equivalent to what we're doing in the current Linux port, but | |
288 // done once instead of done multiple times in different places. | |
289 if (event->type() == ui::ET_KEY_PRESSED) { | |
290 ui::KeyEvent* key_press_event = static_cast<ui::KeyEvent*>(event); | |
291 ui::KeyEvent char_event(key_press_event->GetCharacter(), | |
292 key_press_event->key_code(), | |
293 key_press_event->flags()); | |
294 | |
295 DCHECK_EQ(key_press_event->GetCharacter(), char_event.GetCharacter()); | |
296 DCHECK_EQ(key_press_event->key_code(), char_event.key_code()); | |
297 DCHECK_EQ(key_press_event->flags(), char_event.flags()); | |
298 | |
299 char_event.SetExtendedKeyEventData( | |
300 make_scoped_ptr(new mojo::MojoExtendedKeyEventData( | |
301 key_press_event->GetLocatedWindowsKeyboardCode(), | |
302 key_press_event->GetText(), | |
303 key_press_event->GetUnmodifiedText()))); | |
304 char_event.set_platform_keycode(key_press_event->platform_keycode()); | |
305 | |
306 delegate_->OnEvent(mojo::Event::From(char_event)); | |
307 } | |
308 #endif | |
309 } | |
310 | |
311 void DefaultDisplayManager::OnCloseRequest() { | |
312 platform_window_->Close(); | |
313 } | |
314 | |
315 void DefaultDisplayManager::OnClosed() { | |
225 delegate_->OnDisplayClosed(); | 316 delegate_->OnDisplayClosed(); |
226 } | 317 } |
227 | 318 |
319 void DefaultDisplayManager::OnWindowStateChanged( | |
320 ui::PlatformWindowState new_state) { | |
321 } | |
322 | |
323 void DefaultDisplayManager::OnLostCapture() { | |
324 } | |
325 | |
326 void DefaultDisplayManager::OnAcceleratedWidgetAvailable( | |
327 gfx::AcceleratedWidget widget, | |
328 float device_pixel_ratio) { | |
329 context_provider_->SetAcceleratedWidget(widget); | |
330 UpdateMetrics(metrics_.size_in_pixels.To<gfx::Size>(), device_pixel_ratio); | |
331 } | |
332 | |
333 void DefaultDisplayManager::OnActivationChanged(bool active) { | |
334 } | |
335 | |
228 } // namespace view_manager | 336 } // namespace view_manager |
OLD | NEW |