summaryrefslogblamecommitdiffstats
path: root/src/hci/mucurses/kb.c
blob: 48de14cb96791bfb4b4553565d0473dec509ef25 (plain) (tree)




































































































                                                                              
#include <curses.h>
#include <stddef.h>
#include "core.h"

/** @file
 *
 * MuCurses keyboard input handling functions
 */

#define INPUT_BUFFER_LEN 80

bool echo_on = FALSE;
bool delay = FALSE;

/**
 *
 */
int has_key ( int ch ) {
	return TRUE;
}

/**
 * Push a character back onto the FIFO
 *
 * @v ch	char to push to head of input stream
 * @ret rc	return status code
 */
int ungetch ( int ch ) {
	stdscr->scr->pushc( stdscr->scr, ch );
	return OK;
}

/**
 * Pop a character from the FIFO into a window
 *
 * @v *win	window in which to echo input
 * @ret ch	char from input stream
 */
int wgetch ( WINDOW *win ) {
	int ch;
	if ( win == NULL )
		return ERR;

	ch = win->scr->popc( win->scr );

	if ( echo_on ) {
		if ( ch == KEY_LEFT || ch == KEY_BACKSPACE ) {
			if ( win->curs_x == 0 ) {
				wmove( win, --(win->curs_y), win->width - 1 );
				wdelch( win );
			} else {
				wmove( win, win->curs_y, --(win->curs_x) );
				wdelch( win );
			}
		} else if ( ch >= 0401 && ch <= 0633 ) {
			beep();
		} else {
			_wputch( win, (chtype)( ch | win->attrs ), WRAP );
		}
	}

	return ch;
}

/**
 * Read at most n characters from the FIFO into a window
 *
 * @v *win	window in which to echo input
 * @v *str	pointer to string in which to store result
 */
int wgetnstr ( WINDOW *win, char *str, int n ) {
	char *str_start;
	int c;

	if ( n < 0 )
		return ERR;

	str_start = str;

	for ( ; ( c = wgetch(win) ) && n; n-- ) {
		if ( n == 1 ) { // last character must be a newline...
			if ( c == '\n' ) {
				*str = '\0';
			} else { // ...otherwise beep and wait for one
				beep();
				++n;
				continue;
			}
		} else if ( c == '\n' ) {
			*str = '\0';
			break;
		} else {
			if ( c == KEY_LEFT || c == KEY_BACKSPACE ) {
				if ( ! ( str == str_start ) )
					str--;
			} else { *str = c; str++; }
		}
	}

	return OK;
}