diff options
author | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-04-27 11:22:29 +0200 |
---|---|---|
committer | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-04-27 11:24:28 +0200 |
commit | ddd5b69b998a8f413ad3b7ec5ff4d54221dfc0b6 (patch) | |
tree | 8e185c6a180f62ccf3a2fd55164a6b449bbceb1e | |
parent | 27066c6328fc80ef573bfb856f6df451cdd4262e (diff) |
border: clear buffer on fullscreen views
This patch makes sure to clear the border buffer of fullscreen view so
the border doesn't get drawn behind a fullscreen view, which would be
visible if the view was transparent.
-rw-r--r-- | include/border.h | 8 | ||||
-rw-r--r-- | sway/border.c | 22 | ||||
-rw-r--r-- | sway/layout.c | 1 |
3 files changed, 21 insertions, 10 deletions
diff --git a/include/border.h b/include/border.h index c99c02ea..eb7fc656 100644 --- a/include/border.h +++ b/include/border.h @@ -3,11 +3,19 @@ #include <wlc/wlc.h> #include "container.h" +/** + * Border pixel buffer and corresponding geometry. + */ struct border { unsigned char *buffer; struct wlc_geometry geometry; }; +/** + * Clear border buffer. + */ +void border_clear(struct border *border); + void render_view_borders(wlc_handle view); void update_view_border(swayc_t *view); void map_update_view_border(swayc_t *view, void *data); diff --git a/sway/border.c b/sway/border.c index 69807990..d261d006 100644 --- a/sway/border.c +++ b/sway/border.c @@ -4,12 +4,11 @@ #include <pango/pangocairo.h> #include <stdlib.h> #include <stdio.h> +#include <arpa/inet.h> #include "container.h" #include "config.h" #include "client/pango.h" -#include <arpa/inet.h> - void cairo_set_source_u32(cairo_t *cairo, uint32_t color) { color = htonl(color); @@ -20,6 +19,13 @@ void cairo_set_source_u32(cairo_t *cairo, uint32_t color) { (color >> (3*8) & 0xFF) / 255.0); } +void border_clear(struct border *border) { + if (border && border->buffer) { + free(border->buffer); + border->buffer = NULL; + } +} + static cairo_t *create_border_buffer(swayc_t *view, struct wlc_geometry g, cairo_surface_t **surface) { if (view->border == NULL) { view->border = malloc(sizeof(struct border)); @@ -35,16 +41,14 @@ static cairo_t *create_border_buffer(swayc_t *view, struct wlc_geometry g, cairo *surface = cairo_image_surface_create_for_data(view->border->buffer, CAIRO_FORMAT_ARGB32, g.size.w, g.size.h, stride); if (cairo_surface_status(*surface) != CAIRO_STATUS_SUCCESS) { - free(view->border); - view->border->buffer = NULL; + border_clear(view->border); sway_log(L_DEBUG, "Unable to allocate surface"); return NULL; } cr = cairo_create(*surface); if (cairo_status(cr) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy(*surface); - free(view->border->buffer); - view->border->buffer = NULL; + border_clear(view->border); sway_log(L_DEBUG, "Unable to create cairo context"); return NULL; } @@ -295,10 +299,8 @@ void update_view_border(swayc_t *view) { cairo_t *cr = NULL; cairo_surface_t *surface = NULL; - if (view->border && view->border->buffer) { - free(view->border->buffer); - view->border->buffer = NULL; - } + // clear previous border buffer. + border_clear(view->border); // get focused and focused_inactive views swayc_t *focused = get_focused_view(&root_container); diff --git a/sway/layout.c b/sway/layout.c index 3e550927..902a521b 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -555,6 +555,7 @@ void update_geometry(swayc_t *container) { container->border_geometry = wlc_geometry_zero; container->title_bar_geometry = wlc_geometry_zero; + border_clear(container->border); } else if (container->is_floating) { // allocate border for floating window update_border_geometry_floating(container, &geometry); } else if (!container->is_floating) { // allocate border for titled window |