blob: 6bccdaa159aab9f8e5e2eb6c723e3a6493ec695f [file] [log] [blame]
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -03001#include <newt.h>
Arnaldo Carvalho de Melod1b4f242010-08-10 15:49:07 -03002#include <signal.h>
3#include <stdio.h>
4#include <stdbool.h>
5#include <string.h>
Arnaldo Carvalho de Melo7081e082010-03-12 10:48:12 -03006#include <sys/ttydefaults.h>
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -03007
8#include "cache.h"
Arnaldo Carvalho de Melod1b4f242010-08-10 15:49:07 -03009#include "debug.h"
Arnaldo Carvalho de Meloef8f34a2010-08-06 17:35:02 -030010#include "ui/browser.h"
Arnaldo Carvalho de Melo55755362010-08-08 19:48:31 -030011#include "ui/helpline.h"
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -030012
Arnaldo Carvalho de Meloef8f34a2010-08-06 17:35:02 -030013newtComponent newt_form__new(void);
Arnaldo Carvalho de Melod1b4f242010-08-10 15:49:07 -030014int popup_menu(int argc, char * const argv[]);
15int ui__help_window(const char *text);
16bool dialog_yesno(const char *msg);
Arnaldo Carvalho de Meloef8f34a2010-08-06 17:35:02 -030017
Arnaldo Carvalho de Melo211ef122010-08-10 14:54:09 -030018char browser__last_msg[1024];
Arnaldo Carvalho de Melo5f4d3f82010-03-26 21:16:22 -030019
20int browser__show_help(const char *format, va_list ap)
21{
22 int ret;
23 static int backlog;
24
25 ret = vsnprintf(browser__last_msg + backlog,
26 sizeof(browser__last_msg) - backlog, format, ap);
27 backlog += ret;
28
29 if (browser__last_msg[backlog - 1] == '\n') {
Arnaldo Carvalho de Melo3798ed72010-05-11 18:01:23 -030030 ui_helpline__puts(browser__last_msg);
Arnaldo Carvalho de Melo5f4d3f82010-03-26 21:16:22 -030031 newtRefresh();
32 backlog = 0;
33 }
34
35 return ret;
36}
37
Arnaldo Carvalho de Melo7081e082010-03-12 10:48:12 -030038static void newt_form__set_exit_keys(newtComponent self)
39{
Arnaldo Carvalho de Meloa308f3a2010-05-16 20:29:38 -030040 newtFormAddHotKey(self, NEWT_KEY_LEFT);
Arnaldo Carvalho de Melo7081e082010-03-12 10:48:12 -030041 newtFormAddHotKey(self, NEWT_KEY_ESCAPE);
42 newtFormAddHotKey(self, 'Q');
43 newtFormAddHotKey(self, 'q');
44 newtFormAddHotKey(self, CTRL('c'));
45}
46
Arnaldo Carvalho de Meloef8f34a2010-08-06 17:35:02 -030047newtComponent newt_form__new(void)
Arnaldo Carvalho de Melo7081e082010-03-12 10:48:12 -030048{
49 newtComponent self = newtForm(NULL, NULL, 0);
50 if (self)
51 newt_form__set_exit_keys(self);
52 return self;
53}
54
Arnaldo Carvalho de Melod1b4f242010-08-10 15:49:07 -030055int popup_menu(int argc, char * const argv[])
Arnaldo Carvalho de Melo53c54012010-03-24 16:40:14 -030056{
57 struct newtExitStruct es;
58 int i, rc = -1, max_len = 5;
59 newtComponent listbox, form = newt_form__new();
60
61 if (form == NULL)
62 return -1;
63
64 listbox = newtListbox(0, 0, argc, NEWT_FLAG_RETURNEXIT);
65 if (listbox == NULL)
66 goto out_destroy_form;
67
Arnaldo Carvalho de Melo7f826452010-05-10 10:51:25 -030068 newtFormAddComponent(form, listbox);
Arnaldo Carvalho de Melo53c54012010-03-24 16:40:14 -030069
70 for (i = 0; i < argc; ++i) {
71 int len = strlen(argv[i]);
72 if (len > max_len)
73 max_len = len;
74 if (newtListboxAddEntry(listbox, argv[i], (void *)(long)i))
75 goto out_destroy_form;
76 }
77
78 newtCenteredWindow(max_len, argc, NULL);
79 newtFormRun(form, &es);
80 rc = newtListboxGetCurrent(listbox) - NULL;
81 if (es.reason == NEWT_EXIT_HOTKEY)
82 rc = -1;
83 newtPopWindow();
84out_destroy_form:
85 newtFormDestroy(form);
86 return rc;
87}
88
Arnaldo Carvalho de Melod1b4f242010-08-10 15:49:07 -030089int ui__help_window(const char *text)
Arnaldo Carvalho de Meloa9a4ab72010-05-16 21:04:27 -030090{
91 struct newtExitStruct es;
92 newtComponent tb, form = newt_form__new();
93 int rc = -1;
94 int max_len = 0, nr_lines = 0;
95 const char *t;
96
97 if (form == NULL)
98 return -1;
99
100 t = text;
101 while (1) {
102 const char *sep = strchr(t, '\n');
103 int len;
104
105 if (sep == NULL)
106 sep = strchr(t, '\0');
107 len = sep - t;
108 if (max_len < len)
109 max_len = len;
110 ++nr_lines;
111 if (*sep == '\0')
112 break;
113 t = sep + 1;
114 }
115
116 tb = newtTextbox(0, 0, max_len, nr_lines, 0);
117 if (tb == NULL)
118 goto out_destroy_form;
119
120 newtTextboxSetText(tb, text);
121 newtFormAddComponent(form, tb);
122 newtCenteredWindow(max_len, nr_lines, NULL);
123 newtFormRun(form, &es);
124 newtPopWindow();
125 rc = 0;
126out_destroy_form:
127 newtFormDestroy(form);
128 return rc;
129}
130
Arnaldo Carvalho de Melod1b4f242010-08-10 15:49:07 -0300131bool dialog_yesno(const char *msg)
Arnaldo Carvalho de Melo53c54012010-03-24 16:40:14 -0300132{
133 /* newtWinChoice should really be accepting const char pointers... */
134 char yes[] = "Yes", no[] = "No";
Arnaldo Carvalho de Meloc0ed55d2010-04-05 12:04:23 -0300135 return newtWinChoice(NULL, yes, no, (char *)msg) == 1;
Arnaldo Carvalho de Melo53c54012010-03-24 16:40:14 -0300136}
137
Arnaldo Carvalho de Melo73ae8f82010-07-30 10:06:06 -0300138static void newt_suspend(void *d __used)
139{
140 newtSuspend();
141 raise(SIGTSTP);
142 newtResume();
143}
144
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -0300145void setup_browser(void)
146{
Arnaldo Carvalho de Melo46e3e052010-05-22 11:25:40 -0300147 if (!isatty(1) || !use_browser || dump_trace) {
Arnaldo Carvalho de Melo62e34362010-05-26 13:22:26 -0300148 use_browser = 0;
Arnaldo Carvalho de Melo5d06e692010-05-20 22:01:10 -0300149 setup_pager();
150 return;
151 }
152
153 use_browser = 1;
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -0300154 newtInit();
155 newtCls();
Arnaldo Carvalho de Melo73ae8f82010-07-30 10:06:06 -0300156 newtSetSuspendCallback(newt_suspend, NULL);
Arnaldo Carvalho de Melo3798ed72010-05-11 18:01:23 -0300157 ui_helpline__puts(" ");
Arnaldo Carvalho de Meloef8f34a2010-08-06 17:35:02 -0300158 ui_browser__init();
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -0300159}
160
Arnaldo Carvalho de Melof3a1f0e2010-03-22 13:10:25 -0300161void exit_browser(bool wait_for_ok)
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -0300162{
Arnaldo Carvalho de Melo5d06e692010-05-20 22:01:10 -0300163 if (use_browser > 0) {
Arnaldo Carvalho de Melof3a1f0e2010-03-22 13:10:25 -0300164 if (wait_for_ok) {
165 char title[] = "Fatal Error", ok[] = "Ok";
166 newtWinMessage(title, ok, browser__last_msg);
167 }
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -0300168 newtFinished();
Arnaldo Carvalho de Melof3a1f0e2010-03-22 13:10:25 -0300169 }
Arnaldo Carvalho de Melof9224c52010-03-11 20:12:44 -0300170}