21#include <freerdp/config.h>
23#include "wlf_pointer.h"
26#define TAG CLIENT_TAG("wayland.pointer")
35static BOOL wlf_Pointer_New(rdpContext* context, rdpPointer* pointer)
37 wlfPointer* ptr = (wlfPointer*)pointer;
42 ptr->size = 4ULL * pointer->width * pointer->height;
43 ptr->data = winpr_aligned_malloc(ptr->size, 16);
48 if (!freerdp_image_copy_from_pointer_data(
49 ptr->data, PIXEL_FORMAT_BGRA32, 0, 0, 0, pointer->width, pointer->height,
50 pointer->xorMaskData, pointer->lengthXorMask, pointer->andMaskData,
51 pointer->lengthAndMask, pointer->xorBpp, &context->gdi->palette))
53 winpr_aligned_free(ptr->data);
61static void wlf_Pointer_Free(rdpContext* context, rdpPointer* pointer)
63 wlfPointer* ptr = (wlfPointer*)pointer;
64 WINPR_UNUSED(context);
67 winpr_aligned_free(ptr->data);
70static BOOL wlf_Pointer_Set(rdpContext* context, rdpPointer* pointer)
73 wlfPointer* ptr = (wlfPointer*)pointer;
76 UwacReturnCode rc = UWAC_ERROR_INTERNAL;
80 if (!wlf || !wlf->seat)
83 UINT32 x = pointer->xPos;
84 UINT32 y = pointer->yPos;
85 UINT32 w = pointer->width;
86 UINT32 h = pointer->height;
88 if (!wlf_scale_coordinates(context, &x, &y, FALSE) ||
89 !wlf_scale_coordinates(context, &w, &h, FALSE))
100 area.right = (UINT16)pointer->width;
101 area.bottom = (UINT16)pointer->height;
103 if (!wlf_copy_image(ptr->data, 4ULL * pointer->width, pointer->width, pointer->height, data,
104 4ULL * w, w, h, &area,
108 rc = UwacSeatSetMouseCursor(wlf->seat, data, size, w, h, x, y);
110 if (rc == UWAC_SUCCESS)
118static BOOL wlf_Pointer_SetNull(rdpContext* context)
122 if (!wlf || !wlf->seat)
125 if (UwacSeatSetMouseCursor(wlf->seat,
nullptr, 0, 0, 0, 0, 0) != UWAC_SUCCESS)
131static BOOL wlf_Pointer_SetDefault(rdpContext* context)
135 if (!wlf || !wlf->seat)
138 if (UwacSeatSetMouseCursor(wlf->seat,
nullptr, 1, 0, 0, 0, 0) != UWAC_SUCCESS)
144static BOOL wlf_Pointer_SetPosition(WINPR_ATTR_UNUSED rdpContext* context,
145 WINPR_ATTR_UNUSED UINT32 x, WINPR_ATTR_UNUSED UINT32 y)
148 WLog_ERR(TAG,
"TODO: implement");
152BOOL wlf_register_pointer(rdpGraphics* graphics)
154 rdpPointer pointer = WINPR_C_ARRAY_INIT;
156 pointer.size =
sizeof(wlfPointer);
157 pointer.New = wlf_Pointer_New;
158 pointer.Free = wlf_Pointer_Free;
159 pointer.Set = wlf_Pointer_Set;
160 pointer.SetNull = wlf_Pointer_SetNull;
161 pointer.SetDefault = wlf_Pointer_SetDefault;
162 pointer.SetPosition = wlf_Pointer_SetPosition;
163 graphics_register_pointer(graphics, &pointer);
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.