21#include <freerdp/config.h>
26#include <winpr/assert.h>
28#include <freerdp/log.h>
32#define TAG FREERDP_TAG("core.window")
34static void update_free_window_icon_info(
ICON_INFO* iconInfo);
38 WINPR_ASSERT(unicode_string);
39 free(unicode_string->string);
40 unicode_string->string =
nullptr;
41 unicode_string->length = 0;
46 WINPR_ASSERT(unicode_string);
48 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
51 const UINT16 new_len = Stream_Get_UINT16(s);
53 if (!Stream_CheckAndLogRequiredLength(TAG, s, new_len))
58 free_unicode_string(unicode_string);
62 BYTE* new_str = (BYTE*)realloc(unicode_string->string, new_len);
65 free_unicode_string(unicode_string);
69 unicode_string->string = new_str;
70 unicode_string->length = new_len;
71 Stream_Read(s, unicode_string->string, unicode_string->length);
77 WCHAR* buffer =
nullptr;
79 free(unicode_string->string);
80 unicode_string->string =
nullptr;
81 unicode_string->length = 0;
83 if (!
string || strlen(
string) < 1)
86 buffer = ConvertUtf8ToWCharAlloc(
string, &len);
88 if (!buffer || (len *
sizeof(WCHAR) > UINT16_MAX))
94 unicode_string->string = (BYTE*)buffer;
95 unicode_string->length = (UINT16)len *
sizeof(WCHAR);
101 WINPR_ASSERT(unicode_string);
104 size_t inLen = unicode_string->length /
sizeof(WCHAR);
105 return ConvertWCharNToUtf8Alloc((
const WCHAR*)unicode_string->string, inLen, &outLen);
111 BYTE* newBitMask =
nullptr;
113 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
116 Stream_Read_UINT16(s, iconInfo->cacheEntry);
117 Stream_Read_UINT8(s, iconInfo->cacheId);
118 Stream_Read_UINT8(s, iconInfo->bpp);
120 if ((iconInfo->bpp < 1) || (iconInfo->bpp > 32))
122 WLog_ERR(TAG,
"invalid bpp value %" PRIu32
"", iconInfo->bpp);
126 Stream_Read_UINT16(s, iconInfo->width);
127 Stream_Read_UINT16(s, iconInfo->height);
130 switch (iconInfo->bpp)
135 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
138 Stream_Read_UINT16(s, iconInfo->cbColorTable);
142 iconInfo->cbColorTable = 0;
146 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
149 Stream_Read_UINT16(s, iconInfo->cbBitsMask);
150 Stream_Read_UINT16(s, iconInfo->cbBitsColor);
153 if (iconInfo->cbBitsMask > 0)
155 newBitMask = (BYTE*)realloc(iconInfo->bitsMask, iconInfo->cbBitsMask);
159 free(iconInfo->bitsMask);
160 iconInfo->bitsMask =
nullptr;
164 iconInfo->bitsMask = newBitMask;
165 if (!Stream_CheckAndLogRequiredLength(TAG, s, iconInfo->cbBitsMask))
167 Stream_Read(s, iconInfo->bitsMask, iconInfo->cbBitsMask);
171 free(iconInfo->bitsMask);
172 iconInfo->bitsMask =
nullptr;
173 iconInfo->cbBitsMask = 0;
177 if (iconInfo->cbColorTable > 0)
179 BYTE* new_tab =
nullptr;
180 new_tab = (BYTE*)realloc(iconInfo->colorTable, iconInfo->cbColorTable);
184 free(iconInfo->colorTable);
185 iconInfo->colorTable =
nullptr;
189 iconInfo->colorTable = new_tab;
193 free(iconInfo->colorTable);
194 iconInfo->colorTable =
nullptr;
197 if (iconInfo->colorTable)
199 if (!Stream_CheckAndLogRequiredLength(TAG, s, iconInfo->cbColorTable))
201 Stream_Read(s, iconInfo->colorTable, iconInfo->cbColorTable);
205 if (iconInfo->cbBitsColor > 0)
207 newBitMask = (BYTE*)realloc(iconInfo->bitsColor, iconInfo->cbBitsColor);
211 free(iconInfo->bitsColor);
212 iconInfo->bitsColor =
nullptr;
216 iconInfo->bitsColor = newBitMask;
217 if (!Stream_CheckAndLogRequiredLength(TAG, s, iconInfo->cbBitsColor))
219 Stream_Read(s, iconInfo->bitsColor, iconInfo->cbBitsColor);
223 free(iconInfo->bitsColor);
224 iconInfo->bitsColor =
nullptr;
225 iconInfo->cbBitsColor = 0;
232 if (!Stream_CheckAndLogRequiredLength(TAG, s, 3))
235 Stream_Read_UINT16(s, cachedIconInfo->cacheEntry);
236 Stream_Read_UINT8(s, cachedIconInfo->cacheId);
242 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
245 Stream_Read_UINT32(s, notifyIconInfoTip->timeout);
246 Stream_Read_UINT32(s, notifyIconInfoTip->flags);
247 return rail_read_unicode_string(s, ¬ifyIconInfoTip->text) &&
248 rail_read_unicode_string(s, ¬ifyIconInfoTip->title);
257 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OWNER)
259 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
262 Stream_Read_UINT32(s, windowState->ownerWindowId);
265 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_STYLE)
267 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
270 Stream_Read_UINT32(s, windowState->style);
271 Stream_Read_UINT32(s, windowState->extendedStyle);
274 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_SHOW)
276 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
279 Stream_Read_UINT8(s, windowState->showState);
282 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
284 if (!rail_read_unicode_string(s, &windowState->titleInfo))
288 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET)
290 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
293 Stream_Read_INT32(s, windowState->clientOffsetX);
294 Stream_Read_INT32(s, windowState->clientOffsetY);
297 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE)
299 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
302 Stream_Read_UINT32(s, windowState->clientAreaWidth);
303 Stream_Read_UINT32(s, windowState->clientAreaHeight);
306 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_X)
308 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
311 Stream_Read_UINT32(s, windowState->resizeMarginLeft);
312 Stream_Read_UINT32(s, windowState->resizeMarginRight);
315 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_Y)
317 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
320 Stream_Read_UINT32(s, windowState->resizeMarginTop);
321 Stream_Read_UINT32(s, windowState->resizeMarginBottom);
324 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT)
326 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
329 Stream_Read_UINT8(s, windowState->RPContent);
332 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT)
334 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
337 Stream_Read_UINT32(s, windowState->rootParentHandle);
340 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET)
342 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
345 Stream_Read_INT32(s, windowState->windowOffsetX);
346 Stream_Read_INT32(s, windowState->windowOffsetY);
349 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA)
351 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
354 Stream_Read_INT32(s, windowState->windowClientDeltaX);
355 Stream_Read_INT32(s, windowState->windowClientDeltaY);
358 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)
360 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
363 Stream_Read_UINT32(s, windowState->windowWidth);
364 Stream_Read_UINT32(s, windowState->windowHeight);
367 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
369 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
372 Stream_Read_UINT16(s, windowState->numWindowRects);
374 if (windowState->numWindowRects > 0)
376 size =
sizeof(
RECTANGLE_16) * windowState->numWindowRects;
377 newRect = (
RECTANGLE_16*)realloc(windowState->windowRects, size);
381 free(windowState->windowRects);
382 windowState->windowRects =
nullptr;
386 windowState->windowRects = newRect;
388 if (!Stream_CheckAndLogRequiredLengthOfSize(TAG, s, windowState->numWindowRects, 8ull))
392 for (UINT32 i = 0; i < windowState->numWindowRects; i++)
394 Stream_Read_UINT16(s, windowState->windowRects[i].left);
395 Stream_Read_UINT16(s, windowState->windowRects[i].top);
396 Stream_Read_UINT16(s, windowState->windowRects[i].right);
397 Stream_Read_UINT16(s, windowState->windowRects[i].bottom);
402 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET)
404 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
407 Stream_Read_INT32(s, windowState->visibleOffsetX);
408 Stream_Read_INT32(s, windowState->visibleOffsetY);
411 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
413 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
416 Stream_Read_UINT16(s, windowState->numVisibilityRects);
418 if (windowState->numVisibilityRects != 0)
420 size =
sizeof(
RECTANGLE_16) * windowState->numVisibilityRects;
421 newRect = (
RECTANGLE_16*)realloc(windowState->visibilityRects, size);
425 free(windowState->visibilityRects);
426 windowState->visibilityRects =
nullptr;
430 windowState->visibilityRects = newRect;
432 if (!Stream_CheckAndLogRequiredLengthOfSize(TAG, s, windowState->numVisibilityRects,
437 for (UINT32 i = 0; i < windowState->numVisibilityRects; i++)
439 Stream_Read_UINT16(s, windowState->visibilityRects[i].left);
440 Stream_Read_UINT16(s, windowState->visibilityRects[i].top);
441 Stream_Read_UINT16(s, windowState->visibilityRects[i].right);
442 Stream_Read_UINT16(s,
443 windowState->visibilityRects[i].bottom);
448 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OVERLAY_DESCRIPTION)
450 if (!rail_read_unicode_string(s, &windowState->OverlayDescription))
454 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ICON_OVERLAY_NULL)
459 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TASKBAR_BUTTON)
461 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
464 Stream_Read_UINT8(s, windowState->TaskbarButton);
467 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ENFORCE_SERVER_ZORDER)
469 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
472 Stream_Read_UINT8(s, windowState->EnforceServerZOrder);
475 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_STATE)
477 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
480 Stream_Read_UINT8(s, windowState->AppBarState);
483 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_EDGE)
485 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
488 Stream_Read_UINT8(s, windowState->AppBarEdge);
497 WINPR_UNUSED(orderInfo);
500 if (!window_icon->iconInfo)
503 return update_read_icon_info(s, window_icon->iconInfo);
509 WINPR_UNUSED(orderInfo);
510 return update_read_cached_icon_info(
511 s, &window_cached_icon->cachedIcon);
514static void update_read_window_delete_order(WINPR_ATTR_UNUSED
wStream* s,
520static BOOL window_order_supported(
const rdpSettings* settings, UINT32 fieldFlags)
522 const UINT32 mask = (WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE | WINDOW_ORDER_FIELD_RP_CONTENT |
523 WINDOW_ORDER_FIELD_ROOT_PARENT);
534 case WINDOW_LEVEL_SUPPORTED_EX:
537 case WINDOW_LEVEL_SUPPORTED:
538 return ((fieldFlags & mask) == 0) || dresult;
540 case WINDOW_LEVEL_NOT_SUPPORTED:
548#define DUMP_APPEND(buffer, size, ...) \
551 char* b = (buffer); \
553 size_t pos = strnlen(b, s); \
554 (void)_snprintf(&b[pos], s - pos, __VA_ARGS__); \
557static void dump_window_style(
char* buffer,
size_t bufferSize, UINT32 style)
559 DUMP_APPEND(buffer, bufferSize,
" style=<0x%" PRIx32
": ", style);
560 if (style & WS_BORDER)
561 DUMP_APPEND(buffer, bufferSize,
" border");
562 if (style & WS_CAPTION)
563 DUMP_APPEND(buffer, bufferSize,
" caption");
564 if (style & WS_CHILD)
565 DUMP_APPEND(buffer, bufferSize,
" child");
566 if (style & WS_CHILDWINDOW)
567 DUMP_APPEND(buffer, bufferSize,
" childwindow");
568 if (style & WS_CLIPCHILDREN)
569 DUMP_APPEND(buffer, bufferSize,
" clipchildren");
570 if (style & WS_CLIPSIBLINGS)
571 DUMP_APPEND(buffer, bufferSize,
" clipsiblings");
572 if (style & WS_DISABLED)
573 DUMP_APPEND(buffer, bufferSize,
" disabled");
574 if (style & WS_DLGFRAME)
575 DUMP_APPEND(buffer, bufferSize,
" dlgframe");
576 if (style & WS_GROUP)
577 DUMP_APPEND(buffer, bufferSize,
" group");
578 if (style & WS_HSCROLL)
579 DUMP_APPEND(buffer, bufferSize,
" hscroll");
580 if (style & WS_ICONIC)
581 DUMP_APPEND(buffer, bufferSize,
" iconic");
582 if (style & WS_MAXIMIZE)
583 DUMP_APPEND(buffer, bufferSize,
" maximize");
584 if (style & WS_MAXIMIZEBOX)
585 DUMP_APPEND(buffer, bufferSize,
" maximizebox");
586 if (style & WS_MINIMIZE)
587 DUMP_APPEND(buffer, bufferSize,
" minimize");
588 if (style & WS_MINIMIZEBOX)
589 DUMP_APPEND(buffer, bufferSize,
" minimizebox");
590 if (style & WS_POPUP)
591 DUMP_APPEND(buffer, bufferSize,
" popup");
592 if (style & WS_SIZEBOX)
593 DUMP_APPEND(buffer, bufferSize,
" sizebox");
594 if (style & WS_SYSMENU)
595 DUMP_APPEND(buffer, bufferSize,
" sysmenu");
596 if (style & WS_TABSTOP)
597 DUMP_APPEND(buffer, bufferSize,
" tabstop");
598 if (style & WS_THICKFRAME)
599 DUMP_APPEND(buffer, bufferSize,
" thickframe");
600 if (style & WS_VISIBLE)
601 DUMP_APPEND(buffer, bufferSize,
" visible");
602 if (style & WS_VSCROLL)
603 DUMP_APPEND(buffer, bufferSize,
" vscroll");
604 DUMP_APPEND(buffer, bufferSize,
">");
607static void dump_window_style_ex(
char* buffer,
size_t bufferSize, UINT32 extendedStyle)
609 DUMP_APPEND(buffer, bufferSize,
" styleEx=<0x%" PRIx32
": ", extendedStyle);
610 if (extendedStyle & WS_EX_ACCEPTFILES)
611 DUMP_APPEND(buffer, bufferSize,
" acceptfiles");
612 if (extendedStyle & WS_EX_APPWINDOW)
613 DUMP_APPEND(buffer, bufferSize,
" appwindow");
614 if (extendedStyle & WS_EX_CLIENTEDGE)
615 DUMP_APPEND(buffer, bufferSize,
" clientedge");
616 if (extendedStyle & WS_EX_COMPOSITED)
617 DUMP_APPEND(buffer, bufferSize,
" composited");
618 if (extendedStyle & WS_EX_CONTEXTHELP)
619 DUMP_APPEND(buffer, bufferSize,
" contexthelp");
620 if (extendedStyle & WS_EX_CONTROLPARENT)
621 DUMP_APPEND(buffer, bufferSize,
" controlparent");
622 if (extendedStyle & WS_EX_DLGMODALFRAME)
623 DUMP_APPEND(buffer, bufferSize,
" dlgmodalframe");
624 if (extendedStyle & WS_EX_LAYERED)
625 DUMP_APPEND(buffer, bufferSize,
" layered");
626 if (extendedStyle & WS_EX_LAYOUTRTL)
627 DUMP_APPEND(buffer, bufferSize,
" layoutrtl");
628 if (extendedStyle & WS_EX_LEFT)
629 DUMP_APPEND(buffer, bufferSize,
" left");
630 if (extendedStyle & WS_EX_LEFTSCROLLBAR)
631 DUMP_APPEND(buffer, bufferSize,
" leftscrollbar");
632 if (extendedStyle & WS_EX_LTRREADING)
633 DUMP_APPEND(buffer, bufferSize,
" ltrreading");
634 if (extendedStyle & WS_EX_MDICHILD)
635 DUMP_APPEND(buffer, bufferSize,
" mdichild");
636 if (extendedStyle & WS_EX_NOACTIVATE)
637 DUMP_APPEND(buffer, bufferSize,
" noactivate");
638 if (extendedStyle & WS_EX_NOINHERITLAYOUT)
639 DUMP_APPEND(buffer, bufferSize,
" noinheritlayout");
640#if defined(WS_EX_NOREDIRECTIONBITMAP)
641 if (extendedStyle & WS_EX_NOREDIRECTIONBITMAP)
642 DUMP_APPEND(buffer, bufferSize,
" noredirectionbitmap");
644 if (extendedStyle & WS_EX_RIGHT)
645 DUMP_APPEND(buffer, bufferSize,
" right");
646 if (extendedStyle & WS_EX_RIGHTSCROLLBAR)
647 DUMP_APPEND(buffer, bufferSize,
" rightscrollbar");
648 if (extendedStyle & WS_EX_RTLREADING)
649 DUMP_APPEND(buffer, bufferSize,
" rtlreading");
650 if (extendedStyle & WS_EX_STATICEDGE)
651 DUMP_APPEND(buffer, bufferSize,
" staticedge");
652 if (extendedStyle & WS_EX_TOOLWINDOW)
653 DUMP_APPEND(buffer, bufferSize,
" toolWindow");
654 if (extendedStyle & WS_EX_TOPMOST)
655 DUMP_APPEND(buffer, bufferSize,
" topMost");
656 if (extendedStyle & WS_EX_TRANSPARENT)
657 DUMP_APPEND(buffer, bufferSize,
" transparent");
658 if (extendedStyle & WS_EX_WINDOWEDGE)
659 DUMP_APPEND(buffer, bufferSize,
" windowedge");
660 DUMP_APPEND(buffer, bufferSize,
">");
663static void dump_window_state_order(wLog* log,
const char* msg,
const WINDOW_ORDER_INFO* order,
666 char buffer[3000] = WINPR_C_ARRAY_INIT;
667 const size_t bufferSize =
sizeof(buffer) - 1;
669 (void)_snprintf(buffer, bufferSize,
"%s windowId=%" PRIu32
"", msg, order->windowId);
671 if (order->fieldFlags & WINDOW_ORDER_FIELD_OWNER)
672 DUMP_APPEND(buffer, bufferSize,
" owner=%" PRIu32
"", state->ownerWindowId);
673 if (order->fieldFlags & WINDOW_ORDER_FIELD_STYLE)
675 dump_window_style(buffer, bufferSize, state->style);
676 dump_window_style_ex(buffer, bufferSize, state->extendedStyle);
679 if (order->fieldFlags & WINDOW_ORDER_FIELD_SHOW)
681 const char* showStr =
nullptr;
682 switch (state->showState)
688 showStr =
"minimized";
691 showStr =
"maximized";
697 showStr =
"<unknown>";
700 DUMP_APPEND(buffer, bufferSize,
" show=%s", showStr);
703 if (order->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
705 char* title = rail_string_to_utf8_string(&state->titleInfo);
708 DUMP_APPEND(buffer, bufferSize,
" title=\"%s\"", title);
712 DUMP_APPEND(buffer, bufferSize,
" title=<decode failed>");
714 if (order->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET)
715 DUMP_APPEND(buffer, bufferSize,
" clientOffset=(%" PRId32
",%" PRId32
")",
716 state->clientOffsetX, state->clientOffsetY);
717 if (order->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE)
718 DUMP_APPEND(buffer, bufferSize,
" clientAreaWidth=%" PRIu32
" clientAreaHeight=%" PRIu32
"",
719 state->clientAreaWidth, state->clientAreaHeight);
720 if (order->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_X)
721 DUMP_APPEND(buffer, bufferSize,
722 " resizeMarginLeft=%" PRIu32
" resizeMarginRight=%" PRIu32
"",
723 state->resizeMarginLeft, state->resizeMarginRight);
724 if (order->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_Y)
725 DUMP_APPEND(buffer, bufferSize,
726 " resizeMarginTop=%" PRIu32
" resizeMarginBottom=%" PRIu32
"",
727 state->resizeMarginTop, state->resizeMarginBottom);
728 if (order->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT)
729 DUMP_APPEND(buffer, bufferSize,
" rpContent=0x%" PRIx32
"", state->RPContent);
730 if (order->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT)
731 DUMP_APPEND(buffer, bufferSize,
" rootParent=0x%" PRIx32
"", state->rootParentHandle);
732 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET)
733 DUMP_APPEND(buffer, bufferSize,
" windowOffset=(%" PRId32
",%" PRId32
")",
734 state->windowOffsetX, state->windowOffsetY);
735 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA)
736 DUMP_APPEND(buffer, bufferSize,
" windowClientDelta=(%" PRId32
",%" PRId32
")",
737 state->windowClientDeltaX, state->windowClientDeltaY);
738 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)
739 DUMP_APPEND(buffer, bufferSize,
" windowWidth=%" PRIu32
" windowHeight=%" PRIu32
"",
740 state->windowWidth, state->windowHeight);
742 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
744 DUMP_APPEND(buffer, bufferSize,
" windowRects=(");
745 for (UINT32 i = 0; i < state->numWindowRects; i++)
747 DUMP_APPEND(buffer, bufferSize,
"(%" PRIu16
",%" PRIu16
",%" PRIu16
",%" PRIu16
")",
748 state->windowRects[i].left, state->windowRects[i].top,
749 state->windowRects[i].right, state->windowRects[i].bottom);
751 DUMP_APPEND(buffer, bufferSize,
")");
754 if (order->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET)
755 DUMP_APPEND(buffer, bufferSize,
" visibleOffset=(%" PRId32
",%" PRId32
")",
756 state->visibleOffsetX, state->visibleOffsetY);
758 if (order->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
760 DUMP_APPEND(buffer, bufferSize,
" visibilityRects=(");
761 for (UINT32 i = 0; i < state->numVisibilityRects; i++)
763 DUMP_APPEND(buffer, bufferSize,
"(%" PRIu16
",%" PRIu16
",%" PRIu16
",%" PRIu16
")",
764 state->visibilityRects[i].left, state->visibilityRects[i].top,
765 state->visibilityRects[i].right, state->visibilityRects[i].bottom);
767 DUMP_APPEND(buffer, bufferSize,
")");
770 if (order->fieldFlags & WINDOW_ORDER_FIELD_OVERLAY_DESCRIPTION)
771 DUMP_APPEND(buffer, bufferSize,
" overlayDescr");
773 if (order->fieldFlags & WINDOW_ORDER_FIELD_ICON_OVERLAY_NULL)
774 DUMP_APPEND(buffer, bufferSize,
" iconOverlayNull");
776 if (order->fieldFlags & WINDOW_ORDER_FIELD_TASKBAR_BUTTON)
777 DUMP_APPEND(buffer, bufferSize,
" taskBarButton=0x%" PRIx8
"", state->TaskbarButton);
779 if (order->fieldFlags & WINDOW_ORDER_FIELD_ENFORCE_SERVER_ZORDER)
780 DUMP_APPEND(buffer, bufferSize,
" enforceServerZOrder=0x%" PRIx8
"",
781 state->EnforceServerZOrder);
782 if (order->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_STATE)
783 DUMP_APPEND(buffer, bufferSize,
" appBarState=0x%" PRIx8
"", state->AppBarState);
784 if (order->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_EDGE)
786 const char* appBarEdgeStr =
nullptr;
787 switch (state->AppBarEdge)
790 appBarEdgeStr =
"left";
793 appBarEdgeStr =
"top";
796 appBarEdgeStr =
"right";
799 appBarEdgeStr =
"bottom";
802 appBarEdgeStr =
"<unknown>";
805 DUMP_APPEND(buffer, bufferSize,
" appBarEdge=%s", appBarEdgeStr);
808 WLog_Print(log, WLOG_DEBUG,
"%s", buffer);
811static BOOL update_recv_window_info_order(rdpUpdate* update,
wStream* s,
815 rdpContext* context = update->context;
816 rdpWindowUpdate* window = update->window;
821 WINPR_ASSERT(context);
822 WINPR_ASSERT(window);
823 WINPR_ASSERT(orderInfo);
825 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
828 Stream_Read_UINT32(s, orderInfo->windowId);
830 if (orderInfo->fieldFlags & WINDOW_ORDER_ICON)
833 result = update_read_window_icon_order(s, orderInfo, &window_icon);
837 WLog_Print(up->log, WLOG_DEBUG,
"WindowIcon windowId=0x%" PRIx32
"",
838 orderInfo->windowId);
839 IFCALLRET(window->WindowIcon, result, context, orderInfo, &window_icon);
842 update_free_window_icon_info(window_icon.iconInfo);
843 free(window_icon.iconInfo);
845 else if (orderInfo->fieldFlags & WINDOW_ORDER_CACHED_ICON)
848 result = update_read_window_cached_icon_order(s, orderInfo, &window_cached_icon);
852 WLog_Print(up->log, WLOG_DEBUG,
"WindowCachedIcon windowId=0x%" PRIx32
"",
853 orderInfo->windowId);
854 IFCALLRET(window->WindowCachedIcon, result, context, orderInfo, &window_cached_icon);
857 else if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_DELETED)
859 update_read_window_delete_order(s, orderInfo);
860 WLog_Print(up->log, WLOG_DEBUG,
"WindowDelete windowId=0x%" PRIx32
"", orderInfo->windowId);
861 IFCALLRET(window->WindowDelete, result, context, orderInfo);
866 result = update_read_window_state_order(s, orderInfo, &windowState);
870 if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_NEW)
872 dump_window_state_order(up->log,
"WindowCreate", orderInfo, &windowState);
873 IFCALLRET(window->WindowCreate, result, context, orderInfo, &windowState);
877 dump_window_state_order(up->log,
"WindowUpdate", orderInfo, &windowState);
878 IFCALLRET(window->WindowUpdate, result, context, orderInfo, &windowState);
881 update_free_window_state(&windowState);
890 free(notify->toolTip.string);
891 free(notify->infoTip.text.string);
892 free(notify->infoTip.title.string);
893 update_free_window_icon_info(¬ify->icon);
900 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_VERSION)
902 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
905 Stream_Read_UINT32(s, notify_icon_state->version);
908 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_TIP)
910 if (!rail_read_unicode_string(s,
911 ¬ify_icon_state->toolTip))
915 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP)
917 if (!update_read_notify_icon_infotip(
918 s, ¬ify_icon_state->infoTip))
922 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_STATE)
924 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
927 Stream_Read_UINT32(s, notify_icon_state->state);
930 if (orderInfo->fieldFlags & WINDOW_ORDER_ICON)
932 if (!update_read_icon_info(s, ¬ify_icon_state->icon))
936 if (orderInfo->fieldFlags & WINDOW_ORDER_CACHED_ICON)
938 if (!update_read_cached_icon_info(
939 s, ¬ify_icon_state->cachedIcon))
947update_read_notification_icon_delete_order(WINPR_ATTR_UNUSED
wStream* s,
953static BOOL update_recv_notification_icon_info_order(rdpUpdate* update,
wStream* s,
957 rdpContext* context = update->context;
958 rdpWindowUpdate* window = update->window;
962 WINPR_ASSERT(orderInfo);
963 WINPR_ASSERT(context);
964 WINPR_ASSERT(window);
966 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
969 Stream_Read_UINT32(s, orderInfo->windowId);
970 Stream_Read_UINT32(s, orderInfo->notifyIconId);
972 if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_DELETED)
974 update_read_notification_icon_delete_order(s, orderInfo);
975 WLog_Print(up->log, WLOG_DEBUG,
"NotifyIconDelete");
976 IFCALLRET(window->NotifyIconDelete, result, context, orderInfo);
981 result = update_read_notification_icon_state_order(s, orderInfo, ¬ify_icon_state);
986 if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_NEW)
988 WLog_Print(up->log, WLOG_DEBUG,
"NotifyIconCreate");
989 IFCALLRET(window->NotifyIconCreate, result, context, orderInfo, ¬ify_icon_state);
993 WLog_Print(up->log, WLOG_DEBUG,
"NotifyIconUpdate");
994 IFCALLRET(window->NotifyIconUpdate, result, context, orderInfo, ¬ify_icon_state);
997 update_notify_icon_state_order_free(¬ify_icon_state);
1003static BOOL update_read_desktop_actively_monitored_order(
wStream* s,
1007 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND)
1009 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
1012 Stream_Read_UINT32(s, monitored_desktop->activeWindowId);
1015 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ZORDER)
1017 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
1020 Stream_Read_UINT8(s, monitored_desktop->numWindowIds);
1022 if (!Stream_CheckAndLogRequiredLengthOfSize(TAG, s, monitored_desktop->numWindowIds, 4ull))
1024 monitored_desktop->numWindowIds = 0;
1028 if (monitored_desktop->numWindowIds > 0)
1030 const size_t size =
sizeof(UINT32) * monitored_desktop->numWindowIds;
1031 UINT32* newid = (UINT32*)realloc(monitored_desktop->windowIds, size);
1035 free(monitored_desktop->windowIds);
1036 monitored_desktop->windowIds =
nullptr;
1037 monitored_desktop->numWindowIds = 0;
1041 monitored_desktop->windowIds = newid;
1044 for (UINT32 i = 0; i < monitored_desktop->numWindowIds; i++)
1046 Stream_Read_UINT32(s, monitored_desktop->windowIds[i]);
1051 free(monitored_desktop->windowIds);
1052 monitored_desktop->windowIds =
nullptr;
1059static void update_read_desktop_non_monitored_order(WINPR_ATTR_UNUSED
wStream* s,
1065static void dump_monitored_desktop(wLog* log,
const char* msg,
const WINDOW_ORDER_INFO* orderInfo,
1068 char buffer[1000] = WINPR_C_ARRAY_INIT;
1069 const size_t bufferSize =
sizeof(buffer) - 1;
1071 DUMP_APPEND(buffer, bufferSize,
"%s", msg);
1073 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND)
1074 DUMP_APPEND(buffer, bufferSize,
" activeWindowId=0x%" PRIx32
"", monitored->activeWindowId);
1076 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ZORDER)
1078 DUMP_APPEND(buffer, bufferSize,
" windows=(");
1079 for (UINT32 i = 0; i < monitored->numWindowIds; i++)
1081 WINPR_ASSERT(monitored->windowIds);
1082 DUMP_APPEND(buffer, bufferSize,
"0x%" PRIx32
",", monitored->windowIds[i]);
1084 DUMP_APPEND(buffer, bufferSize,
")");
1086 WLog_Print(log, WLOG_DEBUG,
"%s", buffer);
1089static BOOL update_recv_desktop_info_order(rdpUpdate* update,
wStream* s,
1093 rdpContext* context = update->context;
1094 rdpWindowUpdate* window = update->window;
1098 WINPR_ASSERT(orderInfo);
1099 WINPR_ASSERT(context);
1100 WINPR_ASSERT(window);
1102 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_NONE)
1104 update_read_desktop_non_monitored_order(s, orderInfo);
1105 WLog_Print(up->log, WLOG_DEBUG,
"NonMonitoredDesktop, windowId=0x%" PRIx32
"",
1106 orderInfo->windowId);
1107 IFCALLRET(window->NonMonitoredDesktop, result, context, orderInfo);
1112 result = update_read_desktop_actively_monitored_order(s, orderInfo, &monitored_desktop);
1116 dump_monitored_desktop(up->log,
"ActivelyMonitoredDesktop", orderInfo,
1117 &monitored_desktop);
1118 IFCALLRET(window->MonitoredDesktop, result, context, orderInfo, &monitored_desktop);
1121 free(monitored_desktop.windowIds);
1127void update_free_window_icon_info(
ICON_INFO* iconInfo)
1132 free(iconInfo->bitsColor);
1133 iconInfo->bitsColor =
nullptr;
1134 free(iconInfo->bitsMask);
1135 iconInfo->bitsMask =
nullptr;
1136 free(iconInfo->colorTable);
1137 iconInfo->colorTable =
nullptr;
1140BOOL update_recv_altsec_window_order(rdpUpdate* update,
wStream* s)
1143 size_t remaining = 0;
1144 UINT16 orderSize = 0;
1148 remaining = Stream_GetRemainingLength(s);
1150 if (!Stream_CheckAndLogRequiredLength(TAG, s, 6))
1153 Stream_Read_UINT16(s, orderSize);
1154 Stream_Read_UINT32(s, orderInfo.fieldFlags);
1156 if (remaining + 1 < orderSize)
1158 WLog_Print(up->log, WLOG_ERROR,
"Stream short orderSize");
1162 if (!window_order_supported(update->context->settings, orderInfo.fieldFlags))
1164 WLog_INFO(TAG,
"Window order %08" PRIx32
" not supported!", orderInfo.fieldFlags);
1168 if (orderInfo.fieldFlags & WINDOW_ORDER_TYPE_WINDOW)
1169 rc = update_recv_window_info_order(update, s, &orderInfo);
1170 else if (orderInfo.fieldFlags & WINDOW_ORDER_TYPE_NOTIFY)
1171 rc = update_recv_notification_icon_info_order(update, s, &orderInfo);
1172 else if (orderInfo.fieldFlags & WINDOW_ORDER_TYPE_DESKTOP)
1173 rc = update_recv_desktop_info_order(update, s, &orderInfo);
1176 WLog_Print(up->log, WLOG_ERROR,
"windoworder flags %08" PRIx32
" failed",
1177 orderInfo.fieldFlags);
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.