factor out renderclients

This will help once we get to implementing layer-shell
This commit is contained in:
Devin J. Pohly 2020-04-23 21:53:48 -05:00
parent 15ed82571b
commit 275badc707

47
dwl.c
View File

@ -149,6 +149,7 @@ static void quit(const Arg *arg);
static void raiseclient(Client *c); static void raiseclient(Client *c);
static void refocus(void); static void refocus(void);
static void render(struct wlr_surface *surface, int sx, int sy, void *data); static void render(struct wlr_surface *surface, int sx, int sy, void *data);
static void renderclients(Monitor *m, struct timespec *now);
static void rendermon(struct wl_listener *listener, void *data); static void rendermon(struct wl_listener *listener, void *data);
static void resize(Client *c, int x, int y, int w, int h); static void resize(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg); static void resizemouse(const Arg *arg);
@ -812,6 +813,31 @@ render(struct wlr_surface *surface, int sx, int sy, void *data)
wlr_surface_send_frame_done(surface, rdata->when); wlr_surface_send_frame_done(surface, rdata->when);
} }
void
renderclients(Monitor *m, struct timespec *now)
{
/* Each subsequent window we render is rendered on top of the last. Because
* our stacking list is ordered front-to-back, we iterate over it backwards. */
Client *c;
wl_list_for_each_reverse(c, &stack, slink) {
/* Only render clients which are on this monitor. */
/* XXX consider checking wlr_output_layout_intersects, in case a
* window can be seen on multiple outputs */
if (!VISIBLEON(c, m))
continue;
struct render_data rdata = {
.output = m->wlr_output,
.when = now,
.x = c->x,
.y = c->y,
};
/* This calls our render function for each surface among the
* xdg_surface's toplevel and popups. */
wlr_xdg_surface_for_each_surface(c->xdg_surface, render, &rdata);
}
}
void void
rendermon(struct wl_listener *listener, void *data) rendermon(struct wl_listener *listener, void *data)
{ {
@ -838,26 +864,7 @@ rendermon(struct wl_listener *listener, void *data)
wlr_renderer_begin(drw, m->wlr_output->width, m->wlr_output->height); wlr_renderer_begin(drw, m->wlr_output->width, m->wlr_output->height);
wlr_renderer_clear(drw, rootcolor); wlr_renderer_clear(drw, rootcolor);
/* Each subsequent window we render is rendered on top of the last. Because renderclients(m, &now);
* our stacking list is ordered front-to-back, we iterate over it backwards. */
Client *c;
wl_list_for_each_reverse(c, &stack, slink) {
/* Only render clients which are on this monitor. */
/* XXX consider checking wlr_output_layout_intersects, in case a
* window can be seen on multiple outputs */
if (!VISIBLEON(c, m))
continue;
struct render_data rdata = {
.output = m->wlr_output,
.when = &now,
.x = c->x,
.y = c->y,
};
/* This calls our render function for each surface among the
* xdg_surface's toplevel and popups. */
wlr_xdg_surface_for_each_surface(c->xdg_surface, render, &rdata);
}
/* Hardware cursors are rendered by the GPU on a separate plane, and can be /* Hardware cursors are rendered by the GPU on a separate plane, and can be
* moved around without re-rendering what's beneath them - which is more * moved around without re-rendering what's beneath them - which is more