Skip to content

Commit

Permalink
Add getters for scrollback buffer line count and line pos
Browse files Browse the repository at this point in the history
This functionality is needed to implement a scrollbar
  • Loading branch information
aheck authored and Aetf committed Dec 22, 2023
1 parent 5c720b9 commit 76f7ace
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/tsm/libtsm-int.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ struct tsm_screen {
struct line *sb_last; /* last line; was moved last*/
unsigned int sb_max; /* max-limit of lines in sb */
struct line *sb_pos; /* current position in sb or NULL */
unsigned int sb_pos_num; /* current numeric position in sb */
uint64_t sb_last_id; /* last id given to sb-line */

/* cursor: positions are always in-bound, but cursor_x might be
Expand Down
2 changes: 2 additions & 0 deletions src/tsm/libtsm.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ void tsm_screen_sb_down(struct tsm_screen *con, unsigned int num);
void tsm_screen_sb_page_up(struct tsm_screen *con, unsigned int num);
void tsm_screen_sb_page_down(struct tsm_screen *con, unsigned int num);
void tsm_screen_sb_reset(struct tsm_screen *con);
unsigned int tsm_screen_sb_get_line_count(struct tsm_screen *con);
unsigned int tsm_screen_sb_get_line_pos(struct tsm_screen *con);

void tsm_screen_set_def_attr(struct tsm_screen *con,
const struct tsm_screen_attr *attr);
Expand Down
2 changes: 2 additions & 0 deletions src/tsm/libtsm.sym
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,6 @@ global:
tsm_vte_get_mouse_mode;
tsm_vte_get_mouse_event;
tsm_vte_handle_mouse;
tsm_screen_sb_get_line_count;
tsm_screen_sb_get_line_pos;
} LIBTSM_4;
42 changes: 37 additions & 5 deletions src/tsm/tsm-screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,10 +230,13 @@ static void link_to_scrollback(struct tsm_screen *con, struct line *line)
if (con->sb_pos) {
if (con->sb_pos == tmp ||
!(con->flags & TSM_SCREEN_FIXED_POS)) {
if (con->sb_pos->next)
if (con->sb_pos->next) {
con->sb_pos = con->sb_pos->next;
else
++con->sb_pos_num;
} else {
con->sb_pos = line;
con->sb_pos_num = 0;
}
}
}

Expand All @@ -253,12 +256,17 @@ static void link_to_scrollback(struct tsm_screen *con, struct line *line)
line->sb_id = ++con->sb_last_id;
line->next = NULL;
line->prev = con->sb_last;
if (con->sb_last)
if (con->sb_last) {
con->sb_last->next = line;
else
} else {
con->sb_first = line;
}
con->sb_last = line;
++con->sb_count;

if (con->sb_pos == NULL) {
con->sb_pos_num = con->sb_count;
}
}

static void screen_scroll_up(struct tsm_screen *con, unsigned int num)
Expand Down Expand Up @@ -832,6 +840,7 @@ void tsm_screen_clear_sb(struct tsm_screen *con)
con->sb_last = NULL;
con->sb_count = 0;
con->sb_pos = NULL;
con->sb_pos_num = 0;

if (con->sel_active) {
if (con->sel_start.line) {
Expand Down Expand Up @@ -861,10 +870,12 @@ void tsm_screen_sb_up(struct tsm_screen *con, unsigned int num)
return;

con->sb_pos = con->sb_pos->prev;
--con->sb_pos_num;
} else if (!con->sb_last) {
return;
} else {
con->sb_pos = con->sb_last;
con->sb_pos_num = con->sb_count - 1;
}
}
}
Expand All @@ -880,8 +891,10 @@ void tsm_screen_sb_down(struct tsm_screen *con, unsigned int num)
con->age = con->age_cnt;

while (num--) {
if (con->sb_pos)
if (con->sb_pos) {
con->sb_pos = con->sb_pos->next;
++con->sb_pos_num;
}
else
return;
}
Expand Down Expand Up @@ -918,6 +931,25 @@ void tsm_screen_sb_reset(struct tsm_screen *con)
con->age = con->age_cnt;

con->sb_pos = NULL;
con->sb_pos_num = 0;
}

unsigned int tsm_screen_sb_get_line_count(struct tsm_screen *con)
{
if (!con) {
return 0;
}

return con->sb_count;
}

unsigned int tsm_screen_sb_get_line_pos(struct tsm_screen *con)
{
if (!con) {
return 0;
}

return con->sb_pos_num;
}

SHL_EXPORT
Expand Down
69 changes: 69 additions & 0 deletions test/test_screen.c
Original file line number Diff line number Diff line change
Expand Up @@ -194,11 +194,80 @@ START_TEST(test_screen_resize_alt_colors)
}
END_TEST

START_TEST(test_screen_sb_get_line_pos)
{
struct tsm_screen *screen;
int r;

r = tsm_screen_new(&screen, NULL, NULL);
ck_assert_int_eq(r, 0);

r = tsm_screen_resize(screen, 5, 5);
ck_assert_int_eq(r, 0);

tsm_screen_set_max_sb(screen, 5);

ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 0);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 0);

/* fill up screen */
tsm_screen_newline(screen);
tsm_screen_newline(screen);
tsm_screen_newline(screen);
tsm_screen_newline(screen);

/* create first entry in scrollback buffer */
tsm_screen_newline(screen);

ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 1);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 1);

tsm_screen_newline(screen);

ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 2);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 2);

tsm_screen_newline(screen);

ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 3);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 3);

/* scroll up by one (third line of sb) */
tsm_screen_sb_up(screen, 1);
ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 3);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 2);

/* scroll up by one (second line of sb) */
tsm_screen_sb_up(screen, 1);
ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 3);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 1);

/* scroll up by one (first line of sb) */
tsm_screen_sb_up(screen, 1);
ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 3);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 0);

/* scroll up beyond top end of buffer */
tsm_screen_sb_up(screen, 1);
ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 3);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 0);

/* scroll out of scrollback buffer */
tsm_screen_sb_down(screen, 3);
ck_assert_int_eq(tsm_screen_sb_get_line_count(screen), 3);
ck_assert_int_eq(tsm_screen_sb_get_line_pos(screen), 3);

tsm_screen_unref(screen);
screen = NULL;
}
END_TEST


TEST_DEFINE_CASE(misc)
TEST(test_screen_init)
TEST(test_screen_null)
TEST(test_screen_resize_alt_colors)
TEST(test_screen_sb_get_line_pos)
TEST_END_CASE

TEST_DEFINE(
Expand Down

0 comments on commit 76f7ace

Please sign in to comment.