at v5.2 2.1 kB view raw
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 11static void __tui_progress__init(struct ui_progress *p) 12{ 13 p->next = p->step = p->total / (SLtt_Screen_Cols - 2) ?: 1; 14} 15 16static 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 29static 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 63static 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 79static struct ui_progress_ops tui_progress__ops = { 80 .init = __tui_progress__init, 81 .update = tui_progress__update, 82 .finish = tui_progress__finish, 83}; 84 85void tui_progress__init(void) 86{ 87 ui_progress__ops = &tui_progress__ops; 88}