diff options
author | David Herrmann <dh.herrmann@gmail.com> | 2013-10-23 17:19:07 +0200 |
---|---|---|
committer | David Herrmann <dh.herrmann@gmail.com> | 2013-10-23 17:19:07 +0200 |
commit | 2c5522468020731dfa1112c6a27ecbdc796bb65c (patch) | |
tree | 5002138b0d6330286adba330b0c29be8e32f8052 | |
parent | 53a164dcccb2903d02b59b5c6f43d21b72883a70 (diff) |
screen: allocate private symbol table
We shouldn't use the global symbol table. It's not thread-safe. Allocate a
new one for private use in tsm_screen.
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
-rw-r--r-- | src/tsm_screen.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/tsm_screen.c b/src/tsm_screen.c index a67fbde..18d877e 100644 --- a/src/tsm_screen.c +++ b/src/tsm_screen.c @@ -97,6 +97,7 @@ struct tsm_screen { void *llog_data; unsigned int opts; unsigned int flags; + struct tsm_symbol_table *sym_table; /* default attributes for new cells */ struct tsm_screen_attr def_attr; @@ -493,6 +494,10 @@ int tsm_screen_new(struct tsm_screen **out, tsm_log_t log, void *log_data) con->def_attr.fg = 255; con->def_attr.fb = 255; + ret = tsm_symbol_table_new(&con->sym_table); + if (ret) + goto err_free; + ret = tsm_screen_resize(con, 80, 24); if (ret) goto err_free; @@ -510,6 +515,7 @@ err_free: free(con->main_lines); free(con->alt_lines); free(con->tab_ruler); + tsm_symbol_table_unref(con->sym_table); free(con); return ret; } @@ -540,6 +546,7 @@ void tsm_screen_unref(struct tsm_screen *con) free(con->main_lines); free(con->alt_lines); free(con->tab_ruler); + tsm_symbol_table_unref(con->sym_table); free(con); } @@ -1016,7 +1023,7 @@ void tsm_screen_write(struct tsm_screen *con, tsm_symbol_t ch, if (!con) return; - len = tsm_symbol_get_width(NULL, ch); + len = tsm_symbol_get_width(con->sym_table, ch); if (!len) return; @@ -1912,7 +1919,7 @@ tsm_age_t tsm_screen_draw(struct tsm_screen *con, tsm_screen_draw_cb draw_cb, age = con->age; } - ch = tsm_symbol_get(NULL, &cell->ch, &len); + ch = tsm_symbol_get(con->sym_table, &cell->ch, &len); if (cell->ch == ' ' || cell->ch == 0) len = 0; ret = draw_cb(con, cell->ch, ch, len, cell->width, |