[clients] add checks from #11804 to all clients

This commit is contained in:
akallabeth
2025-09-16 09:23:31 +02:00
parent 73cdd2cfc1
commit 8062adf83d
7 changed files with 164 additions and 80 deletions

View File

@@ -1400,29 +1400,37 @@ BOOL mac_begin_paint(rdpContext *context)
BOOL mac_end_paint(rdpContext *context)
{
rdpGdi *gdi;
HGDI_RGN invalid;
NSRect newDrawRect;
int ww, wh, dw, dh;
mfContext *mfc = (mfContext *)context;
MRDPView *view = (MRDPView *)mfc->view;
gdi = context->gdi;
if (!gdi)
return FALSE;
ww = mfc->client_width;
wh = mfc->client_height;
dw = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopWidth);
dh = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopHeight);
if ((!context) || (!context->gdi))
return FALSE;
if (context->gdi->primary->hdc->hwnd->invalid->null)
mfContext *mfc = (mfContext *)context;
MRDPView *view = (MRDPView *)mfc->view;
WINPR_ASSERT(view);
rdpGdi *gdi = context->gdi;
if (!gdi)
return FALSE;
const int ww = mfc->client_width;
const int wh = mfc->client_height;
const int dw = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopWidth);
const int dh = freerdp_settings_get_uint32(mfc->common.context.settings, FreeRDP_DesktopHeight);
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
invalid = gdi->primary->hdc->hwnd->invalid;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
if (hwnd->invalid->null)
return TRUE;
HGDI_RGN invalid = gdi->primary->hdc->hwnd->invalid;
newDrawRect.origin.x = invalid->x;
newDrawRect.origin.y = invalid->y;
newDrawRect.size.width = invalid->w;

View File

@@ -285,7 +285,6 @@ static int error_info_to_error(freerdp* instance, DWORD* pcode, char** msg, size
* It can be used to reset invalidated areas. */
static BOOL sdl_begin_paint(rdpContext* context)
{
rdpGdi* gdi = nullptr;
auto sdl = get_context(context);
WINPR_ASSERT(sdl);
@@ -301,14 +300,19 @@ static BOOL sdl_begin_paint(rdpContext* context)
}
sdl->update_complete.clear();
gdi = context->gdi;
auto gdi = context->gdi;
WINPR_ASSERT(gdi);
WINPR_ASSERT(gdi->primary);
WINPR_ASSERT(gdi->primary->hdc);
WINPR_ASSERT(gdi->primary->hdc->hwnd);
WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid);
gdi->primary->hdc->hwnd->invalid->null = TRUE;
gdi->primary->hdc->hwnd->ninvalid = 0;
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid);
hwnd->invalid->null = TRUE;
hwnd->ninvalid = 0;
return TRUE;
}
@@ -437,24 +441,33 @@ static BOOL sdl_draw_to_window(SdlContext* sdl, std::map<Uint32, SdlWindow>& win
static BOOL sdl_end_paint_process(rdpContext* context)
{
rdpGdi* gdi = nullptr;
auto sdl = get_context(context);
WINPR_ASSERT(context);
SdlEventUpdateTriggerGuard guard(sdl);
gdi = context->gdi;
auto gdi = context->gdi;
WINPR_ASSERT(gdi);
WINPR_ASSERT(gdi->primary);
WINPR_ASSERT(gdi->primary->hdc);
WINPR_ASSERT(gdi->primary->hdc->hwnd);
WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid);
if (gdi->suppressOutput || gdi->primary->hdc->hwnd->invalid->null)
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
const INT32 ninvalid = gdi->primary->hdc->hwnd->ninvalid;
const GDI_RGN* cinvalid = gdi->primary->hdc->hwnd->cinvalid;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
if (hwnd->invalid->null)
return TRUE;
WINPR_ASSERT(hwnd->invalid);
if (gdi->suppressOutput || hwnd->invalid->null)
return TRUE;
const INT32 ninvalid = hwnd->ninvalid;
const GDI_RGN* cinvalid = hwnd->cinvalid;
if (ninvalid < 1)
return TRUE;

View File

@@ -285,11 +285,16 @@ static BOOL sdl_begin_paint(rdpContext* context)
auto gdi = context->gdi;
WINPR_ASSERT(gdi);
WINPR_ASSERT(gdi->primary);
WINPR_ASSERT(gdi->primary->hdc);
WINPR_ASSERT(gdi->primary->hdc->hwnd);
WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid);
gdi->primary->hdc->hwnd->invalid->null = TRUE;
gdi->primary->hdc->hwnd->ninvalid = 0;
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid);
hwnd->invalid->null = TRUE;
hwnd->ninvalid = 0;
return TRUE;
}
@@ -377,14 +382,24 @@ static BOOL sdl_end_paint(rdpContext* context)
auto gdi = context->gdi;
WINPR_ASSERT(gdi);
WINPR_ASSERT(gdi->primary);
WINPR_ASSERT(gdi->primary->hdc);
WINPR_ASSERT(gdi->primary->hdc->hwnd);
WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid);
if (gdi->suppressOutput || gdi->primary->hdc->hwnd->invalid->null)
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
const INT32 ninvalid = gdi->primary->hdc->hwnd->ninvalid;
const GDI_RGN* cinvalid = gdi->primary->hdc->hwnd->cinvalid;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
if (hwnd->invalid->null)
return TRUE;
WINPR_ASSERT(hwnd->invalid);
if (gdi->suppressOutput || hwnd->invalid->null)
return TRUE;
const INT32 ninvalid = hwnd->ninvalid;
const GDI_RGN* cinvalid = hwnd->cinvalid;
if (ninvalid < 1)
return TRUE;

View File

@@ -78,11 +78,16 @@ static BOOL tf_end_paint(rdpContext* context)
gdi = context->gdi;
WINPR_ASSERT(gdi);
WINPR_ASSERT(gdi->primary);
WINPR_ASSERT(gdi->primary->hdc);
WINPR_ASSERT(gdi->primary->hdc->hwnd);
WINPR_ASSERT(gdi->primary->hdc->hwnd->invalid);
if (gdi->primary->hdc->hwnd->invalid->null)
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
if (hwnd->invalid->null)
return TRUE;
return TRUE;

View File

@@ -120,33 +120,33 @@ fail:
static BOOL wl_end_paint(rdpContext* context)
{
rdpGdi* gdi = NULL;
wlfContext* context_w = NULL;
INT32 x = 0;
INT32 y = 0;
INT32 w = 0;
INT32 h = 0;
if (!context || !context->gdi || !context->gdi->primary)
return FALSE;
gdi = context->gdi;
if (gdi->primary->hdc->hwnd->invalid->null)
rdpGdi* gdi = context->gdi;
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
x = gdi->primary->hdc->hwnd->invalid->x;
y = gdi->primary->hdc->hwnd->invalid->y;
w = gdi->primary->hdc->hwnd->invalid->w;
h = gdi->primary->hdc->hwnd->invalid->h;
context_w = (wlfContext*)context;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
if (hwnd->invalid->null)
return TRUE;
const INT32 x = hwnd->invalid->x;
const INT32 y = hwnd->invalid->y;
const INT32 w = hwnd->invalid->w;
const INT32 h = hwnd->invalid->h;
wlfContext* context_w = (wlfContext*)context;
if (!wl_update_buffer(context_w, x, y, w, h))
{
return FALSE;
}
gdi->primary->hdc->hwnd->invalid->null = TRUE;
gdi->primary->hdc->hwnd->ninvalid = 0;
hwnd->invalid->null = TRUE;
hwnd->ninvalid = 0;
return TRUE;
}

View File

@@ -83,17 +83,30 @@ static BOOL wf_has_console(void)
static BOOL wf_end_paint(rdpContext* context)
{
rdpGdi* gdi;
int ninvalid;
RECT updateRect;
HGDI_RGN cinvalid;
REGION16 invalidRegion;
RECTANGLE_16 invalidRect;
const RECTANGLE_16* extents;
RECT updateRect = { 0 };
REGION16 invalidRegion = { 0 };
RECTANGLE_16 invalidRect = { 0 };
const RECTANGLE_16* extents = NULL;
WINPR_ASSERT(context);
wfContext* wfc = (wfContext*)context;
gdi = context->gdi;
ninvalid = gdi->primary->hdc->hwnd->ninvalid;
cinvalid = gdi->primary->hdc->hwnd->cinvalid;
rdpGdi* gdi = context->gdi;
WINPR_ASSERT(gdi);
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
if (hwnd->invalid->null)
return TRUE;
const int ninvalid = hwnd->ninvalid;
const HGDI_RGN cinvalid = hwnd->cinvalid;
if (ninvalid < 1)
return TRUE;

View File

@@ -129,20 +129,50 @@ DWORD ios_ui_verify_changed_certificate_ex(freerdp *instance, const char *host,
BOOL ios_ui_begin_paint(rdpContext *context)
{
WINPR_ASSERT(context);
rdpGdi *gdi = context->gdi;
gdi->primary->hdc->hwnd->invalid->null = TRUE;
WINPR_ASSERT(gdi);
WINPR_ASSERT(gdi->primary);
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
HGDI_WND hwnd = hdc->hwnd;
if (!hwnd->invalid)
return TRUE;
hwnd->invalid->null = TRUE;
return TRUE;
}
BOOL ios_ui_end_paint(rdpContext *context)
{
mfInfo *mfi = MFI_FROM_INSTANCE(context->instance);
rdpGdi *gdi = context->gdi;
CGRect dirty_rect =
CGRectMake(gdi->primary->hdc->hwnd->invalid->x, gdi->primary->hdc->hwnd->invalid->y,
gdi->primary->hdc->hwnd->invalid->w, gdi->primary->hdc->hwnd->invalid->h);
WINPR_ASSERT(context);
if (!gdi->primary->hdc->hwnd->invalid->null)
mfInfo *mfi = MFI_FROM_INSTANCE(context->instance);
WINPR_ASSERT(mfi);
rdpGdi *gdi = context->gdi;
WINPR_ASSERT(gdi);
WINPR_ASSERT(gdi->primary);
HGDI_DC hdc = gdi->primary->hdc;
WINPR_ASSERT(hdc);
if (!hdc->hwnd)
return TRUE;
HGDI_WND hwnd = hdc->hwnd;
WINPR_ASSERT(hwnd->invalid || (hwnd->ninvalid == 0));
if (hwnd->invalid->null)
return TRUE;
CGRect dirty_rect =
CGRectMake(hwnd->invalid->x, hwnd->invalid->y, hwnd->invalid->w, hwnd->invalid->h);
if (!hwnd->invalid->null)
[mfi->session performSelectorOnMainThread:@selector(setNeedsDisplayInRectAsValue:)
withObject:[NSValue valueWithCGRect:dirty_rect]
waitUntilDone:NO];