From cfafcd2528f3eabf881ed2c7bbdcd59d5847de13 Mon Sep 17 00:00:00 2001 From: Jay Sorg Date: Sun, 7 Mar 2021 00:49:09 -0800 Subject: [PATCH] use damage to track any lost screen changes --- module/rdp.h | 1 + xrdpdev/xrdpdev.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/module/rdp.h b/module/rdp.h index 04ce1913..125c7d90 100644 --- a/module/rdp.h +++ b/module/rdp.h @@ -325,6 +325,7 @@ struct _rdpRec int fd; /* egl */ void *egl; + DamagePtr damage; }; typedef struct _rdpRec rdpRec; typedef struct _rdpRec * rdpPtr; diff --git a/xrdpdev/xrdpdev.c b/xrdpdev/xrdpdev.c index 2dcce60d..e3121f10 100644 --- a/xrdpdev/xrdpdev.c +++ b/xrdpdev/xrdpdev.c @@ -87,7 +87,8 @@ Bool g_use_dri3 = TRUE; while (0) static int g_setup_done = 0; -static OsTimerPtr g_timer = 0; +static OsTimerPtr g_randr_timer = 0; +static OsTimerPtr g_damage_timer = 0; static char g_xrdp_driver_name[] = XRDP_DRIVER_NAME; @@ -367,6 +368,47 @@ rdpResizeSession(rdpPtr dev, int width, int height) return ok; } +/*****************************************************************************/ +static void +xorgxrdpDamageReport(DamagePtr pDamage, RegionPtr pRegion, void *closure) +{ + rdpPtr dev; + ScreenPtr pScreen; + + LLOGLN(10, ("xorgxrdpDamageReport:")); + pScreen = (ScreenPtr)closure; + dev = rdpGetDevFromScreen(pScreen); + rdpClientConAddAllReg(dev, pRegion, &(pScreen->root->drawable)); +} + +/*****************************************************************************/ +static void +xorgxrdpDamageDestroy(DamagePtr pDamage, void *closure) +{ + LLOGLN(0, ("xorgxrdpDamageDestroy:")); +} + +/******************************************************************************/ +/* returns error */ +static CARD32 +rdpDeferredDamage(OsTimerPtr timer, CARD32 now, pointer arg) +{ + ScreenPtr pScreen; + rdpPtr dev; + + pScreen = (ScreenPtr) arg; + dev = rdpGetDevFromScreen(pScreen); + dev->damage = DamageCreate(xorgxrdpDamageReport, xorgxrdpDamageDestroy, + DamageReportRawRegion, TRUE, + pScreen, pScreen); + if (dev->damage != NULL) + { + DamageSetReportAfterOp(dev->damage, TRUE); + DamageRegister(&(pScreen->root->drawable), dev->damage); + } + return 0; +} + /******************************************************************************/ /* returns error */ static CARD32 @@ -723,7 +765,8 @@ rdpScreenInit(ScreenPtr pScreen, int argc, char **argv) RegisterBlockAndWakeupHandlers(rdpBlockHandler1, rdpWakeupHandler1, pScreen); - g_timer = TimerSet(g_timer, 0, 10, rdpDeferredRandR, pScreen); + g_randr_timer = TimerSet(g_randr_timer, 0, 10, rdpDeferredRandR, pScreen); + g_damage_timer = TimerSet(g_damage_timer, 0, 10, rdpDeferredDamage, pScreen); if (rdpClientConInit(dev) != 0) {