FreeRDP
Loading...
Searching...
No Matches
wlf_pointer.c
1
21#include <freerdp/config.h>
22
23#include "wlf_pointer.h"
24#include "wlfreerdp.h"
25
26#define TAG CLIENT_TAG("wayland.pointer")
27
28typedef struct
29{
30 rdpPointer pointer;
31 size_t size;
32 void* data;
33} wlfPointer;
34
35static BOOL wlf_Pointer_New(rdpContext* context, rdpPointer* pointer)
36{
37 wlfPointer* ptr = (wlfPointer*)pointer;
38
39 if (!ptr)
40 return FALSE;
41
42 ptr->size = 4ULL * pointer->width * pointer->height;
43 ptr->data = winpr_aligned_malloc(ptr->size, 16);
44
45 if (!ptr->data)
46 return FALSE;
47
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))
52 {
53 winpr_aligned_free(ptr->data);
54 ptr->data = nullptr;
55 return FALSE;
56 }
57
58 return TRUE;
59}
60
61static void wlf_Pointer_Free(rdpContext* context, rdpPointer* pointer)
62{
63 wlfPointer* ptr = (wlfPointer*)pointer;
64 WINPR_UNUSED(context);
65
66 if (ptr)
67 winpr_aligned_free(ptr->data);
68}
69
70static BOOL wlf_Pointer_Set(rdpContext* context, rdpPointer* pointer)
71{
72 wlfContext* wlf = (wlfContext*)context;
73 wlfPointer* ptr = (wlfPointer*)pointer;
74 void* data = nullptr;
75 size_t size = 0;
76 UwacReturnCode rc = UWAC_ERROR_INTERNAL;
77 BOOL res = FALSE;
78 RECTANGLE_16 area;
79
80 if (!wlf || !wlf->seat)
81 return FALSE;
82
83 UINT32 x = pointer->xPos;
84 UINT32 y = pointer->yPos;
85 UINT32 w = pointer->width;
86 UINT32 h = pointer->height;
87
88 if (!wlf_scale_coordinates(context, &x, &y, FALSE) ||
89 !wlf_scale_coordinates(context, &w, &h, FALSE))
90 return FALSE;
91
92 size = 4ULL * w * h;
93 data = malloc(size);
94
95 if (!data)
96 return FALSE;
97
98 area.top = 0;
99 area.left = 0;
100 area.right = (UINT16)pointer->width;
101 area.bottom = (UINT16)pointer->height;
102
103 if (!wlf_copy_image(ptr->data, 4ULL * pointer->width, pointer->width, pointer->height, data,
104 4ULL * w, w, h, &area,
105 freerdp_settings_get_bool(context->settings, FreeRDP_SmartSizing)))
106 goto fail;
107
108 rc = UwacSeatSetMouseCursor(wlf->seat, data, size, w, h, x, y);
109
110 if (rc == UWAC_SUCCESS)
111 res = TRUE;
112
113fail:
114 free(data);
115 return res;
116}
117
118static BOOL wlf_Pointer_SetNull(rdpContext* context)
119{
120 wlfContext* wlf = (wlfContext*)context;
121
122 if (!wlf || !wlf->seat)
123 return FALSE;
124
125 if (UwacSeatSetMouseCursor(wlf->seat, nullptr, 0, 0, 0, 0, 0) != UWAC_SUCCESS)
126 return FALSE;
127
128 return TRUE;
129}
130
131static BOOL wlf_Pointer_SetDefault(rdpContext* context)
132{
133 wlfContext* wlf = (wlfContext*)context;
134
135 if (!wlf || !wlf->seat)
136 return FALSE;
137
138 if (UwacSeatSetMouseCursor(wlf->seat, nullptr, 1, 0, 0, 0, 0) != UWAC_SUCCESS)
139 return FALSE;
140
141 return TRUE;
142}
143
144static BOOL wlf_Pointer_SetPosition(WINPR_ATTR_UNUSED rdpContext* context,
145 WINPR_ATTR_UNUSED UINT32 x, WINPR_ATTR_UNUSED UINT32 y)
146{
147 // TODO
148 WLog_ERR(TAG, "TODO: implement");
149 return TRUE;
150}
151
152BOOL wlf_register_pointer(rdpGraphics* graphics)
153{
154 rdpPointer pointer = WINPR_C_ARRAY_INIT;
155
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);
164 return TRUE;
165}
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.