static int brl_readCommand(BrailleDisplay *brl, KeyTableCommandContext context) { vbButtons buttons; BrButtons(&buttons); if (!buttons.keypressed) { return EOF; } else { vbButtons b; do { BrButtons(&b); buttons.bigbuttons |= b.bigbuttons; { const TimeValue duration = { .seconds = 0, .nanoseconds = 1 * NSECS_PER_USEC }; accurateDelay(&duration); } } while (b.keypressed); /* Test which buttons has been pressed */ if (buttons.bigbuttons==KEY_UP) return BRL_CMD_LNUP; else if (buttons.bigbuttons==KEY_LEFT) return BRL_CMD_FWINLT; else if (buttons.bigbuttons==KEY_RIGHT) return BRL_CMD_FWINRT; else if (buttons.bigbuttons==KEY_DOWN) return BRL_CMD_LNDN; else if (buttons.bigbuttons==KEY_ATTRIBUTES) return BRL_CMD_ATTRVIS; else if (buttons.bigbuttons==KEY_CURSOR) return BRL_CMD_CSRVIS; else if (buttons.bigbuttons==KEY_HOME) { /* If a routing key has been pressed, then mark the beginning of a block; go to cursor position otherwise */ return (buttons.routingkey>0) ? BRL_CMD_BLK(CLIP_NEW)+buttons.routingkey-1 : BRL_CMD_HOME; } else if (buttons.bigbuttons==KEY_MENU) { /* If a routing key has been pressed, then mark the end of a block; go to preferences menu otherwise */ return (buttons.routingkey>0) ? BRL_CMD_BLK(COPY_RECT)+buttons.routingkey-1 : BRL_CMD_PREFMENU; } else if (buttons.bigbuttons==(KEY_ATTRIBUTES | KEY_MENU)) return BRL_CMD_PASTE; else if (buttons.bigbuttons==(KEY_CURSOR | KEY_LEFT)) return BRL_CMD_CHRLT; else if (buttons.bigbuttons==(KEY_HOME | KEY_RIGHT)) return BRL_CMD_CHRRT; else if (buttons.bigbuttons==(KEY_UP | KEY_LEFT)) return BRL_CMD_TOP_LEFT; else if (buttons.bigbuttons==(KEY_RIGHT | KEY_DOWN)) return BRL_CMD_BOT_LEFT; else if (buttons.bigbuttons==(KEY_ATTRIBUTES | KEY_DOWN)) return BRL_CMD_HELP; else if (buttons.bigbuttons==(KEY_MENU | KEY_CURSOR)) return BRL_CMD_INFO; else if (buttons.bigbuttons==0) { /* A cursor routing key has been pressed */ if (buttons.routingkey>0) { const TimeValue duration = { .seconds = 0, .nanoseconds = 5 * NSECS_PER_USEC }; accurateDelay(&duration); return BRL_CMD_BLK(ROUTE)+buttons.routingkey-1; } else return EOF; } else return EOF;
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { static short status = 0; /* cursor routing keys mode */ KeyStroke keystroke; keystroke = getbrlkey (); if (keystroke.block == EOF) return EOF; if (keystroke.block != 'R') { /* translate only 'T' and 'S' events * I kicked argtrans[] (never ever needed) --> simply return 0x00 */ if (keystroke.block == 'T') keystroke.key = cmd_T_trans[keystroke.key]; else keystroke.key = cmd_S_trans[keystroke.key]; status = 0; if ((keystroke.key == BRL_CMD_BLK(COPY_LINE)) || (keystroke.key == BRL_CMD_BLK(COPY_RECT))) keystroke.key += brlcols - 1; return keystroke.key; } else { /* directly process 'R' events */ /* cursor routing key 1 or 2 pressed: begin / end block to copy'n'paste */ /* (counting starts with 0 !) */ if (keystroke.key == 1 || keystroke.key == 2) { status = keystroke.key; return EOF; } /* cursor routing keys 3, 4 and 5: invidiually defined functions */ /* (counting starts with 0 !) */ if (keystroke.key >= 3 && keystroke.key <= 5) { return cmd_R_trans[keystroke.key]; } switch (status) { case 0: /* ordinary cursor routing */ return keystroke.key + BRL_CMD_BLK(ROUTE) - MB_CR_EXTRAKEYS; case 1: /* begin block */ status = 0; return keystroke.key + BRL_CMD_BLK(CLIP_NEW) - MB_CR_EXTRAKEYS; case 2: /* end block */ status = 0; return keystroke.key + BRL_CMD_BLK(COPY_RECT) - MB_CR_EXTRAKEYS; } status = 0; } /* should never reach this, just to keep compiler happy ;-) */ return EOF; }
static int handleMessageCommands (int command, void *data) { MessageData *mgd = data; switch (command & BRL_MSK_CMD) { default: { int arg = command & BRL_MSK_ARG; switch (command & BRL_MSK_BLK) { case BRL_CMD_BLK(TOUCH_AT): mgd->touch = arg != BRL_MSK_ARG; mgd->timeout = 1000; break; default: mgd->timeout = -1; break; } break; } } if (!mgd->touch) mgd->endWait = 1; return 1; }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { InputPacket packet; int length; if (context == KTB_CTX_WAITING) return BRL_CMD_NOOP; if (writeFunction) return EOF; while (*initialCommand != EOF) enqueueCommand(*initialCommand++); while ((length = readPacket(brl, &packet))) { if ((packet.data.type >= IPT_MINIMUM_LINE) && (packet.data.type <= IPT_MAXIMUM_LINE)) { enqueueCommand(BRL_CMD_BLK(GOTOLINE) | BRL_FLG_MOTION_TOLEFT | (packet.data.type - IPT_MINIMUM_LINE)); writeFunction = writeLine; return EOF; } switch (packet.data.type) { case IPT_SEARCH_ATTRIBUTE: case IPT_CURRENT_LINE: enqueueCommand(BRL_CMD_HOME); enqueueCommand(BRL_CMD_LNBEG); writeFunction = writeLine; return EOF; case IPT_CURRENT_LOCATION: writeFunction = writeLocation; return EOF; default: logUnexpectedPacket(&packet, length); break; } } return (errno == EAGAIN)? EOF: BRL_CMD_RESTARTBRL; }
static int handlePreferencesCommands (int command, void *data) { switch (command & BRL_MSK_CMD) { { static const char modeString_preferences[] = "prf"; static Preferences savedPreferences; case BRL_CMD_PREFMENU: { int ok = 0; if (isSpecialScreen(SCR_MENU)) { if (prefs.saveOnExit) { if (savePreferences()) { alert(ALERT_COMMAND_DONE); } } deactivateSpecialScreen(SCR_MENU); ok = 1; } else if (activateSpecialScreen(SCR_MENU)) { updateSessionAttributes(); savedPreferences = prefs; ok = 1; } if (ok) { infoMode = 0; } else { alert(ALERT_COMMAND_REJECTED); } break; } case BRL_CMD_PREFSAVE: if (isSpecialScreen(SCR_MENU)) { if (savePreferences()) alert(ALERT_COMMAND_DONE); deactivateSpecialScreen(SCR_MENU); } else if (savePreferences()) { alert(ALERT_COMMAND_DONE); } else { alert(ALERT_COMMAND_REJECTED); } break; case BRL_CMD_PREFLOAD: if (isSpecialScreen(SCR_MENU)) { setPreferences(&savedPreferences); message(modeString_preferences, gettext("changes discarded"), 0); } else if (loadPreferences()) { alert(ALERT_COMMAND_DONE); } else { alert(ALERT_COMMAND_REJECTED); } break; } default: { int arg = command & BRL_MSK_ARG; switch (command & BRL_MSK_BLK) { { MenuItem *item; case BRL_CMD_BLK(SET_TEXT_TABLE): item = getPreferencesMenuItem_textTable(); goto doSetMenuItem; case BRL_CMD_BLK(SET_ATTRIBUTES_TABLE): item = getPreferencesMenuItem_attributesTable(); goto doSetMenuItem; case BRL_CMD_BLK(SET_CONTRACTION_TABLE): item = getPreferencesMenuItem_contractionTable(); goto doSetMenuItem; case BRL_CMD_BLK(SET_KEYBOARD_TABLE): item = getPreferencesMenuItem_keyboardTable(); goto doSetMenuItem; case BRL_CMD_BLK(SET_LANGUAGE_PROFILE): item = getPreferencesMenuItem_languageProfile(); goto doSetMenuItem; doSetMenuItem: if (item) { unsigned int count = brl.textColumns; if (count <= arg) count = arg + 1; changeMenuItem(item); if (changeMenuSettingScaled(getMenuItemMenu(item), arg, count)) { break; } } alert(ALERT_COMMAND_REJECTED); break; } default: return 0; } break; } } return 1; }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { while (1) { unsigned char packet[3]; int size = readPacket(brl, packet, sizeof(packet)); if (size == 0) break; if (size < 0) return BRL_CMD_RESTARTBRL; switch (packet[1]) { default: break; case 1: return BRL_CMD_BLK(PASSDOTS) | translateInputCell(packet[2]); case 2: { unsigned char column = packet[2]; if (column && (column <= brl->textColumns)) return BRL_CMD_BLK(ROUTE) + (column - 1); break; } case 3: switch (packet[2]) { default: break; // left rear: two columns, one row case 0X02: // ESC return BRL_CMD_LEARN; case 0X01: // M return BRL_CMD_PREFMENU; // left middle: cross case 0X06: // up return BRL_CMD_LNUP; case 0X03: // left return BRL_CMD_FWINLT; case 0X05: // right return BRL_CMD_FWINRT; case 0X04: // down return BRL_CMD_LNDN; // left front: two columns, three rows case 0X09: // ins return BRL_CMD_RETURN; case 0X0A: // E return BRL_CMD_TOP; case 0X0B: // supp return BRL_CMD_CSRTRK; case 0X0C: // L return BRL_CMD_BOT; case 0X07: // extra 1 (40s only) return BRL_CMD_CHRLT; case 0X08: // extra 2 (40s only) return BRL_CMD_CHRRT; case 0x0E: // left thumb return BRL_CMD_KEY(BACKSPACE); case 0x0F: // right thumb return BRL_CMD_BLK(PASSDOTS); case 0x3F: // both thumbs return BRL_CMD_KEY(ENTER); case 0X29: // key under dot 7 return BRL_CMD_KEY(ESCAPE); case 0X2A: // key under dot 8 return BRL_CMD_KEY(TAB); // right rear: one column, one row case 0X19: // extra 3 (40s only) return BRL_CMD_INFO; // right middle: one column, two rows case 0X1B: // extra 4 (40s only) return BRL_CMD_PRDIFLN; case 0X1A: // extra 5 (40s only) return BRL_CMD_NXDIFLN; // right front: one column, four rows case 0X2B: // slash (40s only) return BRL_CMD_FREEZE; case 0X2C: // asterisk (40s only) return BRL_CMD_DISPMD; case 0X2D: // minus (40s only) return BRL_CMD_ATTRVIS; case 0X2E: // plus (40s only) return BRL_CMD_CSRVIS; // first (top) row of numeric pad case 0X37: // seven (40s only) return BRL_CMD_KEY(HOME); case 0X38: // eight (40s only) return BRL_CMD_KEY(CURSOR_UP); case 0X39: // nine (40s only) return BRL_CMD_KEY(PAGE_UP); // second row of numeric pad case 0X34: // four (40s only) return BRL_CMD_KEY(CURSOR_LEFT); case 0X35: // five (40s only) return BRL_CMD_CSRJMP_VERT; case 0X36: // six (40s only) return BRL_CMD_KEY(CURSOR_RIGHT); // third row of numeric pad case 0X31: // one (40s only) return BRL_CMD_KEY(END); case 0X32: // two (40s only) return BRL_CMD_KEY(CURSOR_DOWN); case 0X33: // three (40s only) return BRL_CMD_KEY(PAGE_DOWN); // fourth (bottom) row of numeric pad case 0X28: // verr num (40s only) return BRL_CMD_SIXDOTS; case 0X30: // zero (40s only) return BRL_CMD_KEY(INSERT); case 0X2F: // supp (40s only) return BRL_CMD_KEY(DELETE); } break; /* When data is written to the display it acknowledges with: * 0X00 0X04 0Xxx * where xx is the number of bytes written. */ case 4: continue; } logUnexpectedPacket(packet, size); } return EOF; }
/* Converts a key code to a brltty command according to the context */ int brl_keyToCommand(BrailleDisplay *brl, KeyTableCommandContext context, int code) { static int ctrlpressed = 0; static int altpressed = 0; static int cut = 0; static int descchar = 0; unsigned char ch; int type; ch = code & 0xff; type = code & (~ 0xff); if (code==0) return 0; if (code==EOF) return EOF; if (type==BRL_VSMSK_CHAR) { int command = ch | BRL_CMD_BLK(PASSCHAR) | altpressed | ctrlpressed; altpressed = ctrlpressed = 0; return command; } if (type==BRL_VSMSK_ROUTING) { ctrlpressed = altpressed = 0; switch (cut) { case 0: if (descchar) { descchar = 0; return ((int) ch) | BRL_CMD_BLK(DESCCHAR); } else return ((int) ch) | BRL_CMD_BLK(ROUTE); case 1: cut++; return ((int) ch) | BRL_CMD_BLK(CLIP_NEW); case 2: cut = 0; return ((int) ch) | BRL_CMD_BLK(COPY_LINE); } return EOF; /* Should not be reached */ } else if (type==BRL_VSMSK_FUNCTIONKEY) { ctrlpressed = altpressed = 0; switch (code) { case BRL_VSKEY_A1: return BRL_CMD_BLK(SWITCHVT); case BRL_VSKEY_A2: return BRL_CMD_BLK(SWITCHVT)+1; case BRL_VSKEY_A3: return BRL_CMD_BLK(SWITCHVT)+2; case BRL_VSKEY_A6: return BRL_CMD_BLK(SWITCHVT)+3; case BRL_VSKEY_A7: return BRL_CMD_BLK(SWITCHVT)+4; case BRL_VSKEY_A8: return BRL_CMD_BLK(SWITCHVT)+5; case BRL_VSKEY_B5: cut = 1; return EOF; case BRL_VSKEY_B6: return BRL_CMD_TOP_LEFT; case BRL_VSKEY_D6: return BRL_CMD_BOT_LEFT; case BRL_VSKEY_A4: return BRL_CMD_FWINLTSKIP; case BRL_VSKEY_B8: return BRL_CMD_FWINLTSKIP; case BRL_VSKEY_A5: return BRL_CMD_FWINRTSKIP; case BRL_VSKEY_D8: return BRL_CMD_FWINRTSKIP; case BRL_VSKEY_B7: return BRL_CMD_LNUP; case BRL_VSKEY_D7: return BRL_CMD_LNDN; case BRL_VSKEY_C8: return BRL_CMD_FWINRT; case BRL_VSKEY_C6: return BRL_CMD_FWINLT; case BRL_VSKEY_C7: return BRL_CMD_HOME; case BRL_VSKEY_B2: return BRL_CMD_KEY(CURSOR_UP); case BRL_VSKEY_D2: return BRL_CMD_KEY(CURSOR_DOWN); case BRL_VSKEY_C3: return BRL_CMD_KEY(CURSOR_RIGHT); case BRL_VSKEY_C1: return BRL_CMD_KEY(CURSOR_LEFT); case BRL_VSKEY_B3: return BRL_CMD_CSRVIS; case BRL_VSKEY_D1: return BRL_CMD_KEY(DELETE); case BRL_VSKEY_D3: return BRL_CMD_KEY(INSERT); case BRL_VSKEY_C5: return BRL_CMD_PASTE; case BRL_VSKEY_D5: descchar = 1; return EOF; default: return EOF; } } else if (type==BRL_VSMSK_OTHER) { /* ctrlpressed = 0; */ if ((ch>=0xe1) && (ch<=0xea)) { int flags = altpressed; ch-=0xe1; altpressed = 0; return flags | BRL_CMD_BLK(PASSKEY) | ( BRL_KEY_FUNCTION + ch); } /* altpressed = 0; */ switch (code) { case BRL_VSKEY_PLOC_LT: return BRL_CMD_SIXDOTS; case BRL_VSKEY_BACKSPACE: return BRL_CMD_KEY(BACKSPACE); case BRL_VSKEY_TAB: return BRL_CMD_KEY(TAB); case BRL_VSKEY_RETURN: return BRL_CMD_KEY(ENTER); case BRL_VSKEY_PLOC_PLOC_A: return BRL_CMD_HELP; case BRL_VSKEY_PLOC_PLOC_B: return BRL_CMD_TUNES; case BRL_VSKEY_PLOC_PLOC_C: return BRL_CMD_PREFMENU; case BRL_VSKEY_PLOC_PLOC_D: return BRL_CMD_KEY(PAGE_DOWN); case BRL_VSKEY_PLOC_PLOC_E: return BRL_CMD_KEY(END); case BRL_VSKEY_PLOC_PLOC_F: return BRL_CMD_FREEZE; case BRL_VSKEY_PLOC_PLOC_H: return BRL_CMD_KEY(HOME); case BRL_VSKEY_PLOC_PLOC_I: return BRL_CMD_INFO; case BRL_VSKEY_PLOC_PLOC_L: return BRL_CMD_LEARN; case BRL_VSKEY_PLOC_PLOC_R: return BRL_CMD_PREFLOAD; case BRL_VSKEY_PLOC_PLOC_S: return BRL_CMD_PREFSAVE; case BRL_VSKEY_PLOC_PLOC_T: return BRL_CMD_CSRTRK; case BRL_VSKEY_PLOC_PLOC_U: return BRL_CMD_KEY(PAGE_UP); case BRL_VSKEY_CONTROL: ctrlpressed = BRL_FLG_INPUT_CONTROL; return BRL_CMD_NOOP; case BRL_VSKEY_ALT: altpressed = BRL_FLG_INPUT_META; return BRL_CMD_NOOP; case BRL_VSKEY_ESCAPE: return BRL_CMD_KEY(ESCAPE); default: return EOF; } } return EOF; }
static int brl_readCommand (BrailleDisplay *brl, KeyTableCommandContext context) { int key = readKey(); if (context != currentContext) { logMessage(LOG_DEBUG, "Context switch: %d -> %d", currentContext, context); switch (currentContext = context) { case KTB_CTX_DEFAULT: deviceStatus = DEV_ONLINE; break; default: break; } } if (key != EOF) { switch (key) { case KEY_FUNCTION_ENTER: return BRL_CMD_KEY(ENTER); case KEY_FUNCTION_TAB: return BRL_CMD_KEY(TAB); case KEY_FUNCTION_CURSOR_UP: return BRL_CMD_KEY(CURSOR_UP); case KEY_FUNCTION_CURSOR_DOWN: return BRL_CMD_KEY(CURSOR_DOWN); case KEY_FUNCTION_CURSOR_LEFT: return BRL_CMD_KEY(CURSOR_LEFT); case KEY_FUNCTION_CURSOR_RIGHT: return BRL_CMD_KEY(CURSOR_RIGHT); case KEY_FUNCTION_CURSOR_UP_JUMP: return BRL_CMD_KEY(HOME); case KEY_FUNCTION_CURSOR_DOWN_JUMP: return BRL_CMD_KEY(END); case KEY_FUNCTION_CURSOR_LEFT_JUMP: return BRL_CMD_KEY(PAGE_UP); case KEY_FUNCTION_CURSOR_RIGHT_JUMP: return BRL_CMD_KEY(PAGE_DOWN); case KEY_FUNCTION_F1: return BRL_CMD_KFN(1); case KEY_FUNCTION_F2: return BRL_CMD_KFN(2); case KEY_FUNCTION_F3: return BRL_CMD_KFN(3); case KEY_FUNCTION_F4: return BRL_CMD_KFN(4); case KEY_FUNCTION_F5: return BRL_CMD_KFN(5); case KEY_FUNCTION_F6: return BRL_CMD_KFN(6); case KEY_FUNCTION_F7: return BRL_CMD_KFN(7); case KEY_FUNCTION_F9: return BRL_CMD_KFN(9); case KEY_FUNCTION_F10: return BRL_CMD_KFN(10); case KEY_COMMAND: { int command; while ((command = readKey()) == EOF) asyncWait(1); logMessage(LOG_DEBUG, "Received command: (0x%2.2X) 0x%4.4X", KEY_COMMAND, command); switch (command) { case KEY_COMMAND: /* pressing the escape command twice will pass it through */ return BRL_CMD_BLK(PASSDOTS) + translateInputCell(KEY_COMMAND); case KEY_COMMAND_SWITCHVT_PREV: return BRL_CMD_SWITCHVT_PREV; case KEY_COMMAND_SWITCHVT_NEXT: return BRL_CMD_SWITCHVT_NEXT; case KEY_COMMAND_SWITCHVT_1: return BRL_CMD_BLK(SWITCHVT) + 0; case KEY_COMMAND_SWITCHVT_2: return BRL_CMD_BLK(SWITCHVT) + 1; case KEY_COMMAND_SWITCHVT_3: return BRL_CMD_BLK(SWITCHVT) + 2; case KEY_COMMAND_SWITCHVT_4: return BRL_CMD_BLK(SWITCHVT) + 3; case KEY_COMMAND_SWITCHVT_5: return BRL_CMD_BLK(SWITCHVT) + 4; case KEY_COMMAND_SWITCHVT_6: return BRL_CMD_BLK(SWITCHVT) + 5; case KEY_COMMAND_SWITCHVT_7: return BRL_CMD_BLK(SWITCHVT) + 6; case KEY_COMMAND_SWITCHVT_8: return BRL_CMD_BLK(SWITCHVT) + 7; case KEY_COMMAND_SWITCHVT_9: return BRL_CMD_BLK(SWITCHVT) + 8; case KEY_COMMAND_SWITCHVT_10: return BRL_CMD_BLK(SWITCHVT) + 9; case KEY_COMMAND_PAGE_UP: return BRL_CMD_KEY(PAGE_UP); case KEY_COMMAND_PAGE_DOWN: return BRL_CMD_KEY(PAGE_DOWN); case KEY_COMMAND_PREFMENU: currentLine = 0; cursorRow = 0; cursorColumn = 31; sendCursorRow(); return BRL_CMD_PREFMENU; case KEY_COMMAND_PREFSAVE: return BRL_CMD_PREFSAVE; case KEY_COMMAND_PREFLOAD: return BRL_CMD_PREFLOAD; case KEY_COMMAND_FREEZE_ON: return BRL_CMD_FREEZE | BRL_FLG_TOGGLE_ON; case KEY_COMMAND_FREEZE_OFF: return BRL_CMD_FREEZE | BRL_FLG_TOGGLE_OFF; case KEY_COMMAND_RESTARTBRL: return BRL_CMD_RESTARTBRL; case KEY_COMMAND_DOWNLOAD: downloadFile(); break; default: logMessage(LOG_WARNING, "Unknown command: (0X%2.2X) 0X%4.4X", KEY_COMMAND, command); break; } break; } default: switch (key & KEY_MASK) { case KEY_UPDATE: handleUpdate(key >> KEY_SHIFT); break; case KEY_FUNCTION: logMessage(LOG_WARNING, "Unknown function: (0X%2.2X) 0X%4.4X", KEY_COMMAND, key>>KEY_SHIFT); break; default: { unsigned char dots = translateInputCell(key); logMessage(LOG_DEBUG, "Received character: 0X%2.2X dec=%d dots=%2.2X", key, key, dots); return BRL_CMD_BLK(PASSDOTS) + dots; } } break; } } return EOF; }