home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
dev
/
c
/
curses
/
src
/
wgetch.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-21
|
6KB
|
207 lines
/* -*-C-*-
*
*
* Filename : wgetch.c
*
* Author : Simon J Raybould. (sie@fulcrum.bt.co.uk).
*
* Date : Friday 23rd August 1991.
*
* Desc : Read a character.
*
*
* THIS CODE IS NOT PUBLIC DOMAIN
* ==============================
*
* This code is copyright Simon J Raybould 1991, all rights are reserved.
* All code, ideas, data structures and algorithms remain the property of the
* author. Neither the whole nor sections of this code may be used as part
* of other code without the authors consent. If you wish to use some of this
* code then please email me at (sie@fulcrum.bt.co.uk).
*
* This source is not public domain, so you do not have any right to alter it
* or sell it for personal gain. The source is provided purely for reference
* purposes. You may re-compile the source with any compiler you choose.
* You must not distribute altered copies without the authors consent. My
* intention is that the source will help people isolate any bugs much more
* effectivly.
*
* Disclaimer
* ==========
*
* No implication is made as to this code being fit for any purpose at all.
* I (the author) shall not be held responsible for any loss of data or damage
* to property that may result from its use or misuse.
*
*
* Revision History
* ================
*
* $Log: wgetch.c,v $
* Revision 1.6 1993/05/17 23:31:47 sie
* Underscores added to names.
* Speed optimisations for V2.10
*
* Revision 1.5 1992/12/25 23:39:35 sie
* GNU C port.
*
* Revision 1.4 92/06/10 23:44:59 sie
* Added serial support.
*
* Revision 1.3 91/12/28 22:45:46 sie
* changed attrs to UBYTE from short + some tidying up.
*
* Revision 1.2 91/12/27 10:02:38 sie
* Attempted to speed up wgetch a bit.
*
* Revision 1.1 91/09/07 11:50:10 sie
* Initial revision
*
*
*/
static char *rcsid = "$Header: /SRC/lib/curses/src/RCS/wgetch.c,v 1.6 1993/05/17 23:31:47 sie Exp $";
#include <fcntl.h>
#include "acurses.h"
wgetch(WINDOW *WinPtr)
{
static unsigned char buffer[RAWBUFSIZ];
int Class, i;
struct IntuiMessage *Message;
static struct InputEvent ievent = { NULL, IECLASS_RAWKEY, 0, 0, 0 };
char c;
if(!(_CursesFlags & CFLAG_INITSCR)) /* Haven't called initscr() */
return ERR;
if(_CursesType == CUST_CURSES) {
if(_GetchBufPos < _GetchNChars) /* If we still have some chars then return next */
return (int)buffer[_GetchBufPos++];
/* Else read a new buffer */
_GetchBufPos = _GetchNChars = 0;
while(!_GetchNChars) {
#ifdef LATTICE
chkabort(); /* Check if INTR */
#endif
/* Get message if there is one already queued */
Message = (struct IntuiMessage *)GetMsg(_CursesWindow->UserPort);
if(!Message) {
/* Nuffin yet */
if(WinPtr->_nodelay) /* If non-blocking return ERR */
return ERR;
else { /* Wait for character */
Wait(1<<_CursesWindow->UserPort->mp_SigBit);
Message = (struct IntuiMessage *)GetMsg(_CursesWindow->UserPort);
}
}
if(!Message) /* Try again */
continue;
Class = Message->Class;
switch(Class) {
case RAWKEY:
_GetchBufPos = 0;
ievent.ie_Code = Message->Code;
ievent.ie_Qualifier = Message->Qualifier;
ievent.ie_position.ie_addr = *((APTR*)Message->IAddress);
ReplyMsg((struct Message *)Message);
_GetchNChars = RawKeyConvert(&ievent, buffer, RAWBUFSIZ, 0L);
if(!_GetchNChars) /* If no characters then try again */
break;
if(_CursesFlags & CFLAG_ECHO)
for(i=0; i<_GetchNChars; i++)
_DoEcho(WinPtr, buffer[i]);
/* Translate ANSI sequence if keypad set to TRUE */
if(_CursesFlags & CFLAG_KEYPAD) {
switch(_GetchNChars) {
case 1:
_GetchNChars = 0; /* Translation will use up all chars */
if((_CursesFlags & CFLAG_NLCR) && (buffer[0] == '\r'))
return (int)'\n';
return (int)*buffer;
case 2: /* ARROW KEY */
_GetchNChars = 0; /* Translation will use up all chars */
if(buffer[0] != 155)
return -1;
switch(buffer[1]) {
case 'A':
return KEY_UP;
case 'B':
return KEY_DOWN;
case 'C':
return KEY_RIGHT;
case 'D':
return KEY_LEFT;
default:
return -1;
}
case 3: /* FUNCTION KEY */
_GetchNChars = 0; /* Translation will use up all chars */
if(buffer[0] != 155)
return -1;
if(buffer[2] != 126)
return -1;
if(buffer[1] == 63)
return KEY_HELP;
return KEY_F0 + (buffer[1] - 47); /* KEY_F(1) = F1 */
default:
_GetchNChars = 0; /* Translation will use up all chars */
return -1;
}
}
break;
default:
ReplyMsg((struct Message *)Message);
break;
}
}
if((_CursesFlags & CFLAG_NLCR) && (buffer[_GetchBufPos] == '\r')) {
_GetchBufPos++;
return (int)'\n';
}
return (int)buffer[_GetchBufPos++];
} else if(_CursesType == ANSI_CURSES) {
if((WinPtr->_nodelay) && (!WaitForChar(_ifh, 10000L)))
return ERR; /* if nodelay and no char ready */
read(0, &c, 1);
if(_CursesFlags & CFLAG_ECHO)
_DoEcho(WinPtr, c);
if((_CursesFlags & CFLAG_NLCR) && (c == '\r'))
return (int)'\n';
if(c == ESC && WaitForChar(_ifh, 10000L)) { /* if ESC wait for [ */
read(0, &c, 1);
if(_CursesFlags & CFLAG_ECHO)
_DoEcho(WinPtr, c);
if(c != '[')
return -1;
} else if((unsigned char)c != 0x9b) /* if not ESC of 9b then return */
return (int)c;
/* Got CSI, wait for rest */
if(!WaitForChar(_ifh, 10000L))
return -1;
read(0, &c, 1);
if(_CursesFlags & CFLAG_ECHO)
_DoEcho(WinPtr, c);
if(_CursesFlags & CFLAG_KEYPAD) {
switch(c) {
case 'A':
return KEY_UP;
case 'B':
return KEY_DOWN;
case 'C':
return KEY_RIGHT;
case 'D':
return KEY_LEFT;
default:
return -1;
}
}
}
}