void inputx_update(void) { const struct KeyBuffer *keybuf; const struct InputCode *code; unicode_char_t ch; int i; UINT32 value; if (inputx_can_post()) { keybuf = get_buffer(); /* is the key down right now? */ if (keybuf->status_keydown && (keybuf->begin_pos != keybuf->end_pos)) { /* identify the character that is down right now, and its component codes */ ch = keybuf->buffer[keybuf->begin_pos]; code = &codes[ch]; /* loop through this character's component codes */ for (i = 0; code->ipt[i] && (i < sizeof(code->ipt) / sizeof(code->ipt[0])); i++) { value = code->ipt[i]->mask; input_port_set_digital_value(code->port[i], value, value); } } } }
void inputx_postn_rate(const unicode_char_t *text, size_t text_len, mame_time rate) { int last_cr = 0; unicode_char_t ch; const char *s; const struct CharInfo *ci; current_rate = rate; if (inputx_can_post()) { while((text_len > 0) && !buffer_full()) { ch = *(text++); text_len--; /* change all eolns to '\r' */ if ((ch != '\n') || !last_cr) { if (ch == '\n') ch = '\r'; else last_cr = (ch == '\r'); if (LOG_INPUTX) logerror("inputx_postn(): code=%i (%s) port=%i ipt->name='%s'\n", (int) ch, charstr(ch), codes[ch].port[0], codes[ch].ipt[0] ? codes[ch].ipt[0]->name : "<null>"); if (can_post_key_directly(ch)) { /* we can post this key in the queue directly */ internal_post_key(ch); } else if (can_post_key_alternate(ch)) { /* we can post this key with an alternate representation */ ci = find_charinfo(ch); assert(ci && ci->alternate); s = ci->alternate; while(*s) { s += uchar_from_utf8(&ch, s, strlen(s)); internal_post_key(ch); } } } else { last_cr = 0; } } } }
static void command_input(void) { /* post a set of characters to the emulation */ if (state == STATE_READY) { if (!inputx_can_post()) { state = STATE_ABORTED; report_message(MSG_FAILURE, "Natural keyboard input not supported for this driver"); return; } /* input_chars can be NULL, so we should check for that */ if (current_command->u.input_args.input_chars) { inputx_post_utf8_rate(current_command->u.input_args.input_chars, current_command->u.input_args.rate); } } state = inputx_is_posting() ? STATE_INCOMMAND : STATE_READY; }
int inputx_can_post_key(unicode_char_t ch) { return inputx_can_post() && (can_post_key_directly(ch) || can_post_key_alternate(ch)); }
static struct KeyBuffer *get_buffer(void) { assert(inputx_can_post()); return (struct KeyBuffer *) keybuffer; }