FreeRDP
Loading...
Searching...
No Matches
xf_utils.c
1
21#include <string.h>
22#include <winpr/assert.h>
23#include <winpr/wtypes.h>
24#include <winpr/path.h>
25
26#include "xf_utils.h"
27#include "xfreerdp.h"
28
29#include <freerdp/log.h>
30
31#define TAG CLIENT_TAG("xfreerdp.utils")
32
33static const DWORD log_level = WLOG_TRACE;
34
35static const char* error_to_string(wLog* log, Display* display, int error, char* buffer,
36 size_t size)
37{
38 WINPR_ASSERT(size <= INT32_MAX);
39 const int rc = XGetErrorText(display, error, buffer, (int)size);
40 if (rc != Success)
41 WLog_Print(log, WLOG_WARN, "XGetErrorText returned %d", rc);
42 return buffer;
43}
44
45WINPR_ATTR_FORMAT_ARG(6, 7)
46static void write_log(wLog* log, DWORD level, const char* fname, const char* fkt, size_t line,
47 WINPR_FORMAT_ARG const char* fmt, ...)
48{
49 va_list ap = { 0 };
50 va_start(ap, fmt);
51 WLog_PrintTextMessageVA(log, level, line, fname, fkt, fmt, ap);
52 va_end(ap);
53}
54
55static BOOL ignore_code(int rc, size_t count, va_list ap)
56{
57 for (size_t x = 0; x < count; x++)
58 {
59 const int val = va_arg(ap, int);
60 if (rc == val)
61 return TRUE;
62 }
63 return FALSE;
64}
65
66/* libx11 return codes are not really well documented, so checked against
67 * https://gitlab.freedesktop.org/xorg/lib/libx11.git */
68static int write_result_log_va(wLog* log, DWORD level, const char* fname, const char* fkt,
69 size_t line, Display* display, char* name, int rc, size_t count,
70 va_list ap)
71{
72 const BOOL ignore = ignore_code(rc, count, ap);
73 if (!ignore)
74 {
75 char buffer[128] = { 0 };
76
77 if (WLog_IsLevelActive(log, level))
78 {
79 WLog_PrintTextMessage(log, level, line, fname, fkt, "%s returned %s", name,
80 error_to_string(log, display, rc, buffer, sizeof(buffer)));
81 }
82 }
83 return rc;
84}
85
86static int write_result_log_expect_success(wLog* log, DWORD level, const char* fname,
87 const char* fkt, size_t line, Display* display,
88 char* name, int rc)
89{
90 if (rc != Success)
91 {
92 va_list ap;
93 (void)write_result_log_va(log, level, fname, fkt, line, display, name, rc, 0, ap);
94 va_end(ap);
95 }
96 return rc;
97}
98
99static int write_result_log_expect_one(wLog* log, DWORD level, const char* fname, const char* fkt,
100 size_t line, Display* display, char* name, int rc)
101{
102 if (rc != 1)
103 {
104 va_list ap;
105 (void)write_result_log_va(log, level, fname, fkt, line, display, name, rc, 0, ap);
106 va_end(ap);
107 }
108 return rc;
109}
110
111char* Safe_XGetAtomNameEx(wLog* log, Display* display, Atom atom, const char* varname)
112{
113 WLog_Print(log, log_level, "XGetAtomName(%s, 0x%08lx)", varname, atom);
114 if (atom == None)
115 return strdup("Atom_None");
116 return XGetAtomName(display, atom);
117}
118
119Atom Logging_XInternAtom(wLog* log, Display* display, _Xconst char* atom_name, Bool only_if_exists)
120{
121 Atom atom = XInternAtom(display, atom_name, only_if_exists);
122 if (WLog_IsLevelActive(log, log_level))
123 {
124 WLog_Print(log, log_level, "XInternAtom(%p, %s, %s) -> 0x%08" PRIx32, (void*)display,
125 atom_name, only_if_exists ? "True" : "False",
126 WINPR_CXX_COMPAT_CAST(UINT32, atom));
127 }
128 return atom;
129}
130
131const char* x11_error_to_string(xfContext* xfc, int error, char* buffer, size_t size)
132{
133 WINPR_ASSERT(xfc);
134 return error_to_string(xfc->log, xfc->display, error, buffer, size);
135}
136
137int LogDynAndXChangeProperty_ex(wLog* log, const char* file, const char* fkt, size_t line,
138 Display* display, Window w, Atom property, Atom type, int format,
139 int mode, const unsigned char* data, int nelements)
140{
141 if (WLog_IsLevelActive(log, log_level))
142 {
143 char* propstr = Safe_XGetAtomName(log, display, property);
144 char* typestr = Safe_XGetAtomName(log, display, type);
145 write_log(log, log_level, file, fkt, line,
146 "XChangeProperty(%p, %lu, %s [%lu], %s [%lu], %d, %d, %p, %d)", (void*)display, w,
147 propstr, property, typestr, type, format, mode, (const void*)data, nelements);
148 XFree(propstr);
149 XFree(typestr);
150 }
151 const int rc = XChangeProperty(display, w, property, type, format, mode, data, nelements);
152 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XChangeProperty",
153 rc);
154}
155
156int LogDynAndXDeleteProperty_ex(wLog* log, const char* file, const char* fkt, size_t line,
157 Display* display, Window w, Atom property)
158{
159 if (WLog_IsLevelActive(log, log_level))
160 {
161 char* propstr = Safe_XGetAtomName(log, display, property);
162 write_log(log, log_level, file, fkt, line, "XDeleteProperty(%p, %lu, %s [%lu])",
163 (void*)display, w, propstr, property);
164 XFree(propstr);
165 }
166 const int rc = XDeleteProperty(display, w, property);
167 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XDeleteProperty",
168 rc);
169}
170
171int LogDynAndXConvertSelection_ex(wLog* log, const char* file, const char* fkt, size_t line,
172 Display* display, Atom selection, Atom target, Atom property,
173 Window requestor, Time time)
174{
175 if (WLog_IsLevelActive(log, log_level))
176 {
177 char* selectstr = Safe_XGetAtomName(log, display, selection);
178 char* targetstr = Safe_XGetAtomName(log, display, target);
179 char* propstr = Safe_XGetAtomName(log, display, property);
180 write_log(log, log_level, file, fkt, line,
181 "XConvertSelection(%p, %s [%lu], %s [%lu], %s [%lu], %lu, %lu)", (void*)display,
182 selectstr, selection, targetstr, target, propstr, property, requestor, time);
183 XFree(propstr);
184 XFree(targetstr);
185 XFree(selectstr);
186 }
187 const int rc = XConvertSelection(display, selection, target, property, requestor, time);
188 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
189 "XConvertSelection", rc);
190}
191
192int LogDynAndXGetWindowProperty_ex(wLog* log, const char* file, const char* fkt, size_t line,
193 Display* display, Window w, Atom property, long long_offset,
194 long long_length, int delete, Atom req_type,
195 Atom* actual_type_return, int* actual_format_return,
196 unsigned long* nitems_return, unsigned long* bytes_after_return,
197 unsigned char** prop_return)
198{
199 if (WLog_IsLevelActive(log, log_level))
200 {
201 char* propstr = Safe_XGetAtomName(log, display, property);
202 char* req_type_str = Safe_XGetAtomName(log, display, req_type);
203 write_log(
204 log, log_level, file, fkt, line,
205 "XGetWindowProperty(%p, %lu, %s [%lu], %ld, %ld, %d, %s [%lu], %p, %p, %p, %p, %p)",
206 (void*)display, w, propstr, property, long_offset, long_length, delete, req_type_str,
207 req_type, (void*)actual_type_return, (void*)actual_format_return, (void*)nitems_return,
208 (void*)bytes_after_return, (void*)prop_return);
209 XFree(propstr);
210 XFree(req_type_str);
211 }
212 const int rc = XGetWindowProperty(display, w, property, long_offset, long_length, delete,
213 req_type, actual_type_return, actual_format_return,
214 nitems_return, bytes_after_return, prop_return);
215 return write_result_log_expect_success(log, WLOG_WARN, file, fkt, line, display,
216 "XGetWindowProperty", rc);
217}
218
219BOOL IsGnome(void)
220{
221 // NOLINTNEXTLINE(concurrency-mt-unsafe)
222 char* env = getenv("DESKTOP_SESSION");
223 return (env != NULL && strcmp(env, "gnome") == 0);
224}
225
226BOOL run_action_script(xfContext* xfc, const char* what, const char* arg, fn_action_script_run fkt,
227 void* user)
228{
229 BOOL rc = FALSE;
230 FILE* keyScript = NULL;
231 WINPR_ASSERT(xfc);
232
233 rdpSettings* settings = xfc->common.context.settings;
234 WINPR_ASSERT(settings);
235
236 const char* ActionScript = freerdp_settings_get_string(settings, FreeRDP_ActionScript);
237
238 xfc->actionScriptExists = winpr_PathFileExists(ActionScript);
239
240 if (!xfc->actionScriptExists)
241 {
242 WLog_DBG(TAG, "[ActionScript] no such script '%s'", ActionScript);
243 goto fail;
244 }
245
246 char command[2048] = { 0 };
247 (void)sprintf_s(command, sizeof(command), "%s %s", ActionScript, what);
248 keyScript = popen(command, "r");
249
250 if (!keyScript)
251 {
252 WLog_ERR(TAG, "[ActionScript] Failed to execute '%s'", command);
253 goto fail;
254 }
255
256 BOOL read_data = FALSE;
257 char buffer[2048] = { 0 };
258 while (fgets(buffer, sizeof(buffer), keyScript) != NULL)
259 {
260 char* context = NULL;
261 (void)strtok_s(buffer, "\n", &context);
262
263 if (fkt)
264 {
265 if (!fkt(xfc, buffer, strnlen(buffer, sizeof(buffer)), user, what, arg))
266 goto fail;
267 }
268 read_data = TRUE;
269 }
270
271 rc = read_data;
272 if (!rc)
273 WLog_ERR(TAG, "[ActionScript] No data returned from command '%s'", command);
274fail:
275 if (keyScript)
276 pclose(keyScript);
277 const BOOL res = rc || !xfc->actionScriptExists;
278 if (!rc)
279 xfc->actionScriptExists = FALSE;
280 return res;
281}
282
283int LogDynAndXCopyArea_ex(wLog* log, const char* file, const char* fkt, size_t line,
284 Display* display, Pixmap src, Window dest, GC gc, int src_x, int src_y,
285 unsigned int width, unsigned int height, int dest_x, int dest_y)
286{
287 if (WLog_IsLevelActive(log, log_level))
288 {
289 XWindowAttributes attr = { 0 };
290 const Status rc = XGetWindowAttributes(display, dest, &attr);
291
292 write_log(log, log_level, file, fkt, line,
293 "XCopyArea(%p, src: {%lu}, dest: [%d]{%lu, %lu, %d}, gc: {%p}, src_x: {%d}, "
294 "src_y: {%d}, "
295 "width: {%u}, "
296 "height: {%u}, dest_x: {%d}, dest_y: {%d})",
297 (void*)display, src, rc, dest, attr.root, attr.depth, (void*)gc, src_x, src_y,
298 width, height, dest_x, dest_y);
299 }
300
301 if ((width == 0) || (height == 0))
302 {
303 const DWORD lvl = WLOG_WARN;
304 if (WLog_IsLevelActive(log, lvl))
305 write_log(log, lvl, file, fkt, line, "XCopyArea(width=%u, height=%u) !", width, height);
306 return Success;
307 }
308
309 const int rc = XCopyArea(display, src, dest, gc, src_x, src_y, width, height, dest_x, dest_y);
310 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XCopyArea", rc);
311}
312
313int LogDynAndXPutImage_ex(wLog* log, const char* file, const char* fkt, size_t line,
314 Display* display, Drawable d, GC gc, XImage* image, int src_x, int src_y,
315 int dest_x, int dest_y, unsigned int width, unsigned int height)
316{
317 if (WLog_IsLevelActive(log, log_level))
318 {
319 write_log(log, log_level, file, fkt, line,
320 "XPutImage(%p, d: {%lu}, gc: {%p}, image: [%p]{%d}, src_x: {%d}, src_y: {%d}, "
321 "dest_x: {%d}, "
322 "dest_y: {%d}, width: {%u}, "
323 "height: {%u})",
324 (void*)display, d, (void*)gc, (void*)image, image ? image->depth : -1, src_x,
325 src_y, dest_x, dest_y, width, height);
326 }
327
328 if ((width == 0) || (height == 0))
329 {
330 const DWORD lvl = WLOG_WARN;
331 if (WLog_IsLevelActive(log, lvl))
332 write_log(log, lvl, file, fkt, line, "XPutImage(width=%u, height=%u) !", width, height);
333 return Success;
334 }
335
336 const int rc = XPutImage(display, d, gc, image, src_x, src_y, dest_x, dest_y, width, height);
337 return write_result_log_expect_success(log, WLOG_WARN, file, fkt, line, display, "XPutImage",
338 rc);
339}
340
341/* be careful here.
342 * XSendEvent returns Status, but implementation always returns 1
343 */
344Status LogDynAndXSendEvent_ex(wLog* log, const char* file, const char* fkt, size_t line,
345 Display* display, Window w, int propagate, long event_mask,
346 XEvent* event_send)
347{
348 if (WLog_IsLevelActive(log, log_level))
349 {
350 write_log(log, log_level, file, fkt, line,
351 "XSendEvent(d: {%p}, w: {%lu}, propagate: {%d}, event_mask: {%ld}, "
352 "event_send: [%p]{TODO})",
353 (void*)display, w, propagate, event_mask, (void*)event_send);
354 }
355
356 const int rc = XSendEvent(display, w, propagate, event_mask, event_send);
357 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSendEvent", rc);
358}
359
360int LogDynAndXFlush_ex(wLog* log, const char* file, const char* fkt, size_t line, Display* display)
361{
362 if (WLog_IsLevelActive(log, log_level))
363 {
364 write_log(log, log_level, file, fkt, line, "XFlush(%p)", (void*)display);
365 }
366
367 const int rc = XFlush(display);
368 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XFlush", rc);
369}
370
371Window LogDynAndXGetSelectionOwner_ex(wLog* log, const char* file, const char* fkt, size_t line,
372 Display* display, Atom selection)
373{
374 if (WLog_IsLevelActive(log, log_level))
375 {
376 char* selectionstr = Safe_XGetAtomName(log, display, selection);
377 write_log(log, log_level, file, fkt, line, "XGetSelectionOwner(%p, %s)", (void*)display,
378 selectionstr);
379 XFree(selectionstr);
380 }
381 return XGetSelectionOwner(display, selection);
382}
383
384int LogDynAndXDestroyWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
385 Display* display, Window window)
386{
387 if (WLog_IsLevelActive(log, log_level))
388 {
389 write_log(log, log_level, file, fkt, line, "XDestroyWindow(%p, %lu)", (void*)display,
390 window);
391 }
392 const int rc = XDestroyWindow(display, window);
393 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XDestroyWindow",
394 rc);
395}
396
397int LogDynAndXSync_ex(wLog* log, const char* file, const char* fkt, size_t line, Display* display,
398 Bool discard)
399{
400 if (WLog_IsLevelActive(log, log_level))
401 {
402 write_log(log, log_level, file, fkt, line, "XSync(%p, %d)", (void*)display, discard);
403 }
404 const int rc = XSync(display, discard);
405 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSync", rc);
406}
407
408int LogDynAndXChangeWindowAttributes_ex(wLog* log, const char* file, const char* fkt, size_t line,
409 Display* display, Window window, unsigned long valuemask,
410 XSetWindowAttributes* attributes)
411{
412 if (WLog_IsLevelActive(log, log_level))
413 {
414 write_log(log, log_level, file, fkt, line, "XChangeWindowAttributes(%p, %lu, 0x%08lu, %p)",
415 (void*)display, window, valuemask, (void*)attributes);
416 }
417 const int rc = XChangeWindowAttributes(display, window, valuemask, attributes);
418 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
419 "XChangeWindowAttributes", rc);
420}
421
422int LogDynAndXSetTransientForHint_ex(wLog* log, const char* file, const char* fkt, size_t line,
423 Display* display, Window window, Window prop_window)
424{
425 if (WLog_IsLevelActive(log, log_level))
426 {
427 write_log(log, log_level, file, fkt, line, "XSetTransientForHint(%p, %lu, %lu)",
428 (void*)display, window, prop_window);
429 }
430 const int rc = XSetTransientForHint(display, window, prop_window);
431 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
432 "XSetTransientForHint", rc);
433}
434
435int LogDynAndXCloseDisplay_ex(wLog* log, const char* file, const char* fkt, size_t line,
436 Display* display)
437{
438 if (WLog_IsLevelActive(log, log_level))
439 {
440 write_log(log, log_level, file, fkt, line, "XCloseDisplay(%p)", (void*)display);
441 }
442 const int rc = XCloseDisplay(display);
443 return write_result_log_expect_success(log, WLOG_WARN, file, fkt, line, display,
444 "XCloseDisplay", rc);
445}
446
447XImage* LogDynAndXCreateImage_ex(wLog* log, const char* file, const char* fkt, size_t line,
448 Display* display, Visual* visual, unsigned int depth, int format,
449 int offset, char* data, unsigned int width, unsigned int height,
450 int bitmap_pad, int bytes_per_line)
451{
452 if (WLog_IsLevelActive(log, log_level))
453 {
454 write_log(log, log_level, file, fkt, line, "XCreateImage(%p)", (void*)display);
455 }
456 return XCreateImage(display, visual, depth, format, offset, data, width, height, bitmap_pad,
457 bytes_per_line);
458}
459
460Window LogDynAndXCreateWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
461 Display* display, Window parent, int x, int y, unsigned int width,
462 unsigned int height, unsigned int border_width, int depth,
463 unsigned int class, Visual* visual, unsigned long valuemask,
464 XSetWindowAttributes* attributes)
465{
466 if (WLog_IsLevelActive(log, log_level))
467 {
468 write_log(log, log_level, file, fkt, line, "XCreateWindow(%p)", (void*)display);
469 }
470 return XCreateWindow(display, parent, x, y, width, height, border_width, depth, class, visual,
471 valuemask, attributes);
472}
473
474GC LogDynAndXCreateGC_ex(wLog* log, const char* file, const char* fkt, size_t line,
475 Display* display, Drawable d, unsigned long valuemask, XGCValues* values)
476{
477 if (WLog_IsLevelActive(log, log_level))
478 {
479 write_log(log, log_level, file, fkt, line, "XCreateGC(%p)", (void*)display);
480 }
481 return XCreateGC(display, d, valuemask, values);
482}
483
484int LogDynAndXFreeGC_ex(wLog* log, const char* file, const char* fkt, size_t line, Display* display,
485 GC gc)
486{
487 if (WLog_IsLevelActive(log, log_level))
488 {
489 write_log(log, log_level, file, fkt, line, "XFreeGC(%p)", (void*)display);
490 }
491 const int rc = XFreeGC(display, gc);
492 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XFreeGC", rc);
493}
494
495Pixmap LogDynAndXCreatePixmap_ex(wLog* log, const char* file, const char* fkt, size_t line,
496 Display* display, Drawable d, unsigned int width,
497 unsigned int height, unsigned int depth)
498{
499 if (WLog_IsLevelActive(log, log_level))
500 {
501 write_log(log, log_level, file, fkt, line, "XCreatePixmap(%p, 0x%08lu, %u, %u, %u)",
502 (void*)display, d, width, height, depth);
503 }
504 return XCreatePixmap(display, d, width, height, depth);
505}
506
507int LogDynAndXFreePixmap_ex(wLog* log, const char* file, const char* fkt, size_t line,
508 Display* display, Pixmap pixmap)
509{
510 if (WLog_IsLevelActive(log, log_level))
511 {
512 write_log(log, log_level, file, fkt, line, "XFreePixmap(%p)", (void*)display);
513 }
514 const int rc = XFreePixmap(display, pixmap);
515 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XFreePixmap", rc);
516}
517
518int LogDynAndXSetSelectionOwner_ex(wLog* log, const char* file, const char* fkt, size_t line,
519 Display* display, Atom selection, Window owner, Time time)
520{
521 if (WLog_IsLevelActive(log, log_level))
522 {
523 char* selectionstr = Safe_XGetAtomName(log, display, selection);
524 write_log(log, log_level, file, fkt, line, "XSetSelectionOwner(%p, %s, 0x%08lu, %lu)",
525 (void*)display, selectionstr, owner, time);
526 XFree(selectionstr);
527 }
528 const int rc = XSetSelectionOwner(display, selection, owner, time);
529 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
530 "XSetSelectionOwner", rc);
531}
532
533int LogDynAndXSetForeground_ex(wLog* log, const char* file, const char* fkt, size_t line,
534 Display* display, GC gc, unsigned long foreground)
535{
536 if (WLog_IsLevelActive(log, log_level))
537 {
538 write_log(log, log_level, file, fkt, line, "XSetForeground(%p, %p, 0x%08lu)",
539 (void*)display, (void*)gc, foreground);
540 }
541 const int rc = XSetForeground(display, gc, foreground);
542 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSetForeground",
543 rc);
544}
545
546int LogDynAndXMoveWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
547 Display* display, Window w, int x, int y)
548{
549 if (WLog_IsLevelActive(log, log_level))
550 {
551 write_log(log, log_level, file, fkt, line, "XMoveWindow(%p, 0x%08lu, %d, %d)",
552 (void*)display, w, x, y);
553 }
554 const int rc = XMoveWindow(display, w, x, y);
555 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XMoveWindow", rc);
556}
557
558int LogDynAndXSetFillStyle_ex(wLog* log, const char* file, const char* fkt, size_t line,
559 Display* display, GC gc, int fill_style)
560{
561 if (WLog_IsLevelActive(log, log_level))
562 {
563 write_log(log, log_level, file, fkt, line, "XSetFillStyle(%p, %p, %d)", (void*)display,
564 (void*)gc, fill_style);
565 }
566 const int rc = XSetFillStyle(display, gc, fill_style);
567 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSetFillStyle",
568 rc);
569}
570
571int LogDynAndXSetFunction_ex(wLog* log, const char* file, const char* fkt, size_t line,
572 Display* display, GC gc, int function)
573{
574 if (WLog_IsLevelActive(log, log_level))
575 {
576 write_log(log, log_level, file, fkt, line, "XSetFunction(%p, %p, %d)", (void*)display,
577 (void*)gc, function);
578 }
579 const int rc = XSetFunction(display, gc, function);
580 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSetFunction",
581 rc);
582}
583
584int LogDynAndXRaiseWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
585 Display* display, Window w)
586{
587 if (WLog_IsLevelActive(log, log_level))
588 {
589 write_log(log, log_level, file, fkt, line, "XRaiseWindow(%p, %lu)", (void*)display, w);
590 }
591 const int rc = XRaiseWindow(display, w);
592 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XRaiseWindow",
593 rc);
594}
595
596int LogDynAndXMapWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
597 Display* display, Window w)
598{
599 if (WLog_IsLevelActive(log, log_level))
600 {
601 write_log(log, log_level, file, fkt, line, "XMapWindow(%p, %lu)", (void*)display, w);
602 }
603 const int rc = XMapWindow(display, w);
604 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XMapWindow", rc);
605}
606
607int LogDynAndXUnmapWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
608 Display* display, Window w)
609{
610 if (WLog_IsLevelActive(log, log_level))
611 {
612 write_log(log, log_level, file, fkt, line, "XUnmapWindow(%p, %lu)", (void*)display, w);
613 }
614 const int rc = XUnmapWindow(display, w);
615 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XUnmapWindow",
616 rc);
617}
618
619int LogDynAndXMoveResizeWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
620 Display* display, Window w, int x, int y, unsigned int width,
621 unsigned int height)
622{
623 if (WLog_IsLevelActive(log, log_level))
624 {
625 write_log(log, log_level, file, fkt, line, "XMoveResizeWindow(%p, %lu, %d, %d, %u, %u)",
626 (void*)display, w, x, y, width, height);
627 }
628 const int rc = XMoveResizeWindow(display, w, x, y, width, height);
629 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
630 "XMoveResizeWindow", rc);
631}
632
633Status LogDynAndXWithdrawWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
634 Display* display, Window w, int screen_number)
635{
636 if (WLog_IsLevelActive(log, log_level))
637 {
638 write_log(log, log_level, file, fkt, line, "XWithdrawWindow(%p, %lu, %d)", (void*)display,
639 w, screen_number);
640 }
641 const Status rc = XWithdrawWindow(display, w, screen_number);
642 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XWithdrawWindow",
643 rc);
644}
645
646int LogDynAndXResizeWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
647 Display* display, Window w, unsigned int width, unsigned int height)
648{
649 if (WLog_IsLevelActive(log, log_level))
650 {
651 write_log(log, log_level, file, fkt, line, "XResizeWindow(%p, %lu, %u, %u)", (void*)display,
652 w, width, height);
653 }
654 const int rc = XResizeWindow(display, w, width, height);
655 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XResizeWindow",
656 rc);
657}
658
659int LogDynAndXClearWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
660 Display* display, Window w)
661{
662 if (WLog_IsLevelActive(log, log_level))
663 {
664 write_log(log, log_level, file, fkt, line, "XClearWindow(%p, %lu)", (void*)display, w);
665 }
666 const int rc = XClearWindow(display, w);
667 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XClearWindow",
668 rc);
669}
670
671int LogDynAndXSetBackground_ex(wLog* log, const char* file, const char* fkt, size_t line,
672 Display* display, GC gc, unsigned long background)
673{
674 if (WLog_IsLevelActive(log, log_level))
675 {
676 write_log(log, log_level, file, fkt, line, "XSetBackground(%p, %p, %lu)", (void*)display,
677 (void*)gc, background);
678 }
679 const int rc = XSetBackground(display, gc, background);
680 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSetBackground",
681 rc);
682}
683
684int LogDynAndXSetClipMask_ex(wLog* log, const char* file, const char* fkt, size_t line,
685 Display* display, GC gc, Pixmap pixmap)
686{
687 if (WLog_IsLevelActive(log, log_level))
688 {
689 write_log(log, log_level, file, fkt, line, "XSetClipMask(%p, %p, %lu)", (void*)display,
690 (void*)gc, pixmap);
691 }
692 const int rc = XSetClipMask(display, gc, pixmap);
693 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSetClipMask",
694 rc);
695}
696
697int LogDynAndXFillRectangle_ex(wLog* log, const char* file, const char* fkt, size_t line,
698 Display* display, Window w, GC gc, int x, int y, unsigned int width,
699 unsigned int height)
700{
701 if (WLog_IsLevelActive(log, log_level))
702 {
703 write_log(log, log_level, file, fkt, line, "XFillRectangle(%p, %lu, %p, %d, %d, %u, %u)",
704 (void*)display, w, (void*)gc, x, y, width, height);
705 }
706 const int rc = XFillRectangle(display, w, gc, x, y, width, height);
707 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XFillRectangle",
708 rc);
709}
710
711int LogDynAndXSetRegion_ex(wLog* log, const char* file, const char* fkt, size_t line,
712 Display* display, GC gc, Region r)
713{
714 if (WLog_IsLevelActive(log, log_level))
715 {
716 write_log(log, log_level, file, fkt, line, "XSetRegion(%p, %p, %p)", (void*)display,
717 (void*)gc, (void*)r);
718 }
719 const int rc = XSetRegion(display, gc, r);
720 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XSetRegion", rc);
721}
722
723int LogDynAndXReparentWindow_ex(wLog* log, const char* file, const char* fkt, size_t line,
724 Display* display, Window w, Window parent, int x, int y)
725{
726 if (WLog_IsLevelActive(log, log_level))
727 {
728 write_log(log, log_level, file, fkt, line, "XReparentWindow(%p, %lu, %lu, %d, %d)",
729 (void*)display, w, parent, x, y);
730 }
731 const int rc = XReparentWindow(display, w, parent, x, y);
732 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display, "XReparentWindow",
733 rc);
734}
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.