1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ash/wm/image_cursors.h"
7 #include "base/logging.h"
8 #include "ui/base/cursor/cursor_loader.h"
9 #include "ui/base/cursor/cursor.h"
10 #include "ui/gfx/point.h"
11 #include "grit/ash_resources.h"
12 #include "grit/ui_resources.h"
16 const int kAnimatedCursorFrameDelayMs
= 25;
30 // TODO(oshima): Remove this comment (http://crbug.com/141586).
31 // The cursor's hot points are defined in chromeos cursor images at:
32 // http://folder/kuscher/projects/Chrome_OS/Pointers/focuspoint
33 const CursorData kImageCursors
[] = {
34 {ui::kCursorNull
, IDR_AURA_CURSOR_PTR
, {4, 4}, {8, 9}},
35 {ui::kCursorPointer
, IDR_AURA_CURSOR_PTR
, {4, 4}, {8, 9}},
36 {ui::kCursorNoDrop
, IDR_AURA_CURSOR_NO_DROP
, {4, 4}, {8, 9}},
37 {ui::kCursorNotAllowed
, IDR_AURA_CURSOR_NO_DROP
, {4, 4}, {8, 9}},
38 {ui::kCursorCopy
, IDR_AURA_CURSOR_COPY
, {4, 4}, {8, 9}},
39 {ui::kCursorHand
, IDR_AURA_CURSOR_HAND
, {9, 4}, {19, 8}},
40 {ui::kCursorMove
, IDR_AURA_CURSOR_MOVE
, {11, 11}, {23, 23}},
41 {ui::kCursorNorthEastResize
, IDR_AURA_CURSOR_NORTH_EAST_RESIZE
,
43 {ui::kCursorSouthWestResize
, IDR_AURA_CURSOR_SOUTH_WEST_RESIZE
,
45 {ui::kCursorSouthEastResize
, IDR_AURA_CURSOR_SOUTH_EAST_RESIZE
,
47 {ui::kCursorNorthWestResize
, IDR_AURA_CURSOR_NORTH_WEST_RESIZE
,
49 {ui::kCursorNorthResize
, IDR_AURA_CURSOR_NORTH_RESIZE
, {11, 12}, {23, 23}},
50 {ui::kCursorSouthResize
, IDR_AURA_CURSOR_SOUTH_RESIZE
, {11, 12}, {23, 23}},
51 {ui::kCursorEastResize
, IDR_AURA_CURSOR_EAST_RESIZE
, {12, 11}, {25, 23}},
52 {ui::kCursorWestResize
, IDR_AURA_CURSOR_WEST_RESIZE
, {12, 11}, {25, 23}},
53 {ui::kCursorIBeam
, IDR_AURA_CURSOR_IBEAM
, {12, 12}, {24, 25}},
54 {ui::kCursorAlias
, IDR_AURA_CURSOR_ALIAS
, {8, 6}, {15, 11}},
55 {ui::kCursorCell
, IDR_AURA_CURSOR_CELL
, {11, 11}, {24, 23}},
56 {ui::kCursorContextMenu
, IDR_AURA_CURSOR_CONTEXT_MENU
, {4, 4}, {8, 9}},
57 {ui::kCursorCross
, IDR_AURA_CURSOR_CROSSHAIR
, {12, 12}, {25, 23}},
58 {ui::kCursorHelp
, IDR_AURA_CURSOR_HELP
, {4, 4}, {8, 9}},
59 {ui::kCursorVerticalText
, IDR_AURA_CURSOR_XTERM_HORIZ
, {12, 11}, {26, 23}},
60 {ui::kCursorZoomIn
, IDR_AURA_CURSOR_ZOOM_IN
, {10, 10}, {20, 20}},
61 {ui::kCursorZoomOut
, IDR_AURA_CURSOR_ZOOM_OUT
, {10, 10}, {20, 20}},
62 {ui::kCursorRowResize
, IDR_AURA_CURSOR_ROW_RESIZE
, {11, 12}, {23, 23}},
63 {ui::kCursorColumnResize
, IDR_AURA_CURSOR_COL_RESIZE
, {12, 11}, {25, 23}},
64 {ui::kCursorEastWestResize
, IDR_AURA_CURSOR_EAST_WEST_RESIZE
,
66 {ui::kCursorNorthSouthResize
, IDR_AURA_CURSOR_NORTH_SOUTH_RESIZE
,
68 {ui::kCursorNorthEastSouthWestResize
,
69 IDR_AURA_CURSOR_NORTH_EAST_SOUTH_WEST_RESIZE
, {12, 11}, {25, 23}},
70 {ui::kCursorNorthWestSouthEastResize
,
71 IDR_AURA_CURSOR_NORTH_WEST_SOUTH_EAST_RESIZE
, {11, 11}, {24, 23}},
72 {ui::kCursorGrab
, IDR_AURA_CURSOR_GRAB
, {8, 5}, {16, 10}},
73 {ui::kCursorGrabbing
, IDR_AURA_CURSOR_GRABBING
, {9, 9}, {18, 18}},
76 const CursorData kAnimatedCursors
[] = {
77 {ui::kCursorWait
, IDR_THROBBER
, {7, 7}, {14, 14}},
78 {ui::kCursorProgress
, IDR_THROBBER
, {7, 7}, {14, 14}},
85 ImageCursors::ImageCursors() {
88 ImageCursors::~ImageCursors() {
91 float ImageCursors::GetDeviceScaleFactor() const {
92 if (!cursor_loader_
.get()) {
94 // Returning 1.0f on release build as it's not serious enough to crash
95 // even if this ever happens.
98 return cursor_loader_
->device_scale_factor();
101 bool ImageCursors::SetDeviceScaleFactor(float device_scale_factor
) {
102 if (!cursor_loader_
.get())
103 cursor_loader_
.reset(ui::CursorLoader::Create());
104 else if (GetDeviceScaleFactor() == device_scale_factor
)
107 cursor_loader_
->UnloadAll();
108 cursor_loader_
->set_device_scale_factor(device_scale_factor
);
110 for (size_t i
= 0; i
< arraysize(kImageCursors
); ++i
) {
111 const HotPoint
& hot
= device_scale_factor
== 1.0f
?
112 kImageCursors
[i
].hot_1x
: kImageCursors
[i
].hot_2x
;
113 cursor_loader_
->LoadImageCursor(kImageCursors
[i
].id
,
114 kImageCursors
[i
].resource_id
,
115 gfx::Point(hot
.x
, hot
.y
));
117 for (size_t i
= 0; i
< arraysize(kAnimatedCursors
); ++i
) {
118 const HotPoint
& hot
= device_scale_factor
== 1.0f
?
119 kAnimatedCursors
[i
].hot_1x
: kAnimatedCursors
[i
].hot_2x
;
120 cursor_loader_
->LoadAnimatedCursor(kAnimatedCursors
[i
].id
,
121 kAnimatedCursors
[i
].resource_id
,
122 gfx::Point(hot
.x
, hot
.y
),
123 kAnimatedCursorFrameDelayMs
);
128 void ImageCursors::SetPlatformCursor(gfx::NativeCursor
* cursor
) {
129 cursor_loader_
->SetPlatformCursor(cursor
);