linux/tools/perf/util/ui/util.c
<<
>>
Prefs
   1#include "../util.h"
   2#include <signal.h>
   3#include <stdbool.h>
   4#include <string.h>
   5#include <sys/ttydefaults.h>
   6
   7#include "../cache.h"
   8#include "../debug.h"
   9#include "browser.h"
  10#include "keysyms.h"
  11#include "helpline.h"
  12#include "ui.h"
  13#include "util.h"
  14#include "libslang.h"
  15
  16static void ui_browser__argv_write(struct ui_browser *browser,
  17                                   void *entry, int row)
  18{
  19        char **arg = entry;
  20        bool current_entry = ui_browser__is_current_entry(browser, row);
  21
  22        ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED :
  23                                                       HE_COLORSET_NORMAL);
  24        slsmg_write_nstring(*arg, browser->width);
  25}
  26
  27static int popup_menu__run(struct ui_browser *menu)
  28{
  29        int key;
  30
  31        if (ui_browser__show(menu, " ", "ESC: exit, ENTER|->: Select option") < 0)
  32                return -1;
  33
  34        while (1) {
  35                key = ui_browser__run(menu, 0);
  36
  37                switch (key) {
  38                case K_RIGHT:
  39                case K_ENTER:
  40                        key = menu->index;
  41                        break;
  42                case K_LEFT:
  43                case K_ESC:
  44                case 'q':
  45                case CTRL('c'):
  46                        key = -1;
  47                        break;
  48                default:
  49                        continue;
  50                }
  51
  52                break;
  53        }
  54
  55        ui_browser__hide(menu);
  56        return key;
  57}
  58
  59int ui__popup_menu(int argc, char * const argv[])
  60{
  61        struct ui_browser menu = {
  62                .entries    = (void *)argv,
  63                .refresh    = ui_browser__argv_refresh,
  64                .seek       = ui_browser__argv_seek,
  65                .write      = ui_browser__argv_write,
  66                .nr_entries = argc,
  67        };
  68
  69        return popup_menu__run(&menu);
  70}
  71
  72int ui__question_window(const char *title, const char *text,
  73                        const char *exit_msg, int delay_secs)
  74{
  75        int x, y;
  76        int max_len = 0, nr_lines = 0;
  77        const char *t;
  78
  79        t = text;
  80        while (1) {
  81                const char *sep = strchr(t, '\n');
  82                int len;
  83
  84                if (sep == NULL)
  85                        sep = strchr(t, '\0');
  86                len = sep - t;
  87                if (max_len < len)
  88                        max_len = len;
  89                ++nr_lines;
  90                if (*sep == '\0')
  91                        break;
  92                t = sep + 1;
  93        }
  94
  95        max_len += 2;
  96        nr_lines += 4;
  97        y = SLtt_Screen_Rows / 2 - nr_lines / 2,
  98        x = SLtt_Screen_Cols / 2 - max_len / 2;
  99
 100        SLsmg_set_color(0);
 101        SLsmg_draw_box(y, x++, nr_lines, max_len);
 102        if (title) {
 103                SLsmg_gotorc(y, x + 1);
 104                SLsmg_write_string((char *)title);
 105        }
 106        SLsmg_gotorc(++y, x);
 107        nr_lines -= 2;
 108        max_len -= 2;
 109        SLsmg_write_wrapped_string((unsigned char *)text, y, x,
 110                                   nr_lines, max_len, 1);
 111        SLsmg_gotorc(y + nr_lines - 2, x);
 112        SLsmg_write_nstring((char *)" ", max_len);
 113        SLsmg_gotorc(y + nr_lines - 1, x);
 114        SLsmg_write_nstring((char *)exit_msg, max_len);
 115        SLsmg_refresh();
 116        return ui__getch(delay_secs);
 117}
 118
 119int ui__help_window(const char *text)
 120{
 121        return ui__question_window("Help", text, "Press any key...", 0);
 122}
 123
 124int ui__dialog_yesno(const char *msg)
 125{
 126        return ui__question_window(NULL, msg, "Enter: Yes, ESC: No", 0);
 127}
 128
 129int __ui__warning(const char *title, const char *format, va_list args)
 130{
 131        char *s;
 132
 133        if (use_browser > 0 && vasprintf(&s, format, args) > 0) {
 134                int key;
 135
 136                pthread_mutex_lock(&ui__lock);
 137                key = ui__question_window(title, s, "Press any key...", 0);
 138                pthread_mutex_unlock(&ui__lock);
 139                free(s);
 140                return key;
 141        }
 142
 143        fprintf(stderr, "%s:\n", title);
 144        vfprintf(stderr, format, args);
 145        return K_ESC;
 146}
 147
 148int ui__warning(const char *format, ...)
 149{
 150        int key;
 151        va_list args;
 152
 153        va_start(args, format);
 154        key = __ui__warning("Warning", format, args);
 155        va_end(args);
 156        return key;
 157}
 158
 159int ui__error(const char *format, ...)
 160{
 161        int key;
 162        va_list args;
 163
 164        va_start(args, format);
 165        key = __ui__warning("Error", format, args);
 166        va_end(args);
 167        return key;
 168}
 169