diff --git a/src/common.h b/src/common.h
index 9c4c727c..7892d645 100644
--- a/src/common.h
+++ b/src/common.h
@@ -272,12 +272,9 @@ typedef struct session {
// === Expose event related ===
/// Pointer to an array of XRectangle
-s of exposed region.
- /// XXX why do we need this array?
+ /// This is a reuse temporary buffer for handling root expose events.
+ /// This is a dynarr.
rect_t *expose_rects;
- /// Number of XRectangle
-s in expose_rects
.
- int size_expose;
- /// Index of the next free slot in expose_rects
.
- int n_expose;
struct wm *wm;
diff --git a/src/event.c b/src/event.c
index af8ee7c0..a4eb7ac1 100644
--- a/src/event.c
+++ b/src/event.c
@@ -22,6 +22,7 @@
#include "log.h"
#include "picom.h"
#include "region.h"
+#include "utils/dynarr.h"
#include "utils/misc.h"
#include "wm/defs.h"
#include "wm/wm.h"
@@ -495,9 +496,9 @@ static inline void ev_circulate_notify(session_t *ps, xcb_circulate_notify_event
}
}
-static inline void expose_root(session_t *ps, const rect_t *rects, int nrects) {
+static inline void expose_root(session_t *ps, const rect_t *rects, size_t nrects) {
region_t region;
- pixman_region32_init_rects(®ion, rects, nrects);
+ pixman_region32_init_rects(®ion, rects, (int)nrects);
add_damage(ps, ®ion);
pixman_region32_fini(®ion);
}
@@ -505,27 +506,19 @@ static inline void expose_root(session_t *ps, const rect_t *rects, int nrects) {
static inline void ev_expose(session_t *ps, xcb_expose_event_t *ev) {
if (ev->window == ps->c.screen_info->root ||
(ps->overlay && ev->window == ps->overlay)) {
- int more = ev->count + 1;
- if (ps->n_expose == ps->size_expose) {
- if (ps->expose_rects) {
- ps->expose_rects =
- crealloc(ps->expose_rects, ps->size_expose + more);
- ps->size_expose += more;
- } else {
- ps->expose_rects = ccalloc(more, rect_t);
- ps->size_expose = more;
- }
- }
+ dynarr_reserve(ps->expose_rects, ev->count + 1);
- ps->expose_rects[ps->n_expose].x1 = ev->x;
- ps->expose_rects[ps->n_expose].y1 = ev->y;
- ps->expose_rects[ps->n_expose].x2 = ev->x + ev->width;
- ps->expose_rects[ps->n_expose].y2 = ev->y + ev->height;
- ps->n_expose++;
+ rect_t new_rect = {
+ .x1 = ev->x,
+ .y1 = ev->y,
+ .x2 = ev->x + ev->width,
+ .y2 = ev->y + ev->height,
+ };
+ dynarr_push(ps->expose_rects, new_rect);
if (ev->count == 0) {
- expose_root(ps, ps->expose_rects, ps->n_expose);
- ps->n_expose = 0;
+ expose_root(ps, ps->expose_rects, dynarr_len(ps->expose_rects));
+ dynarr_clear_pod(ps->expose_rects);
}
}
}
diff --git a/src/picom.c b/src/picom.c
index a66698da..ebd62d37 100644
--- a/src/picom.c
+++ b/src/picom.c
@@ -63,6 +63,7 @@
#include "renderer/command_builder.h"
#include "renderer/layout.h"
#include "renderer/renderer.h"
+#include "utils/dynarr.h"
#include "utils/file_watch.h"
#include "utils/kernel.h"
#include "utils/list.h"
@@ -2020,8 +2021,6 @@ static session_t *session_init(int argc, char **argv, Display *dpy,
.quit = false,
.expose_rects = NULL,
- .size_expose = 0,
- .n_expose = 0,
.black_picture = XCB_NONE,
.cshadow_picture = XCB_NONE,
@@ -2521,6 +2520,7 @@ static session_t *session_init(int argc, char **argv, Display *dpy,
}
ps->command_builder = command_builder_new();
+ ps->expose_rects = dynarr_new(rect_t, 0);
ps->pending_updates = true;
@@ -2591,7 +2591,7 @@ static void session_destroy(session_t *ps) {
free_paint(ps, &ps->tgt_buffer);
pixman_region32_fini(&ps->screen_reg);
- free(ps->expose_rects);
+ dynarr_free_pod(ps->expose_rects);
x_free_monitor_info(&ps->monitors);