aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevin J. Pohly <djpohly@gmail.com>2020-04-23 21:53:48 -0500
committerDevin J. Pohly <djpohly@gmail.com>2020-04-23 23:16:56 -0500
commit275badc707289420a31348659f08b4949edc2abb (patch)
treee4c2169d2821450cbc6f05170d96b985f5a03c6c
parent15ed82571b2f702f278b8d120d23c3079bac411e (diff)
factor out renderclients
This will help once we get to implementing layer-shell
-rw-r--r--dwl.c47
1 files 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);
@@ -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