示例#1
0
/*-----------------------------------------------------------------------------------*/
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);
  }
}
示例#2
0
/*-----------------------------------------------------------------------------------*/
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++;
  }
}
示例#3
0
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;
	}
}
示例#4
0
// store key-stroke into buffer
static void
handle_1605(struct bregs *regs)
{
    regs->al = !enqueue_key(regs->ch, regs->cl);
}
示例#5
0
/*-----------------------------------------------------------------------------------*/
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;
}