summaryrefslogtreecommitdiffstats
path: root/sway/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/render.c')
-rw-r--r--sway/render.c113
1 files changed, 0 insertions, 113 deletions
diff --git a/sway/render.c b/sway/render.c
deleted file mode 100644
index 9388c1d0..00000000
--- a/sway/render.c
+++ /dev/null
@@ -1,113 +0,0 @@
1#include "render.h"
2#include <wlc/wlc-render.h>
3#include <cairo/cairo.h>
4#include <stdlib.h>
5#include <stdio.h>
6#include "container.h"
7
8void cairo_set_source_u32(cairo_t *cairo, uint32_t color) {
9 cairo_set_source_rgba(cairo,
10 (color >> (3*8) & 0xFF) / 255.0,
11 (color >> (2*8) & 0xFF) / 255.0,
12 (color >> (1*8) & 0xFF) / 255.0,
13 (color >> (0*8) & 0xFF) / 255.0);
14}
15
16cairo_t *create_border_buffer(swayc_t *view, struct wlc_geometry geo,
17 cairo_surface_t **surface) {
18 const int channels = 4;
19 cairo_t *cr;
20 view->border_geometry = geo;
21 view->border = calloc(channels * geo.size.w * geo.size.h,
22 sizeof(unsigned char));
23 if (!view->border) {
24 sway_log(L_DEBUG, "Unable to allocate buffer");
25 return NULL;
26 }
27 *surface = cairo_image_surface_create_for_data(view->border,
28 CAIRO_FORMAT_ARGB32, geo.size.w, geo.size.h, channels * geo.size.w);
29 if (cairo_surface_status(*surface) != CAIRO_STATUS_SUCCESS) {
30 free(view->border);
31 view->border = NULL;
32 sway_log(L_DEBUG, "Unable to allocate surface");
33 return NULL;
34 }
35 cr = cairo_create(*surface);
36 if (cairo_status(cr) != CAIRO_STATUS_SUCCESS) {
37 cairo_surface_destroy(*surface);
38 free(view->border);
39 view->border = NULL;
40 sway_log(L_DEBUG, "Unable to create cairo context");
41 return NULL;
42 }
43 return cr;
44}
45
46void update_view_border(swayc_t *view) {
47 struct wlc_geometry geo;
48 wlc_view_get_visible_geometry(view->handle, &geo);
49 cairo_t *cr = NULL;
50 cairo_surface_t *surface = NULL;
51
52 if (view->border) {
53 free(view->border);
54 view->border = NULL;
55 }
56
57 switch (view->border_type) {
58 case B_NONE:
59 view->border_geometry = geo;
60 break;
61 case B_PIXEL:
62 geo.origin.x -= view->border_thickness;
63 geo.origin.y -= view->border_thickness;
64 geo.size.w += view->border_thickness * 2;
65 geo.size.h += view->border_thickness * 2;
66 if (geo.size.w <= 0 || geo.size.h <= 0) {
67 view->border = NULL;
68 break;
69 }
70 cr = create_border_buffer(view, geo, &surface);
71 if (!cr) {
72 break;
73 }
74 cairo_set_source_u32(cr, 0x0000FFFF);
75 cairo_paint(cr);
76 break;
77 case B_NORMAL:
78 // TODO
79 break;
80 }
81 if (surface) {
82 cairo_surface_flush(surface);
83 cairo_surface_destroy(surface);
84 }
85 if (cr) {
86 cairo_destroy(cr);
87 sway_log(L_DEBUG, "Created border for %p (%dx%d+%d,%d)", view,
88 geo.size.w, geo.size.h, geo.origin.x, geo.origin.y);
89 }
90 view->border_geometry = geo;
91}
92
93void render_view_borders(wlc_handle view) {
94 swayc_t *c = swayc_by_handle(view);
95 if (!c || c->border_type == B_NONE) {
96 return;
97 }
98 struct wlc_geometry geo;
99 wlc_view_get_visible_geometry(view, &geo);
100 if (geo.size.w != c->presumed_geometry.size.w
101 || geo.size.h != c->presumed_geometry.size.h
102 || geo.origin.x != c->presumed_geometry.origin.x
103 || geo.origin.y != c->presumed_geometry.origin.y) {
104 update_view_border(c);
105 c->presumed_geometry = geo;
106 }
107 if (c->border) {
108 geo = c->border_geometry;
109 sway_log(L_DEBUG, "Rendering border for %p (%dx%d+%d,%d)", c,
110 geo.size.w, geo.size.h, geo.origin.x, geo.origin.y);
111 wlc_pixels_write(WLC_RGBA8888, &c->border_geometry, c->border);
112 }
113}