diff options
author | Guido Cella <guidocella91@gmail.com> | 2020-08-26 19:00:40 +0200 |
---|---|---|
committer | Guido Cella <guidocella91@gmail.com> | 2020-08-26 19:04:30 +0200 |
commit | b35182f5192b14f0b7869d3783db728919cc527a (patch) | |
tree | 154adc787076c92eb751550043b4301cb2abff45 | |
parent | 1e2dde66747e6fd542e52b2066bd96d42be919c6 (diff) |
render layer surfaces
-rw-r--r-- | dwl.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -240,6 +240,8 @@ static void pointerfocus(Client *c, struct wlr_surface *surface, static void quit(const Arg *arg); static void render(struct wlr_surface *surface, int sx, int sy, void *data); static void renderclients(Monitor *m, struct timespec *now); +static void renderlayer(Monitor *m, struct wl_list *layer_surfaces); +static void renderlayersurface(struct wlr_surface *surface, int sx, int sy, void *data); static void rendermon(struct wl_listener *listener, void *data); static void resize(Client *c, int x, int y, int w, int h, int interact); static void run(char *startup_cmd); @@ -1556,6 +1558,43 @@ renderclients(Monitor *m, struct timespec *now) } void +renderlayer(Monitor *m, struct wl_list *layer_surfaces) +{ + LayerSurface *layersurface; + wl_list_for_each(layersurface, layer_surfaces, link) + wlr_surface_for_each_surface(layersurface->layer_surface->surface, + renderlayersurface, layersurface); +} + +void +renderlayersurface(struct wlr_surface *surface, int sx, int sy, void *data) +{ + LayerSurface *layersurface = data; + struct wlr_texture *texture = wlr_surface_get_texture(surface); + struct wlr_output *output; + double ox = 0, oy = 0; + enum wl_output_transform transform; + struct wlr_box box; + float matrix[9]; + struct timespec now; + + if (!texture) { + return; + } + + output = layersurface->layer_surface->output; + wlr_output_layout_output_coords(output_layout, output, &ox, &oy); + ox += layersurface->geo.x + sx, oy += layersurface->geo.y + sy; + transform = wlr_output_transform_invert(surface->current.transform); + memcpy(&box, &layersurface->geo, sizeof(struct wlr_box)); + wlr_matrix_project_box(matrix, &box, transform, 0, + output->transform_matrix); + wlr_render_texture_with_matrix(drw, texture, matrix, 1); + clock_gettime(CLOCK_MONOTONIC, &now); + wlr_surface_send_frame_done(surface, &now); +} + +void rendermon(struct wl_listener *listener, void *data) { Client *c; @@ -1585,7 +1624,11 @@ rendermon(struct wl_listener *listener, void *data) wlr_renderer_begin(drw, m->wlr_output->width, m->wlr_output->height); wlr_renderer_clear(drw, rootcolor); + renderlayer(m, &m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]); + renderlayer(m, &m->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]); renderclients(m, &now); + renderlayer(m, &m->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); + renderlayer(m, &m->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); #ifdef XWAYLAND renderindependents(m->wlr_output, &now); #endif |