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)20WaylandZcrCursorShapes::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)30base::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)140void 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