factor out renderclients
This will help once we get to implementing layer-shell
This commit is contained in:
parent
15ed82571b
commit
275badc707
47
dwl.c
47
dwl.c
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user