22#include <winpr/assert.h>
23#include <winpr/wtypes.h>
24#include <winpr/path.h>
29#include <freerdp/utils/helpers.h>
30#include <freerdp/log.h>
32#define TAG CLIENT_TAG("xfreerdp.utils")
34static const DWORD log_level = WLOG_TRACE;
36static const char* error_to_string(wLog* log, Display* display,
int error,
char* buffer,
39 WINPR_ASSERT(size <= INT32_MAX);
40 const int rc = XGetErrorText(display, error, buffer, (
int)size);
42 WLog_Print(log, WLOG_WARN,
"XGetErrorText returned %d", rc);
46WINPR_ATTR_FORMAT_ARG(6, 7)
47static
void write_log(wLog* log, DWORD level, const
char* fname, const
char* fkt,
size_t line,
48 WINPR_FORMAT_ARG const
char* fmt, ...)
50 va_list ap = WINPR_C_ARRAY_INIT;
52 WLog_PrintTextMessageVA(log, level, line, fname, fkt, fmt, ap);
56static BOOL ignore_code(
int rc,
size_t count, va_list ap)
58 for (
size_t x = 0; x < count; x++)
60 const int val = va_arg(ap,
int);
69static int write_result_log_va(wLog* log, DWORD level,
const char* fname,
const char* fkt,
70 size_t line, Display* display,
char* name,
int rc,
size_t count,
73 const BOOL ignore = ignore_code(rc, count, ap);
76 char buffer[128] = WINPR_C_ARRAY_INIT;
78 if (WLog_IsLevelActive(log, level))
80 WLog_PrintTextMessage(log, level, line, fname, fkt,
"%s returned %s", name,
81 error_to_string(log, display, rc, buffer,
sizeof(buffer)));
87static int write_result_log_expect_success(wLog* log, DWORD level,
const char* fname,
88 const char* fkt,
size_t line, Display* display,
93 va_list ap = WINPR_C_ARRAY_INIT;
94 (void)write_result_log_va(log, level, fname, fkt, line, display, name, rc, 0, ap);
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)
104 va_list ap = WINPR_C_ARRAY_INIT;
105 (void)write_result_log_va(log, level, fname, fkt, line, display, name, rc, 0, ap);
110char* Safe_XGetAtomNameEx(wLog* log, Display* display, Atom atom,
const char* varname)
112 WLog_Print(log, log_level,
"XGetAtomName(%s, 0x%08lx)", varname, atom);
114 return strdup(
"Atom_None");
115 return XGetAtomName(display, atom);
118Atom Logging_XInternAtom(wLog* log, Display* display, _Xconst
char* atom_name, Bool only_if_exists)
120 Atom atom = XInternAtom(display, atom_name, only_if_exists);
121 if (WLog_IsLevelActive(log, log_level))
123 WLog_Print(log, log_level,
"XInternAtom(%p, %s, %s) -> 0x%08" PRIx32, (
void*)display,
124 atom_name, only_if_exists ?
"True" :
"False",
125 WINPR_CXX_COMPAT_CAST(UINT32, atom));
130const char* x11_error_to_string(xfContext* xfc,
int error,
char* buffer,
size_t size)
133 return error_to_string(xfc->log, xfc->display, error, buffer, size);
136int LogDynAndXChangeProperty_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
137 Display* display, Window w, Atom property, Atom type,
int format,
138 int mode,
const unsigned char* data,
int nelements)
140 if (WLog_IsLevelActive(log, log_level))
142 char* propstr = Safe_XGetAtomName(log, display, property);
143 char* typestr = Safe_XGetAtomName(log, display, type);
144 write_log(log, log_level, file, fkt, line,
145 "XChangeProperty(%p, %lu, %s [%lu], %s [%lu], %d, %d, %p, %d)", (
void*)display, w,
146 propstr, property, typestr, type, format, mode, (
const void*)data, nelements);
150 const int rc = XChangeProperty(display, w, property, type, format, mode, data, nelements);
151 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XChangeProperty",
155int LogDynAndXDeleteProperty_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
156 Display* display, Window w, Atom property)
158 if (WLog_IsLevelActive(log, log_level))
160 char* propstr = Safe_XGetAtomName(log, display, property);
161 write_log(log, log_level, file, fkt, line,
"XDeleteProperty(%p, %lu, %s [%lu])",
162 (
void*)display, w, propstr, property);
165 const int rc = XDeleteProperty(display, w, property);
166 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XDeleteProperty",
170int LogDynAndXConvertSelection_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
171 Display* display, Atom selection, Atom target, Atom property,
172 Window requestor, Time time)
174 if (WLog_IsLevelActive(log, log_level))
176 char* selectstr = Safe_XGetAtomName(log, display, selection);
177 char* targetstr = Safe_XGetAtomName(log, display, target);
178 char* propstr = Safe_XGetAtomName(log, display, property);
179 write_log(log, log_level, file, fkt, line,
180 "XConvertSelection(%p, %s [%lu], %s [%lu], %s [%lu], %lu, %lu)", (
void*)display,
181 selectstr, selection, targetstr, target, propstr, property, requestor, time);
186 const int rc = XConvertSelection(display, selection, target, property, requestor, time);
187 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
188 "XConvertSelection", rc);
191int LogDynAndXGetWindowProperty_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
192 Display* display, Window w, Atom property,
long long_offset,
193 long long_length,
int c_delete, Atom req_type,
194 Atom* actual_type_return,
int* actual_format_return,
195 unsigned long* nitems_return,
unsigned long* bytes_after_return,
196 unsigned char** prop_return)
198 if (WLog_IsLevelActive(log, log_level))
200 char* propstr = Safe_XGetAtomName(log, display, property);
201 char* req_type_str = Safe_XGetAtomName(log, display, req_type);
203 log, log_level, file, fkt, line,
204 "XGetWindowProperty(%p, %lu, %s [%lu], %ld, %ld, %d, %s [%lu], %p, %p, %p, %p, %p)",
205 (
void*)display, w, propstr, property, long_offset, long_length, c_delete, req_type_str,
206 req_type, (
void*)actual_type_return, (
void*)actual_format_return, (
void*)nitems_return,
207 (
void*)bytes_after_return, (
void*)prop_return);
211 const int rc = XGetWindowProperty(display, w, property, long_offset, long_length, c_delete,
212 req_type, actual_type_return, actual_format_return,
213 nitems_return, bytes_after_return, prop_return);
214 return write_result_log_expect_success(log, WLOG_WARN, file, fkt, line, display,
215 "XGetWindowProperty", rc);
221 char* env = getenv(
"DESKTOP_SESSION");
222 return (env !=
nullptr && strcmp(env,
"gnome") == 0);
225BOOL run_action_script(xfContext* xfc,
const char* what,
const char* arg, fn_action_script_run fkt,
229 FILE* keyScript =
nullptr;
232 rdpSettings* settings = xfc->common.context.settings;
233 WINPR_ASSERT(settings);
237 xfc->actionScriptExists = winpr_PathFileExists(ActionScript);
239 if (!xfc->actionScriptExists)
241 WLog_DBG(TAG,
"[ActionScript] no such script '%s'", ActionScript);
246 char command[2048] = WINPR_C_ARRAY_INIT;
247 (void)sprintf_s(command,
sizeof(command),
"%s %s", ActionScript, what);
248 keyScript = popen(command,
"r");
252 WLog_ERR(TAG,
"[ActionScript] Failed to execute '%s'", command);
257 BOOL read_data = FALSE;
258 char buffer[2048] = WINPR_C_ARRAY_INIT;
259 while (fgets(buffer,
sizeof(buffer), keyScript) !=
nullptr)
261 char* end = strchr(buffer,
'\n');
267 if (!fkt(xfc, buffer, strnlen(buffer,
sizeof(buffer)), user, what, arg))
276 WLog_ERR(TAG,
"[ActionScript] No data returned from command '%s'", command);
281 const BOOL res = rc || !xfc->actionScriptExists;
283 xfc->actionScriptExists = FALSE;
287int LogDynAndXCopyArea_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
288 Display* display, Pixmap src, Window dest, GC gc,
int src_x,
int src_y,
289 unsigned int width,
unsigned int height,
int dest_x,
int dest_y)
291 if (WLog_IsLevelActive(log, log_level))
293 XWindowAttributes attr = WINPR_C_ARRAY_INIT;
294 const Status rc = XGetWindowAttributes(display, dest, &attr);
296 write_log(log, log_level, file, fkt, line,
297 "XCopyArea(%p, src: {%lu}, dest: [%d]{%lu, %lu, %d}, gc: {%p}, src_x: {%d}, "
300 "height: {%u}, dest_x: {%d}, dest_y: {%d})",
301 (
void*)display, src, rc, dest, attr.root, attr.depth, (
void*)gc, src_x, src_y,
302 width, height, dest_x, dest_y);
305 if ((width == 0) || (height == 0))
307 const DWORD lvl = WLOG_WARN;
308 if (WLog_IsLevelActive(log, lvl))
309 write_log(log, lvl, file, fkt, line,
"XCopyArea(width=%u, height=%u) !", width, height);
313 const int rc = XCopyArea(display, src, dest, gc, src_x, src_y, width, height, dest_x, dest_y);
314 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XCopyArea", rc);
317int LogDynAndXPutImage_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
318 Display* display, Drawable d, GC gc, XImage* image,
int src_x,
int src_y,
319 int dest_x,
int dest_y,
unsigned int width,
unsigned int height)
321 if (WLog_IsLevelActive(log, log_level))
323 write_log(log, log_level, file, fkt, line,
324 "XPutImage(%p, d: {%lu}, gc: {%p}, image: [%p]{%d}, src_x: {%d}, src_y: {%d}, "
326 "dest_y: {%d}, width: {%u}, "
328 (
void*)display, d, (
void*)gc, (
void*)image, image ? image->depth : -1, src_x,
329 src_y, dest_x, dest_y, width, height);
332 if ((width == 0) || (height == 0))
334 const DWORD lvl = WLOG_WARN;
335 if (WLog_IsLevelActive(log, lvl))
336 write_log(log, lvl, file, fkt, line,
"XPutImage(width=%u, height=%u) !", width, height);
340 const int rc = XPutImage(display, d, gc, image, src_x, src_y, dest_x, dest_y, width, height);
341 return write_result_log_expect_success(log, WLOG_WARN, file, fkt, line, display,
"XPutImage",
348Status LogDynAndXSendEvent_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
349 Display* display, Window w,
int propagate,
long event_mask,
352 if (WLog_IsLevelActive(log, log_level))
354 write_log(log, log_level, file, fkt, line,
355 "XSendEvent(d: {%p}, w: {%lu}, propagate: {%d}, event_mask: {%ld}, "
356 "event_send: [%p]{TODO})",
357 (
void*)display, w, propagate, event_mask, (
void*)event_send);
360 const int rc = XSendEvent(display, w, propagate, event_mask, event_send);
361 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSendEvent", rc);
364int LogDynAndXFlush_ex(wLog* log,
const char* file,
const char* fkt,
size_t line, Display* display)
366 if (WLog_IsLevelActive(log, log_level))
368 write_log(log, log_level, file, fkt, line,
"XFlush(%p)", (
void*)display);
371 const int rc = XFlush(display);
372 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XFlush", rc);
375Window LogDynAndXGetSelectionOwner_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
376 Display* display, Atom selection)
378 if (WLog_IsLevelActive(log, log_level))
380 char* selectionstr = Safe_XGetAtomName(log, display, selection);
381 write_log(log, log_level, file, fkt, line,
"XGetSelectionOwner(%p, %s)", (
void*)display,
385 return XGetSelectionOwner(display, selection);
388int LogDynAndXDestroyWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
389 Display* display, Window window)
391 if (WLog_IsLevelActive(log, log_level))
393 write_log(log, log_level, file, fkt, line,
"XDestroyWindow(%p, %lu)", (
void*)display,
396 const int rc = XDestroyWindow(display, window);
397 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XDestroyWindow",
401int LogDynAndXSync_ex(wLog* log,
const char* file,
const char* fkt,
size_t line, Display* display,
404 if (WLog_IsLevelActive(log, log_level))
406 write_log(log, log_level, file, fkt, line,
"XSync(%p, %d)", (
void*)display, discard);
408 const int rc = XSync(display, discard);
409 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSync", rc);
412int LogDynAndXChangeWindowAttributes_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
413 Display* display, Window window,
unsigned long valuemask,
414 XSetWindowAttributes* attributes)
416 if (WLog_IsLevelActive(log, log_level))
418 write_log(log, log_level, file, fkt, line,
"XChangeWindowAttributes(%p, %lu, 0x%08lu, %p)",
419 (
void*)display, window, valuemask, (
void*)attributes);
421 const int rc = XChangeWindowAttributes(display, window, valuemask, attributes);
422 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
423 "XChangeWindowAttributes", rc);
426int LogDynAndXSetTransientForHint_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
427 Display* display, Window window, Window prop_window)
429 if (WLog_IsLevelActive(log, log_level))
431 write_log(log, log_level, file, fkt, line,
"XSetTransientForHint(%p, %lu, %lu)",
432 (
void*)display, window, prop_window);
434 const int rc = XSetTransientForHint(display, window, prop_window);
435 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
436 "XSetTransientForHint", rc);
439int LogDynAndXCloseDisplay_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
442 if (WLog_IsLevelActive(log, log_level))
444 write_log(log, log_level, file, fkt, line,
"XCloseDisplay(%p)", (
void*)display);
446 const int rc = XCloseDisplay(display);
447 return write_result_log_expect_success(log, WLOG_WARN, file, fkt, line, display,
448 "XCloseDisplay", rc);
451XImage* LogDynAndXCreateImage_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
452 Display* display, Visual* visual,
unsigned int depth,
int format,
453 int offset,
char* data,
unsigned int width,
unsigned int height,
454 int bitmap_pad,
int bytes_per_line)
456 if (WLog_IsLevelActive(log, log_level))
458 write_log(log, log_level, file, fkt, line,
"XCreateImage(%p)", (
void*)display);
460 return XCreateImage(display, visual, depth, format, offset, data, width, height, bitmap_pad,
464Window LogDynAndXCreateWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
465 Display* display, Window parent,
int x,
int y,
unsigned int width,
466 unsigned int height,
unsigned int border_width,
int depth,
467 unsigned int c_class, Visual* visual,
unsigned long valuemask,
468 XSetWindowAttributes* attributes)
470 if (WLog_IsLevelActive(log, log_level))
472 write_log(log, log_level, file, fkt, line,
"XCreateWindow(%p)", (
void*)display);
474 return XCreateWindow(display, parent, x, y, width, height, border_width, depth, c_class, visual,
475 valuemask, attributes);
478GC LogDynAndXCreateGC_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
479 Display* display, Drawable d,
unsigned long valuemask, XGCValues* values)
481 if (WLog_IsLevelActive(log, log_level))
483 write_log(log, log_level, file, fkt, line,
"XCreateGC(%p)", (
void*)display);
485 return XCreateGC(display, d, valuemask, values);
488int LogDynAndXFreeGC_ex(wLog* log,
const char* file,
const char* fkt,
size_t line, Display* display,
491 if (WLog_IsLevelActive(log, log_level))
493 write_log(log, log_level, file, fkt, line,
"XFreeGC(%p)", (
void*)display);
495 const int rc = XFreeGC(display, gc);
496 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XFreeGC", rc);
499Pixmap LogDynAndXCreatePixmap_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
500 Display* display, Drawable d,
unsigned int width,
501 unsigned int height,
unsigned int depth)
503 if (WLog_IsLevelActive(log, log_level))
505 write_log(log, log_level, file, fkt, line,
"XCreatePixmap(%p, 0x%08lu, %u, %u, %u)",
506 (
void*)display, d, width, height, depth);
508 return XCreatePixmap(display, d, width, height, depth);
511int LogDynAndXFreePixmap_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
512 Display* display, Pixmap pixmap)
514 if (WLog_IsLevelActive(log, log_level))
516 write_log(log, log_level, file, fkt, line,
"XFreePixmap(%p)", (
void*)display);
518 const int rc = XFreePixmap(display, pixmap);
519 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XFreePixmap", rc);
522int LogDynAndXSetSelectionOwner_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
523 Display* display, Atom selection, Window owner, Time time)
525 if (WLog_IsLevelActive(log, log_level))
527 char* selectionstr = Safe_XGetAtomName(log, display, selection);
528 write_log(log, log_level, file, fkt, line,
"XSetSelectionOwner(%p, %s, 0x%08lu, %lu)",
529 (
void*)display, selectionstr, owner, time);
532 const int rc = XSetSelectionOwner(display, selection, owner, time);
533 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
534 "XSetSelectionOwner", rc);
537int LogDynAndXSetForeground_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
538 Display* display, GC gc,
unsigned long foreground)
540 if (WLog_IsLevelActive(log, log_level))
542 write_log(log, log_level, file, fkt, line,
"XSetForeground(%p, %p, 0x%08lu)",
543 (
void*)display, (
void*)gc, foreground);
545 const int rc = XSetForeground(display, gc, foreground);
546 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetForeground",
550int LogDynAndXMoveWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
551 Display* display, Window w,
int x,
int y)
553 if (WLog_IsLevelActive(log, log_level))
555 write_log(log, log_level, file, fkt, line,
"XMoveWindow(%p, 0x%08lu, %d, %d)",
556 (
void*)display, w, x, y);
558 const int rc = XMoveWindow(display, w, x, y);
559 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XMoveWindow", rc);
562int LogDynAndXSetFillStyle_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
563 Display* display, GC gc,
int fill_style)
565 if (WLog_IsLevelActive(log, log_level))
567 write_log(log, log_level, file, fkt, line,
"XSetFillStyle(%p, %p, %d)", (
void*)display,
568 (
void*)gc, fill_style);
570 const int rc = XSetFillStyle(display, gc, fill_style);
571 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetFillStyle",
575int LogDynAndXSetFunction_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
576 Display* display, GC gc,
int function)
578 if (WLog_IsLevelActive(log, log_level))
580 write_log(log, log_level, file, fkt, line,
"XSetFunction(%p, %p, %d)", (
void*)display,
581 (
void*)gc, function);
583 const int rc = XSetFunction(display, gc, function);
584 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetFunction",
588int LogDynAndXRaiseWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
589 Display* display, Window w)
591 if (WLog_IsLevelActive(log, log_level))
593 write_log(log, log_level, file, fkt, line,
"XRaiseWindow(%p, %lu)", (
void*)display, w);
595 const int rc = XRaiseWindow(display, w);
596 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XRaiseWindow",
600int LogDynAndXMapWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
601 Display* display, Window w)
603 if (WLog_IsLevelActive(log, log_level))
605 write_log(log, log_level, file, fkt, line,
"XMapWindow(%p, %lu)", (
void*)display, w);
607 const int rc = XMapWindow(display, w);
608 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XMapWindow", rc);
611int LogDynAndXUnmapWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
612 Display* display, Window w)
614 if (WLog_IsLevelActive(log, log_level))
616 write_log(log, log_level, file, fkt, line,
"XUnmapWindow(%p, %lu)", (
void*)display, w);
618 const int rc = XUnmapWindow(display, w);
619 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XUnmapWindow",
623int LogDynAndXMoveResizeWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
624 Display* display, Window w,
int x,
int y,
unsigned int width,
627 if (WLog_IsLevelActive(log, log_level))
629 write_log(log, log_level, file, fkt, line,
"XMoveResizeWindow(%p, %lu, %d, %d, %u, %u)",
630 (
void*)display, w, x, y, width, height);
632 const int rc = XMoveResizeWindow(display, w, x, y, width, height);
633 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
634 "XMoveResizeWindow", rc);
637Status LogDynAndXWithdrawWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
638 Display* display, Window w,
int screen_number)
640 if (WLog_IsLevelActive(log, log_level))
642 write_log(log, log_level, file, fkt, line,
"XWithdrawWindow(%p, %lu, %d)", (
void*)display,
645 const Status rc = XWithdrawWindow(display, w, screen_number);
646 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XWithdrawWindow",
650int LogDynAndXResizeWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
651 Display* display, Window w,
unsigned int width,
unsigned int height)
653 if (WLog_IsLevelActive(log, log_level))
655 write_log(log, log_level, file, fkt, line,
"XResizeWindow(%p, %lu, %u, %u)", (
void*)display,
658 const int rc = XResizeWindow(display, w, width, height);
659 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XResizeWindow",
663int LogDynAndXClearWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
664 Display* display, Window w)
666 if (WLog_IsLevelActive(log, log_level))
668 write_log(log, log_level, file, fkt, line,
"XClearWindow(%p, %lu)", (
void*)display, w);
670 const int rc = XClearWindow(display, w);
671 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XClearWindow",
675int LogDynAndXSetBackground_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
676 Display* display, GC gc,
unsigned long background)
678 if (WLog_IsLevelActive(log, log_level))
680 write_log(log, log_level, file, fkt, line,
"XSetBackground(%p, %p, %lu)", (
void*)display,
681 (
void*)gc, background);
683 const int rc = XSetBackground(display, gc, background);
684 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetBackground",
688int LogDynAndXSetClipMask_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
689 Display* display, GC gc, Pixmap pixmap)
691 if (WLog_IsLevelActive(log, log_level))
693 write_log(log, log_level, file, fkt, line,
"XSetClipMask(%p, %p, %lu)", (
void*)display,
696 const int rc = XSetClipMask(display, gc, pixmap);
697 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetClipMask",
701int LogDynAndXFillRectangle_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
702 Display* display, Window w, GC gc,
int x,
int y,
unsigned int width,
705 if (WLog_IsLevelActive(log, log_level))
707 write_log(log, log_level, file, fkt, line,
"XFillRectangle(%p, %lu, %p, %d, %d, %u, %u)",
708 (
void*)display, w, (
void*)gc, x, y, width, height);
710 const int rc = XFillRectangle(display, w, gc, x, y, width, height);
711 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XFillRectangle",
715int LogDynAndXSetRegion_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
716 Display* display, GC gc, Region r)
718 if (WLog_IsLevelActive(log, log_level))
720 write_log(log, log_level, file, fkt, line,
"XSetRegion(%p, %p, %p)", (
void*)display,
721 (
void*)gc, (
void*)r);
723 const int rc = XSetRegion(display, gc, r);
724 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetRegion", rc);
727int LogDynAndXReparentWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
728 Display* display, Window w, Window parent,
int x,
int y)
730 if (WLog_IsLevelActive(log, log_level))
732 write_log(log, log_level, file, fkt, line,
"XReparentWindow(%p, %lu, %lu, %d, %d)",
733 (
void*)display, w, parent, x, y);
735 const int rc = XReparentWindow(display, w, parent, x, y);
736 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XReparentWindow",
740char* getConfigOption(BOOL system,
const char* option)
743 WINPR_JSON* file = freerdp_GetJSONConfigFile(system,
"xfreerdp.json");
759int LogDynAndXRestackWindows_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
760 Display* display, Window* windows,
int nwindows)
762 if (WLog_IsLevelActive(log, log_level))
764 write_log(log, log_level, file, fkt, line,
"XRestackWindows(%p, %p, %d)", (
void*)display,
765 (
const void*)windows, nwindows);
767 const int rc = XRestackWindows(display, windows, nwindows);
768 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XRestackWindows",
WINPR_ATTR_NODISCARD WINPR_API WINPR_JSON * WINPR_JSON_GetObjectItemCaseSensitive(const WINPR_JSON *object, const char *string)
Same as WINPR_JSON_GetObjectItem but with case sensitive matching.
WINPR_API void WINPR_JSON_Delete(WINPR_JSON *item)
Delete a WinPR JSON wrapper object.
WINPR_ATTR_NODISCARD WINPR_API const char * WINPR_JSON_GetStringValue(WINPR_JSON *item)
Return the String value of a JSON item.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.