FreeRDP
Loading...
Searching...
No Matches
sdlClip Class Reference

object that handles clipboard context for the SDL3 client More...

#include <sdl_clip.hpp>

Public Member Functions

 sdlClip (SdlContext *sdl)
 
 sdlClip (const sdlClip &)=delete
 
 sdlClip (sdlClip &&)=delete
 
sdlClipoperator= (const sdlClip &)=delete
 
sdlClipoperator= (sdlClip &&)=delete
 
bool init (CliprdrClientContext *clip)
 
bool uninit (CliprdrClientContext *clip)
 
bool handleEvent (const SDL_ClipboardEvent &ev)
 

Detailed Description

object that handles clipboard context for the SDL3 client

Definition at line 75 of file sdl_clip.hpp.

Constructor & Destructor Documentation

◆ sdlClip()

sdlClip::sdlClip ( SdlContext sdl)
explicit

Definition at line 131 of file sdl_clip.cpp.

132 : _sdl(sdl), _file(cliprdr_file_context_new(this)), _log(WLog_Get(TAG)),
133 _system(ClipboardCreate()), _event(CreateEventA(nullptr, TRUE, FALSE, nullptr)),
134 _uuid(sdl::utils::generate_uuid_v4())
135{
136 WINPR_ASSERT(sdl);
137
138 std::stringstream ss;
139 ss << s_mime_freerdp_update << "-" << _uuid;
140 _mime_uuid = ss.str();
141
142 std::ignore = cliprdr_file_context_set_locally_available(_file, TRUE);
143}

◆ ~sdlClip()

sdlClip::~sdlClip ( )
virtual

Definition at line 145 of file sdl_clip.cpp.

146{
147 cliprdr_file_context_free(_file);
148 ClipboardDestroy(_system);
149 std::ignore = CloseHandle(_event);
150}

Member Function Documentation

◆ handleEvent()

bool sdlClip::handleEvent ( const SDL_ClipboardEvent &  ev)

Definition at line 188 of file sdl_clip.cpp.

189{
190 if (!_ctx || !_sync || ev.owner)
191 {
192 _last_timestamp = ev.timestamp;
193 if (!_current_mimetypes.empty())
194 {
195 _cache_data.clear();
196 auto rc =
197 SDL_SetClipboardData(sdlClip::ClipDataCb, sdlClip::ClipCleanCb, this, ev.mime_types,
198 WINPR_ASSERTING_INT_CAST(size_t, ev.num_mime_types));
199 _current_mimetypes.clear();
200 return rc;
201 }
202 return true;
203 }
204
205 if (ev.timestamp == _last_timestamp)
206 {
207 return true;
208 }
209
210 if (contains(ev.mime_types, ev.num_mime_types))
211 {
212 return true;
213 }
214
215 clearServerFormats();
216
217 std::string mime_html = s_mime_html;
218
219 std::vector<std::string> mime_bitmap = { BMP_MIME_LIST };
220 std::string mime_webp = s_mime_webp;
221 std::string mime_png = s_mime_png;
222 std::string mime_jpeg = s_mime_jpg;
223 std::string mime_tiff = s_mime_tiff;
224 std::vector<std::string> mime_images = { mime_webp, mime_png, mime_jpeg, mime_tiff };
225
226 std::vector<std::string> clientFormatNames;
227 std::vector<CLIPRDR_FORMAT> clientFormats;
228
229 size_t nformats = WINPR_ASSERTING_INT_CAST(size_t, ev.num_mime_types);
230 const char** clipboard_mime_formats = ev.mime_types;
231
232 WLog_Print(_log, WLOG_TRACE, "SDL has %" PRIuz " formats", nformats);
233
234 bool textPushed = false;
235 bool imgPushed = false;
236 bool filePushed = false;
237
238 for (size_t i = 0; i < nformats; i++)
239 {
240 std::string local_mime = clipboard_mime_formats[i];
241 WLog_Print(_log, WLOG_TRACE, " - %s", local_mime.c_str());
242
243 if (std::find(s_mime_text().begin(), s_mime_text().end(), local_mime) !=
244 s_mime_text().end())
245 {
246 /* text formats */
247 if (!textPushed)
248 {
249 clientFormats.push_back({ CF_TEXT, nullptr });
250 clientFormats.push_back({ CF_OEMTEXT, nullptr });
251 clientFormats.push_back({ CF_UNICODETEXT, nullptr });
252 textPushed = true;
253 }
254 }
255 else if (local_mime == mime_html)
256 /* html */
257 clientFormatNames.emplace_back(s_type_HtmlFormat);
258 else if ((std::find(mime_bitmap.begin(), mime_bitmap.end(), local_mime) !=
259 mime_bitmap.end()) ||
260 (std::find(mime_images.begin(), mime_images.end(), local_mime) !=
261 mime_images.end()))
262 {
263 /* image formats */
264 if (!imgPushed)
265 {
266 clientFormats.push_back({ CF_DIB, nullptr });
267#if defined(WINPR_UTILS_IMAGE_DIBv5)
268 clientFormats.push_back({ CF_DIBV5, nullptr });
269#endif
270
271 for (auto& bmp : mime_bitmap)
272 clientFormatNames.push_back(bmp);
273
274 for (auto& img : mime_images)
275 clientFormatNames.push_back(img);
276
277 clientFormatNames.emplace_back(s_type_HtmlFormat);
278 imgPushed = true;
279 }
280 }
281 else if (mime_is_file(local_mime))
282 {
283 if (!filePushed)
284 {
285 clientFormatNames.emplace_back(s_type_FileGroupDescriptorW);
286 filePushed = true;
287 }
288 }
289 }
290
291 for (auto& name : clientFormatNames)
292 {
293 clientFormats.push_back({ ClipboardRegisterFormat(_system, name.c_str()), name.data() });
294 }
295
296 std::sort(clientFormats.begin(), clientFormats.end(),
297 [](const auto& a, const auto& b) { return a < b; });
298 auto u = std::unique(clientFormats.begin(), clientFormats.end());
299 clientFormats.erase(u, clientFormats.end());
300
301 const CLIPRDR_FORMAT_LIST formatList = {
302 { CB_FORMAT_LIST, 0, 0 },
303 static_cast<UINT32>(clientFormats.size()),
304 clientFormats.data(),
305 };
306
307 WLog_Print(_log, WLOG_TRACE,
308 "-------------- client format list [%" PRIu32 "] ------------------",
309 formatList.numFormats);
310 for (UINT32 x = 0; x < formatList.numFormats; x++)
311 {
312 auto format = &formatList.formats[x];
313 WLog_Print(_log, WLOG_TRACE, "client announces %" PRIu32 " [%s][%s]", format->formatId,
314 ClipboardGetFormatIdString(format->formatId), format->formatName);
315 }
316
317 if (cliprdr_file_context_notify_new_client_format_list(_file) != CHANNEL_RC_OK)
318 return false;
319
320 WINPR_ASSERT(_ctx);
321 WINPR_ASSERT(_ctx->ClientFormatList);
322 return _ctx->ClientFormatList(_ctx, &formatList) == CHANNEL_RC_OK;
323}

◆ init()

bool sdlClip::init ( CliprdrClientContext *  clip)

Definition at line 152 of file sdl_clip.cpp.

153{
154 WINPR_ASSERT(clip);
155 _ctx = clip;
156 clip->custom = this;
157 _ctx->MonitorReady = sdlClip::MonitorReady;
158 _ctx->ServerCapabilities = sdlClip::ReceiveServerCapabilities;
159 _ctx->ServerFormatList = sdlClip::ReceiveServerFormatList;
160 _ctx->ServerFormatListResponse = sdlClip::ReceiveFormatListResponse;
161 _ctx->ServerFormatDataRequest = sdlClip::ReceiveFormatDataRequest;
162 _ctx->ServerFormatDataResponse = sdlClip::ReceiveFormatDataResponse;
163
164 return cliprdr_file_context_init(_file, _ctx);
165}

◆ uninit()

bool sdlClip::uninit ( CliprdrClientContext *  clip)

Definition at line 167 of file sdl_clip.cpp.

168{
169 WINPR_ASSERT(clip);
170 if (!cliprdr_file_context_uninit(_file, _ctx))
171 return false;
172 _ctx = nullptr;
173 clip->custom = nullptr;
174 return true;
175}

The documentation for this class was generated from the following files: