diff options
Diffstat (limited to 'chromium/ash/wm/image_cursors.cc')
-rw-r--r-- | chromium/ash/wm/image_cursors.cc | 152 |
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 |