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);
41 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
44 Stream_Read_UINT16(s, new_len);
46 if (!Stream_CheckAndLogRequiredLength(TAG, s, new_len))
51 free(unicode_string->string);
52 unicode_string->string = NULL;
53 unicode_string->length = 0;
57 new_str = (BYTE*)realloc(unicode_string->string, new_len);
61 free(unicode_string->string);
62 unicode_string->string = NULL;
66 unicode_string->string = new_str;
67 unicode_string->length = new_len;
68 Stream_Read(s, unicode_string->string, unicode_string->length);
76 free(unicode_string->string);
77 unicode_string->string = NULL;
78 unicode_string->length = 0;
80 if (!
string || strlen(
string) < 1)
83 buffer = ConvertUtf8ToWCharAlloc(
string, &len);
85 if (!buffer || (len *
sizeof(WCHAR) > UINT16_MAX))
91 unicode_string->string = (BYTE*)buffer;
92 unicode_string->length = (UINT16)len *
sizeof(WCHAR);
98 WINPR_ASSERT(unicode_string);
101 size_t inLen = unicode_string->length /
sizeof(WCHAR);
102 return ConvertWCharNToUtf8Alloc((
const WCHAR*)unicode_string->string, inLen, &outLen);
108 BYTE* newBitMask = NULL;
110 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
113 Stream_Read_UINT16(s, iconInfo->cacheEntry);
114 Stream_Read_UINT8(s, iconInfo->cacheId);
115 Stream_Read_UINT8(s, iconInfo->bpp);
117 if ((iconInfo->bpp < 1) || (iconInfo->bpp > 32))
119 WLog_ERR(TAG,
"invalid bpp value %" PRIu32
"", iconInfo->bpp);
123 Stream_Read_UINT16(s, iconInfo->width);
124 Stream_Read_UINT16(s, iconInfo->height);
127 switch (iconInfo->bpp)
132 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
135 Stream_Read_UINT16(s, iconInfo->cbColorTable);
139 iconInfo->cbColorTable = 0;
143 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
146 Stream_Read_UINT16(s, iconInfo->cbBitsMask);
147 Stream_Read_UINT16(s, iconInfo->cbBitsColor);
150 if (iconInfo->cbBitsMask > 0)
152 newBitMask = (BYTE*)realloc(iconInfo->bitsMask, iconInfo->cbBitsMask);
156 free(iconInfo->bitsMask);
157 iconInfo->bitsMask = NULL;
161 iconInfo->bitsMask = newBitMask;
162 if (!Stream_CheckAndLogRequiredLength(TAG, s, iconInfo->cbBitsMask))
164 Stream_Read(s, iconInfo->bitsMask, iconInfo->cbBitsMask);
168 free(iconInfo->bitsMask);
169 iconInfo->bitsMask = NULL;
170 iconInfo->cbBitsMask = 0;
174 if (iconInfo->cbColorTable > 0)
176 BYTE* new_tab = NULL;
177 new_tab = (BYTE*)realloc(iconInfo->colorTable, iconInfo->cbColorTable);
181 free(iconInfo->colorTable);
182 iconInfo->colorTable = NULL;
186 iconInfo->colorTable = new_tab;
190 free(iconInfo->colorTable);
191 iconInfo->colorTable = NULL;
194 if (iconInfo->colorTable)
196 if (!Stream_CheckAndLogRequiredLength(TAG, s, iconInfo->cbColorTable))
198 Stream_Read(s, iconInfo->colorTable, iconInfo->cbColorTable);
202 if (iconInfo->cbBitsColor > 0)
204 newBitMask = (BYTE*)realloc(iconInfo->bitsColor, iconInfo->cbBitsColor);
208 free(iconInfo->bitsColor);
209 iconInfo->bitsColor = NULL;
213 iconInfo->bitsColor = newBitMask;
214 if (!Stream_CheckAndLogRequiredLength(TAG, s, iconInfo->cbBitsColor))
216 Stream_Read(s, iconInfo->bitsColor, iconInfo->cbBitsColor);
220 free(iconInfo->bitsColor);
221 iconInfo->bitsColor = NULL;
222 iconInfo->cbBitsColor = 0;
229 if (!Stream_CheckAndLogRequiredLength(TAG, s, 3))
232 Stream_Read_UINT16(s, cachedIconInfo->cacheEntry);
233 Stream_Read_UINT8(s, cachedIconInfo->cacheId);
239 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
242 Stream_Read_UINT32(s, notifyIconInfoTip->timeout);
243 Stream_Read_UINT32(s, notifyIconInfoTip->flags);
244 return rail_read_unicode_string(s, ¬ifyIconInfoTip->text) &&
245 rail_read_unicode_string(s, ¬ifyIconInfoTip->title);
254 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OWNER)
256 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
259 Stream_Read_UINT32(s, windowState->ownerWindowId);
262 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_STYLE)
264 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
267 Stream_Read_UINT32(s, windowState->style);
268 Stream_Read_UINT32(s, windowState->extendedStyle);
271 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_SHOW)
273 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
276 Stream_Read_UINT8(s, windowState->showState);
279 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
281 if (!rail_read_unicode_string(s, &windowState->titleInfo))
285 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET)
287 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
290 Stream_Read_INT32(s, windowState->clientOffsetX);
291 Stream_Read_INT32(s, windowState->clientOffsetY);
294 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE)
296 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
299 Stream_Read_UINT32(s, windowState->clientAreaWidth);
300 Stream_Read_UINT32(s, windowState->clientAreaHeight);
303 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_X)
305 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
308 Stream_Read_UINT32(s, windowState->resizeMarginLeft);
309 Stream_Read_UINT32(s, windowState->resizeMarginRight);
312 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_Y)
314 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
317 Stream_Read_UINT32(s, windowState->resizeMarginTop);
318 Stream_Read_UINT32(s, windowState->resizeMarginBottom);
321 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT)
323 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
326 Stream_Read_UINT8(s, windowState->RPContent);
329 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT)
331 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
334 Stream_Read_UINT32(s, windowState->rootParentHandle);
337 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET)
339 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
342 Stream_Read_INT32(s, windowState->windowOffsetX);
343 Stream_Read_INT32(s, windowState->windowOffsetY);
346 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA)
348 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
351 Stream_Read_INT32(s, windowState->windowClientDeltaX);
352 Stream_Read_INT32(s, windowState->windowClientDeltaY);
355 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)
357 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
360 Stream_Read_UINT32(s, windowState->windowWidth);
361 Stream_Read_UINT32(s, windowState->windowHeight);
364 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
366 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
369 Stream_Read_UINT16(s, windowState->numWindowRects);
371 if (windowState->numWindowRects > 0)
373 size =
sizeof(
RECTANGLE_16) * windowState->numWindowRects;
374 newRect = (
RECTANGLE_16*)realloc(windowState->windowRects, size);
378 free(windowState->windowRects);
379 windowState->windowRects = NULL;
383 windowState->windowRects = newRect;
385 if (!Stream_CheckAndLogRequiredLengthOfSize(TAG, s, windowState->numWindowRects, 8ull))
389 for (UINT32 i = 0; i < windowState->numWindowRects; i++)
391 Stream_Read_UINT16(s, windowState->windowRects[i].left);
392 Stream_Read_UINT16(s, windowState->windowRects[i].top);
393 Stream_Read_UINT16(s, windowState->windowRects[i].right);
394 Stream_Read_UINT16(s, windowState->windowRects[i].bottom);
399 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET)
401 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
404 Stream_Read_INT32(s, windowState->visibleOffsetX);
405 Stream_Read_INT32(s, windowState->visibleOffsetY);
408 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
410 if (!Stream_CheckAndLogRequiredLength(TAG, s, 2))
413 Stream_Read_UINT16(s, windowState->numVisibilityRects);
415 if (windowState->numVisibilityRects != 0)
417 size =
sizeof(
RECTANGLE_16) * windowState->numVisibilityRects;
418 newRect = (
RECTANGLE_16*)realloc(windowState->visibilityRects, size);
422 free(windowState->visibilityRects);
423 windowState->visibilityRects = NULL;
427 windowState->visibilityRects = newRect;
429 if (!Stream_CheckAndLogRequiredLengthOfSize(TAG, s, windowState->numVisibilityRects,
434 for (UINT32 i = 0; i < windowState->numVisibilityRects; i++)
436 Stream_Read_UINT16(s, windowState->visibilityRects[i].left);
437 Stream_Read_UINT16(s, windowState->visibilityRects[i].top);
438 Stream_Read_UINT16(s, windowState->visibilityRects[i].right);
439 Stream_Read_UINT16(s,
440 windowState->visibilityRects[i].bottom);
445 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_OVERLAY_DESCRIPTION)
447 if (!rail_read_unicode_string(s, &windowState->OverlayDescription))
451 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ICON_OVERLAY_NULL)
456 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_TASKBAR_BUTTON)
458 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
461 Stream_Read_UINT8(s, windowState->TaskbarButton);
464 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_ENFORCE_SERVER_ZORDER)
466 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
469 Stream_Read_UINT8(s, windowState->EnforceServerZOrder);
472 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_STATE)
474 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
477 Stream_Read_UINT8(s, windowState->AppBarState);
480 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_EDGE)
482 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
485 Stream_Read_UINT8(s, windowState->AppBarEdge);
494 WINPR_UNUSED(orderInfo);
497 if (!window_icon->iconInfo)
500 return update_read_icon_info(s, window_icon->iconInfo);
506 WINPR_UNUSED(orderInfo);
507 return update_read_cached_icon_info(
508 s, &window_cached_icon->cachedIcon);
511static void update_read_window_delete_order(WINPR_ATTR_UNUSED
wStream* s,
517static BOOL window_order_supported(
const rdpSettings* settings, UINT32 fieldFlags)
519 const UINT32 mask = (WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE | WINDOW_ORDER_FIELD_RP_CONTENT |
520 WINDOW_ORDER_FIELD_ROOT_PARENT);
527 dresult = settings->AllowUnanouncedOrdersFromServer;
529 switch (settings->RemoteWndSupportLevel)
531 case WINDOW_LEVEL_SUPPORTED_EX:
534 case WINDOW_LEVEL_SUPPORTED:
535 return ((fieldFlags & mask) == 0) || dresult;
537 case WINDOW_LEVEL_NOT_SUPPORTED:
545#define DUMP_APPEND(buffer, size, ...) \
548 char* b = (buffer); \
550 size_t pos = strnlen(b, s); \
551 (void)_snprintf(&b[pos], s - pos, __VA_ARGS__); \
554static void dump_window_style(
char* buffer,
size_t bufferSize, UINT32 style)
556 DUMP_APPEND(buffer, bufferSize,
" style=<0x%" PRIx32
": ", style);
557 if (style & WS_BORDER)
558 DUMP_APPEND(buffer, bufferSize,
" border");
559 if (style & WS_CAPTION)
560 DUMP_APPEND(buffer, bufferSize,
" caption");
561 if (style & WS_CHILD)
562 DUMP_APPEND(buffer, bufferSize,
" child");
563 if (style & WS_CHILDWINDOW)
564 DUMP_APPEND(buffer, bufferSize,
" childwindow");
565 if (style & WS_CLIPCHILDREN)
566 DUMP_APPEND(buffer, bufferSize,
" clipchildren");
567 if (style & WS_CLIPSIBLINGS)
568 DUMP_APPEND(buffer, bufferSize,
" clipsiblings");
569 if (style & WS_DISABLED)
570 DUMP_APPEND(buffer, bufferSize,
" disabled");
571 if (style & WS_DLGFRAME)
572 DUMP_APPEND(buffer, bufferSize,
" dlgframe");
573 if (style & WS_GROUP)
574 DUMP_APPEND(buffer, bufferSize,
" group");
575 if (style & WS_HSCROLL)
576 DUMP_APPEND(buffer, bufferSize,
" hscroll");
577 if (style & WS_ICONIC)
578 DUMP_APPEND(buffer, bufferSize,
" iconic");
579 if (style & WS_MAXIMIZE)
580 DUMP_APPEND(buffer, bufferSize,
" maximize");
581 if (style & WS_MAXIMIZEBOX)
582 DUMP_APPEND(buffer, bufferSize,
" maximizebox");
583 if (style & WS_MINIMIZE)
584 DUMP_APPEND(buffer, bufferSize,
" minimize");
585 if (style & WS_MINIMIZEBOX)
586 DUMP_APPEND(buffer, bufferSize,
" minimizebox");
587 if (style & WS_POPUP)
588 DUMP_APPEND(buffer, bufferSize,
" popup");
589 if (style & WS_SIZEBOX)
590 DUMP_APPEND(buffer, bufferSize,
" sizebox");
591 if (style & WS_SYSMENU)
592 DUMP_APPEND(buffer, bufferSize,
" sysmenu");
593 if (style & WS_TABSTOP)
594 DUMP_APPEND(buffer, bufferSize,
" tabstop");
595 if (style & WS_THICKFRAME)
596 DUMP_APPEND(buffer, bufferSize,
" thickframe");
597 if (style & WS_VISIBLE)
598 DUMP_APPEND(buffer, bufferSize,
" visible");
599 if (style & WS_VSCROLL)
600 DUMP_APPEND(buffer, bufferSize,
" vscroll");
601 DUMP_APPEND(buffer, bufferSize,
">");
604static void dump_window_style_ex(
char* buffer,
size_t bufferSize, UINT32 extendedStyle)
606 DUMP_APPEND(buffer, bufferSize,
" styleEx=<0x%" PRIx32
": ", extendedStyle);
607 if (extendedStyle & WS_EX_ACCEPTFILES)
608 DUMP_APPEND(buffer, bufferSize,
" acceptfiles");
609 if (extendedStyle & WS_EX_APPWINDOW)
610 DUMP_APPEND(buffer, bufferSize,
" appwindow");
611 if (extendedStyle & WS_EX_CLIENTEDGE)
612 DUMP_APPEND(buffer, bufferSize,
" clientedge");
613 if (extendedStyle & WS_EX_COMPOSITED)
614 DUMP_APPEND(buffer, bufferSize,
" composited");
615 if (extendedStyle & WS_EX_CONTEXTHELP)
616 DUMP_APPEND(buffer, bufferSize,
" contexthelp");
617 if (extendedStyle & WS_EX_CONTROLPARENT)
618 DUMP_APPEND(buffer, bufferSize,
" controlparent");
619 if (extendedStyle & WS_EX_DLGMODALFRAME)
620 DUMP_APPEND(buffer, bufferSize,
" dlgmodalframe");
621 if (extendedStyle & WS_EX_LAYERED)
622 DUMP_APPEND(buffer, bufferSize,
" layered");
623 if (extendedStyle & WS_EX_LAYOUTRTL)
624 DUMP_APPEND(buffer, bufferSize,
" layoutrtl");
625 if (extendedStyle & WS_EX_LEFT)
626 DUMP_APPEND(buffer, bufferSize,
" left");
627 if (extendedStyle & WS_EX_LEFTSCROLLBAR)
628 DUMP_APPEND(buffer, bufferSize,
" leftscrollbar");
629 if (extendedStyle & WS_EX_LTRREADING)
630 DUMP_APPEND(buffer, bufferSize,
" ltrreading");
631 if (extendedStyle & WS_EX_MDICHILD)
632 DUMP_APPEND(buffer, bufferSize,
" mdichild");
633 if (extendedStyle & WS_EX_NOACTIVATE)
634 DUMP_APPEND(buffer, bufferSize,
" noactivate");
635 if (extendedStyle & WS_EX_NOINHERITLAYOUT)
636 DUMP_APPEND(buffer, bufferSize,
" noinheritlayout");
637#if defined(WS_EX_NOREDIRECTIONBITMAP)
638 if (extendedStyle & WS_EX_NOREDIRECTIONBITMAP)
639 DUMP_APPEND(buffer, bufferSize,
" noredirectionbitmap");
641 if (extendedStyle & WS_EX_RIGHT)
642 DUMP_APPEND(buffer, bufferSize,
" right");
643 if (extendedStyle & WS_EX_RIGHTSCROLLBAR)
644 DUMP_APPEND(buffer, bufferSize,
" rightscrollbar");
645 if (extendedStyle & WS_EX_RTLREADING)
646 DUMP_APPEND(buffer, bufferSize,
" rtlreading");
647 if (extendedStyle & WS_EX_STATICEDGE)
648 DUMP_APPEND(buffer, bufferSize,
" staticedge");
649 if (extendedStyle & WS_EX_TOOLWINDOW)
650 DUMP_APPEND(buffer, bufferSize,
" toolWindow");
651 if (extendedStyle & WS_EX_TOPMOST)
652 DUMP_APPEND(buffer, bufferSize,
" topMost");
653 if (extendedStyle & WS_EX_TRANSPARENT)
654 DUMP_APPEND(buffer, bufferSize,
" transparent");
655 if (extendedStyle & WS_EX_WINDOWEDGE)
656 DUMP_APPEND(buffer, bufferSize,
" windowedge");
657 DUMP_APPEND(buffer, bufferSize,
">");
660static void dump_window_state_order(wLog* log,
const char* msg,
const WINDOW_ORDER_INFO* order,
663 char buffer[3000] = { 0 };
664 const size_t bufferSize =
sizeof(buffer) - 1;
666 (void)_snprintf(buffer, bufferSize,
"%s windowId=%" PRIu32
"", msg, order->windowId);
668 if (order->fieldFlags & WINDOW_ORDER_FIELD_OWNER)
669 DUMP_APPEND(buffer, bufferSize,
" owner=%" PRIu32
"", state->ownerWindowId);
670 if (order->fieldFlags & WINDOW_ORDER_FIELD_STYLE)
672 dump_window_style(buffer, bufferSize, state->style);
673 dump_window_style_ex(buffer, bufferSize, state->extendedStyle);
676 if (order->fieldFlags & WINDOW_ORDER_FIELD_SHOW)
678 const char* showStr = NULL;
679 switch (state->showState)
685 showStr =
"minimized";
688 showStr =
"maximized";
694 showStr =
"<unknown>";
697 DUMP_APPEND(buffer, bufferSize,
" show=%s", showStr);
700 if (order->fieldFlags & WINDOW_ORDER_FIELD_TITLE)
702 char* title = rail_string_to_utf8_string(&state->titleInfo);
705 DUMP_APPEND(buffer, bufferSize,
" title=\"%s\"", title);
709 DUMP_APPEND(buffer, bufferSize,
" title=<decode failed>");
711 if (order->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_OFFSET)
712 DUMP_APPEND(buffer, bufferSize,
" clientOffset=(%" PRId32
",%" PRId32
")",
713 state->clientOffsetX, state->clientOffsetY);
714 if (order->fieldFlags & WINDOW_ORDER_FIELD_CLIENT_AREA_SIZE)
715 DUMP_APPEND(buffer, bufferSize,
" clientAreaWidth=%" PRIu32
" clientAreaHeight=%" PRIu32
"",
716 state->clientAreaWidth, state->clientAreaHeight);
717 if (order->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_X)
718 DUMP_APPEND(buffer, bufferSize,
719 " resizeMarginLeft=%" PRIu32
" resizeMarginRight=%" PRIu32
"",
720 state->resizeMarginLeft, state->resizeMarginRight);
721 if (order->fieldFlags & WINDOW_ORDER_FIELD_RESIZE_MARGIN_Y)
722 DUMP_APPEND(buffer, bufferSize,
723 " resizeMarginTop=%" PRIu32
" resizeMarginBottom=%" PRIu32
"",
724 state->resizeMarginTop, state->resizeMarginBottom);
725 if (order->fieldFlags & WINDOW_ORDER_FIELD_RP_CONTENT)
726 DUMP_APPEND(buffer, bufferSize,
" rpContent=0x%" PRIx32
"", state->RPContent);
727 if (order->fieldFlags & WINDOW_ORDER_FIELD_ROOT_PARENT)
728 DUMP_APPEND(buffer, bufferSize,
" rootParent=0x%" PRIx32
"", state->rootParentHandle);
729 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_OFFSET)
730 DUMP_APPEND(buffer, bufferSize,
" windowOffset=(%" PRId32
",%" PRId32
")",
731 state->windowOffsetX, state->windowOffsetY);
732 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_CLIENT_DELTA)
733 DUMP_APPEND(buffer, bufferSize,
" windowClientDelta=(%" PRId32
",%" PRId32
")",
734 state->windowClientDeltaX, state->windowClientDeltaY);
735 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_SIZE)
736 DUMP_APPEND(buffer, bufferSize,
" windowWidth=%" PRIu32
" windowHeight=%" PRIu32
"",
737 state->windowWidth, state->windowHeight);
739 if (order->fieldFlags & WINDOW_ORDER_FIELD_WND_RECTS)
741 DUMP_APPEND(buffer, bufferSize,
" windowRects=(");
742 for (UINT32 i = 0; i < state->numWindowRects; i++)
744 DUMP_APPEND(buffer, bufferSize,
"(%" PRIu16
",%" PRIu16
",%" PRIu16
",%" PRIu16
")",
745 state->windowRects[i].left, state->windowRects[i].top,
746 state->windowRects[i].right, state->windowRects[i].bottom);
748 DUMP_APPEND(buffer, bufferSize,
")");
751 if (order->fieldFlags & WINDOW_ORDER_FIELD_VIS_OFFSET)
752 DUMP_APPEND(buffer, bufferSize,
" visibleOffset=(%" PRId32
",%" PRId32
")",
753 state->visibleOffsetX, state->visibleOffsetY);
755 if (order->fieldFlags & WINDOW_ORDER_FIELD_VISIBILITY)
757 DUMP_APPEND(buffer, bufferSize,
" visibilityRects=(");
758 for (UINT32 i = 0; i < state->numVisibilityRects; i++)
760 DUMP_APPEND(buffer, bufferSize,
"(%" PRIu16
",%" PRIu16
",%" PRIu16
",%" PRIu16
")",
761 state->visibilityRects[i].left, state->visibilityRects[i].top,
762 state->visibilityRects[i].right, state->visibilityRects[i].bottom);
764 DUMP_APPEND(buffer, bufferSize,
")");
767 if (order->fieldFlags & WINDOW_ORDER_FIELD_OVERLAY_DESCRIPTION)
768 DUMP_APPEND(buffer, bufferSize,
" overlayDescr");
770 if (order->fieldFlags & WINDOW_ORDER_FIELD_ICON_OVERLAY_NULL)
771 DUMP_APPEND(buffer, bufferSize,
" iconOverlayNull");
773 if (order->fieldFlags & WINDOW_ORDER_FIELD_TASKBAR_BUTTON)
774 DUMP_APPEND(buffer, bufferSize,
" taskBarButton=0x%" PRIx8
"", state->TaskbarButton);
776 if (order->fieldFlags & WINDOW_ORDER_FIELD_ENFORCE_SERVER_ZORDER)
777 DUMP_APPEND(buffer, bufferSize,
" enforceServerZOrder=0x%" PRIx8
"",
778 state->EnforceServerZOrder);
779 if (order->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_STATE)
780 DUMP_APPEND(buffer, bufferSize,
" appBarState=0x%" PRIx8
"", state->AppBarState);
781 if (order->fieldFlags & WINDOW_ORDER_FIELD_APPBAR_EDGE)
783 const char* appBarEdgeStr = NULL;
784 switch (state->AppBarEdge)
787 appBarEdgeStr =
"left";
790 appBarEdgeStr =
"top";
793 appBarEdgeStr =
"right";
796 appBarEdgeStr =
"bottom";
799 appBarEdgeStr =
"<unknown>";
802 DUMP_APPEND(buffer, bufferSize,
" appBarEdge=%s", appBarEdgeStr);
805 WLog_Print(log, WLOG_DEBUG, buffer);
808static BOOL update_recv_window_info_order(rdpUpdate* update,
wStream* s,
812 rdpContext* context = update->context;
813 rdpWindowUpdate* window = update->window;
818 WINPR_ASSERT(context);
819 WINPR_ASSERT(window);
820 WINPR_ASSERT(orderInfo);
822 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
825 Stream_Read_UINT32(s, orderInfo->windowId);
827 if (orderInfo->fieldFlags & WINDOW_ORDER_ICON)
830 result = update_read_window_icon_order(s, orderInfo, &window_icon);
834 WLog_Print(up->log, WLOG_DEBUG,
"WindowIcon windowId=0x%" PRIx32
"",
835 orderInfo->windowId);
836 IFCALLRET(window->WindowIcon, result, context, orderInfo, &window_icon);
839 update_free_window_icon_info(window_icon.iconInfo);
840 free(window_icon.iconInfo);
842 else if (orderInfo->fieldFlags & WINDOW_ORDER_CACHED_ICON)
845 result = update_read_window_cached_icon_order(s, orderInfo, &window_cached_icon);
849 WLog_Print(up->log, WLOG_DEBUG,
"WindowCachedIcon windowId=0x%" PRIx32
"",
850 orderInfo->windowId);
851 IFCALLRET(window->WindowCachedIcon, result, context, orderInfo, &window_cached_icon);
854 else if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_DELETED)
856 update_read_window_delete_order(s, orderInfo);
857 WLog_Print(up->log, WLOG_DEBUG,
"WindowDelete windowId=0x%" PRIx32
"", orderInfo->windowId);
858 IFCALLRET(window->WindowDelete, result, context, orderInfo);
863 result = update_read_window_state_order(s, orderInfo, &windowState);
867 if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_NEW)
869 dump_window_state_order(up->log,
"WindowCreate", orderInfo, &windowState);
870 IFCALLRET(window->WindowCreate, result, context, orderInfo, &windowState);
874 dump_window_state_order(up->log,
"WindowUpdate", orderInfo, &windowState);
875 IFCALLRET(window->WindowUpdate, result, context, orderInfo, &windowState);
878 update_free_window_state(&windowState);
887 free(notify->toolTip.string);
888 free(notify->infoTip.text.string);
889 free(notify->infoTip.title.string);
890 update_free_window_icon_info(¬ify->icon);
897 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_VERSION)
899 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
902 Stream_Read_UINT32(s, notify_icon_state->version);
905 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_TIP)
907 if (!rail_read_unicode_string(s,
908 ¬ify_icon_state->toolTip))
912 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_INFO_TIP)
914 if (!update_read_notify_icon_infotip(
915 s, ¬ify_icon_state->infoTip))
919 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_STATE)
921 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
924 Stream_Read_UINT32(s, notify_icon_state->state);
927 if (orderInfo->fieldFlags & WINDOW_ORDER_ICON)
929 if (!update_read_icon_info(s, ¬ify_icon_state->icon))
933 if (orderInfo->fieldFlags & WINDOW_ORDER_CACHED_ICON)
935 if (!update_read_cached_icon_info(
936 s, ¬ify_icon_state->cachedIcon))
944update_read_notification_icon_delete_order(WINPR_ATTR_UNUSED
wStream* s,
950static BOOL update_recv_notification_icon_info_order(rdpUpdate* update,
wStream* s,
954 rdpContext* context = update->context;
955 rdpWindowUpdate* window = update->window;
959 WINPR_ASSERT(orderInfo);
960 WINPR_ASSERT(context);
961 WINPR_ASSERT(window);
963 if (!Stream_CheckAndLogRequiredLength(TAG, s, 8))
966 Stream_Read_UINT32(s, orderInfo->windowId);
967 Stream_Read_UINT32(s, orderInfo->notifyIconId);
969 if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_DELETED)
971 update_read_notification_icon_delete_order(s, orderInfo);
972 WLog_Print(up->log, WLOG_DEBUG,
"NotifyIconDelete");
973 IFCALLRET(window->NotifyIconDelete, result, context, orderInfo);
978 result = update_read_notification_icon_state_order(s, orderInfo, ¬ify_icon_state);
983 if (orderInfo->fieldFlags & WINDOW_ORDER_STATE_NEW)
985 WLog_Print(up->log, WLOG_DEBUG,
"NotifyIconCreate");
986 IFCALLRET(window->NotifyIconCreate, result, context, orderInfo, ¬ify_icon_state);
990 WLog_Print(up->log, WLOG_DEBUG,
"NotifyIconUpdate");
991 IFCALLRET(window->NotifyIconUpdate, result, context, orderInfo, ¬ify_icon_state);
994 update_notify_icon_state_order_free(¬ify_icon_state);
1000static BOOL update_read_desktop_actively_monitored_order(
wStream* s,
1004 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND)
1006 if (!Stream_CheckAndLogRequiredLength(TAG, s, 4))
1009 Stream_Read_UINT32(s, monitored_desktop->activeWindowId);
1012 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ZORDER)
1014 if (!Stream_CheckAndLogRequiredLength(TAG, s, 1))
1017 Stream_Read_UINT8(s, monitored_desktop->numWindowIds);
1019 if (!Stream_CheckAndLogRequiredLengthOfSize(TAG, s, monitored_desktop->numWindowIds, 4ull))
1021 monitored_desktop->numWindowIds = 0;
1025 if (monitored_desktop->numWindowIds > 0)
1027 const size_t size =
sizeof(UINT32) * monitored_desktop->numWindowIds;
1028 UINT32* newid = (UINT32*)realloc(monitored_desktop->windowIds, size);
1032 free(monitored_desktop->windowIds);
1033 monitored_desktop->windowIds = NULL;
1034 monitored_desktop->numWindowIds = 0;
1038 monitored_desktop->windowIds = newid;
1041 for (UINT32 i = 0; i < monitored_desktop->numWindowIds; i++)
1043 Stream_Read_UINT32(s, monitored_desktop->windowIds[i]);
1048 free(monitored_desktop->windowIds);
1049 monitored_desktop->windowIds = NULL;
1056static void update_read_desktop_non_monitored_order(WINPR_ATTR_UNUSED
wStream* s,
1062static void dump_monitored_desktop(wLog* log,
const char* msg,
const WINDOW_ORDER_INFO* orderInfo,
1065 char buffer[1000] = { 0 };
1066 const size_t bufferSize =
sizeof(buffer) - 1;
1068 DUMP_APPEND(buffer, bufferSize,
"%s", msg);
1070 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND)
1071 DUMP_APPEND(buffer, bufferSize,
" activeWindowId=0x%" PRIx32
"", monitored->activeWindowId);
1073 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_ZORDER)
1075 DUMP_APPEND(buffer, bufferSize,
" windows=(");
1076 for (UINT32 i = 0; i < monitored->numWindowIds; i++)
1078 WINPR_ASSERT(monitored->windowIds);
1079 DUMP_APPEND(buffer, bufferSize,
"0x%" PRIx32
",", monitored->windowIds[i]);
1081 DUMP_APPEND(buffer, bufferSize,
")");
1083 WLog_Print(log, WLOG_DEBUG, buffer);
1086static BOOL update_recv_desktop_info_order(rdpUpdate* update,
wStream* s,
1090 rdpContext* context = update->context;
1091 rdpWindowUpdate* window = update->window;
1095 WINPR_ASSERT(orderInfo);
1096 WINPR_ASSERT(context);
1097 WINPR_ASSERT(window);
1099 if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_DESKTOP_NONE)
1101 update_read_desktop_non_monitored_order(s, orderInfo);
1102 WLog_Print(up->log, WLOG_DEBUG,
"NonMonitoredDesktop, windowId=0x%" PRIx32
"",
1103 orderInfo->windowId);
1104 IFCALLRET(window->NonMonitoredDesktop, result, context, orderInfo);
1109 result = update_read_desktop_actively_monitored_order(s, orderInfo, &monitored_desktop);
1113 dump_monitored_desktop(up->log,
"ActivelyMonitoredDesktop", orderInfo,
1114 &monitored_desktop);
1115 IFCALLRET(window->MonitoredDesktop, result, context, orderInfo, &monitored_desktop);
1118 free(monitored_desktop.windowIds);
1124void update_free_window_icon_info(
ICON_INFO* iconInfo)
1129 free(iconInfo->bitsColor);
1130 iconInfo->bitsColor = NULL;
1131 free(iconInfo->bitsMask);
1132 iconInfo->bitsMask = NULL;
1133 free(iconInfo->colorTable);
1134 iconInfo->colorTable = NULL;
1137BOOL update_recv_altsec_window_order(rdpUpdate* update,
wStream* s)
1140 size_t remaining = 0;
1141 UINT16 orderSize = 0;
1145 remaining = Stream_GetRemainingLength(s);
1147 if (!Stream_CheckAndLogRequiredLength(TAG, s, 6))
1150 Stream_Read_UINT16(s, orderSize);
1151 Stream_Read_UINT32(s, orderInfo.fieldFlags);
1153 if (remaining + 1 < orderSize)
1155 WLog_Print(up->log, WLOG_ERROR,
"Stream short orderSize");
1159 if (!window_order_supported(update->context->settings, orderInfo.fieldFlags))
1161 WLog_INFO(TAG,
"Window order %08" PRIx32
" not supported!", orderInfo.fieldFlags);
1165 if (orderInfo.fieldFlags & WINDOW_ORDER_TYPE_WINDOW)
1166 rc = update_recv_window_info_order(update, s, &orderInfo);
1167 else if (orderInfo.fieldFlags & WINDOW_ORDER_TYPE_NOTIFY)
1168 rc = update_recv_notification_icon_info_order(update, s, &orderInfo);
1169 else if (orderInfo.fieldFlags & WINDOW_ORDER_TYPE_DESKTOP)
1170 rc = update_recv_desktop_info_order(update, s, &orderInfo);
1173 WLog_Print(up->log, WLOG_ERROR,
"windoworder flags %08" PRIx32
" failed",
1174 orderInfo.fieldFlags);