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 return FALSE;
55 }
56
57 return TRUE;
58}
59
60static void wlf_Pointer_Free(rdpContext* context, rdpPointer* pointer)
61{
62 wlfPointer* ptr = (wlfPointer*)pointer;
63 WINPR_UNUSED(context);
64
65 if (ptr)
66 winpr_aligned_free(ptr->data);
67}
68
69static BOOL wlf_Pointer_Set(rdpContext* context, rdpPointer* pointer)
70{
71 wlfContext* wlf = (wlfContext*)context;
72 wlfPointer* ptr = (wlfPointer*)pointer;
73 void* data = NULL;
74 size_t size = 0;
75 UwacReturnCode rc = UWAC_ERROR_INTERNAL;
76 BOOL res = FALSE;
77 RECTANGLE_16 area;
78
79 if (!wlf || !wlf->seat)
80 return FALSE;
81
82 UINT32 x = pointer->xPos;
83 UINT32 y = pointer->yPos;
84 UINT32 w = pointer->width;
85 UINT32 h = pointer->height;
86
87 if (!wlf_scale_coordinates(context, &x, &y, FALSE) ||
88 !wlf_scale_coordinates(context, &w, &h, FALSE))
89 return FALSE;
90
91 size = 4ULL * w * h;
92 data = malloc(size);
93
94 if (!data)
95 return FALSE;
96
97 area.top = 0;
98 area.left = 0;
99 area.right = (UINT16)pointer->width;
100 area.bottom = (UINT16)pointer->height;
101
102 if (!wlf_copy_image(ptr->data, 4ULL * pointer->width, pointer->width, pointer->height, data,
103 4ULL * w, w, h, &area,
104 freerdp_settings_get_bool(context->settings, FreeRDP_SmartSizing)))
105 goto fail;
106
107 rc = UwacSeatSetMouseCursor(wlf->seat, data, size, w, h, x, y);
108
109 if (rc == UWAC_SUCCESS)
110 res = TRUE;
111
112fail:
113 free(data);
114 return res;
115}
116
117static BOOL wlf_Pointer_SetNull(rdpContext* context)
118{
119 wlfContext* wlf = (wlfContext*)context;
120
121 if (!wlf || !wlf->seat)
122 return FALSE;
123
124 if (UwacSeatSetMouseCursor(wlf->seat, NULL, 0, 0, 0, 0, 0) != UWAC_SUCCESS)
125 return FALSE;
126
127 return TRUE;
128}
129
130static BOOL wlf_Pointer_SetDefault(rdpContext* context)
131{
132 wlfContext* wlf = (wlfContext*)context;
133
134 if (!wlf || !wlf->seat)
135 return FALSE;
136
137 if (UwacSeatSetMouseCursor(wlf->seat, NULL, 1, 0, 0, 0, 0) != UWAC_SUCCESS)
138 return FALSE;
139
140 return TRUE;
141}
142
143static BOOL wlf_Pointer_SetPosition(WINPR_ATTR_UNUSED rdpContext* context,
144 WINPR_ATTR_UNUSED UINT32 x, WINPR_ATTR_UNUSED UINT32 y)
145{
146 // TODO
147 WLog_ERR(TAG, "TODO: implement");
148 return TRUE;
149}
150
151BOOL wlf_register_pointer(rdpGraphics* graphics)
152{
153 rdpPointer pointer = { 0 };
154
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);
163 return TRUE;
164}
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.