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);
60static void wlf_Pointer_Free(rdpContext* context, rdpPointer* pointer)
62 wlfPointer* ptr = (wlfPointer*)pointer;
63 WINPR_UNUSED(context);
66 winpr_aligned_free(ptr->data);
69static BOOL wlf_Pointer_Set(rdpContext* context, rdpPointer* pointer)
72 wlfPointer* ptr = (wlfPointer*)pointer;
75 UwacReturnCode rc = UWAC_ERROR_INTERNAL;
79 if (!wlf || !wlf->seat)
82 UINT32 x = pointer->xPos;
83 UINT32 y = pointer->yPos;
84 UINT32 w = pointer->width;
85 UINT32 h = pointer->height;
87 if (!wlf_scale_coordinates(context, &x, &y, FALSE) ||
88 !wlf_scale_coordinates(context, &w, &h, FALSE))
99 area.right = (UINT16)pointer->width;
100 area.bottom = (UINT16)pointer->height;
102 if (!wlf_copy_image(ptr->data, 4ULL * pointer->width, pointer->width, pointer->height, data,
103 4ULL * w, w, h, &area,
107 rc = UwacSeatSetMouseCursor(wlf->seat, data, size, w, h, x, y);
109 if (rc == UWAC_SUCCESS)
117static BOOL wlf_Pointer_SetNull(rdpContext* context)
121 if (!wlf || !wlf->seat)
124 if (UwacSeatSetMouseCursor(wlf->seat, NULL, 0, 0, 0, 0, 0) != UWAC_SUCCESS)
130static BOOL wlf_Pointer_SetDefault(rdpContext* context)
134 if (!wlf || !wlf->seat)
137 if (UwacSeatSetMouseCursor(wlf->seat, NULL, 1, 0, 0, 0, 0) != UWAC_SUCCESS)
143static BOOL wlf_Pointer_SetPosition(WINPR_ATTR_UNUSED rdpContext* context,
144 WINPR_ATTR_UNUSED UINT32 x, WINPR_ATTR_UNUSED UINT32 y)
147 WLog_ERR(TAG,
"TODO: implement");
151BOOL wlf_register_pointer(rdpGraphics* graphics)
153 rdpPointer pointer = { 0 };
155 pointer.size =
sizeof(wlfPointer);
156 pointer.New = wlf_Pointer_New;
157 pointer.Free = wlf_Pointer_Free;
158 pointer.Set = wlf_Pointer_Set;
159 pointer.SetNull = wlf_Pointer_SetNull;
160 pointer.SetDefault = wlf_Pointer_SetDefault;
161 pointer.SetPosition = wlf_Pointer_SetPosition;
162 graphics_register_pointer(graphics, &pointer);
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.