1 // Copyright 2020 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.
4 
5 #include "ui/ozone/platform/wayland/host/wayland_zcr_cursor_shapes.h"
6 
7 #include <cursor-shapes-unstable-v1-client-protocol.h>
8 
9 #include "base/check.h"
10 #include "base/optional.h"
11 #include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
12 #include "ui/gfx/native_widget_types.h"
13 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
14 #include "ui/ozone/platform/wayland/host/wayland_pointer.h"
15 
16 namespace ui {
17 
18 using mojom::CursorType;
19 
WaylandZcrCursorShapes(zcr_cursor_shapes_v1 * zcr_cursor_shapes,WaylandConnection * connection)20 WaylandZcrCursorShapes::WaylandZcrCursorShapes(
21     zcr_cursor_shapes_v1* zcr_cursor_shapes,
22     WaylandConnection* connection)
23     : zcr_cursor_shapes_v1_(zcr_cursor_shapes), connection_(connection) {
24   // |zcr_cursor_shapes_v1_| and |connection_| may be null in tests.
25 }
26 
27 WaylandZcrCursorShapes::~WaylandZcrCursorShapes() = default;
28 
29 // static
ShapeFromType(CursorType type)30 base::Optional<int32_t> WaylandZcrCursorShapes::ShapeFromType(CursorType type) {
31   switch (type) {
32     case CursorType::kNull:
33       // kNull is an alias for kPointer. Fall through.
34     case CursorType::kPointer:
35       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_POINTER;
36     case CursorType::kCross:
37       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_CROSS;
38     case CursorType::kHand:
39       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_HAND;
40     case CursorType::kIBeam:
41       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_IBEAM;
42     case CursorType::kWait:
43       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_WAIT;
44     case CursorType::kHelp:
45       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_HELP;
46     case CursorType::kEastResize:
47       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_EAST_RESIZE;
48     case CursorType::kNorthResize:
49       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_RESIZE;
50     case CursorType::kNorthEastResize:
51       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_EAST_RESIZE;
52     case CursorType::kNorthWestResize:
53       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_WEST_RESIZE;
54     case CursorType::kSouthResize:
55       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_RESIZE;
56     case CursorType::kSouthEastResize:
57       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_EAST_RESIZE;
58     case CursorType::kSouthWestResize:
59       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_WEST_RESIZE;
60     case CursorType::kWestResize:
61       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_WEST_RESIZE;
62     case CursorType::kNorthSouthResize:
63       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_SOUTH_RESIZE;
64     case CursorType::kEastWestResize:
65       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_EAST_WEST_RESIZE;
66     case CursorType::kNorthEastSouthWestResize:
67       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_EAST_SOUTH_WEST_RESIZE;
68     case CursorType::kNorthWestSouthEastResize:
69       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_WEST_SOUTH_EAST_RESIZE;
70     case CursorType::kColumnResize:
71       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_COLUMN_RESIZE;
72     case CursorType::kRowResize:
73       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ROW_RESIZE;
74     case CursorType::kMiddlePanning:
75       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_MIDDLE_PANNING;
76     case CursorType::kEastPanning:
77       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_EAST_PANNING;
78     case CursorType::kNorthPanning:
79       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_PANNING;
80     case CursorType::kNorthEastPanning:
81       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_EAST_PANNING;
82     case CursorType::kNorthWestPanning:
83       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NORTH_WEST_PANNING;
84     case CursorType::kSouthPanning:
85       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_PANNING;
86     case CursorType::kSouthEastPanning:
87       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_EAST_PANNING;
88     case CursorType::kSouthWestPanning:
89       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_SOUTH_WEST_PANNING;
90     case CursorType::kWestPanning:
91       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_WEST_PANNING;
92     case CursorType::kMove:
93       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_MOVE;
94     case CursorType::kVerticalText:
95       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_VERTICAL_TEXT;
96     case CursorType::kCell:
97       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_CELL;
98     case CursorType::kContextMenu:
99       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_CONTEXT_MENU;
100     case CursorType::kAlias:
101       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ALIAS;
102     case CursorType::kProgress:
103       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_PROGRESS;
104     case CursorType::kNoDrop:
105       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NO_DROP;
106     case CursorType::kCopy:
107       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_COPY;
108     case CursorType::kNone:
109       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NONE;
110     case CursorType::kNotAllowed:
111       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_NOT_ALLOWED;
112     case CursorType::kZoomIn:
113       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ZOOM_IN;
114     case CursorType::kZoomOut:
115       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_ZOOM_OUT;
116     case CursorType::kGrab:
117       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_GRAB;
118     case CursorType::kGrabbing:
119       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_GRABBING;
120     case CursorType::kMiddlePanningVertical:
121     case CursorType::kMiddlePanningHorizontal:
122       // Not supported by this API.
123       return base::nullopt;
124     case CursorType::kCustom:
125       // Custom means a bitmap cursor, which can't use the shape API.
126       return base::nullopt;
127     case CursorType::kDndNone:
128       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_NONE;
129     case CursorType::kDndMove:
130       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_MOVE;
131     case CursorType::kDndCopy:
132       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_COPY;
133     case CursorType::kDndLink:
134       return ZCR_CURSOR_SHAPES_V1_CURSOR_SHAPE_TYPE_DND_LINK;
135       // NOTE: If you add a new cursor shape, please also update
136       // UseDefaultCursorForType() in bitmap_cursor_factory_ozone.cc.
137   }
138 }
139 
SetCursorShape(int32_t shape)140 void WaylandZcrCursorShapes::SetCursorShape(int32_t shape) {
141   // Nothing to do if there's no pointer (mouse) connected.
142   if (!connection_->pointer())
143     return;
144   zcr_cursor_shapes_v1_set_cursor_shape(
145       zcr_cursor_shapes_v1_.get(), connection_->pointer()->wl_object(), shape);
146 }
147 
148 }  // namespace ui
149