diff options
Diffstat (limited to 'sway/render.c')
-rw-r--r-- | sway/render.c | 113 |
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 | |||
8 | void 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 | |||
16 | cairo_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 | |||
46 | void 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 | |||
93 | void 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 | } | ||