From a58dfdd2032c951fc51e1c1c0b803f7f37345837 Mon Sep 17 00:00:00 2001 From: "Pierre-Loup A. Griffais" Date: Sun, 24 Nov 2019 13:55:02 -0800 Subject: [PATCH] Only acknowledge frame_done once per commit, otherwise we pull unwanted frames out of thin air. Also use dummy ClientMessage events to nudge steamcompmgr's event loop, Expose events have a meaning and we don't want to confuse some clients. --- src/main.cpp | 2 +- src/steamcompmgr.c | 20 +++++++++++++------- src/wlserver.c | 11 +++++------ src/wlserver.h | 2 +- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7735ef3..b0a2d62 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -121,7 +121,7 @@ void wayland_PushSurface(struct wlr_surface *surf, struct wlr_dmabuf_attributes g_vecResListEntries.push_back( newEntry ); } - send_xwayland_expose(); + nudge_steamcompmgr(); } int steamCompMgr_PullSurface( struct ResListEntry_t *pResEntry ) diff --git a/src/steamcompmgr.c b/src/steamcompmgr.c index 913b2bb..473523d 100644 --- a/src/steamcompmgr.c +++ b/src/steamcompmgr.c @@ -98,6 +98,7 @@ typedef struct _win { Bool nudged; Bool ignoreOverrideRedirect; Bool validContents; + Bool committed; Bool mouseMoved; @@ -127,7 +128,7 @@ static Window currentOverlayWindow; static Window currentNotificationWindow; static Window ourWindow; -static XEvent exposeEvent; +static XEvent nudgeEvent; Bool gameFocused; @@ -1244,6 +1245,7 @@ add_win (Display *dpy, Window id, Window prev, unsigned long sequence) } new->damaged = 0; new->validContents = False; + new->committed = False; new->texName = 0; new->eglImage = EGL_NO_IMAGE_KHR; @@ -1571,10 +1573,9 @@ register_cm (Display *dpy) ourWindow = w; - exposeEvent.type = Expose; - exposeEvent.xexpose.window = ourWindow; - exposeEvent.xexpose.width = 1; - exposeEvent.xexpose.height = 1; + nudgeEvent.xclient.type = ClientMessage; + nudgeEvent.xclient.window = ourWindow; + nudgeEvent.xclient.format = 32; return True; } @@ -1603,6 +1604,8 @@ void check_new_wayland_res(void) w->damaged = 1; w->validContents = True; + w->committed = True; + bFound = True; } } @@ -2050,7 +2053,7 @@ steamcompmgr_main (int argc, char **argv) // If we're in the middle of a fade, pump an event into the loop to // make sure we keep pushing frames even if the app isn't updating. if (fadeOutWindow.id) - XSendEvent(dpy, ourWindow, True, ExposureMask, &exposeEvent); + XSendEvent(dpy, ourWindow, True, SubstructureRedirectMask, &nudgeEvent); Window window_returned, child; int root_x, root_y; @@ -2092,9 +2095,12 @@ steamcompmgr_main (int argc, char **argv) // Send frame done event to all Wayland surfaces for (win *w = list; w; w = w->next) { - if ( w->wlrsurface ) + if ( w->wlrsurface && w->committed == True ) { + // Acknowledge commit once. wlr_surface_send_frame_done(w->wlrsurface, &now); + + w->committed = False; } } } diff --git a/src/wlserver.c b/src/wlserver.c index 7556622..142d0a4 100644 --- a/src/wlserver.c +++ b/src/wlserver.c @@ -20,7 +20,7 @@ struct wlserver_t wlserver; Display *g_XWLDpy; -void send_xwayland_expose(void) +void nudge_steamcompmgr(void) { static bool bHasNestedDisplay = false; static XEvent XWLExposeEvent = {}; @@ -29,15 +29,14 @@ void send_xwayland_expose(void) { g_XWLDpy = XOpenDisplay( wlserver.wlr.xwayland->display_name ); - XWLExposeEvent.xexpose.type = Expose; - XWLExposeEvent.xexpose.window = DefaultRootWindow( g_XWLDpy ); - XWLExposeEvent.xexpose.width = 1; - XWLExposeEvent.xexpose.height = 1; + XWLExposeEvent.xclient.type = ClientMessage; + XWLExposeEvent.xclient.window = DefaultRootWindow( g_XWLDpy ); + XWLExposeEvent.xclient.format = 32; bHasNestedDisplay = true; } - XSendEvent( g_XWLDpy , DefaultRootWindow( g_XWLDpy ), True, ExposureMask, &XWLExposeEvent); + XSendEvent( g_XWLDpy , DefaultRootWindow( g_XWLDpy ), True, SubstructureRedirectMask, &XWLExposeEvent); XFlush( g_XWLDpy ); } diff --git a/src/wlserver.h b/src/wlserver.h index 8c9643d..92c50e2 100644 --- a/src/wlserver.h +++ b/src/wlserver.h @@ -44,7 +44,7 @@ int wlserver_init(int argc, char **argv); int wlserver_run(void); -void send_xwayland_expose(void); +void nudge_steamcompmgr(void); #ifndef C_SIDE }