18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/kernel.h> 38c2ecf20Sopenharmony_ci#include "../progress.h" 48c2ecf20Sopenharmony_ci#include "../libslang.h" 58c2ecf20Sopenharmony_ci#include "../ui.h" 68c2ecf20Sopenharmony_ci#include "tui.h" 78c2ecf20Sopenharmony_ci#include "units.h" 88c2ecf20Sopenharmony_ci#include "../browser.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_cistatic void __tui_progress__init(struct ui_progress *p) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci p->next = p->step = p->total / (SLtt_Screen_Cols - 2) ?: 1; 138c2ecf20Sopenharmony_ci} 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic int get_title(struct ui_progress *p, char *buf, size_t size) 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci char buf_cur[20]; 188c2ecf20Sopenharmony_ci char buf_tot[20]; 198c2ecf20Sopenharmony_ci int ret; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci ret = unit_number__scnprintf(buf_cur, sizeof(buf_cur), p->curr); 228c2ecf20Sopenharmony_ci ret += unit_number__scnprintf(buf_tot, sizeof(buf_tot), p->total); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci return ret + scnprintf(buf, size, "%s [%s/%s]", 258c2ecf20Sopenharmony_ci p->title, buf_cur, buf_tot); 268c2ecf20Sopenharmony_ci} 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic void tui_progress__update(struct ui_progress *p) 298c2ecf20Sopenharmony_ci{ 308c2ecf20Sopenharmony_ci char buf[100], *title = (char *) p->title; 318c2ecf20Sopenharmony_ci int bar, y; 328c2ecf20Sopenharmony_ci /* 338c2ecf20Sopenharmony_ci * FIXME: We should have a per UI backend way of showing progress, 348c2ecf20Sopenharmony_ci * stdio will just show a percentage as NN%, etc. 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_ci if (use_browser <= 0) 378c2ecf20Sopenharmony_ci return; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci if (p->total == 0) 408c2ecf20Sopenharmony_ci return; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci if (p->size) { 438c2ecf20Sopenharmony_ci get_title(p, buf, sizeof(buf)); 448c2ecf20Sopenharmony_ci title = buf; 458c2ecf20Sopenharmony_ci } 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci ui__refresh_dimensions(false); 488c2ecf20Sopenharmony_ci pthread_mutex_lock(&ui__lock); 498c2ecf20Sopenharmony_ci y = SLtt_Screen_Rows / 2 - 2; 508c2ecf20Sopenharmony_ci SLsmg_set_color(0); 518c2ecf20Sopenharmony_ci SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols); 528c2ecf20Sopenharmony_ci SLsmg_gotorc(y++, 1); 538c2ecf20Sopenharmony_ci SLsmg_write_string(title); 548c2ecf20Sopenharmony_ci SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' '); 558c2ecf20Sopenharmony_ci SLsmg_set_color(HE_COLORSET_SELECTED); 568c2ecf20Sopenharmony_ci bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total; 578c2ecf20Sopenharmony_ci SLsmg_fill_region(y, 1, 1, bar, ' '); 588c2ecf20Sopenharmony_ci SLsmg_refresh(); 598c2ecf20Sopenharmony_ci pthread_mutex_unlock(&ui__lock); 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_cistatic void tui_progress__finish(void) 638c2ecf20Sopenharmony_ci{ 648c2ecf20Sopenharmony_ci int y; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci if (use_browser <= 0) 678c2ecf20Sopenharmony_ci return; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci ui__refresh_dimensions(false); 708c2ecf20Sopenharmony_ci pthread_mutex_lock(&ui__lock); 718c2ecf20Sopenharmony_ci y = SLtt_Screen_Rows / 2 - 2; 728c2ecf20Sopenharmony_ci SLsmg_set_color(0); 738c2ecf20Sopenharmony_ci SLsmg_fill_region(y, 0, 3, SLtt_Screen_Cols, ' '); 748c2ecf20Sopenharmony_ci SLsmg_refresh(); 758c2ecf20Sopenharmony_ci pthread_mutex_unlock(&ui__lock); 768c2ecf20Sopenharmony_ci} 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_cistatic struct ui_progress_ops tui_progress__ops = { 798c2ecf20Sopenharmony_ci .init = __tui_progress__init, 808c2ecf20Sopenharmony_ci .update = tui_progress__update, 818c2ecf20Sopenharmony_ci .finish = tui_progress__finish, 828c2ecf20Sopenharmony_ci}; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_civoid tui_progress__init(void) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci ui_progress__ops = &tui_progress__ops; 878c2ecf20Sopenharmony_ci} 88