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.
This commit is contained in:
parent
985d6e40a7
commit
a58dfdd203
4 changed files with 20 additions and 15 deletions
|
@ -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 )
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue