Index: ash/display/display_controller.cc |
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc |
index 7b7cc5882e5592a336e718a28d2fa3c442bb5215..4d2c1a9338e9072147f6d9ab3a41756774618dea 100644 |
--- a/ash/display/display_controller.cc |
+++ b/ash/display/display_controller.cc |
@@ -9,6 +9,7 @@ |
#include <map> |
#include "ash/ash_switches.h" |
+#include "ash/display/cursor_window_controller.h" |
#include "ash/display/display_layout_store.h" |
#include "ash/display/display_manager.h" |
#include "ash/display/mirror_window_controller.h" |
@@ -20,6 +21,7 @@ |
#include "ash/screen_util.h" |
#include "ash/shell.h" |
#include "ash/shell_delegate.h" |
+#include "ash/shell_window_ids.h" |
#include "ash/wm/coordinate_conversion.h" |
#include "base/command_line.h" |
#include "base/strings/stringprintf.h" |
@@ -215,8 +217,11 @@ bool DisplayController::DisplayChangeLimiter::IsThrottled() const { |
DisplayController::DisplayController() |
: primary_root_window_for_replace_(NULL), |
+ is_cursor_compositing_enabled_(false), |
focus_activation_store_(new internal::FocusActivationStore()), |
- mirror_window_controller_(new internal::MirrorWindowController), |
+ cursor_window_controller_(new internal::CursorWindowController()), |
+ mirror_window_controller_(new internal::MirrorWindowController( |
+ cursor_window_controller_.get())), |
virtual_keyboard_window_controller_( |
new internal::VirtualKeyboardWindowController) { |
#if defined(OS_CHROMEOS) |
@@ -250,6 +255,7 @@ void DisplayController::Shutdown() { |
Shell::GetInstance()->display_manager()->set_delegate(NULL); |
mirror_window_controller_.reset(); |
+ cursor_window_controller_.reset(); |
virtual_keyboard_window_controller_.reset(); |
Shell::GetScreen()->RemoveObserver(this); |
@@ -400,6 +406,25 @@ void DisplayController::SwapPrimaryDisplay() { |
} |
} |
+void DisplayController::SetCursorCompositingEnabled(bool enabled) { |
+#if defined(OS_CHROMEOS) && defined(USE_X11) |
+ if (is_cursor_compositing_enabled_ != enabled) { |
+ is_cursor_compositing_enabled_ = enabled; |
+ UpdateCursorWindowContainer(); |
+ } |
+#endif |
+} |
+ |
+void DisplayController::SetDisplayForCursor(const gfx::Display& display) { |
+ if (!is_cursor_compositing_enabled_) |
+ return; |
+ |
+ cursor_window_controller_->SetContainer( |
+ internal::GetRootWindowController(root_windows_[display.id()])-> |
+ GetContainer(internal::kShellWindowId_OverlayContainer)); |
+ cursor_window_controller_->SetDisplayBounds(display.bounds()); |
+} |
+ |
void DisplayController::SetPrimaryDisplayId(int64 id) { |
DCHECK_NE(gfx::Display::kInvalidDisplayID, id); |
if (id == gfx::Display::kInvalidDisplayID || primary_display_id == id) |
@@ -613,6 +638,7 @@ void DisplayController::OnWindowTreeHostResized(const aura::RootWindow* root) { |
display.id(), |
root->host()->GetBounds())) { |
mirror_window_controller_->UpdateWindow(); |
+ UpdateCursorWindowContainer(); |
} |
} |
@@ -622,10 +648,12 @@ void DisplayController::CreateOrUpdateNonDesktopDisplay( |
case internal::DisplayManager::MIRRORING: |
mirror_window_controller_->UpdateWindow(info); |
virtual_keyboard_window_controller_->Close(); |
+ UpdateCursorWindowContainer(); |
break; |
case internal::DisplayManager::VIRTUAL_KEYBOARD: |
mirror_window_controller_->Close(); |
virtual_keyboard_window_controller_->UpdateWindow(info); |
+ UpdateCursorWindowContainer(); |
break; |
case internal::DisplayManager::EXTENDED: |
NOTREACHED(); |
@@ -635,6 +663,7 @@ void DisplayController::CreateOrUpdateNonDesktopDisplay( |
void DisplayController::CloseNonDesktopDisplay() { |
mirror_window_controller_->Close(); |
virtual_keyboard_window_controller_->Close(); |
+ UpdateCursorWindowContainer(); |
} |
void DisplayController::PreDisplayConfigurationChange(bool clear_focus) { |
@@ -741,4 +770,24 @@ void DisplayController::UpdateHostWindowNames() { |
#endif |
} |
+void DisplayController::UpdateCursorWindowContainer() { |
+#if defined(OS_CHROMEOS) && defined(USE_X11) |
+ if (is_cursor_compositing_enabled_) { |
+ cursor_window_controller_->SetMirroring(false); |
+ cursor_window_controller_->SetContainer( |
+ Shell::GetPrimaryRootWindowController()->GetContainer( |
+ internal::kShellWindowId_OverlayContainer)); |
+ } else { |
+ aura::RootWindow* mirror_root_window = |
+ mirror_window_controller_->root_window(); |
+ if (mirror_root_window) { |
+ cursor_window_controller_->SetMirroring(true); |
+ cursor_window_controller_->SetContainer(mirror_root_window->window()); |
+ } else { |
+ cursor_window_controller_->SetContainer(NULL); |
+ } |
+ } |
+#endif |
+} |
+ |
} // namespace ash |