summaryrefslogtreecommitdiff
path: root/chromium/ash/wm/image_cursors.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/wm/image_cursors.cc')
-rw-r--r--chromium/ash/wm/image_cursors.cc152
1 files changed, 152 insertions, 0 deletions
diff --git a/chromium/ash/wm/image_cursors.cc b/chromium/ash/wm/image_cursors.cc
new file mode 100644
index 00000000000..e63bece7ffd
--- /dev/null
+++ b/chromium/ash/wm/image_cursors.cc
@@ -0,0 +1,152 @@
+// Copyright (c) 2012 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 "ash/wm/image_cursors.h"
+
+#include <float.h>
+
+#include "base/logging.h"
+#include "base/strings/string16.h"
+#include "ui/base/cursor/cursor.h"
+#include "ui/base/cursor/cursor_loader.h"
+#include "ui/base/cursor/cursors_aura.h"
+#include "ui/gfx/display.h"
+#include "ui/gfx/point.h"
+
+namespace ash {
+
+const int kImageCursorIds[] = {
+ ui::kCursorNull,
+ ui::kCursorPointer,
+ ui::kCursorNoDrop,
+ ui::kCursorNotAllowed,
+ ui::kCursorCopy,
+ ui::kCursorHand,
+ ui::kCursorMove,
+ ui::kCursorNorthEastResize,
+ ui::kCursorSouthWestResize,
+ ui::kCursorSouthEastResize,
+ ui::kCursorNorthWestResize,
+ ui::kCursorNorthResize,
+ ui::kCursorSouthResize,
+ ui::kCursorEastResize,
+ ui::kCursorWestResize,
+ ui::kCursorIBeam,
+ ui::kCursorAlias,
+ ui::kCursorCell,
+ ui::kCursorContextMenu,
+ ui::kCursorCross,
+ ui::kCursorHelp,
+ ui::kCursorVerticalText,
+ ui::kCursorZoomIn,
+ ui::kCursorZoomOut,
+ ui::kCursorRowResize,
+ ui::kCursorColumnResize,
+ ui::kCursorEastWestResize,
+ ui::kCursorNorthSouthResize,
+ ui::kCursorNorthEastSouthWestResize,
+ ui::kCursorNorthWestSouthEastResize,
+ ui::kCursorGrab,
+ ui::kCursorGrabbing,
+};
+
+const int kAnimatedCursorIds[] = {
+ ui::kCursorWait,
+ ui::kCursorProgress
+};
+
+ImageCursors::ImageCursors() : scale_(1.f), cursor_set_(ui::CURSOR_SET_NORMAL) {
+}
+
+ImageCursors::~ImageCursors() {
+}
+
+gfx::Display ImageCursors::GetDisplay() const {
+ if (!cursor_loader_) {
+ NOTREACHED();
+ // Returning default on release build as it's not serious enough to crash
+ // even if this ever happens.
+ return gfx::Display();
+ }
+ return cursor_loader_->display();
+}
+
+bool ImageCursors::SetDisplay(const gfx::Display& display) {
+ float device_scale_factor = display.device_scale_factor();
+ if (!cursor_loader_) {
+ cursor_loader_.reset(ui::CursorLoader::Create());
+ cursor_loader_->set_scale(scale_);
+ } else if (cursor_loader_->display().rotation() == display.rotation() &&
+ cursor_loader_->display().device_scale_factor() ==
+ device_scale_factor) {
+ return false;
+ }
+
+ cursor_loader_->set_display(display);
+ ReloadCursors();
+ return true;
+}
+
+void ImageCursors::ReloadCursors() {
+ const gfx::Display& display = cursor_loader_->display();
+ float device_scale_factor = display.device_scale_factor();
+
+ cursor_loader_->UnloadAll();
+
+ for (size_t i = 0; i < arraysize(kImageCursorIds); ++i) {
+ int resource_id = -1;
+ gfx::Point hot_point;
+ bool success = ui::GetCursorDataFor(cursor_set_,
+ kImageCursorIds[i],
+ device_scale_factor,
+ &resource_id,
+ &hot_point);
+ DCHECK(success);
+ cursor_loader_->LoadImageCursor(kImageCursorIds[i], resource_id, hot_point);
+ }
+ for (size_t i = 0; i < arraysize(kAnimatedCursorIds); ++i) {
+ int resource_id = -1;
+ gfx::Point hot_point;
+ bool success = ui::GetAnimatedCursorDataFor(cursor_set_,
+ kAnimatedCursorIds[i],
+ device_scale_factor,
+ &resource_id,
+ &hot_point);
+ DCHECK(success);
+ cursor_loader_->LoadAnimatedCursor(kAnimatedCursorIds[i],
+ resource_id,
+ hot_point,
+ ui::kAnimatedCursorFrameDelayMs);
+ }
+}
+
+void ImageCursors::SetScale(float scale) {
+ if (scale < FLT_EPSILON) {
+ NOTREACHED() << "Scale must be bigger than 0.";
+ scale = 1.0f;
+ }
+
+ scale_ = scale;
+
+ if (cursor_loader_.get()) {
+ cursor_loader_->set_scale(scale);
+ ReloadCursors();
+ }
+}
+
+void ImageCursors::SetCursorSet(ui::CursorSetType cursor_set) {
+ if (cursor_set_ == cursor_set)
+ return;
+
+ cursor_set_ = cursor_set;
+
+ if (cursor_loader_.get())
+ ReloadCursors();
+}
+
+void ImageCursors::SetPlatformCursor(gfx::NativeCursor* cursor) {
+ cursor_loader_->SetPlatformCursor(cursor);
+}
+
+} // namespace ash