#include "config.h"
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sys/types.h>
#ifdef GPM_MOUSEDRIVER
#include <gpm.h>
#endif
#include "aalib.h"
#include "aaint.h"
static int iswaiting;
static int __resized;
#ifdef GPM_MOUSEDRIVER
extern int __curses_usegpm;
#endif
static jmp_buf buf;
#ifdef SIGWINCH
static void handler(int i)
{
__resized = 2;
signal(SIGWINCH, handler);
if (iswaiting)
longjmp(buf, 1);
}
#endif
static int stdin_init(struct aa_context *context, int mode)
{
#ifdef SIGWINCH
signal(SIGWINCH, handler);
#endif
#ifdef GPM_MOUSEDRIVER
aa_recommendlowmouse("gpm");
#endif
return 1;
}
static void stdin_uninit(aa_context * c)
{
#ifdef SIGWINCH
signal(SIGWINCH, SIG_IGN); /*this line may cause problem... */
#endif
}
static int stdin_getchar(aa_context * c1, int wait)
{
int c;
int flag;
struct timeval tv;
if (wait) {
setjmp(buf);
iswaiting = 1;
}
if (__resized == 2) {
__resized = 1;
return (AA_RESIZE);
}
if (!wait) {
fd_set readfds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(0, &readfds);
#ifdef GPM_MOUSEDRIVER
if (__curses_usegpm) {
FD_SET(gpm_fd, &readfds);
}
#endif
#ifdef GPM_MOUSEDRIVER
if (!(flag = select((__curses_usegpm ? gpm_fd : 0) + 1, &readfds, NULL, NULL, &tv)))
#else
if (!(flag = select(1, &readfds, NULL, NULL, &tv)))
#endif
return AA_NONE;
}
#ifdef GPM_MOUSEDRIVER
if (__curses_usegpm) {
c = Gpm_Getc(stdin);
} else
#endif
c = getc(stdin);
iswaiting = 0;
if (c == 27)
return (AA_ESC);
if (c == 10)
return (13);
if (c > 0 && c < 127 && c != 127)
return (c);
switch (c) {
#ifdef KEY_MOUSE
case KEY_MOUSE:
return AA_MOUSE
#endif
case 127:
return (AA_BACKSPACE);
}
if(feof(stdin)) return AA_NONE;
return (AA_UNKNOWN);
}
__AA_CONST struct aa_kbddriver kbd_stdin_d =
{
"stdin", "Standard input keyboard driver 1.0",
0,
stdin_init,
stdin_uninit,
stdin_getchar,
};