Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:X0F
libtsm_fork
libtsm_PR32.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libtsm_PR32.patch of Package libtsm_fork
From bbce88a7606a64e357403995547ecc2c30673a77 Mon Sep 17 00:00:00 2001 From: Andreas Heck <aheck@gmx.de> Date: Tue, 27 Sep 2022 23:14:32 +0200 Subject: [PATCH] Add getters for scrollback buffer line count and line pos This functionality is needed to implement a scrollbar --- src/tsm/libtsm-int.h | 1 + src/tsm/libtsm.h | 2 ++ src/tsm/libtsm.sym | 2 ++ src/tsm/tsm-screen.c | 42 +++++++++++++++++++++++---- test/test_screen.c | 69 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 5 deletions(-) diff --git a/src/tsm/libtsm-int.h b/src/tsm/libtsm-int.h index 8f70f7a..2557d54 100644 --- a/src/tsm/libtsm-int.h +++ b/src/tsm/libtsm-int.h @@ -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 diff --git a/src/tsm/libtsm.h b/src/tsm/libtsm.h index 9c3c223..23eb472 100644 --- a/src/tsm/libtsm.h +++ b/src/tsm/libtsm.h @@ -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); diff --git a/src/tsm/libtsm.sym b/src/tsm/libtsm.sym index bfab08c..17b83c1 100644 --- a/src/tsm/libtsm.sym +++ b/src/tsm/libtsm.sym @@ -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; diff --git a/src/tsm/tsm-screen.c b/src/tsm/tsm-screen.c index 552ddb3..a50785e 100644 --- a/src/tsm/tsm-screen.c +++ b/src/tsm/tsm-screen.c @@ -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; + } } } @@ -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) @@ -830,6 +838,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) { @@ -859,10 +868,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; } } } @@ -878,8 +889,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; } @@ -916,6 +929,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 diff --git a/test/test_screen.c b/test/test_screen.c index 7caff29..0608ab2 100644 --- a/test/test_screen.c +++ b/test/test_screen.c @@ -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(
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor