diff --git a/src/bar/bar.c b/src/bar/bar.c index 19f9b44..e4443b8 100644 --- a/src/bar/bar.c +++ b/src/bar/bar.c @@ -33,6 +33,11 @@ static void bar_item_cleanup(zdwm_bar_item_t *item) { if (destroy_state) destroy_state(item->state); item->state = nullptr; + for (size_t i = 0; i < item->count; ++i) { + auto cell = &item->cells[i]; + p_delete(&cell->text); + } + p_delete(&item->cells); p_clear(item, 1); } diff --git a/src/bar/cell.c b/src/bar/cell.c index 90819f7..a0a09b4 100644 --- a/src/bar/cell.c +++ b/src/bar/cell.c @@ -68,9 +68,11 @@ void bar_cell_set_text(zdwm_bar_item_t *item, size_t index, const char *text) { if (index >= item->count) return; auto cell = &item->cells[index]; - if (cell->text == text || strcmp(cell->text, text) == 0) return; + if (cell->text && text && strcmp(cell->text, text) == 0) return; - cell->text = text; + p_delete(&cell->text); + + cell->text = p_strdup_nullable(text); cell->dirty = true; item->dirty = true; diff --git a/src/bar/types.h b/src/bar/types.h index 28ebe16..0ec5e41 100644 --- a/src/bar/types.h +++ b/src/bar/types.h @@ -14,7 +14,7 @@ typedef struct bar_x_region_t { typedef struct bar_cell_t { zdwm_icon_t icon; - const char *text; + char *text; /* 持有内存,避免野指针问题 */ const color_t *fg; const color_t *bg; bar_x_region_t region;