Blame alsamixer/menu_widget.c

Packit Service a9274b
#include "menu_widget.h"
Packit Service a9274b
#include "colors.h"
Packit Service a9274b
#include "utils.h"
Packit Service a9274b
#include "bindings.h"
Packit Service a9274b
Packit Service a9274b
/* Returns
Packit Service a9274b
 * - KEY_CANCEL: close is requested
Packit Service a9274b
 * - KEY_ENTER: item is selected
Packit Service a9274b
 * - -1: no action
Packit Service a9274b
 */
Packit Service a9274b
int menu_widget_handle_key(MENU *menu, int key)
Packit Service a9274b
{
Packit Service a9274b
	MEVENT m;
Packit Service a9274b
Packit Service a9274b
	switch (key) {
Packit Service a9274b
	case 27:
Packit Service a9274b
	case KEY_CANCEL:
Packit Service a9274b
	case 'q':
Packit Service a9274b
	case 'Q':
Packit Service a9274b
		return KEY_CANCEL;
Packit Service a9274b
	case '\n':
Packit Service a9274b
	case '\r':
Packit Service a9274b
	case KEY_ENTER:
Packit Service a9274b
		return KEY_ENTER;
Packit Service a9274b
Packit Service a9274b
	case KEY_MOUSE:
Packit Service a9274b
		switch (menu_driver(menu, KEY_MOUSE)) {
Packit Service a9274b
			case E_UNKNOWN_COMMAND:
Packit Service a9274b
				/* If you double-click an item a REQ_TOGGLE_ITEM is generated
Packit Service a9274b
				 * and E_UNKNOWN_COMMAND is returned. (man menu_driver) */
Packit Service a9274b
				return KEY_ENTER;
Packit Service a9274b
			case E_REQUEST_DENIED:
Packit Service a9274b
				/* If menu did not handle KEY_MOUSE is has to be removed from
Packit Service a9274b
				 * input queue to prevent an infinite loop. */
Packit Service a9274b
				key = wgetch(menu_win(menu));
Packit Service a9274b
				if (key == KEY_MOUSE) {
Packit Service a9274b
					if (getmouse(&m) == ERR)
Packit Service a9274b
						return -1;
Packit Service a9274b
					if (m.bstate & (BUTTON4_PRESSED|BUTTON4_CLICKED))
Packit Service a9274b
						menu_driver(menu, REQ_UP_ITEM);
Packit Service a9274b
#if NCURSES_MOUSE_VERSION > 1
Packit Service a9274b
					else if (m.bstate & (BUTTON5_PRESSED|BUTTON5_CLICKED))
Packit Service a9274b
						menu_driver(menu, REQ_DOWN_ITEM);
Packit Service a9274b
#endif
Packit Service a9274b
					else
Packit Service a9274b
						return KEY_CANCEL;
Packit Service a9274b
				}
Packit Service a9274b
				else if (key > 0)
Packit Service a9274b
					ungetch(key);
Packit Service a9274b
		}
Packit Service a9274b
		return -1;
Packit Service a9274b
Packit Service a9274b
	default:
Packit Service a9274b
		if (key < ARRAY_SIZE(textbox_bindings)) {
Packit Service a9274b
			key = textbox_bindings[key];
Packit Service a9274b
			if (key >= CMD_TEXTBOX___MIN_MENU_COMMAND &&
Packit Service a9274b
					key <= CMD_TEXTBOX___MAX_MENU_COMMAND)
Packit Service a9274b
				menu_driver(menu, key + KEY_MAX);
Packit Service a9274b
		}
Packit Service a9274b
Packit Service a9274b
		return -1;
Packit Service a9274b
	}
Packit Service a9274b
}
Packit Service a9274b
Packit Service a9274b
void menu_widget_create(struct widget *widget, MENU *menu, const char *title)
Packit Service a9274b
{
Packit Service a9274b
	int rows, columns;
Packit Service a9274b
Packit Service a9274b
	if (menu)
Packit Service a9274b
		unpost_menu(menu);
Packit Service a9274b
Packit Service a9274b
	if (screen_lines < 3 || screen_cols < 10) {
Packit Service a9274b
		widget->close();
Packit Service a9274b
		beep();
Packit Service a9274b
		return;
Packit Service a9274b
	}
Packit Service a9274b
	scale_menu(menu, &rows, &columns);
Packit Service a9274b
	rows += 2;
Packit Service a9274b
	columns += 2;
Packit Service a9274b
	if (rows > screen_lines)
Packit Service a9274b
		rows = screen_lines;
Packit Service a9274b
	if (columns > screen_cols)
Packit Service a9274b
		columns = screen_cols;
Packit Service a9274b
Packit Service a9274b
	widget_init(widget, rows, columns, SCREEN_CENTER, SCREEN_CENTER,
Packit Service a9274b
		    attrs.menu, WIDGET_BORDER | WIDGET_SUBWINDOW);
Packit Service a9274b
Packit Service a9274b
	mvwprintw(widget->window, 0, (columns - 2 - get_mbs_width(title)) / 2, " %s ", title);
Packit Service a9274b
	set_menu_win(menu, widget->window);
Packit Service a9274b
	set_menu_sub(menu, widget->subwindow);
Packit Service a9274b
	post_menu(menu);
Packit Service a9274b
}