Add support for animations after terminal resize

If animations are enabled and the terminal is resized, restart the animation instead of stopping it
This commit is contained in:
wr7 2023-12-21 17:57:50 -06:00
parent 4ee2b3ecc7
commit f4b239c74b
2 changed files with 53 additions and 17 deletions

View File

@ -619,11 +619,16 @@ void position_input(
password->visible_len = len;
}
static void doom_init(struct term_buf* buf)
static void doom_reset(struct term_buf* buf)
{
buf->init_width = buf->width;
buf->init_height = buf->height;
if(buf->astate.doom)
{
doom_free(buf);
}
buf->astate.doom = malloc(sizeof(struct doom_state));
buf->astate.doom->buffer_width = buf->width;
buf->astate.doom->buffer_height = buf->height;
if (buf->astate.doom == NULL)
{
@ -649,14 +654,27 @@ static void doom_free(struct term_buf* buf)
free(buf->astate.doom);
}
// Adapted from cmatrix
static void matrix_init(struct term_buf* buf)
static void doom_init(struct term_buf* buf)
{
buf->init_width = buf->width;
buf->init_height = buf->height;
buf->astate.doom = NULL;
doom_reset(buf);
}
static void matrix_free(struct term_buf* buf);
// Adapted from cmatrix
static void matrix_reset(struct term_buf* buf)
{
if(buf->astate.matrix)
{
matrix_free(buf);
}
buf->astate.matrix = malloc(sizeof(struct matrix_state));
struct matrix_state* s = buf->astate.matrix;
s->grid_width = buf->width;
s->grid_height = buf->height;
if (s == NULL)
{
dgn_throw(DGN_ALLOC);
@ -709,6 +727,11 @@ static void matrix_init(struct term_buf* buf)
dgn_throw(DGN_ALLOC);
}
if(buf->height <= 3)
{
return;
}
// Initialize grid
for (int i = 0; i <= buf->height; ++i)
{
@ -727,6 +750,12 @@ static void matrix_init(struct term_buf* buf)
}
}
static void matrix_init(struct term_buf* buf)
{
buf->astate.matrix = NULL;
matrix_reset(buf);
}
static void matrix_free(struct term_buf* buf)
{
free(buf->astate.matrix->grid[0]);
@ -776,23 +805,23 @@ static void doom(struct term_buf* term_buf)
{0x2588, 8, 4}, // white
};
if ((term_buf->width != term_buf->astate.doom->buffer_width) || (term_buf->height != term_buf->astate.doom->buffer_height))
{
doom_reset(term_buf);
}
uint16_t src;
uint16_t random;
uint16_t dst;
uint16_t w = term_buf->init_width;
uint16_t w = term_buf->astate.doom->buffer_width;
uint8_t* tmp = term_buf->astate.doom->buf;
if ((term_buf->width != term_buf->init_width) || (term_buf->height != term_buf->init_height))
{
return;
}
struct tb_cell* buf = tb_cell_buffer();
for (uint16_t x = 0; x < w; ++x)
{
for (uint16_t y = 1; y < term_buf->init_height; ++y)
for (uint16_t y = 1; y < term_buf->astate.doom->buffer_height; ++y)
{
src = y * w + x;
random = ((rand() % 7) & 3);
@ -835,11 +864,16 @@ static void matrix(struct term_buf* buf)
// Chars change mid-scroll
const bool changes = true;
if ((buf->width != buf->init_width) || (buf->height != buf->init_height))
if ((buf->height <= 3))
{
return;
}
if ((buf->width != s->grid_width) || (buf->height != s->grid_height))
{
matrix_reset(buf);
}
count += 1;
if (count > frame_delay)
{

View File

@ -28,6 +28,8 @@ struct matrix_dot
struct matrix_state
{
struct matrix_dot** grid;
uint16_t grid_width;
uint16_t grid_height;
int* length;
int* spaces;
int* updates;
@ -36,6 +38,8 @@ struct matrix_state
struct doom_state
{
uint8_t* buf;
uint16_t buffer_width;
uint16_t buffer_height;
};
union anim_state
@ -48,8 +52,6 @@ struct term_buf
{
uint16_t width;
uint16_t height;
uint16_t init_width;
uint16_t init_height;
struct box box_chars;
char* info_line;