diff options
Diffstat (limited to 'tools/perf/util/ui/setup.c')
-rw-r--r-- | tools/perf/util/ui/setup.c | 121 |
1 files changed, 115 insertions, 6 deletions
diff --git a/tools/perf/util/ui/setup.c b/tools/perf/util/ui/setup.c index ee46d671db59..85a69faa09aa 100644 --- a/tools/perf/util/ui/setup.c +++ b/tools/perf/util/ui/setup.c | |||
@@ -7,9 +7,85 @@ | |||
7 | #include "browser.h" | 7 | #include "browser.h" |
8 | #include "helpline.h" | 8 | #include "helpline.h" |
9 | #include "ui.h" | 9 | #include "ui.h" |
10 | #include "util.h" | ||
11 | #include "libslang.h" | ||
12 | #include "keysyms.h" | ||
10 | 13 | ||
11 | pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; | 14 | pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER; |
12 | 15 | ||
16 | static volatile int ui__need_resize; | ||
17 | |||
18 | void ui__refresh_dimensions(bool force) | ||
19 | { | ||
20 | if (force || ui__need_resize) { | ||
21 | ui__need_resize = 0; | ||
22 | pthread_mutex_lock(&ui__lock); | ||
23 | SLtt_get_screen_size(); | ||
24 | SLsmg_reinit_smg(); | ||
25 | pthread_mutex_unlock(&ui__lock); | ||
26 | } | ||
27 | } | ||
28 | |||
29 | static void ui__sigwinch(int sig __used) | ||
30 | { | ||
31 | ui__need_resize = 1; | ||
32 | } | ||
33 | |||
34 | static void ui__setup_sigwinch(void) | ||
35 | { | ||
36 | static bool done; | ||
37 | |||
38 | if (done) | ||
39 | return; | ||
40 | |||
41 | done = true; | ||
42 | pthread__unblock_sigwinch(); | ||
43 | signal(SIGWINCH, ui__sigwinch); | ||
44 | } | ||
45 | |||
46 | int ui__getch(int delay_secs) | ||
47 | { | ||
48 | struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL; | ||
49 | fd_set read_set; | ||
50 | int err, key; | ||
51 | |||
52 | ui__setup_sigwinch(); | ||
53 | |||
54 | FD_ZERO(&read_set); | ||
55 | FD_SET(0, &read_set); | ||
56 | |||
57 | if (delay_secs) { | ||
58 | timeout.tv_sec = delay_secs; | ||
59 | timeout.tv_usec = 0; | ||
60 | } | ||
61 | |||
62 | err = select(1, &read_set, NULL, NULL, ptimeout); | ||
63 | |||
64 | if (err == 0) | ||
65 | return K_TIMER; | ||
66 | |||
67 | if (err == -1) { | ||
68 | if (errno == EINTR) | ||
69 | return K_RESIZE; | ||
70 | return K_ERROR; | ||
71 | } | ||
72 | |||
73 | key = SLang_getkey(); | ||
74 | if (key != K_ESC) | ||
75 | return key; | ||
76 | |||
77 | FD_ZERO(&read_set); | ||
78 | FD_SET(0, &read_set); | ||
79 | timeout.tv_sec = 0; | ||
80 | timeout.tv_usec = 20; | ||
81 | err = select(1, &read_set, NULL, NULL, &timeout); | ||
82 | if (err == 0) | ||
83 | return K_ESC; | ||
84 | |||
85 | SLang_ungetkey(key); | ||
86 | return SLkp_getkey(); | ||
87 | } | ||
88 | |||
13 | static void newt_suspend(void *d __used) | 89 | static void newt_suspend(void *d __used) |
14 | { | 90 | { |
15 | newtSuspend(); | 91 | newtSuspend(); |
@@ -17,6 +93,33 @@ static void newt_suspend(void *d __used) | |||
17 | newtResume(); | 93 | newtResume(); |
18 | } | 94 | } |
19 | 95 | ||
96 | static int ui__init(void) | ||
97 | { | ||
98 | int err = SLkp_init(); | ||
99 | |||
100 | if (err < 0) | ||
101 | goto out; | ||
102 | |||
103 | SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB); | ||
104 | out: | ||
105 | return err; | ||
106 | } | ||
107 | |||
108 | static void ui__exit(void) | ||
109 | { | ||
110 | SLtt_set_cursor_visibility(1); | ||
111 | SLsmg_refresh(); | ||
112 | SLsmg_reset_smg(); | ||
113 | SLang_reset_tty(); | ||
114 | } | ||
115 | |||
116 | static void ui__signal(int sig) | ||
117 | { | ||
118 | ui__exit(); | ||
119 | psignal(sig, "perf"); | ||
120 | exit(0); | ||
121 | } | ||
122 | |||
20 | void setup_browser(bool fallback_to_pager) | 123 | void setup_browser(bool fallback_to_pager) |
21 | { | 124 | { |
22 | if (!isatty(1) || !use_browser || dump_trace) { | 125 | if (!isatty(1) || !use_browser || dump_trace) { |
@@ -28,19 +131,25 @@ void setup_browser(bool fallback_to_pager) | |||
28 | 131 | ||
29 | use_browser = 1; | 132 | use_browser = 1; |
30 | newtInit(); | 133 | newtInit(); |
31 | newtCls(); | 134 | ui__init(); |
32 | newtSetSuspendCallback(newt_suspend, NULL); | 135 | newtSetSuspendCallback(newt_suspend, NULL); |
33 | ui_helpline__init(); | 136 | ui_helpline__init(); |
34 | ui_browser__init(); | 137 | ui_browser__init(); |
138 | |||
139 | signal(SIGSEGV, ui__signal); | ||
140 | signal(SIGFPE, ui__signal); | ||
141 | signal(SIGINT, ui__signal); | ||
142 | signal(SIGQUIT, ui__signal); | ||
143 | signal(SIGTERM, ui__signal); | ||
35 | } | 144 | } |
36 | 145 | ||
37 | void exit_browser(bool wait_for_ok) | 146 | void exit_browser(bool wait_for_ok) |
38 | { | 147 | { |
39 | if (use_browser > 0) { | 148 | if (use_browser > 0) { |
40 | if (wait_for_ok) { | 149 | if (wait_for_ok) |
41 | char title[] = "Fatal Error", ok[] = "Ok"; | 150 | ui__question_window("Fatal Error", |
42 | newtWinMessage(title, ok, ui_helpline__last_msg); | 151 | ui_helpline__last_msg, |
43 | } | 152 | "Press any key...", 0); |
44 | newtFinished(); | 153 | ui__exit(); |
45 | } | 154 | } |
46 | } | 155 | } |