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

Side by Side Diff: components/mus/ws/window_tree_host_impl.cc

Issue 1465803003: mus: Let clients set the cursor of their window. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix WindowTreeAppTest.SetCursor. Created 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/mus/ws/window_tree_host_impl.h" 5 #include "components/mus/ws/window_tree_host_impl.h"
6 6
7 #include "base/debug/debugger.h" 7 #include "base/debug/debugger.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "components/mus/common/types.h" 9 #include "components/mus/common/types.h"
10 #include "components/mus/public/interfaces/input_event_constants.mojom.h"
10 #include "components/mus/ws/connection_manager.h" 11 #include "components/mus/ws/connection_manager.h"
11 #include "components/mus/ws/display_manager.h" 12 #include "components/mus/ws/display_manager.h"
12 #include "components/mus/ws/focus_controller.h" 13 #include "components/mus/ws/focus_controller.h"
13 #include "components/mus/ws/window_tree_host_delegate.h" 14 #include "components/mus/ws/window_tree_host_delegate.h"
14 #include "components/mus/ws/window_tree_impl.h" 15 #include "components/mus/ws/window_tree_impl.h"
15 #include "mojo/common/common_type_converters.h" 16 #include "mojo/common/common_type_converters.h"
16 #include "mojo/converters/geometry/geometry_type_converters.h" 17 #include "mojo/converters/geometry/geometry_type_converters.h"
17 18
18 namespace mus { 19 namespace mus {
19 namespace ws { 20 namespace ws {
(...skipping 16 matching lines...) Expand all
36 const scoped_refptr<GpuState>& gpu_state, 37 const scoped_refptr<GpuState>& gpu_state,
37 const scoped_refptr<SurfacesState>& surfaces_state, 38 const scoped_refptr<SurfacesState>& surfaces_state,
38 mojom::WindowManagerPtr window_manager) 39 mojom::WindowManagerPtr window_manager)
39 : delegate_(nullptr), 40 : delegate_(nullptr),
40 connection_manager_(connection_manager), 41 connection_manager_(connection_manager),
41 client_(client.Pass()), 42 client_(client.Pass()),
42 event_dispatcher_(this), 43 event_dispatcher_(this),
43 display_manager_( 44 display_manager_(
44 DisplayManager::Create(app_impl, gpu_state, surfaces_state)), 45 DisplayManager::Create(app_impl, gpu_state, surfaces_state)),
45 window_manager_(window_manager.Pass()), 46 window_manager_(window_manager.Pass()),
46 tree_awaiting_input_ack_(nullptr) { 47 tree_awaiting_input_ack_(nullptr),
48 last_cursor_(0) {
47 display_manager_->Init(this); 49 display_manager_->Init(this);
48 if (client_) { 50 if (client_) {
49 client_.set_connection_error_handler(base::Bind( 51 client_.set_connection_error_handler(base::Bind(
50 &WindowTreeHostImpl::OnClientClosed, base::Unretained(this))); 52 &WindowTreeHostImpl::OnClientClosed, base::Unretained(this)));
51 } 53 }
52 } 54 }
53 55
54 WindowTreeHostImpl::~WindowTreeHostImpl() { 56 WindowTreeHostImpl::~WindowTreeHostImpl() {
55 DestroyFocusController(); 57 DestroyFocusController();
56 for (ServerWindow* window : windows_needing_frame_destruction_) 58 for (ServerWindow* window : windows_needing_frame_destruction_)
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 display_manager_->UpdateTextInputState(state); 126 display_manager_->UpdateTextInputState(state);
125 } 127 }
126 128
127 void WindowTreeHostImpl::SetImeVisibility(ServerWindow* window, bool visible) { 129 void WindowTreeHostImpl::SetImeVisibility(ServerWindow* window, bool visible) {
128 // Do not need to show or hide IME for unfocused window. 130 // Do not need to show or hide IME for unfocused window.
129 if (focus_controller_->GetFocusedWindow() != window) 131 if (focus_controller_->GetFocusedWindow() != window)
130 return; 132 return;
131 display_manager_->SetImeVisibility(visible); 133 display_manager_->SetImeVisibility(visible);
132 } 134 }
133 135
136 void WindowTreeHostImpl::OnCursorUpdated(ServerWindow* window) {
137 if (window == event_dispatcher_.last_targeted_window())
138 UpdateNativeCursor(window->cursor());
139 }
140
134 void WindowTreeHostImpl::SetSize(mojo::SizePtr size) { 141 void WindowTreeHostImpl::SetSize(mojo::SizePtr size) {
135 display_manager_->SetViewportSize(size.To<gfx::Size>()); 142 display_manager_->SetViewportSize(size.To<gfx::Size>());
136 } 143 }
137 144
138 void WindowTreeHostImpl::SetTitle(const mojo::String& title) { 145 void WindowTreeHostImpl::SetTitle(const mojo::String& title) {
139 display_manager_->SetTitle(title.To<base::string16>()); 146 display_manager_->SetTitle(title.To<base::string16>());
140 } 147 }
141 148
142 void WindowTreeHostImpl::AddAccelerator(uint32_t id, 149 void WindowTreeHostImpl::AddAccelerator(uint32_t id,
143 mojom::EventMatcherPtr event_matcher) { 150 mojom::EventMatcherPtr event_matcher) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 } 214 }
208 215
209 void WindowTreeHostImpl::DispatchNextEventFromQueue() { 216 void WindowTreeHostImpl::DispatchNextEventFromQueue() {
210 if (event_queue_.empty()) 217 if (event_queue_.empty())
211 return; 218 return;
212 mojom::EventPtr next_event = event_queue_.front().Pass(); 219 mojom::EventPtr next_event = event_queue_.front().Pass();
213 event_queue_.pop(); 220 event_queue_.pop();
214 event_dispatcher_.OnEvent(next_event.Pass()); 221 event_dispatcher_.OnEvent(next_event.Pass());
215 } 222 }
216 223
224 void WindowTreeHostImpl::UpdateNativeCursor(int32_t cursor_id) {
225 if (cursor_id != last_cursor_) {
226 display_manager_->SetCursorById(cursor_id);
227 last_cursor_ = cursor_id;
228 }
229 }
230
217 ServerWindow* WindowTreeHostImpl::GetRootWindow() { 231 ServerWindow* WindowTreeHostImpl::GetRootWindow() {
218 return root_.get(); 232 return root_.get();
219 } 233 }
220 234
221 void WindowTreeHostImpl::OnEvent(mojom::EventPtr event) { 235 void WindowTreeHostImpl::OnEvent(mojom::EventPtr event) {
222 // If this is still waiting for an ack from a previously sent event, then 236 // If this is still waiting for an ack from a previously sent event, then
223 // queue up the event to be dispatched once the ack is received. 237 // queue up the event to be dispatched once the ack is received.
224 if (event_ack_timer_.IsRunning()) { 238 if (event_ack_timer_.IsRunning()) {
225 // TODO(sad): Coalesce if possible. 239 // TODO(sad): Coalesce if possible.
226 event_queue_.push(event.Pass()); 240 event_queue_.push(event.Pass());
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 } 370 }
357 371
358 ServerWindow* WindowTreeHostImpl::GetFocusedWindowForEventDispatcher() { 372 ServerWindow* WindowTreeHostImpl::GetFocusedWindowForEventDispatcher() {
359 return GetFocusedWindow(); 373 return GetFocusedWindow();
360 } 374 }
361 375
362 void WindowTreeHostImpl::DispatchInputEventToWindow(ServerWindow* target, 376 void WindowTreeHostImpl::DispatchInputEventToWindow(ServerWindow* target,
363 bool in_nonclient_area, 377 bool in_nonclient_area,
364 mojom::EventPtr event) { 378 mojom::EventPtr event) {
365 DCHECK(!event_ack_timer_.IsRunning()); 379 DCHECK(!event_ack_timer_.IsRunning());
380 if ((event->action == mojom::EventType::EVENT_TYPE_POINTER_CANCEL ||
381 event->action == mojom::EventType::EVENT_TYPE_POINTER_DOWN ||
382 event->action == mojom::EventType::EVENT_TYPE_POINTER_MOVE ||
383 event->action == mojom::EventType::EVENT_TYPE_POINTER_UP) &&
384 (event->pointer_data &&
385 event->pointer_data->kind == mojom::PointerKind::POINTER_KIND_MOUSE)) {
386 UpdateNativeCursor(target->cursor());
387 }
388
366 // If the event is in the non-client area the event goes to the owner of 389 // If the event is in the non-client area the event goes to the owner of
367 // the window. Otherwise if the window is an embed root, forward to the 390 // the window. Otherwise if the window is an embed root, forward to the
368 // embedded window. 391 // embedded window.
369 WindowTreeImpl* connection = 392 WindowTreeImpl* connection =
370 in_nonclient_area 393 in_nonclient_area
371 ? connection_manager_->GetConnection(target->id().connection_id) 394 ? connection_manager_->GetConnection(target->id().connection_id)
372 : connection_manager_->GetConnectionWithRoot(target->id()); 395 : connection_manager_->GetConnectionWithRoot(target->id());
373 if (!connection) { 396 if (!connection) {
374 DCHECK(!in_nonclient_area); 397 DCHECK(!in_nonclient_area);
375 connection = connection_manager_->GetConnection(target->id().connection_id); 398 connection = connection_manager_->GetConnection(target->id().connection_id);
376 } 399 }
377 tree_awaiting_input_ack_ = connection; 400 tree_awaiting_input_ack_ = connection;
378 connection->DispatchInputEvent(target, event.Pass()); 401 connection->DispatchInputEvent(target, event.Pass());
379 402
380 // TOOD(sad): Adjust this delay, possibly make this dynamic. 403 // TOOD(sad): Adjust this delay, possibly make this dynamic.
381 const base::TimeDelta max_delay = base::debug::BeingDebugged() 404 const base::TimeDelta max_delay = base::debug::BeingDebugged()
382 ? base::TimeDelta::FromDays(1) 405 ? base::TimeDelta::FromDays(1)
383 : GetDefaultAckTimerDelay(); 406 : GetDefaultAckTimerDelay();
384 event_ack_timer_.Start(FROM_HERE, max_delay, this, 407 event_ack_timer_.Start(FROM_HERE, max_delay, this,
385 &WindowTreeHostImpl::OnEventAckTimeout); 408 &WindowTreeHostImpl::OnEventAckTimeout);
386 } 409 }
387 410
388 void WindowTreeHostImpl::OnWindowDestroyed(ServerWindow* window) { 411 void WindowTreeHostImpl::OnWindowDestroyed(ServerWindow* window) {
389 windows_needing_frame_destruction_.erase(window); 412 windows_needing_frame_destruction_.erase(window);
390 window->RemoveObserver(this); 413 window->RemoveObserver(this);
391 } 414 }
392 415
393 } // namespace ws 416 } // namespace ws
394 } // namespace mus 417 } // namespace mus
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698