1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/kernel.h> 3 #include "../cache.h" 4 #include "../progress.h" 5 #include "../libslang.h" 6 #include "../ui.h" 7 #include "tui.h" 8 #include "units.h" 9 #include "../browser.h" 10 11 static void __tui_progress__init(struct ui_progress *p) 12 { 13 p->next = p->step = p->total / (SLtt_Screen_Cols - 2) ?: 1; 14 } 15 16 static int get_title(struct ui_progress *p, char *buf, size_t size) 17 { 18 char buf_cur[20]; 19 char buf_tot[20]; 20 int ret; 21 22 ret = unit_number__scnprintf(buf_cur, sizeof(buf_cur), p->curr); 23 ret += unit_number__scnprintf(buf_tot, sizeof(buf_tot), p->total); 24 25 return ret + scnprintf(buf, size, "%s [%s/%s]", 26 p->title, buf_cur, buf_tot); 27 } 28 29 static void tui_progress__update(struct ui_progress *p) 30 { 31 char buf[100], *title = (char *) p->title; 32 int bar, y; 33 /* 34 * FIXME: We should have a per UI backend way of showing progress, 35 * stdio will just show a percentage as NN%, etc. 36 */ 37 if (use_browser <= 0) 38 return; 39 40 if (p->total == 0) 41 return; 42 43 if (p->size) { 44 get_title(p, buf, sizeof(buf)); 45 title = buf; 46 } 47 48 ui__refresh_dimensions(false); 49 pthread_mutex_lock(&ui__lock); 50 y = SLtt_Screen_Rows / 2 - 2; 51 SLsmg_set_color(0); 52 SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols); 53 SLsmg_gotorc(y++, 1); 54 SLsmg_write_string(title); 55 SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' '); 56 SLsmg_set_color(HE_COLORSET_SELECTED); 57 bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total; 58 SLsmg_fill_region(y, 1, 1, bar, ' '); 59 SLsmg_refresh(); 60 pthread_mutex_unlock(&ui__lock); 61 } 62 63 static void tui_progress__finish(void) 64 { 65 int y; 66 67 if (use_browser <= 0) 68 return; 69 70 ui__refresh_dimensions(false); 71 pthread_mutex_lock(&ui__lock); 72 y = SLtt_Screen_Rows / 2 - 2; 73 SLsmg_set_color(0); 74 SLsmg_fill_region(y, 0, 3, SLtt_Screen_Cols, ' '); 75 SLsmg_refresh(); 76 pthread_mutex_unlock(&ui__lock); 77 } 78 79 static struct ui_progress_ops tui_progress__ops = { 80 .init = __tui_progress__init, 81 .update = tui_progress__update, 82 .finish = tui_progress__finish, 83 }; 84 85 void tui_progress__init(void) 86 { 87 ui_progress__ops = &tui_progress__ops; 88 } 89