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