Added more keys behavior

This commit is contained in:
claudio 2015-03-19 14:07:01 -04:00
parent f458a73343
commit 48e834deda
7 changed files with 129 additions and 18 deletions

View file

@ -339,18 +339,16 @@ void waitforspeed_handler()
// ID N*8 WITH N<100 ARE RESERVED FOR THE SYSTEM APPLICATIONS (SOLVER, ETC)
// ID= N*8 --> USER CONTEXTS FROM N=100 AND UP TO 16250 ARE FREE TO USE
BINT __keycontext __attribute__ ((section (".system_globals")));
// SET THE KEYBOARD CONTEXT
void halSetContext(BINT KeyContext)
{
__keycontext=KeyContext;
halScreen.KeyContext=KeyContext;
}
// AND RETRIEVE
BINT halGetContext()
{
return __keycontext;
return halScreen.KeyContext;
}
@ -391,15 +389,6 @@ void testKeyHandler(BINT keymsg)
}
enum {
CONTEXT_ANY=0,
CONTEXT_INEDITOR=1,
CONTEXT_STACK=8,
CONTEXT_PICT=16
// ADD MORE SYSTEM CONTEXTS HERE
};
// **************************************************************************
// ******************* DEFAULT KEY HANDLERS **************************
// **************************************************************************
@ -459,8 +448,74 @@ void dotKeyHandler(BINT keymsg)
uiOpenCmdLine();
}
uiInsertCharacters(".",1);
halScreen.DirtyFlag|=CMDLINE_DIRTY;
}
void enterKeyHandler(BINT keymsg)
{
if(!(halGetContext()&CONTEXT_INEDITOR)) {
// PERFORM DUP
if(halGetContext()==CONTEXT_STACK) {
// PERFORM DUP ONLY IF THERE'S DATA ON THE STACK
// DON'T ERROR IF STACK IS EMPTY
if(rplDepthData()>0) rplPushData(rplPeekData(1));
halScreen.DirtyFlag|=STACK_DIRTY;
}
}
else{
WORDPTR text=uiGetCmdLineText();
if(!text) {
throw_dbgexception("No memory for command line",__EX_CONT|__EX_WARM|__EX_RESET);
return;
}
BINT len=rplStrLen(text);
WORDPTR newobject;
if(len) {
newobject=rplCompile((BYTEPTR)(text+1),len,1);
if(Exceptions || (!newobject)) {
// TODO: SHOW ERROR MESSAGE AND SELECT THE WORD THAT CAUSED THE ERROR
return;
}
else {
// RUN THE OBJECT
rplSetEntryPoint(newobject);
rplRun();
if(Exceptions) {
// TODO: SHOW ERROR MESSAGE
}
// EVERYTHING WENT FINE, CLOSE THE COMMAND LINE
uiCloseCmdLine();
halSetCmdLineHeight(0);
halSetContext(halGetContext()& (~CONTEXT_INEDITOR));
}
}
}
}
void backspKeyHandler(BINT keymsg)
{
if(!(halGetContext()&CONTEXT_INEDITOR)) {
// DO DROP
if(halGetContext()==CONTEXT_STACK) {
// PERFORM DROP ONLY IF THERE'S DATA ON THE STACK
// DON'T ERROR IF STACK IS EMPTY
if(rplDepthData()>0) rplDropData(1);
halScreen.DirtyFlag|=STACK_DIRTY;
}
}
else{
// REMOVE CHARACTERS FROM THE COMMAND LINE
// TODO: IMPLEMENT THIS!
uiInsertCharacters("**",2);
}
}
// **************************************************************************
// ******************* END OF DEFAULT KEY HANDLERS **************************
// **************************************************************************
@ -490,6 +545,9 @@ struct keyhandler_t __keydefaulthandlers[]= {
{ KM_PRESS|KB_9, CONTEXT_ANY,&numberKeyHandler },
{ KM_PRESS|KB_0, CONTEXT_ANY,&numberKeyHandler },
{ KM_PRESS|KB_DOT, CONTEXT_ANY,&dotKeyHandler },
{ KM_PRESS|KB_ENT, CONTEXT_ANY,&enterKeyHandler },
{ KM_PRESS|KB_BKS, CONTEXT_ANY,&backspKeyHandler },
{ 0 , 0 , 0 }
};
@ -523,7 +581,7 @@ struct keyhandler_t *ptr=__keydefaulthandlers;
while(ptr->action) {
if(ptr->message==keymsg) {
// CHECK IF CONTEXT MATCHES
if((!ptr->context) || (ptr->context==__keycontext)) {
if((!ptr->context) || (ptr->context==halScreen.KeyContext)) {
// IT'S A MATCH, EXECUTE THE ACTION;
(ptr->action)(keymsg);
return 1;

View file

@ -275,6 +275,7 @@ halSetFormHeight(0);
halScreen.DirtyFlag=STACK_DIRTY|MENU1_DIRTY|MENU2_DIRTY;
halScreen.SAreaTimer=0;
halScreen.CursorTimer=0;
halScreen.KeyContext=CONTEXT_STACK;
halScreen.FormFont=halScreen.StackFont=halScreen.Stack1Font=(FONTDATA *)System7Font;
halScreen.MenuFont=(FONTDATA *)System5Font;
halScreen.StAreaFont=(FONTDATA *)MiniFont;

View file

@ -131,11 +131,21 @@ typedef struct {
int CursorPosition; // OFFSET FROM START OF CURRENT LINE
int CursorX,XVisible;
int SelectionStart,SelectionEnd;
// VARIABLES FOR USER INTERFACE
int KeyContext;
} HALSCREEN;
extern HALSCREEN halScreen;
// CALCULATOR CONTEXT IDENTIFIERS
enum {
CONTEXT_ANY=0,
CONTEXT_INEDITOR=1,
CONTEXT_STACK=8,
CONTEXT_PICT=16
// ADD MORE SYSTEM CONTEXTS HERE
};
//! Type definition for interrupt handler functions

View file

@ -412,7 +412,7 @@ __keynumber=0;
__kmat=0LL;
__keyb_repeattime=80/KEYB_SCANSPEED;
__keyb_longpresstime=1000/KEYB_SCANSPEED;
__keyb_debounce=20/KEYB_SCANSPEED;
__keyb_debounce=0; //20/KEYB_SCANSPEED;
__keyb_lock=0;
__pckeymatrix=0;
// INITIALIZE TIMER EVENT 0

View file

@ -32,6 +32,13 @@ void uiSetCmdLineText(WORDPTR text)
halScreen.DirtyFlag|=CMDLINE_ALLDIRTY;
}
WORDPTR uiGetCmdLineText()
{
if(halScreen.LineIsModified>0) uiModifyLine();
if(Exceptions) return NULL;
return CmdLineText;
}
// SCROLL UP/DOWN AND LEFT/RIGHT TO KEEP CURSOR ON SCREEN
void uiEnsureCursorVisible()
{
@ -97,6 +104,26 @@ void uiOpenCmdLine()
}
// OPEN AN EMPTY COMMAND LINE
void uiCloseCmdLine()
{
tmr_eventkill(halScreen.CursorTimer);
CmdLineText=empty_string;
CmdLineCurrentLine=empty_string;
CmdLineUndoList=empty_list;
halScreen.LineCurrent=1;
halScreen.LineIsModified=-1;
halScreen.LineVisible=1;
halScreen.NumLinesVisible=1;
halScreen.CursorX=0;
halScreen.CursorPosition=0;
halScreen.CursorState=0;
halScreen.XVisible=0;
halScreen.DirtyFlag|=CMDLINE_ALLDIRTY;
}
void uiSetCurrentLine(BINT line)
{
@ -259,6 +286,7 @@ halScreen.CursorState&=~0x4000;
void uiModifyLine()
{
WORDPTR newobj;
BINT newsize;
// GET A NEW OBJECT WITH ROOM FOR THE ENTIRE TEXT
newobj=rplAllocTempOb( (rplStrLen(CmdLineText)+rplStrLen(CmdLineCurrentLine)+1+ 3)>>2);
@ -289,6 +317,8 @@ void uiModifyLine()
}
// COPY ALL PREVIOUS LINES TO NEW OBJECT
newsize=startline-src+rplStrLen(CmdLineCurrentLine);
memmove(dest,src,startline-src);
// COPY THE NEW LINE TO THE OBJECT
memmove(dest+(startline-src),(WORDPTR)(CmdLineCurrentLine+1),rplStrLen(CmdLineCurrentLine));
@ -297,9 +327,12 @@ void uiModifyLine()
// APPEND A NEWLINE AND KEEP GOING
dest+=startline-src+rplStrLen(CmdLineCurrentLine);
*dest++='\n';
newsize+=((BYTEPTR)rplSkipOb(CmdLineText))-endline+1;
memmove(dest,endline,((BYTEPTR)rplSkipOb(CmdLineText))-endline);
}
rplSetStringLength(newobj,newsize);
CmdLineText=newobj;
halScreen.LineIsModified=0;

View file

@ -128,6 +128,7 @@ const int keyMap[] = {
Qt::Key_Asterisk, 4,
Qt::Key_Minus, 5,
Qt::Key_Plus, 6,
Qt::Key_Return, 7,
Qt::Key_Enter, 7,
Qt::Key_P, 9,
Qt::Key_T, 10,
@ -154,11 +155,17 @@ const int keyMap[] = {
Qt::Key_Q, 34,
Qt::Key_V, 35,
Qt::Key_A, 41,
Qt::Key_F1, 41,
Qt::Key_B, 42,
Qt::Key_F2, 42,
Qt::Key_C, 43,
Qt::Key_F3, 43,
Qt::Key_D, 44,
Qt::Key_F4, 44,
Qt::Key_E, 45,
Qt::Key_F5, 45,
Qt::Key_F, 46,
Qt::Key_F6, 46,
Qt::Key_G, 47,
Qt::Key_Up, 49,
Qt::Key_Left, 50,

View file

@ -144,6 +144,10 @@ WORDPTR rplCompile(BYTEPTR string,BINT length, BINT addwrapper)
infixmode=0;
previous_tokeninfo=0;
NextTokenStart=(WORDPTR)string;
CompileStringEnd=(WORDPTR)(string+length);
if(addwrapper) {
rplCompileAppend(MKPROLOG(DOCOL,0));
if(RStkSize<=(ValidateTop-RStk)) growRStk(ValidateTop-RStk+RSTKSLACK);
@ -151,8 +155,6 @@ WORDPTR rplCompile(BYTEPTR string,BINT length, BINT addwrapper)
*ValidateTop++=CompileEnd-1; // POINTER TO THE WORD OF THE COMPOSITE, NEEDED TO STORE THE SIZE
}
NextTokenStart=(WORDPTR)string;
CompileStringEnd=(WORDPTR)(string+length);
// FIND THE START OF NEXT TOKEN