1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
3 #include "../progress.h"
4 #include "../libslang.h"
8 #include "../browser.h"
10 static void __tui_progress__init(struct ui_progress
*p
)
12 p
->next
= p
->step
= p
->total
/ (SLtt_Screen_Cols
- 2) ?: 1;
15 static int get_title(struct ui_progress
*p
, char *buf
, size_t size
)
21 ret
= unit_number__scnprintf(buf_cur
, sizeof(buf_cur
), p
->curr
);
22 ret
+= unit_number__scnprintf(buf_tot
, sizeof(buf_tot
), p
->total
);
24 return ret
+ scnprintf(buf
, size
, "%s [%s/%s]",
25 p
->title
, buf_cur
, buf_tot
);
28 static void tui_progress__update(struct ui_progress
*p
)
30 char buf
[100], *title
= (char *) p
->title
;
33 * FIXME: We should have a per UI backend way of showing progress,
34 * stdio will just show a percentage as NN%, etc.
43 get_title(p
, buf
, sizeof(buf
));
47 ui__refresh_dimensions(false);
48 pthread_mutex_lock(&ui__lock
);
49 y
= SLtt_Screen_Rows
/ 2 - 2;
51 SLsmg_draw_box(y
, 0, 3, SLtt_Screen_Cols
);
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
, ' ');
59 pthread_mutex_unlock(&ui__lock
);
62 static void tui_progress__finish(void)
69 ui__refresh_dimensions(false);
70 pthread_mutex_lock(&ui__lock
);
71 y
= SLtt_Screen_Rows
/ 2 - 2;
73 SLsmg_fill_region(y
, 0, 3, SLtt_Screen_Cols
, ' ');
75 pthread_mutex_unlock(&ui__lock
);
78 static struct ui_progress_ops tui_progress__ops
= {
79 .init
= __tui_progress__init
,
80 .update
= tui_progress__update
,
81 .finish
= tui_progress__finish
,
84 void tui_progress__init(void)
86 ui_progress__ops
= &tui_progress__ops
;