From 275badc707289420a31348659f08b4949edc2abb Mon Sep 17 00:00:00 2001 From: "Devin J. Pohly" Date: Thu, 23 Apr 2020 21:53:48 -0500 Subject: factor out renderclients This will help once we get to implementing layer-shell --- dwl.c | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/dwl.c b/dwl.c index 77b3d5d..1a70f6d 100644 --- a/dwl.c +++ b/dwl.c @@ -149,6 +149,7 @@ static void quit(const Arg *arg); static void raiseclient(Client *c); static void refocus(void); 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 resize(Client *c, int x, int y, int w, int h); 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); } +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 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_clear(drw, rootcolor); - /* 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); - } + renderclients(m, &now); /* 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 -- cgit v1.2.3