diff options
author | Devin J. Pohly <djpohly@gmail.com> | 2020-04-23 21:53:48 -0500 |
---|---|---|
committer | Devin J. Pohly <djpohly@gmail.com> | 2020-04-23 23:16:56 -0500 |
commit | 275badc707289420a31348659f08b4949edc2abb (patch) | |
tree | e4c2169d2821450cbc6f05170d96b985f5a03c6c | |
parent | 15ed82571b2f702f278b8d120d23c3079bac411e (diff) |
factor out renderclients
This will help once we get to implementing layer-shell
-rw-r--r-- | dwl.c | 47 |
1 files changed, 27 insertions, 20 deletions
@@ -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); @@ -813,6 +814,31 @@ render(struct wlr_surface *surface, int sx, int sy, void *data) } 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) { /* This function is called every time an output is ready to display a frame, @@ -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 |