1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
4 #include "../progress.h"
5 #include "../libslang.h"
9 #include "../browser.h"
11 static void __tui_progress__init(struct ui_progress
*p
)
13 p
->next
= p
->step
= p
->total
/ (SLtt_Screen_Cols
- 2) ?: 1;
16 static int get_title(struct ui_progress
*p
, char *buf
, size_t size
)
22 ret
= unit_number__scnprintf(buf_cur
, sizeof(buf_cur
), p
->curr
);
23 ret
+= unit_number__scnprintf(buf_tot
, sizeof(buf_tot
), p
->total
);
25 return ret
+ scnprintf(buf
, size
, "%s [%s/%s]",
26 p
->title
, buf_cur
, buf_tot
);
29 static void tui_progress__update(struct ui_progress
*p
)
31 char buf
[100], *title
= (char *) p
->title
;
34 * FIXME: We should have a per UI backend way of showing progress,
35 * stdio will just show a percentage as NN%, etc.
44 get_title(p
, buf
, sizeof(buf
));
48 ui__refresh_dimensions(false);
49 pthread_mutex_lock(&ui__lock
);
50 y
= SLtt_Screen_Rows
/ 2 - 2;
52 SLsmg_draw_box(y
, 0, 3, SLtt_Screen_Cols
);
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
, ' ');
60 pthread_mutex_unlock(&ui__lock
);
63 static void tui_progress__finish(void)
70 ui__refresh_dimensions(false);
71 pthread_mutex_lock(&ui__lock
);
72 y
= SLtt_Screen_Rows
/ 2 - 2;
74 SLsmg_fill_region(y
, 0, 3, SLtt_Screen_Cols
, ' ');
76 pthread_mutex_unlock(&ui__lock
);
79 static struct ui_progress_ops tui_progress__ops
= {
80 .init
= __tui_progress__init
,
81 .update
= tui_progress__update
,
82 .finish
= tui_progress__finish
,
85 void tui_progress__init(void)
87 ui_progress__ops
= &tui_progress__ops
;