}
else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0)
{
- xf_disp_init(xfc, (DispClientContext*)e->pInterface);
+ xf_disp_init(xfc->xfDisp, (DispClientContext*)e->pInterface);
}
else if (strcmp(e->name, GEOMETRY_DVC_CHANNEL_NAME) == 0)
{
{
xfc->rdpei = NULL;
}
+ else if (strcmp(e->name, DISP_DVC_CHANNEL_NAME) == 0)
+ {
+ xf_disp_uninit(xfc->xfDisp, (DispClientContext*)e->pInterface);
+ }
else if (strcmp(e->name, TSMF_DVC_CHANNEL_NAME) == 0)
{
xf_tsmf_uninit(xfc, (TsmfClientContext*) e->pInterface);
struct _xfDispContext
{
xfContext* xfc;
+ DispClientContext* disp;
BOOL haveXRandr;
int eventBase, errorBase;
int lastSentWidth, lastSentHeight;
if (!settings)
return FALSE;
- if (!xfDisp->activated)
+ if (!xfDisp->activated || !xfDisp->disp)
return TRUE;
if (GetTickCount64() - xfDisp->lastSentDate < RESIZE_MIN_DELAY)
if (xfc->fullscreen && (settings->MonitorCount > 0))
{
- if (xf_disp_sendLayout(xfc->disp, settings->MonitorDefArray,
+ if (xf_disp_sendLayout(xfDisp->disp, settings->MonitorDefArray,
settings->MonitorCount) != CHANNEL_RC_OK)
return FALSE;
}
layout.PhysicalWidth = xfDisp->targetWidth;
layout.PhysicalHeight = xfDisp->targetHeight;
- if (IFCALLRESULT(CHANNEL_RC_OK, xfc->disp->SendMonitorLayout, xfc->disp, 1,
+ if (IFCALLRESULT(CHANNEL_RC_OK, xfDisp->disp->SendMonitorLayout, xfDisp->disp, 1,
&layout) != CHANNEL_RC_OK)
return FALSE;
}
if (!settings)
return FALSE;
- if (!xfDisp->haveXRandr)
+ if (!xfDisp->haveXRandr || !xfDisp->disp)
return TRUE;
#ifdef USABLE_XRANDR
#endif
xf_detect_monitors(xfc, &maxWidth, &maxHeight);
- return xf_disp_sendLayout(xfc->disp, settings->MonitorDefArray,
+ return xf_disp_sendLayout(xfDisp->disp, settings->MonitorDefArray,
settings->MonitorCount) == CHANNEL_RC_OK;
}
{
xfDispContext* xfDisp;
- if (!xfc || !xfc->disp)
+ if (!xfc)
return FALSE;
xfDisp = xfc->xfDisp;
return xf_disp_set_window_resizable(xfDisp) ? CHANNEL_RC_OK : CHANNEL_RC_NO_MEMORY;
}
-BOOL xf_disp_init(xfContext* xfc, DispClientContext* disp)
+BOOL xf_disp_init(xfDispContext* xfDisp, DispClientContext* disp)
{
- rdpSettings* settings = xfc->context.settings;
- xfc->disp = disp;
- disp->custom = (void*) xfc->xfDisp;
+ rdpSettings* settings;
+
+ if (!xfDisp || !xfDisp->xfc || !disp)
+ return FALSE;
+
+ settings = xfDisp->xfc->context.settings;
+ xfDisp->disp = disp;
+ disp->custom = (void*) xfDisp;
if (settings->DynamicResolutionUpdate)
{
if (settings->Fullscreen)
{
/* ask X11 to notify us of screen changes */
- XRRSelectInput(xfc->display, DefaultRootWindow(xfc->display), RRScreenChangeNotifyMask);
+ XRRSelectInput(xfDisp->xfc->display, DefaultRootWindow(xfDisp->xfc->display),
+ RRScreenChangeNotifyMask);
}
#endif
return TRUE;
}
+BOOL xf_disp_uninit(xfDispContext* xfDisp, DispClientContext* disp)
+{
+ if (!xfDisp || !disp)
+ return FALSE;
+
+ xfDisp->disp = NULL;
+}
#include "xf_client.h"
#include "xfreerdp.h"
-FREERDP_API BOOL xf_disp_init(xfContext* xfc, DispClientContext *disp);
+FREERDP_API BOOL xf_disp_init(xfDispContext* xfDisp, DispClientContext* disp);
+FREERDP_API BOOL xf_disp_uninit(xfDispContext* xfDisp, DispClientContext* disp);
-xfDispContext *xf_disp_new(xfContext* xfc);
-void xf_disp_free(xfDispContext *disp);
-BOOL xf_disp_handle_xevent(xfContext *xfc, XEvent *event);
-BOOL xf_disp_handle_configureNotify(xfContext *xfc, int width, int height);
-void xf_disp_resized(xfDispContext *disp);
+xfDispContext* xf_disp_new(xfContext* xfc);
+void xf_disp_free(xfDispContext* disp);
+BOOL xf_disp_handle_xevent(xfContext* xfc, XEvent* event);
+BOOL xf_disp_handle_configureNotify(xfContext* xfc, int width, int height);
+void xf_disp_resized(xfDispContext* disp);
#endif /* FREERDP_CLIENT_X11_DISP_H */