mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
[client,x11] destroy XImage on window unmap
When unmapping rails window destroy the cached XImage of appWindow
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user