| Index: ui/views/corewm/cursor_manager.cc
|
| diff --git a/ui/views/corewm/cursor_manager.cc b/ui/views/corewm/cursor_manager.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7b3865f7ef328b45b2dc2dea44933deb052be84e
|
| --- /dev/null
|
| +++ b/ui/views/corewm/cursor_manager.cc
|
| @@ -0,0 +1,178 @@
|
| +// Copyright (c) 2013 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/views/corewm/cursor_manager.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "ui/views/corewm/native_cursor_manager.h"
|
| +#include "ui/views/corewm/native_cursor_manager_delegate.h"
|
| +
|
| +namespace views {
|
| +namespace corewm {
|
| +
|
| +namespace internal {
|
| +
|
| +// Represents the cursor state which is composed of cursor type, visibility, and
|
| +// mouse events enable state. When mouse events are disabled, the cursor is
|
| +// always invisible.
|
| +class CursorState {
|
| + public:
|
| + CursorState()
|
| + : cursor_(ui::kCursorNone),
|
| + visible_(true),
|
| + mouse_events_enabled_(true),
|
| + visible_on_mouse_events_enabled_(true) {
|
| + }
|
| +
|
| + gfx::NativeCursor cursor() const { return cursor_; }
|
| + void set_cursor(gfx::NativeCursor cursor) { cursor_ = cursor; }
|
| +
|
| + bool visible() const { return visible_; }
|
| + void SetVisible(bool visible) {
|
| + if (mouse_events_enabled_)
|
| + visible_ = visible;
|
| + // Ignores the call when mouse events disabled.
|
| + }
|
| +
|
| + bool mouse_events_enabled() const { return mouse_events_enabled_; }
|
| + void SetMouseEventsEnabled(bool enabled) {
|
| + if (mouse_events_enabled_ == enabled)
|
| + return;
|
| + mouse_events_enabled_ = enabled;
|
| +
|
| + // Restores the visibility when mouse events are enabled.
|
| + if (enabled) {
|
| + visible_ = visible_on_mouse_events_enabled_;
|
| + } else {
|
| + visible_on_mouse_events_enabled_ = visible_;
|
| + visible_ = false;
|
| + }
|
| + }
|
| +
|
| + private:
|
| + gfx::NativeCursor cursor_;
|
| + bool visible_;
|
| + bool mouse_events_enabled_;
|
| +
|
| + // The visibility to set when mouse events are enabled.
|
| + bool visible_on_mouse_events_enabled_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CursorState);
|
| +};
|
| +
|
| +} // namespace internal
|
| +
|
| +CursorManager::CursorManager(scoped_ptr<NativeCursorManager> delegate)
|
| + : delegate_(delegate.Pass()),
|
| + cursor_lock_count_(0),
|
| + current_state_(new internal::CursorState),
|
| + state_on_unlock_(new internal::CursorState) {
|
| +}
|
| +
|
| +CursorManager::~CursorManager() {
|
| +}
|
| +
|
| +void CursorManager::SetCursor(gfx::NativeCursor cursor) {
|
| + state_on_unlock_->set_cursor(cursor);
|
| + if (cursor_lock_count_ == 0 &&
|
| + GetCurrentCursor() != state_on_unlock_->cursor()) {
|
| + delegate_->SetCursor(state_on_unlock_->cursor(), this);
|
| + }
|
| +}
|
| +
|
| +void CursorManager::ShowCursor() {
|
| + state_on_unlock_->SetVisible(true);
|
| + if (cursor_lock_count_ == 0 &&
|
| + IsCursorVisible() != state_on_unlock_->visible()) {
|
| + delegate_->SetVisibility(state_on_unlock_->visible(), this);
|
| + }
|
| +}
|
| +
|
| +void CursorManager::HideCursor() {
|
| + state_on_unlock_->SetVisible(false);
|
| + if (cursor_lock_count_ == 0 &&
|
| + IsCursorVisible() != state_on_unlock_->visible()) {
|
| + delegate_->SetVisibility(state_on_unlock_->visible(), this);
|
| + }
|
| +}
|
| +
|
| +bool CursorManager::IsCursorVisible() const {
|
| + return current_state_->visible();
|
| +}
|
| +
|
| +void CursorManager::EnableMouseEvents() {
|
| + state_on_unlock_->SetMouseEventsEnabled(true);
|
| + if (cursor_lock_count_ == 0 &&
|
| + IsMouseEventsEnabled() != state_on_unlock_->mouse_events_enabled()) {
|
| + delegate_->SetMouseEventsEnabled(state_on_unlock_->mouse_events_enabled(),
|
| + this);
|
| + }
|
| +}
|
| +
|
| +void CursorManager::DisableMouseEvents() {
|
| + state_on_unlock_->SetMouseEventsEnabled(false);
|
| + if (cursor_lock_count_ == 0 &&
|
| + IsMouseEventsEnabled() != state_on_unlock_->mouse_events_enabled()) {
|
| + delegate_->SetMouseEventsEnabled(state_on_unlock_->mouse_events_enabled(),
|
| + this);
|
| + }
|
| +}
|
| +
|
| +bool CursorManager::IsMouseEventsEnabled() const {
|
| + return current_state_->mouse_events_enabled();
|
| +}
|
| +
|
| +void CursorManager::SetDeviceScaleFactor(float device_scale_factor) {
|
| + delegate_->SetDeviceScaleFactor(device_scale_factor, this);
|
| +}
|
| +
|
| +void CursorManager::LockCursor() {
|
| + cursor_lock_count_++;
|
| +}
|
| +
|
| +void CursorManager::UnlockCursor() {
|
| + cursor_lock_count_--;
|
| + DCHECK_GE(cursor_lock_count_, 0);
|
| + if (cursor_lock_count_ > 0)
|
| + return;
|
| +
|
| + if (GetCurrentCursor() != state_on_unlock_->cursor()) {
|
| + delegate_->SetCursor(state_on_unlock_->cursor(), this);
|
| + }
|
| + if (IsMouseEventsEnabled() != state_on_unlock_->mouse_events_enabled()) {
|
| + delegate_->SetMouseEventsEnabled(state_on_unlock_->mouse_events_enabled(),
|
| + this);
|
| + }
|
| + if (IsCursorVisible() != state_on_unlock_->visible()) {
|
| + delegate_->SetVisibility(state_on_unlock_->visible(),
|
| + this);
|
| + }
|
| +}
|
| +
|
| +gfx::NativeCursor CursorManager::GetCurrentCursor() const {
|
| + return current_state_->cursor();
|
| +}
|
| +
|
| +bool CursorManager::GetCurrentVisibility() const {
|
| + return current_state_->visible();
|
| +}
|
| +
|
| +bool CursorManager::GetMouseEventsEnabled() const {
|
| + return current_state_->mouse_events_enabled();
|
| +}
|
| +
|
| +void CursorManager::CommitCursor(gfx::NativeCursor cursor) {
|
| + current_state_->set_cursor(cursor);
|
| +}
|
| +
|
| +void CursorManager::CommitVisibility(bool visible) {
|
| + current_state_->SetVisible(visible);
|
| +}
|
| +
|
| +void CursorManager::CommitMouseEventsEnabled(bool enabled) {
|
| + current_state_->SetMouseEventsEnabled(enabled);
|
| +}
|
| +
|
| +} // namespace corewm
|
| +} // namespace views
|
|
|