22#include <winpr/assert.h>
23#include <winpr/wtypes.h>
24#include <winpr/path.h>
29#include <freerdp/log.h>
31#define TAG CLIENT_TAG("xfreerdp.utils")
33static const DWORD log_level = WLOG_TRACE;
35static const char* error_to_string(wLog* log, Display* display,
int error,
char* buffer,
38 WINPR_ASSERT(size <= INT32_MAX);
39 const int rc = XGetErrorText(display, error, buffer, (
int)size);
41 WLog_Print(log, WLOG_WARN,
"XGetErrorText returned %d", rc);
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, ...)
51 WLog_PrintTextMessageVA(log, level, line, fname, fkt, fmt, ap);
55static BOOL ignore_code(
int rc,
size_t count, va_list ap)
57 for (
size_t x = 0; x < count; x++)
59 const int val = va_arg(ap,
int);
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,
72 const BOOL ignore = ignore_code(rc, count, ap);
75 char buffer[128] = { 0 };
77 if (WLog_IsLevelActive(log, level))
79 WLog_PrintTextMessage(log, level, line, fname, fkt,
"%s returned %s", name,
80 error_to_string(log, display, rc, buffer,
sizeof(buffer)));
86static int write_result_log_expect_success(wLog* log, DWORD level,
const char* fname,
87 const char* fkt,
size_t line, Display* display,
93 (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)
105 (void)write_result_log_va(log, level, fname, fkt, line, display, name, rc, 0, ap);
111char* Safe_XGetAtomNameEx(wLog* log, Display* display, Atom atom,
const char* varname)
113 WLog_Print(log, log_level,
"XGetAtomName(%s, 0x%08lx)", varname, atom);
115 return strdup(
"Atom_None");
116 return XGetAtomName(display, atom);
119Atom Logging_XInternAtom(wLog* log, Display* display, _Xconst
char* atom_name, Bool only_if_exists)
121 Atom atom = XInternAtom(display, atom_name, only_if_exists);
122 if (WLog_IsLevelActive(log, log_level))
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));
131const char* x11_error_to_string(xfContext* xfc,
int error,
char* buffer,
size_t size)
134 return error_to_string(xfc->log, xfc->display, error, buffer, size);
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)
141 if (WLog_IsLevelActive(log, log_level))
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);
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",
156int LogDynAndXDeleteProperty_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
157 Display* display, Window w, Atom property)
159 if (WLog_IsLevelActive(log, log_level))
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);
166 const int rc = XDeleteProperty(display, w, property);
167 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XDeleteProperty",
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)
175 if (WLog_IsLevelActive(log, log_level))
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);
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);
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)
199 if (WLog_IsLevelActive(log, log_level))
201 char* propstr = Safe_XGetAtomName(log, display, property);
202 char* req_type_str = Safe_XGetAtomName(log, display, req_type);
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);
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);
222 char* env = getenv(
"DESKTOP_SESSION");
223 return (env != NULL && strcmp(env,
"gnome") == 0);
226BOOL run_action_script(xfContext* xfc,
const char* what,
const char* arg, fn_action_script_run fkt,
230 FILE* keyScript = NULL;
233 rdpSettings* settings = xfc->common.context.settings;
234 WINPR_ASSERT(settings);
238 xfc->actionScriptExists = winpr_PathFileExists(ActionScript);
240 if (!xfc->actionScriptExists)
242 WLog_DBG(TAG,
"[ActionScript] no such script '%s'", ActionScript);
246 char command[2048] = { 0 };
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);
256 BOOL read_data = FALSE;
257 char buffer[2048] = { 0 };
258 while (fgets(buffer,
sizeof(buffer), keyScript) != NULL)
260 char* context = NULL;
261 (void)strtok_s(buffer,
"\n", &context);
265 if (!fkt(xfc, buffer, strnlen(buffer,
sizeof(buffer)), user, what, arg))
273 WLog_ERR(TAG,
"[ActionScript] No data returned from command '%s'", command);
277 const BOOL res = rc || !xfc->actionScriptExists;
279 xfc->actionScriptExists = FALSE;
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)
287 if (WLog_IsLevelActive(log, log_level))
289 XWindowAttributes attr = { 0 };
290 const Status rc = XGetWindowAttributes(display, dest, &attr);
292 write_log(log, log_level, file, fkt, line,
293 "XCopyArea(%p, src: {%lu}, dest: [%d]{%lu, %lu, %d}, gc: {%p}, src_x: {%d}, "
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);
301 if ((width == 0) || (height == 0))
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);
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);
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)
317 if (WLog_IsLevelActive(log, log_level))
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}, "
322 "dest_y: {%d}, width: {%u}, "
324 (
void*)display, d, (
void*)gc, (
void*)image, image ? image->depth : -1, src_x,
325 src_y, dest_x, dest_y, width, height);
328 if ((width == 0) || (height == 0))
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);
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",
344Status LogDynAndXSendEvent_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
345 Display* display, Window w,
int propagate,
long event_mask,
348 if (WLog_IsLevelActive(log, log_level))
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);
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);
360int LogDynAndXFlush_ex(wLog* log,
const char* file,
const char* fkt,
size_t line, Display* display)
362 if (WLog_IsLevelActive(log, log_level))
364 write_log(log, log_level, file, fkt, line,
"XFlush(%p)", (
void*)display);
367 const int rc = XFlush(display);
368 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XFlush", rc);
371Window LogDynAndXGetSelectionOwner_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
372 Display* display, Atom selection)
374 if (WLog_IsLevelActive(log, log_level))
376 char* selectionstr = Safe_XGetAtomName(log, display, selection);
377 write_log(log, log_level, file, fkt, line,
"XGetSelectionOwner(%p, %s)", (
void*)display,
381 return XGetSelectionOwner(display, selection);
384int LogDynAndXDestroyWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
385 Display* display, Window window)
387 if (WLog_IsLevelActive(log, log_level))
389 write_log(log, log_level, file, fkt, line,
"XDestroyWindow(%p, %lu)", (
void*)display,
392 const int rc = XDestroyWindow(display, window);
393 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XDestroyWindow",
397int LogDynAndXSync_ex(wLog* log,
const char* file,
const char* fkt,
size_t line, Display* display,
400 if (WLog_IsLevelActive(log, log_level))
402 write_log(log, log_level, file, fkt, line,
"XSync(%p, %d)", (
void*)display, discard);
404 const int rc = XSync(display, discard);
405 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSync", rc);
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)
412 if (WLog_IsLevelActive(log, log_level))
414 write_log(log, log_level, file, fkt, line,
"XChangeWindowAttributes(%p, %lu, 0x%08lu, %p)",
415 (
void*)display, window, valuemask, (
void*)attributes);
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);
422int LogDynAndXSetTransientForHint_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
423 Display* display, Window window, Window prop_window)
425 if (WLog_IsLevelActive(log, log_level))
427 write_log(log, log_level, file, fkt, line,
"XSetTransientForHint(%p, %lu, %lu)",
428 (
void*)display, window, prop_window);
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);
435int LogDynAndXCloseDisplay_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
438 if (WLog_IsLevelActive(log, log_level))
440 write_log(log, log_level, file, fkt, line,
"XCloseDisplay(%p)", (
void*)display);
442 const int rc = XCloseDisplay(display);
443 return write_result_log_expect_success(log, WLOG_WARN, file, fkt, line, display,
444 "XCloseDisplay", rc);
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)
452 if (WLog_IsLevelActive(log, log_level))
454 write_log(log, log_level, file, fkt, line,
"XCreateImage(%p)", (
void*)display);
456 return XCreateImage(display, visual, depth, format, offset, data, width, height, bitmap_pad,
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)
466 if (WLog_IsLevelActive(log, log_level))
468 write_log(log, log_level, file, fkt, line,
"XCreateWindow(%p)", (
void*)display);
470 return XCreateWindow(display, parent, x, y, width, height, border_width, depth,
class, visual,
471 valuemask, attributes);
474GC LogDynAndXCreateGC_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
475 Display* display, Drawable d,
unsigned long valuemask, XGCValues* values)
477 if (WLog_IsLevelActive(log, log_level))
479 write_log(log, log_level, file, fkt, line,
"XCreateGC(%p)", (
void*)display);
481 return XCreateGC(display, d, valuemask, values);
484int LogDynAndXFreeGC_ex(wLog* log,
const char* file,
const char* fkt,
size_t line, Display* display,
487 if (WLog_IsLevelActive(log, log_level))
489 write_log(log, log_level, file, fkt, line,
"XFreeGC(%p)", (
void*)display);
491 const int rc = XFreeGC(display, gc);
492 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XFreeGC", rc);
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)
499 if (WLog_IsLevelActive(log, log_level))
501 write_log(log, log_level, file, fkt, line,
"XCreatePixmap(%p, 0x%08lu, %u, %u, %u)",
502 (
void*)display, d, width, height, depth);
504 return XCreatePixmap(display, d, width, height, depth);
507int LogDynAndXFreePixmap_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
508 Display* display, Pixmap pixmap)
510 if (WLog_IsLevelActive(log, log_level))
512 write_log(log, log_level, file, fkt, line,
"XFreePixmap(%p)", (
void*)display);
514 const int rc = XFreePixmap(display, pixmap);
515 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XFreePixmap", rc);
518int LogDynAndXSetSelectionOwner_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
519 Display* display, Atom selection, Window owner, Time time)
521 if (WLog_IsLevelActive(log, log_level))
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);
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);
533int LogDynAndXSetForeground_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
534 Display* display, GC gc,
unsigned long foreground)
536 if (WLog_IsLevelActive(log, log_level))
538 write_log(log, log_level, file, fkt, line,
"XSetForeground(%p, %p, 0x%08lu)",
539 (
void*)display, (
void*)gc, foreground);
541 const int rc = XSetForeground(display, gc, foreground);
542 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetForeground",
546int LogDynAndXMoveWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
547 Display* display, Window w,
int x,
int y)
549 if (WLog_IsLevelActive(log, log_level))
551 write_log(log, log_level, file, fkt, line,
"XMoveWindow(%p, 0x%08lu, %d, %d)",
552 (
void*)display, w, x, y);
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);
558int LogDynAndXSetFillStyle_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
559 Display* display, GC gc,
int fill_style)
561 if (WLog_IsLevelActive(log, log_level))
563 write_log(log, log_level, file, fkt, line,
"XSetFillStyle(%p, %p, %d)", (
void*)display,
564 (
void*)gc, fill_style);
566 const int rc = XSetFillStyle(display, gc, fill_style);
567 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetFillStyle",
571int LogDynAndXSetFunction_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
572 Display* display, GC gc,
int function)
574 if (WLog_IsLevelActive(log, log_level))
576 write_log(log, log_level, file, fkt, line,
"XSetFunction(%p, %p, %d)", (
void*)display,
577 (
void*)gc, function);
579 const int rc = XSetFunction(display, gc, function);
580 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetFunction",
584int LogDynAndXRaiseWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
585 Display* display, Window w)
587 if (WLog_IsLevelActive(log, log_level))
589 write_log(log, log_level, file, fkt, line,
"XRaiseWindow(%p, %lu)", (
void*)display, w);
591 const int rc = XRaiseWindow(display, w);
592 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XRaiseWindow",
596int LogDynAndXMapWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
597 Display* display, Window w)
599 if (WLog_IsLevelActive(log, log_level))
601 write_log(log, log_level, file, fkt, line,
"XMapWindow(%p, %lu)", (
void*)display, w);
603 const int rc = XMapWindow(display, w);
604 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XMapWindow", rc);
607int LogDynAndXUnmapWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
608 Display* display, Window w)
610 if (WLog_IsLevelActive(log, log_level))
612 write_log(log, log_level, file, fkt, line,
"XUnmapWindow(%p, %lu)", (
void*)display, w);
614 const int rc = XUnmapWindow(display, w);
615 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XUnmapWindow",
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,
623 if (WLog_IsLevelActive(log, log_level))
625 write_log(log, log_level, file, fkt, line,
"XMoveResizeWindow(%p, %lu, %d, %d, %u, %u)",
626 (
void*)display, w, x, y, width, height);
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);
633Status LogDynAndXWithdrawWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
634 Display* display, Window w,
int screen_number)
636 if (WLog_IsLevelActive(log, log_level))
638 write_log(log, log_level, file, fkt, line,
"XWithdrawWindow(%p, %lu, %d)", (
void*)display,
641 const Status rc = XWithdrawWindow(display, w, screen_number);
642 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XWithdrawWindow",
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)
649 if (WLog_IsLevelActive(log, log_level))
651 write_log(log, log_level, file, fkt, line,
"XResizeWindow(%p, %lu, %u, %u)", (
void*)display,
654 const int rc = XResizeWindow(display, w, width, height);
655 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XResizeWindow",
659int LogDynAndXClearWindow_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
660 Display* display, Window w)
662 if (WLog_IsLevelActive(log, log_level))
664 write_log(log, log_level, file, fkt, line,
"XClearWindow(%p, %lu)", (
void*)display, w);
666 const int rc = XClearWindow(display, w);
667 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XClearWindow",
671int LogDynAndXSetBackground_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
672 Display* display, GC gc,
unsigned long background)
674 if (WLog_IsLevelActive(log, log_level))
676 write_log(log, log_level, file, fkt, line,
"XSetBackground(%p, %p, %lu)", (
void*)display,
677 (
void*)gc, background);
679 const int rc = XSetBackground(display, gc, background);
680 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetBackground",
684int LogDynAndXSetClipMask_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
685 Display* display, GC gc, Pixmap pixmap)
687 if (WLog_IsLevelActive(log, log_level))
689 write_log(log, log_level, file, fkt, line,
"XSetClipMask(%p, %p, %lu)", (
void*)display,
692 const int rc = XSetClipMask(display, gc, pixmap);
693 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetClipMask",
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,
701 if (WLog_IsLevelActive(log, log_level))
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);
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",
711int LogDynAndXSetRegion_ex(wLog* log,
const char* file,
const char* fkt,
size_t line,
712 Display* display, GC gc, Region r)
714 if (WLog_IsLevelActive(log, log_level))
716 write_log(log, log_level, file, fkt, line,
"XSetRegion(%p, %p, %p)", (
void*)display,
717 (
void*)gc, (
void*)r);
719 const int rc = XSetRegion(display, gc, r);
720 return write_result_log_expect_one(log, WLOG_WARN, file, fkt, line, display,
"XSetRegion", rc);
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)
726 if (WLog_IsLevelActive(log, log_level))
728 write_log(log, log_level, file, fkt, line,
"XReparentWindow(%p, %lu, %lu, %d, %d)",
729 (
void*)display, w, parent, x, y);
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",
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.