[gnome-remote-desktop] session-rdp: Add API to explicitly hide mouse pointer



commit ae3333fc99d82c30dd18a5b883b8146e466fba86
Author: Pascal Nowack <Pascal Nowack gmx de>
Date:   Tue Jan 26 11:42:57 2021 +0100

    session-rdp: Add API to explicitly hide mouse pointer
    
    grd_session_rdp_update_pointer() will only be called if PipeWire has an
    explicit mouse pointer bitmap.
    If the mouse pointer is hidden and there is no mouse pointer bitmap,
    the RDP client won't hide the mouse pointer, although it should.
    
    Add a new API which allows the PipeWire backend to hide the mouse
    pointer.

 src/grd-session-rdp.c | 21 +++++++++++++++++++++
 src/grd-session-rdp.h |  2 ++
 2 files changed, 23 insertions(+)
---
diff --git a/src/grd-session-rdp.c b/src/grd-session-rdp.c
index 58c9ebd..d3daeb9 100644
--- a/src/grd-session-rdp.c
+++ b/src/grd-session-rdp.c
@@ -451,6 +451,27 @@ grd_session_rdp_update_pointer (GrdSessionRdp *session_rdp,
   g_free (xor_mask);
 }
 
+void
+grd_session_rdp_hide_pointer (GrdSessionRdp *session_rdp)
+{
+  freerdp_peer *peer = session_rdp->peer;
+  RdpPeerContext *rdp_peer_context = (RdpPeerContext *) peer->context;
+  rdpUpdate *rdp_update = peer->update;
+  POINTER_SYSTEM_UPDATE pointer_system = {0};
+
+  if (!(rdp_peer_context->flags & RDP_PEER_ACTIVATED))
+    return;
+
+  if (session_rdp->pointer_type == POINTER_TYPE_HIDDEN)
+    return;
+
+  session_rdp->last_pointer = NULL;
+  session_rdp->pointer_type = POINTER_TYPE_HIDDEN;
+  pointer_system.type = SYSPTR_NULL;
+
+  rdp_update->pointer->PointerSystem (peer->context, &pointer_system);
+}
+
 void
 grd_session_rdp_move_pointer (GrdSessionRdp *session_rdp,
                               uint16_t       x,
diff --git a/src/grd-session-rdp.h b/src/grd-session-rdp.h
index abcb37d..1884144 100644
--- a/src/grd-session-rdp.h
+++ b/src/grd-session-rdp.h
@@ -52,6 +52,8 @@ void grd_session_rdp_update_pointer (GrdSessionRdp *session_rdp,
                                      uint16_t       height,
                                      uint8_t       *data);
 
+void grd_session_rdp_hide_pointer (GrdSessionRdp *session_rdp);
+
 void grd_session_rdp_move_pointer (GrdSessionRdp *session_rdp,
                                    uint16_t       x,
                                    uint16_t       y);


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