6
6
#include "shm_open.h"
7
7
#include "math.h"
8
8
9
+ void drwbuf_handle_release (void * data , struct wl_buffer * wl_buffer ) {
10
+ struct drwbuf * db = data ;
11
+ db -> released = true;
12
+ };
13
+
14
+ const struct wl_buffer_listener buffer_listener = {
15
+ .release = drwbuf_handle_release
16
+ };
17
+
9
18
void drwsurf_handle_frame_cb (void * data , struct wl_callback * callback ,
10
19
uint32_t time )
11
20
{
@@ -18,8 +27,9 @@ void drwsurf_handle_frame_cb(void* data, struct wl_callback* callback,
18
27
cairo_region_get_rectangle (ds -> back_buffer -> damage , i , & r );
19
28
wl_surface_damage (ds -> surf , r .x , r .y , r .width , r .height );
20
29
};
30
+ cairo_region_subtract (ds -> display_buffer -> damage , ds -> display_buffer -> damage );
21
31
22
- drwsurf_flip (ds );
32
+ drwsurf_attach (ds );
23
33
}
24
34
25
35
const struct wl_callback_listener frame_listener = {
@@ -41,6 +51,7 @@ void drwsurf_damage(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t w, uint
41
51
{
42
52
cairo_rectangle_int_t rect = { x , y , w , h };
43
53
cairo_region_union_rectangle (ds -> back_buffer -> damage , & rect );
54
+ cairo_region_union_rectangle (ds -> back_buffer -> backport_damage , & rect );
44
55
drwsurf_register_frame_cb (ds );
45
56
}
46
57
@@ -64,8 +75,8 @@ drwsurf_backport(struct drwsurf *ds)
64
75
cairo_set_operator (ds -> back_buffer -> cairo , CAIRO_OPERATOR_SOURCE );
65
76
66
77
cairo_rectangle_int_t r = {0 };
67
- for (int i = 0 ; i < cairo_region_num_rectangles (ds -> display_buffer -> damage ); i ++ ) {
68
- cairo_region_get_rectangle (ds -> display_buffer -> damage , i , & r );
78
+ for (int i = 0 ; i < cairo_region_num_rectangles (ds -> display_buffer -> backport_damage ); i ++ ) {
79
+ cairo_region_get_rectangle (ds -> display_buffer -> backport_damage , i , & r );
69
80
70
81
cairo_set_source_surface (ds -> back_buffer -> cairo , ds -> display_buffer -> cairo_surf , 0 , 0 );
71
82
cairo_rectangle (
@@ -79,16 +90,23 @@ drwsurf_backport(struct drwsurf *ds)
79
90
};
80
91
81
92
cairo_restore (ds -> back_buffer -> cairo );
82
- cairo_region_subtract (ds -> display_buffer -> damage , ds -> display_buffer -> damage );
93
+ cairo_region_subtract (ds -> display_buffer -> backport_damage , ds -> display_buffer -> backport_damage );
83
94
}
84
95
85
96
void
86
- drwsurf_flip (struct drwsurf * ds )
97
+ drwsurf_attach (struct drwsurf * ds )
87
98
{
88
99
wl_surface_attach (ds -> surf , ds -> back_buffer -> buf , 0 , 0 );
89
100
wl_surface_commit (ds -> surf );
101
+ ds -> back_buffer -> released = false;
90
102
ds -> attached = true;
103
+ }
91
104
105
+ void
106
+ drwsurf_flip (struct drwsurf * ds )
107
+ {
108
+ if (ds -> back_buffer -> released )
109
+ return ;
92
110
struct drwbuf * tmp = ds -> back_buffer ;
93
111
ds -> back_buffer = ds -> display_buffer ;
94
112
ds -> display_buffer = tmp ;
@@ -101,6 +119,7 @@ drw_draw_text(struct drwsurf *ds, Color color, uint32_t x, uint32_t y,
101
119
uint32_t w , uint32_t h , uint32_t b , const char * label ,
102
120
PangoFontDescription * font_description )
103
121
{
122
+ drwsurf_flip (ds );
104
123
struct drwbuf * d = ds -> back_buffer ;
105
124
106
125
cairo_save (d -> cairo );
@@ -128,6 +147,7 @@ drw_draw_text(struct drwsurf *ds, Color color, uint32_t x, uint32_t y,
128
147
void
129
148
drw_do_clear (struct drwsurf * ds , uint32_t x , uint32_t y , uint32_t w , uint32_t h )
130
149
{
150
+ drwsurf_flip (ds );
131
151
struct drwbuf * d = ds -> back_buffer ;
132
152
133
153
cairo_save (d -> cairo );
143
163
drw_do_rectangle (struct drwsurf * ds , Color color , uint32_t x , uint32_t y ,
144
164
uint32_t w , uint32_t h , bool over , int rounding )
145
165
{
166
+ drwsurf_flip (ds );
146
167
struct drwbuf * d = ds -> back_buffer ;
147
168
148
169
cairo_save (d -> cairo );
@@ -229,6 +250,8 @@ setup_buffer(struct drwsurf *drwsurf, struct drwbuf *drwbuf)
229
250
stride , WL_SHM_FORMAT_ARGB8888 );
230
251
wl_shm_pool_destroy (pool );
231
252
close (fd );
253
+ wl_buffer_add_listener (drwbuf -> buf , & buffer_listener , drwbuf );
254
+ drwbuf -> released = true;
232
255
233
256
234
257
if (drwbuf -> cairo_surf )
@@ -240,6 +263,9 @@ setup_buffer(struct drwsurf *drwsurf, struct drwbuf *drwbuf)
240
263
if (drwbuf -> damage )
241
264
cairo_region_destroy (drwbuf -> damage );
242
265
drwbuf -> damage = cairo_region_create ();
266
+ if (drwbuf -> backport_damage )
267
+ cairo_region_destroy (drwbuf -> backport_damage );
268
+ drwbuf -> backport_damage = cairo_region_create ();
243
269
244
270
if (drwbuf -> cairo )
245
271
cairo_destroy (drwbuf -> cairo );
0 commit comments