[client,x11] destroy XImage on window unmap

When unmapping rails window destroy the cached XImage of appWindow
This commit is contained in:
Armin Novak
2026-02-09 16:58:20 +01:00
parent 1994e98442
commit 169d358734
3 changed files with 31 additions and 3 deletions

View File

@@ -30,6 +30,7 @@
#include "xf_gfx.h"
#include "xf_rail.h"
#include "xf_utils.h"
#include "xf_window.h"
#include <X11/Xutil.h>
@@ -444,6 +445,27 @@ static UINT xf_DeleteSurface(RdpgfxClientContext* context,
return status;
}
static UINT xf_UnmapWindowForSurface(RdpgfxClientContext* context, UINT64 windowID)
{
WINPR_ASSERT(context);
rdpGdi* gdi = (rdpGdi*)context->custom;
WINPR_ASSERT(gdi);
xfContext* xfc = (xfContext*)gdi->context;
WINPR_ASSERT(gdi->context);
if (freerdp_settings_get_bool(gdi->context->settings, FreeRDP_RemoteApplicationMode))
{
xfAppWindow* appWindow = xf_rail_get_window(xfc, windowID);
if (appWindow)
xf_AppWindowDestroyImage(appWindow);
xf_rail_return_window(appWindow);
}
WLog_WARN(TAG, "function not implemented");
return CHANNEL_RC_OK;
}
static UINT xf_UpdateWindowFromSurface(RdpgfxClientContext* context, gdiGfxSurface* surface)
{
WINPR_ASSERT(context);
@@ -482,7 +504,9 @@ void xf_graphics_pipeline_init(xfContext* xfc, RdpgfxClientContext* gfx)
gfx->CreateSurface = xf_CreateSurface;
gfx->DeleteSurface = xf_DeleteSurface;
}
gfx->UpdateWindowFromSurface = xf_UpdateWindowFromSurface;
gfx->UnmapWindowForSurface = xf_UnmapWindowForSurface;
}
void xf_graphics_pipeline_uninit(xfContext* xfc, RdpgfxClientContext* gfx)

View File

@@ -1380,7 +1380,7 @@ void xf_UpdateWindowArea(xfContext* xfc, xfAppWindow* appWindow, int x, int y, i
xf_unlock_x11(xfc);
}
static void xf_AppWindowDestroyImage(xfAppWindow* appWindow)
void xf_AppWindowDestroyImage(xfAppWindow* appWindow)
{
WINPR_ASSERT(appWindow);
if (appWindow->image)

View File

@@ -167,10 +167,13 @@ void xf_SetWindowMinimized(xfContext* xfc, xfWindow* window);
void xf_SetWindowDecorations(xfContext* xfc, Window window, BOOL show);
void xf_SetWindowUnlisted(xfContext* xfc, Window window);
xfWindow* xf_CreateDesktopWindow(xfContext* xfc, char* name, int width, int height);
void xf_ResizeDesktopWindow(xfContext* xfc, xfWindow* window, int width, int height);
void xf_DestroyDesktopWindow(xfContext* xfc, xfWindow* window);
WINPR_ATTR_MALLOC(xf_DestroyDesktopWindow, 2)
xfWindow* xf_CreateDesktopWindow(xfContext* xfc, char* name, int width, int height);
void xf_ResizeDesktopWindow(xfContext* xfc, xfWindow* window, int width, int height);
Window xf_CreateDummyWindow(xfContext* xfc);
void xf_DestroyDummyWindow(xfContext* xfc, Window window);
@@ -196,6 +199,7 @@ void xf_UpdateWindowArea(xfContext* xfc, xfAppWindow* appWindow, int x, int y, i
int height);
UINT xf_AppUpdateWindowFromSurface(xfContext* xfc, gdiGfxSurface* surface);
void xf_AppWindowDestroyImage(xfAppWindow* appWindow);
void xf_DestroyWindow(xfContext* xfc, xfAppWindow* appWindow);
void xf_SetWindowMinMaxInfo(xfContext* xfc, xfAppWindow* appWindow, int maxWidth, int maxHeight,
int maxPosX, int maxPosY, int minTrackWidth, int minTrackHeight,