root/tools/perf/ui/tui/progress.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __tui_progress__init
  2. get_title
  3. tui_progress__update
  4. tui_progress__finish
  5. tui_progress__init

   1 // SPDX-License-Identifier: GPL-2.0
   2 #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 
  10 static void __tui_progress__init(struct ui_progress *p)
  11 {
  12         p->next = p->step = p->total / (SLtt_Screen_Cols - 2) ?: 1;
  13 }
  14 
  15 static 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 
  28 static 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         pthread_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         pthread_mutex_unlock(&ui__lock);
  60 }
  61 
  62 static void tui_progress__finish(void)
  63 {
  64         int y;
  65 
  66         if (use_browser <= 0)
  67                 return;
  68 
  69         ui__refresh_dimensions(false);
  70         pthread_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         pthread_mutex_unlock(&ui__lock);
  76 }
  77 
  78 static struct ui_progress_ops tui_progress__ops = {
  79         .init   = __tui_progress__init,
  80         .update = tui_progress__update,
  81         .finish = tui_progress__finish,
  82 };
  83 
  84 void tui_progress__init(void)
  85 {
  86         ui_progress__ops = &tui_progress__ops;
  87 }

/* [<][>][^][v][top][bottom][index][help] */