[gnome-remote-desktop] session-rdp: Add support for monitor layout changes during a session



commit a09b1c99141b98978ebdf8772172e8c2dd93ca5e
Author: Pascal Nowack <Pascal Nowack gmx de>
Date:   Tue Jan 26 18:42:29 2021 +0100

    session-rdp: Add support for monitor layout changes during a session
    
    With the display control class now being implemented, add support for
    monitor layout changes during the remote desktop session by creating an
    instance of the display control class.
    As the Display Control channel is a dynamic channel, the socket thread
    will take care opening it.

 src/grd-rdp-private.h |  1 +
 src/grd-session-rdp.c | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+)
---
diff --git a/src/grd-rdp-private.h b/src/grd-rdp-private.h
index eebc2ce5..9faebef4 100644
--- a/src/grd-rdp-private.h
+++ b/src/grd-rdp-private.h
@@ -42,6 +42,7 @@ typedef struct _RdpPeerContext
   HANDLE vcm;
 
   GrdClipboardRdp *clipboard_rdp;
+  GrdRdpDisplayControl *display_control;
   GrdRdpGraphicsPipeline *graphics_pipeline;
 } RdpPeerContext;
 
diff --git a/src/grd-session-rdp.c b/src/grd-session-rdp.c
index 1f1acd2c..1e11dbfd 100644
--- a/src/grd-session-rdp.c
+++ b/src/grd-session-rdp.c
@@ -34,6 +34,7 @@
 #include "grd-hwaccel-nvidia.h"
 #include "grd-rdp-buffer.h"
 #include "grd-rdp-damage-detector.h"
+#include "grd-rdp-display-control.h"
 #include "grd-rdp-event-queue.h"
 #include "grd-rdp-graphics-pipeline.h"
 #include "grd-rdp-network-autodetection.h"
@@ -1992,6 +1993,7 @@ socket_thread_func (gpointer data)
       if (WTSVirtualChannelManagerIsChannelJoined (vcm, "drdynvc"))
         {
           GrdRdpGraphicsPipeline *graphics_pipeline;
+          GrdRdpDisplayControl *display_control;
 
           switch (WTSVirtualChannelManagerGetDrdynvcState (vcm))
             {
@@ -2004,9 +2006,12 @@ socket_thread_func (gpointer data)
               break;
             case DRDYNVC_STATE_READY:
               graphics_pipeline = rdp_peer_context->graphics_pipeline;
+              display_control = rdp_peer_context->display_control;
 
               if (rdp_settings->SupportGraphicsPipeline)
                 grd_rdp_graphics_pipeline_maybe_init (graphics_pipeline);
+
+              grd_rdp_display_control_maybe_init (display_control);
               break;
             }
 
@@ -2151,6 +2156,7 @@ grd_session_rdp_stop (GrdSession *session)
   g_clear_object (&session_rdp->pipewire_stream);
 
   g_clear_object (&rdp_peer_context->clipboard_rdp);
+  g_clear_object (&rdp_peer_context->display_control);
   g_clear_object (&rdp_peer_context->graphics_pipeline);
 
   g_clear_pointer (&session_rdp->socket_thread, g_thread_join);
@@ -2286,6 +2292,21 @@ grd_session_rdp_stream_ready (GrdSession *session,
   g_signal_connect (session_rdp->pipewire_stream, "closed",
                     G_CALLBACK (on_pipewire_stream_closed),
                     session_rdp);
+
+  if (session_rdp->screen_share_mode == GRD_RDP_SCREEN_SHARE_MODE_EXTEND)
+    {
+      freerdp_peer *peer = session_rdp->peer;
+      RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
+
+      if (!rdp_peer_context->display_control)
+        {
+          rdp_peer_context->display_control =
+            grd_rdp_display_control_new (session_rdp,
+                                         rdp_peer_context->vcm,
+                                         session_rdp->stop_event,
+                                         MAX_MONITOR_COUNT);
+        }
+    }
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]