|
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 |
}
|