mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-10-26 12:27:44 +00:00 
			
		
		
		
	wayland: Add cursor-shape-v1 protocol support
This commit is contained in:
		| @@ -56,13 +56,14 @@ | ||||
| #define BTN_SIDE   (0x113) | ||||
| #define BTN_EXTRA  (0x114) | ||||
| #endif | ||||
| #include "../../events/SDL_keysym_to_scancode_c.h" | ||||
| #include "../../events/imKStoUCS.h" | ||||
| #include <errno.h> | ||||
| #include <sys/mman.h> | ||||
| #include <unistd.h> | ||||
| #include <errno.h> | ||||
| #include <xkbcommon/xkbcommon.h> | ||||
| #include <xkbcommon/xkbcommon-compose.h> | ||||
| #include "../../events/imKStoUCS.h" | ||||
| #include "../../events/SDL_keysym_to_scancode_c.h" | ||||
| #include <xkbcommon/xkbcommon.h> | ||||
| #include "cursor-shape-v1-client-protocol.h" | ||||
|  | ||||
| /* Weston uses a ratio of 10 units per scroll tick */ | ||||
| #define WAYLAND_WHEEL_AXIS_UNIT 10 | ||||
| @@ -245,6 +246,17 @@ void Wayland_RegisterTimestampListeners(struct SDL_WaylandInput *input) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void Wayland_CreateCursorShapeDevice(struct SDL_WaylandInput *input) | ||||
| { | ||||
|     SDL_VideoData *viddata = input->display; | ||||
|  | ||||
|     if (viddata->cursor_shape_manager) { | ||||
|         if (input->pointer && !input->cursor_shape) { | ||||
|             input->cursor_shape = wp_cursor_shape_manager_v1_get_pointer(viddata->cursor_shape_manager, input->pointer); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Returns SDL_TRUE if a key repeat event was due */ | ||||
| static SDL_bool keyboard_repeat_handle(SDL_WaylandKeyboardRepeat *repeat_info, Uint64 elapsed) | ||||
| { | ||||
| @@ -1696,10 +1708,17 @@ static void seat_handle_capabilities(void *data, struct wl_seat *seat, | ||||
|         input->pointer = wl_seat_get_pointer(seat); | ||||
|         SDL_memset(&input->pointer_curr_axis_info, 0, sizeof(input->pointer_curr_axis_info)); | ||||
|         input->display->pointer = input->pointer; | ||||
|  | ||||
|         Wayland_CreateCursorShapeDevice(input); | ||||
|  | ||||
|         wl_pointer_set_user_data(input->pointer, input); | ||||
|         wl_pointer_add_listener(input->pointer, &pointer_listener, | ||||
|                                 input); | ||||
|     } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) { | ||||
|         if (input->cursor_shape) { | ||||
|             wp_cursor_shape_device_v1_destroy(input->cursor_shape); | ||||
|             input->cursor_shape = NULL; | ||||
|         } | ||||
|         wl_pointer_destroy(input->pointer); | ||||
|         input->pointer = NULL; | ||||
|         input->display->pointer = NULL; | ||||
| @@ -3066,6 +3085,10 @@ void Wayland_display_destroy_input(SDL_VideoData *d) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (input->cursor_shape) { | ||||
|         wp_cursor_shape_device_v1_destroy(input->cursor_shape); | ||||
|     } | ||||
|  | ||||
|     if (input->pointer) { | ||||
|         if (wl_pointer_get_version(input->pointer) >= WL_POINTER_RELEASE_SINCE_VERSION) { | ||||
|             wl_pointer_release(input->pointer); | ||||
|   | ||||
| @@ -102,6 +102,7 @@ struct SDL_WaylandInput | ||||
|     SDL_WaylandDataDevice *data_device; | ||||
|     SDL_WaylandPrimarySelectionDevice *primary_selection_device; | ||||
|     SDL_WaylandTextInput *text_input; | ||||
|     struct wp_cursor_shape_device_v1 *cursor_shape; | ||||
|     struct zwp_relative_pointer_v1 *relative_pointer; | ||||
|     struct zwp_input_timestamps_v1 *keyboard_timestamps; | ||||
|     struct zwp_input_timestamps_v1 *pointer_timestamps; | ||||
| @@ -209,6 +210,7 @@ extern void Wayland_input_add_tablet(struct SDL_WaylandInput *input, struct SDL_ | ||||
| extern void Wayland_input_destroy_tablet(struct SDL_WaylandInput *input); | ||||
|  | ||||
| extern void Wayland_RegisterTimestampListeners(struct SDL_WaylandInput *input); | ||||
| extern void Wayland_CreateCursorShapeDevice(struct SDL_WaylandInput *input); | ||||
|  | ||||
| /* The implicit grab serial needs to be updated on: | ||||
|  * - Keyboard key down/up | ||||
|   | ||||
| @@ -41,6 +41,8 @@ | ||||
| #include "wayland-cursor.h" | ||||
| #include "SDL_waylandmouse.h" | ||||
|  | ||||
| #include "cursor-shape-v1-client-protocol.h" | ||||
|  | ||||
| #include "../../SDL_hints_c.h" | ||||
|  | ||||
| static SDL_Cursor *sys_cursors[SDL_HITTEST_RESIZE_LEFT + 1]; | ||||
| @@ -529,14 +531,19 @@ static SDL_Cursor *Wayland_CreateSystemCursor(SDL_SystemCursor id) | ||||
|             SDL_free(cursor); | ||||
|             return NULL; | ||||
|         } | ||||
|  | ||||
|         cursor->driverdata = (void *)cdata; | ||||
|  | ||||
|         cdata->surface = wl_compositor_create_surface(data->compositor); | ||||
|         wl_surface_set_user_data(cdata->surface, NULL); | ||||
|  | ||||
|         /* Note that we can't actually set any other cursor properties, as this | ||||
|         /* The surface is only necessary if the cursor shape manager is not present. | ||||
|          * | ||||
|          * Note that we can't actually set any other cursor properties, as this | ||||
|          * is output-specific. See wayland_get_system_cursor for the rest! | ||||
|          */ | ||||
|         if (!data->cursor_shape_manager) { | ||||
|             cdata->surface = wl_compositor_create_surface(data->compositor); | ||||
|             wl_surface_set_user_data(cdata->surface, NULL); | ||||
|         } | ||||
|  | ||||
|         cdata->system_cursor = id; | ||||
|     } | ||||
|  | ||||
| @@ -581,6 +588,79 @@ static void Wayland_FreeCursor(SDL_Cursor *cursor) | ||||
|     SDL_free(cursor); | ||||
| } | ||||
|  | ||||
| static void Wayland_SetSystemCursorShape(struct SDL_WaylandInput *input, SDL_SystemCursor id) | ||||
| { | ||||
|     Uint32 shape; | ||||
|  | ||||
|     switch (id) { | ||||
|     case SDL_SYSTEM_CURSOR_ARROW: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_IBEAM: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WAIT: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_WAIT; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_CROSSHAIR: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WAITARROW: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_PROGRESS; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_SIZENWSE: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NWSE_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_SIZENESW: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NESW_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_SIZEWE: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_EW_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_SIZENS: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_SIZEALL: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_SCROLL; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_NO: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_HAND: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_POINTER; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_TOPLEFT: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_TOP: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_TOPRIGHT: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_RIGHT: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_BOTTOMRIGHT: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_BOTTOM: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_BOTTOMLEFT: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE; | ||||
|         break; | ||||
|     case SDL_SYSTEM_CURSOR_WINDOW_LEFT: | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE; | ||||
|         break; | ||||
|     default: | ||||
|         SDL_assert(0); /* Should never be here... */ | ||||
|         shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT; | ||||
|     } | ||||
|  | ||||
|     wp_cursor_shape_device_v1_set_shape(input->cursor_shape, input->pointer_enter_serial, shape); | ||||
| } | ||||
|  | ||||
| static int Wayland_ShowCursor(SDL_Cursor *cursor) | ||||
| { | ||||
|     SDL_VideoDevice *vd = SDL_GetVideoDevice(); | ||||
| @@ -598,7 +678,10 @@ static int Wayland_ShowCursor(SDL_Cursor *cursor) | ||||
|  | ||||
|         /* TODO: High-DPI custom cursors? -flibit */ | ||||
|         if (!data->shm_data) { | ||||
|             if (!wayland_get_system_cursor(d, data, &scale)) { | ||||
|             if (input->cursor_shape) { | ||||
|                 Wayland_SetSystemCursorShape(input, data->system_cursor); | ||||
|                 return 0; | ||||
|             } else if (!wayland_get_system_cursor(d, data, &scale)) { | ||||
|                 return -1; | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -23,41 +23,42 @@ | ||||
|  | ||||
| #ifdef SDL_VIDEO_DRIVER_WAYLAND | ||||
|  | ||||
| #include "../../events/SDL_events_c.h" | ||||
| #include "../../core/linux/SDL_system_theme.h" | ||||
| #include "../../events/SDL_events_c.h" | ||||
|  | ||||
| #include "SDL_waylandvideo.h" | ||||
| #include "SDL_waylandevents_c.h" | ||||
| #include "SDL_waylandwindow.h" | ||||
| #include "SDL_waylandopengles.h" | ||||
| #include "SDL_waylandmouse.h" | ||||
| #include "SDL_waylandkeyboard.h" | ||||
| #include "SDL_waylandclipboard.h" | ||||
| #include "SDL_waylandvulkan.h" | ||||
| #include "SDL_waylandevents_c.h" | ||||
| #include "SDL_waylandkeyboard.h" | ||||
| #include "SDL_waylandmessagebox.h" | ||||
| #include "SDL_waylandmouse.h" | ||||
| #include "SDL_waylandopengles.h" | ||||
| #include "SDL_waylandvideo.h" | ||||
| #include "SDL_waylandvulkan.h" | ||||
| #include "SDL_waylandwindow.h" | ||||
|  | ||||
| #include <fcntl.h> | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
| #include <fcntl.h> | ||||
| #include <xkbcommon/xkbcommon.h> | ||||
|  | ||||
| #include <wayland-util.h> | ||||
|  | ||||
| #include "xdg-shell-client-protocol.h" | ||||
| #include "xdg-decoration-unstable-v1-client-protocol.h" | ||||
| #include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h" | ||||
| #include "idle-inhibit-unstable-v1-client-protocol.h" | ||||
| #include "xdg-activation-v1-client-protocol.h" | ||||
| #include "text-input-unstable-v3-client-protocol.h" | ||||
| #include "tablet-unstable-v2-client-protocol.h" | ||||
| #include "xdg-output-unstable-v1-client-protocol.h" | ||||
| #include "viewporter-client-protocol.h" | ||||
| #include "primary-selection-unstable-v1-client-protocol.h" | ||||
| #include "cursor-shape-v1-client-protocol.h" | ||||
| #include "fractional-scale-v1-client-protocol.h" | ||||
| #include "idle-inhibit-unstable-v1-client-protocol.h" | ||||
| #include "input-timestamps-unstable-v1-client-protocol.h" | ||||
| #include "relative-pointer-unstable-v1-client-protocol.h" | ||||
| #include "pointer-constraints-unstable-v1-client-protocol.h" | ||||
| #include "kde-output-order-v1-client-protocol.h" | ||||
| #include "keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h" | ||||
| #include "pointer-constraints-unstable-v1-client-protocol.h" | ||||
| #include "primary-selection-unstable-v1-client-protocol.h" | ||||
| #include "relative-pointer-unstable-v1-client-protocol.h" | ||||
| #include "tablet-unstable-v2-client-protocol.h" | ||||
| #include "text-input-unstable-v3-client-protocol.h" | ||||
| #include "viewporter-client-protocol.h" | ||||
| #include "xdg-activation-v1-client-protocol.h" | ||||
| #include "xdg-decoration-unstable-v1-client-protocol.h" | ||||
| #include "xdg-output-unstable-v1-client-protocol.h" | ||||
| #include "xdg-shell-client-protocol.h" | ||||
|  | ||||
| #ifdef HAVE_LIBDECOR_H | ||||
| #include <libdecor.h> | ||||
| @@ -200,7 +201,8 @@ error: | ||||
| static void Wayland_FlushOutputOrder(SDL_VideoData *vid) | ||||
| { | ||||
|     SDL_WaylandConnectorName *c, *tmp; | ||||
|     wl_list_for_each_safe (c, tmp, &vid->output_order, link) { | ||||
|     wl_list_for_each_safe(c, tmp, &vid->output_order, link) | ||||
|     { | ||||
|         WAYLAND_wl_list_remove(&c->link); | ||||
|         SDL_free(c); | ||||
|     } | ||||
| @@ -1072,6 +1074,11 @@ static void display_handle_global(void *data, struct wl_registry *registry, uint | ||||
|         if (d->input) { | ||||
|             Wayland_RegisterTimestampListeners(d->input); | ||||
|         } | ||||
|     } else if (SDL_strcmp(interface, "wp_cursor_shape_manager_v1") == 0) { | ||||
|         d->cursor_shape_manager = wl_registry_bind(d->registry, id, &wp_cursor_shape_manager_v1_interface, 1); | ||||
|         if (d->input) { | ||||
|             Wayland_CreateCursorShapeDevice(d->input); | ||||
|         } | ||||
|     } else if (SDL_strcmp(interface, "kde_output_order_v1") == 0) { | ||||
|         d->kde_output_order = wl_registry_bind(d->registry, id, &kde_output_order_v1_interface, 1); | ||||
|         kde_output_order_v1_add_listener(d->kde_output_order, &kde_output_order_listener, d); | ||||
| @@ -1320,6 +1327,11 @@ static void Wayland_VideoCleanup(SDL_VideoDevice *_this) | ||||
|         data->input_timestamps_manager = NULL; | ||||
|     } | ||||
|  | ||||
|     if (data->cursor_shape_manager) { | ||||
|         wp_cursor_shape_manager_v1_destroy(data->cursor_shape_manager); | ||||
|         data->cursor_shape_manager = NULL; | ||||
|     } | ||||
|  | ||||
|     if (data->kde_output_order) { | ||||
|         Wayland_FlushOutputOrder(data); | ||||
|         kde_output_order_v1_destroy(data->kde_output_order); | ||||
|   | ||||
| @@ -67,6 +67,7 @@ struct SDL_VideoData | ||||
|     } shell; | ||||
|     struct zwp_relative_pointer_manager_v1 *relative_pointer_manager; | ||||
|     struct zwp_pointer_constraints_v1 *pointer_constraints; | ||||
|     struct wp_cursor_shape_manager_v1 *cursor_shape_manager; | ||||
|     struct wl_data_device_manager *data_device_manager; | ||||
|     struct zwp_primary_selection_device_manager_v1 *primary_selection_device_manager; | ||||
|     struct zxdg_decoration_manager_v1 *decoration_manager; | ||||
|   | ||||
							
								
								
									
										147
									
								
								wayland-protocols/cursor-shape-v1.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								wayland-protocols/cursor-shape-v1.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <protocol name="cursor_shape_v1"> | ||||
|   <copyright> | ||||
|     Copyright 2018 The Chromium Authors | ||||
|     Copyright 2023 Simon Ser | ||||
|  | ||||
|     Permission is hereby granted, free of charge, to any person obtaining a | ||||
|     copy of this software and associated documentation files (the "Software"), | ||||
|     to deal in the Software without restriction, including without limitation | ||||
|     the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||||
|     and/or sell copies of the Software, and to permit persons to whom the | ||||
|     Software is furnished to do so, subject to the following conditions: | ||||
|     The above copyright notice and this permission notice (including the next | ||||
|     paragraph) shall be included in all copies or substantial portions of the | ||||
|     Software. | ||||
|     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
|     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||||
|     DEALINGS IN THE SOFTWARE. | ||||
|   </copyright> | ||||
|  | ||||
|   <interface name="wp_cursor_shape_manager_v1" version="1"> | ||||
|     <description summary="cursor shape manager"> | ||||
|       This global offers an alternative, optional way to set cursor images. This | ||||
|       new way uses enumerated cursors instead of a wl_surface like | ||||
|       wl_pointer.set_cursor does. | ||||
|  | ||||
|       Warning! The protocol described in this file is currently in the testing | ||||
|       phase. Backward compatible changes may be added together with the | ||||
|       corresponding interface version bump. Backward incompatible changes can | ||||
|       only be done by creating a new major version of the extension. | ||||
|     </description> | ||||
|  | ||||
|     <request name="destroy" type="destructor"> | ||||
|       <description summary="destroy the manager"> | ||||
|         Destroy the cursor shape manager. | ||||
|       </description> | ||||
|     </request> | ||||
|  | ||||
|     <request name="get_pointer"> | ||||
|       <description summary="manage the cursor shape of a pointer device"> | ||||
|         Obtain a wp_cursor_shape_device_v1 for a wl_pointer object. | ||||
|       </description> | ||||
|       <arg name="cursor_shape_device" type="new_id" interface="wp_cursor_shape_device_v1"/> | ||||
|       <arg name="pointer" type="object" interface="wl_pointer"/> | ||||
|     </request> | ||||
|  | ||||
|     <request name="get_tablet_tool_v2"> | ||||
|       <description summary="manage the cursor shape of a tablet tool device"> | ||||
|         Obtain a wp_cursor_shape_device_v1 for a zwp_tablet_tool_v2 object. | ||||
|       </description> | ||||
|       <arg name="cursor_shape_device" type="new_id" interface="wp_cursor_shape_device_v1"/> | ||||
|       <arg name="tablet_tool" type="object" interface="zwp_tablet_tool_v2"/> | ||||
|     </request> | ||||
|   </interface> | ||||
|  | ||||
|   <interface name="wp_cursor_shape_device_v1" version="1"> | ||||
|     <description summary="cursor shape for a device"> | ||||
|       This interface advertises the list of supported cursor shapes for a | ||||
|       device, and allows clients to set the cursor shape. | ||||
|     </description> | ||||
|  | ||||
|     <enum name="shape"> | ||||
|       <description summary="cursor shapes"> | ||||
|         This enum describes cursor shapes. | ||||
|  | ||||
|         The names are taken from the CSS W3C specification: | ||||
|         https://w3c.github.io/csswg-drafts/css-ui/#cursor | ||||
|       </description> | ||||
|       <entry name="default" value="1" summary="default cursor"/> | ||||
|       <entry name="context_menu" value="2" summary="a context menu is available for the object under the cursor"/> | ||||
|       <entry name="help" value="3" summary="help is available for the object under the cursor"/> | ||||
|       <entry name="pointer" value="4" summary="pointer that indicates a link or another interactive element"/> | ||||
|       <entry name="progress" value="5" summary="progress indicator"/> | ||||
|       <entry name="wait" value="6" summary="program is busy, user should wait"/> | ||||
|       <entry name="cell" value="7" summary="a cell or set of cells may be selected"/> | ||||
|       <entry name="crosshair" value="8" summary="simple crosshair"/> | ||||
|       <entry name="text" value="9" summary="text may be selected"/> | ||||
|       <entry name="vertical_text" value="10" summary="vertical text may be selected"/> | ||||
|       <entry name="alias" value="11" summary="drag-and-drop: alias of/shortcut to something is to be created"/> | ||||
|       <entry name="copy" value="12" summary="drag-and-drop: something is to be copied"/> | ||||
|       <entry name="move" value="13" summary="drag-and-drop: something is to be moved"/> | ||||
|       <entry name="no_drop" value="14" summary="drag-and-drop: the dragged item cannot be dropped at the current cursor location"/> | ||||
|       <entry name="not_allowed" value="15" summary="drag-and-drop: the requested action will not be carried out"/> | ||||
|       <entry name="grab" value="16" summary="drag-and-drop: something can be grabbed"/> | ||||
|       <entry name="grabbing" value="17" summary="drag-and-drop: something is being grabbed"/> | ||||
|       <entry name="e_resize" value="18" summary="resizing: the east border is to be moved"/> | ||||
|       <entry name="n_resize" value="19" summary="resizing: the north border is to be moved"/> | ||||
|       <entry name="ne_resize" value="20" summary="resizing: the north-east corner is to be moved"/> | ||||
|       <entry name="nw_resize" value="21" summary="resizing: the north-west corner is to be moved"/> | ||||
|       <entry name="s_resize" value="22" summary="resizing: the south border is to be moved"/> | ||||
|       <entry name="se_resize" value="23" summary="resizing: the south-east corner is to be moved"/> | ||||
|       <entry name="sw_resize" value="24" summary="resizing: the south-west corner is to be moved"/> | ||||
|       <entry name="w_resize" value="25" summary="resizing: the west border is to be moved"/> | ||||
|       <entry name="ew_resize" value="26" summary="resizing: the east and west borders are to be moved"/> | ||||
|       <entry name="ns_resize" value="27" summary="resizing: the north and south borders are to be moved"/> | ||||
|       <entry name="nesw_resize" value="28" summary="resizing: the north-east and south-west corners are to be moved"/> | ||||
|       <entry name="nwse_resize" value="29" summary="resizing: the north-west and south-east corners are to be moved"/> | ||||
|       <entry name="col_resize" value="30" summary="resizing: that the item/column can be resized horizontally"/> | ||||
|       <entry name="row_resize" value="31" summary="resizing: that the item/row can be resized vertically"/> | ||||
|       <entry name="all_scroll" value="32" summary="something can be scrolled in any direction"/> | ||||
|       <entry name="zoom_in" value="33" summary="something can be zoomed in"/> | ||||
|       <entry name="zoom_out" value="34" summary="something can be zoomed out"/> | ||||
|     </enum> | ||||
|  | ||||
|     <enum name="error"> | ||||
|       <entry name="invalid_shape" value="1" | ||||
|         summary="the specified shape value is invalid"/> | ||||
|     </enum> | ||||
|  | ||||
|     <request name="destroy" type="destructor"> | ||||
|       <description summary="destroy the cursor shape device"> | ||||
|         Destroy the cursor shape device. | ||||
|  | ||||
|         The device cursor shape remains unchanged. | ||||
|       </description> | ||||
|     </request> | ||||
|  | ||||
|     <request name="set_shape"> | ||||
|       <description summary="set device cursor to the shape"> | ||||
|         Sets the device cursor to the specified shape. The compositor will | ||||
|         change the cursor image based on the specified shape. | ||||
|  | ||||
|         The cursor actually changes only if the input device focus is one of | ||||
|         the requesting client's surfaces. If any, the previous cursor image | ||||
|         (surface or shape) is replaced. | ||||
|  | ||||
|         The "shape" argument must be a valid enum entry, otherwise the | ||||
|         invalid_shape protocol error is raised. | ||||
|  | ||||
|         This is similar to the wl_pointer.set_cursor and | ||||
|         zwp_tablet_tool_v2.set_cursor requests, but this request accepts a | ||||
|         shape instead of contents in the form of a surface. Clients can mix | ||||
|         set_cursor and set_shape requests. | ||||
|  | ||||
|         The serial parameter must match the latest wl_pointer.enter or | ||||
|         zwp_tablet_tool_v2.proximity_in serial number sent to the client. | ||||
|         Otherwise the request will be ignored. | ||||
|       </description> | ||||
|       <arg name="serial" type="uint" summary="serial number of the enter event"/> | ||||
|       <arg name="shape" type="uint" enum="shape"/> | ||||
|     </request> | ||||
|   </interface> | ||||
| </protocol> | ||||
		Reference in New Issue
	
	Block a user
	 Frank Praznik
					Frank Praznik