Fixed load/unload for display channel.
authorArmin Novak <armin.novak@thincast.com>
Mon, 24 Sep 2018 14:44:25 +0000 (16:44 +0200)
committerArmin Novak <armin.novak@thincast.com>
Mon, 24 Sep 2018 14:44:25 +0000 (16:44 +0200)
client/X11/xf_channels.c
client/X11/xf_disp.c
client/X11/xf_disp.h
client/X11/xfreerdp.h

index 17029a5..ef91504 100644 (file)
@@ -68,7 +68,7 @@ void xf_OnChannelConnectedEventHandler(void* context, ChannelConnectedEventArgs*
        }
        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)
        {
@@ -96,6 +96,10 @@ void xf_OnChannelDisconnectedEventHandler(void* context, ChannelDisconnectedEven
        {
                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);
index ee1dec1..abf91d8 100644 (file)
@@ -40,6 +40,7 @@
 struct _xfDispContext
 {
        xfContext* xfc;
+       DispClientContext* disp;
        BOOL haveXRandr;
        int eventBase, errorBase;
        int lastSentWidth, lastSentHeight;
@@ -121,7 +122,7 @@ static BOOL xf_disp_sendResize(xfDispContext* xfDisp)
        if (!settings)
                return FALSE;
 
-       if (!xfDisp->activated)
+       if (!xfDisp->activated || !xfDisp->disp)
                return TRUE;
 
        if (GetTickCount64() - xfDisp->lastSentDate < RESIZE_MIN_DELAY)
@@ -134,7 +135,7 @@ static BOOL xf_disp_sendResize(xfDispContext* xfDisp)
 
        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;
        }
@@ -151,7 +152,7 @@ static BOOL xf_disp_sendResize(xfDispContext* xfDisp)
                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;
        }
@@ -335,7 +336,7 @@ BOOL xf_disp_handle_xevent(xfContext* xfc, XEvent* event)
        if (!settings)
                return FALSE;
 
-       if (!xfDisp->haveXRandr)
+       if (!xfDisp->haveXRandr || !xfDisp->disp)
                return TRUE;
 
 #ifdef USABLE_XRANDR
@@ -345,7 +346,7 @@ BOOL xf_disp_handle_xevent(xfContext* xfc, XEvent* event)
 
 #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;
 }
 
@@ -354,7 +355,7 @@ BOOL xf_disp_handle_configureNotify(xfContext* xfc, int width, int height)
 {
        xfDispContext* xfDisp;
 
-       if (!xfc || !xfc->disp)
+       if (!xfc)
                return FALSE;
 
        xfDisp = xfc->xfDisp;
@@ -382,11 +383,16 @@ UINT xf_DisplayControlCaps(DispClientContext* disp, UINT32 maxNumMonitors,
        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)
        {
@@ -396,7 +402,8 @@ BOOL xf_disp_init(xfContext* xfc, DispClientContext* disp)
                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
@@ -405,3 +412,10 @@ BOOL xf_disp_init(xfContext* xfc, DispClientContext* disp)
        return TRUE;
 }
 
+BOOL xf_disp_uninit(xfDispContext* xfDisp, DispClientContext* disp)
+{
+       if (!xfDisp || !disp)
+               return FALSE;
+
+       xfDisp->disp = NULL;
+}
index b730e32..6e2db41 100644 (file)
 #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);
+xfDispContextxf_disp_new(xfContext* xfc);
+void xf_disp_free(xfDispContextdisp);
+BOOL xf_disp_handle_xevent(xfContext* xfc, XEvent* event);
+BOOL xf_disp_handle_configureNotify(xfContextxfc, int width, int height);
+void xf_disp_resized(xfDispContextdisp);
 
 #endif /* FREERDP_CLIENT_X11_DISP_H */
index fccebe4..e448d6f 100644 (file)
@@ -220,7 +220,6 @@ struct xf_context
        RdpeiClientContext* rdpei;
        EncomspClientContext* encomsp;
        xfDispContext* xfDisp;
-       DispClientContext* disp;
 
        RailClientContext* rail;
        wHashTable* railWindows;