Linux Audio

Check our new training course

Loading...
v5.4
 1// SPDX-License-Identifier: GPL-2.0
 
 
 
 
 
 
 
 
 
 
 
 2#include "util.h"
 3#include "../util/debug.h"
 4#include <stdio.h>
 5
 6/*
 7 * Default error logging functions
 8 */
 9static int perf_stdio__error(const char *format, va_list args)
10{
11	fprintf(stderr, "Error:\n");
12	vfprintf(stderr, format, args);
13	return 0;
 
 
 
14}
15
16static int perf_stdio__warning(const char *format, va_list args)
17{
18	fprintf(stderr, "Warning:\n");
19	vfprintf(stderr, format, args);
20	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21}
22
23static struct perf_error_ops default_eops =
24{
25	.error		= perf_stdio__error,
26	.warning	= perf_stdio__warning,
27};
 
 
 
 
28
29static struct perf_error_ops *perf_eops = &default_eops;
 
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
32int ui__error(const char *format, ...)
 
33{
34	int ret;
35	va_list args;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
37	va_start(args, format);
38	ret = perf_eops->error(format, args);
39	va_end(args);
 
40
41	return ret;
 
 
42}
43
44int ui__warning(const char *format, ...)
45{
46	int ret;
47	va_list args;
48
49	va_start(args, format);
50	ret = perf_eops->warning(format, args);
51	va_end(args);
 
 
 
 
 
 
52
53	return ret;
 
 
54}
55
56/**
57 * perf_error__register - Register error logging functions
58 * @eops: The pointer to error logging function struct
59 *
60 * Register UI-specific error logging functions. Before calling this,
61 * other logging functions should be unregistered, if any.
62 */
63int perf_error__register(struct perf_error_ops *eops)
64{
65	if (perf_eops != &default_eops)
66		return -1;
67
68	perf_eops = eops;
69	return 0;
 
 
70}
71
72/**
73 * perf_error__unregister - Unregister error logging functions
74 * @eops: The pointer to error logging function struct
75 *
76 * Unregister already registered error logging functions.
77 */
78int perf_error__unregister(struct perf_error_ops *eops)
79{
80	if (perf_eops != eops)
81		return -1;
82
83	perf_eops = &default_eops;
84	return 0;
 
 
85}
v3.5.6
  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_browser__input_window(const char *title, const char *text, char *input,
 73			     const char *exit_msg, int delay_secs)
 74{
 75	int x, y, len, key;
 76	int max_len = 60, nr_lines = 0;
 77	static char buf[50];
 78	const char *t;
 79
 80	t = text;
 81	while (1) {
 82		const char *sep = strchr(t, '\n');
 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 += 8;
 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 -= 7;
108	max_len -= 2;
109	SLsmg_write_wrapped_string((unsigned char *)text, y, x,
110				   nr_lines, max_len, 1);
111	y += nr_lines;
112	len = 5;
113	while (len--) {
114		SLsmg_gotorc(y + len - 1, x);
115		SLsmg_write_nstring((char *)" ", max_len);
116	}
117	SLsmg_draw_box(y++, x + 1, 3, max_len - 2);
118
119	SLsmg_gotorc(y + 3, x);
120	SLsmg_write_nstring((char *)exit_msg, max_len);
121	SLsmg_refresh();
122
123	x += 2;
124	len = 0;
125	key = ui__getch(delay_secs);
126	while (key != K_TIMER && key != K_ENTER && key != K_ESC) {
127		if (key == K_BKSPC) {
128			if (len == 0)
129				goto next_key;
130			SLsmg_gotorc(y, x + --len);
131			SLsmg_write_char(' ');
132		} else {
133			buf[len] = key;
134			SLsmg_gotorc(y, x + len++);
135			SLsmg_write_char(key);
136		}
137		SLsmg_refresh();
138
139		/* XXX more graceful overflow handling needed */
140		if (len == sizeof(buf) - 1) {
141			ui_helpline__push("maximum size of symbol name reached!");
142			key = K_ENTER;
143			break;
144		}
145next_key:
146		key = ui__getch(delay_secs);
147	}
148
149	buf[len] = '\0';
150	strncpy(input, buf, len+1);
151	return key;
152}
153
154int ui__question_window(const char *title, const char *text,
155			const char *exit_msg, int delay_secs)
156{
157	int x, y;
158	int max_len = 0, nr_lines = 0;
159	const char *t;
160
161	t = text;
162	while (1) {
163		const char *sep = strchr(t, '\n');
164		int len;
165
166		if (sep == NULL)
167			sep = strchr(t, '\0');
168		len = sep - t;
169		if (max_len < len)
170			max_len = len;
171		++nr_lines;
172		if (*sep == '\0')
173			break;
174		t = sep + 1;
175	}
176
177	max_len += 2;
178	nr_lines += 4;
179	y = SLtt_Screen_Rows / 2 - nr_lines / 2,
180	x = SLtt_Screen_Cols / 2 - max_len / 2;
181
182	SLsmg_set_color(0);
183	SLsmg_draw_box(y, x++, nr_lines, max_len);
184	if (title) {
185		SLsmg_gotorc(y, x + 1);
186		SLsmg_write_string((char *)title);
187	}
188	SLsmg_gotorc(++y, x);
189	nr_lines -= 2;
190	max_len -= 2;
191	SLsmg_write_wrapped_string((unsigned char *)text, y, x,
192				   nr_lines, max_len, 1);
193	SLsmg_gotorc(y + nr_lines - 2, x);
194	SLsmg_write_nstring((char *)" ", max_len);
195	SLsmg_gotorc(y + nr_lines - 1, x);
196	SLsmg_write_nstring((char *)exit_msg, max_len);
197	SLsmg_refresh();
198	return ui__getch(delay_secs);
199}
200
201int ui__help_window(const char *text)
202{
203	return ui__question_window("Help", text, "Press any key...", 0);
204}
205
206int ui__dialog_yesno(const char *msg)
207{
208	return ui__question_window(NULL, msg, "Enter: Yes, ESC: No", 0);
209}
210
211int __ui__warning(const char *title, const char *format, va_list args)
212{
213	char *s;
 
214
215	if (use_browser > 0 && vasprintf(&s, format, args) > 0) {
216		int key;
217
218		pthread_mutex_lock(&ui__lock);
219		key = ui__question_window(title, s, "Press any key...", 0);
220		pthread_mutex_unlock(&ui__lock);
221		free(s);
222		return key;
223	}
224
225	fprintf(stderr, "%s:\n", title);
226	vfprintf(stderr, format, args);
227	return K_ESC;
228}
229
230int ui__warning(const char *format, ...)
 
 
 
 
 
 
 
231{
232	int key;
233	va_list args;
234
235	va_start(args, format);
236	key = __ui__warning("Warning", format, args);
237	va_end(args);
238	return key;
239}
240
241int ui__error(const char *format, ...)
 
 
 
 
 
 
242{
243	int key;
244	va_list args;
245
246	va_start(args, format);
247	key = __ui__warning("Error", format, args);
248	va_end(args);
249	return key;
250}