void tsm_screen_unref(struct tsm_screen *con) { unsigned int i; if (!con || !con->ref || --con->ref) return; llog_debug(con, "destroying screen"); for (i = 0; i < con->line_num; ++i) line_free(con->lines[i]); free(con->lines); free(con->tab_ruler); shl_timer_free(con->timer); free(con); }
int tsm_screen_new(struct tsm_screen **out, tsm_log_t log) { struct tsm_screen *con; int ret; unsigned int i; if (!out) return -EINVAL; con = malloc(sizeof(*con)); if (!con) return -ENOMEM; memset(con, 0, sizeof(*con)); con->ref = 1; con->llog = log; con->def_attr.fr = 255; con->def_attr.fg = 255; con->def_attr.fb = 255; ret = shl_timer_new(&con->timer); if (ret) goto err_free; ret = tsm_screen_resize(con, 80, 24); if (ret) goto err_timer; llog_debug(con, "new screen"); *out = con; return 0; err_timer: shl_timer_free(con->timer); for (i = 0; i < con->line_num; ++i) { line_free(con->main_lines[i]); line_free(con->alt_lines[i]); } free(con->main_lines); free(con->alt_lines); free(con->tab_ruler); err_free: free(con); return ret; }