/*-----------------------------------------------------------------------------------*/ void ctk_term_input(struct ctk_term_state* ts, unsigned char b) { int ret = parse_input(ts, b); PRINTF(("terminput: 0x%02x\n", b)); if (ret > 0) { enqueue_key((ctk_arch_key_t)b); } }
/*-----------------------------------------------------------------------------------*/ static void lookup_seq(const char* str, const struct seqmap* map) { while (map->seq != 0) { if (strcmp(str,map->seq) == 0) { enqueue_key(map->key); return; } map++; } }
void alpha_down(const uint8_t code, const uint8_t action) { switch(action & KEY_ACTION_MASK) { case ACTION_NORMAL: case ACTION_LOCKABLE: case ACTION_TAPKEY: case ACTION_RAPIDFIRE: enqueue_key(code); break; case ACTION_TOGGLE: toggle_key(code); break; default: break; } }
// store key-stroke into buffer static void handle_1605(struct bregs *regs) { regs->al = !enqueue_key(regs->ch, regs->cl); }
/*-----------------------------------------------------------------------------------*/ static int parse_input(struct ctk_term_state* st, unsigned char c) { unsigned char cl = classify(c); int ret = -1; switch(st->inputstate) { case ANS_IDLE: switch(cl) { case ACC_C0: { switch(c) { case ASCII_ESC: st->inputstate = ANS_ESCSEQ; break; case ASCII_BS: enqueue_key(CH_DEL); break; case ASCII_HT: enqueue_key(CH_TAB); break; case ASCII_FF: ctk_term_redraw(st); break; case ASCII_CR: enqueue_key(CH_ENTER); break; } } break; case ACC_INTERM: case ACC_PARAM: case ACC_LOWCASE: case ACC_UPCASE: case ACC_G1: ret = 1; break; case ACC_C1: if (c == ASCII_CSI) { st->inputstate = ANS_CTRLSEQ; st->ctrlCnt = 0; } else if (c == ASCII_SS3) { st->inputstate = ANS_SS3; st->ctrlCnt = 0; } break; case ACC_DEL: enqueue_key(CH_DEL); break; case ACC_SPEC: break; } break; case ANS_ESCSEQ: { switch(cl) { case ACC_C0: case ACC_DEL: break; case ACC_INTERM: st->inputstate = ANS_ESCSEQ_1; break; case ACC_UPCASE: /* C1 control character */ if (c == '[') { st->inputstate = ANS_CTRLSEQ; st->ctrlCnt = 0; } else if (c == 'O') { st->inputstate = ANS_SS3; st->ctrlCnt = 0; } else { st->inputstate = ANS_IDLE; } break; case ACC_PARAM: /* Private 2-character sequence */ case ACC_LOWCASE: /* Standard 2-character sequence */ default: st->inputstate = ANS_IDLE; break; } } break; case ANS_ESCSEQ_1: { switch(cl) { case ACC_C0: case ACC_INTERM: break; case ACC_PARAM: /* Private function*/ case ACC_LOWCASE: case ACC_UPCASE: /* Standard function */ default: st->inputstate = ANS_IDLE; break; } } break; case ANS_SS3: { switch(cl) { case ACC_PARAM: if (st->ctrlCnt < CTK_TERM_CTRLBUFLEN) st->ctrlbuf[st->ctrlCnt++]=c; break; case ACC_UPCASE: /* VT100 PF seq */ if (st->ctrlCnt < CTK_TERM_CTRLBUFLEN) st->ctrlbuf[st->ctrlCnt++]=c; st->inputstate = ANS_IDLE; st->ctrlbuf[st->ctrlCnt] = 0; lookup_seq((const char*)(st->ctrlbuf), ss3map); break; default: st->inputstate = ANS_IDLE; break; } } break; case ANS_CTRLSEQ: { switch(cl) { case ACC_C0: break; case ACC_INTERM: case ACC_PARAM: if (st->ctrlCnt < CTK_TERM_CTRLBUFLEN) st->ctrlbuf[st->ctrlCnt++]=c; break; case ACC_LOWCASE: case ACC_UPCASE: /* Standard control sequence */ if (st->ctrlCnt < CTK_TERM_CTRLBUFLEN) st->ctrlbuf[st->ctrlCnt++]=c; /* Cygwin console sends ESC [ [ A for function keys */ if (c != '[') { st->ctrlbuf[st->ctrlCnt] = 0; lookup_seq((const char*)(st->ctrlbuf), ctrlmap); st->inputstate = ANS_IDLE; } break; default: st->inputstate = ANS_IDLE; break; } } break; } return ret; }