diff options
author | David Walter Seikel | 2014-02-01 15:00:00 +1000 |
---|---|---|
committer | David Walter Seikel | 2014-02-01 15:00:00 +1000 |
commit | f26667d117af5a119471eb531f3ded65b9c1fbc8 (patch) | |
tree | 992b67a657a159371b88ba48537126370312efa3 /boxes.c | |
parent | Smarten up the CSI parser a little. (diff) | |
download | boxes-f26667d117af5a119471eb531f3ded65b9c1fbc8.zip boxes-f26667d117af5a119471eb531f3ded65b9c1fbc8.tar.gz boxes-f26667d117af5a119471eb531f3ded65b9c1fbc8.tar.bz2 boxes-f26667d117af5a119471eb531f3ded65b9c1fbc8.tar.xz |
Better method to tell if it's ordinary characters, and deal with partial reads better.
Diffstat (limited to '')
-rw-r--r-- | boxes.c | 27 |
1 files changed, 18 insertions, 9 deletions
@@ -1662,12 +1662,12 @@ static void handleCSI(long extra, char *command, int *params, int count) | |||
1662 | } | 1662 | } |
1663 | } | 1663 | } |
1664 | 1664 | ||
1665 | 1665 | // Callback for incoming key sequences from the user. | |
1666 | static int handleKeySequence(long extra, char *sequence) | 1666 | static int handleKeySequence(long extra, char *sequence, int isTranslated) |
1667 | { | 1667 | { |
1668 | struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away. | 1668 | struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away. |
1669 | struct keyCommand *commands = currentBox->view->content->context->modes[currentBox->view->mode].keys; | 1669 | struct keyCommand *commands = currentBox->view->content->context->modes[currentBox->view->mode].keys; |
1670 | int j; | 1670 | int j, l = strlen(sequence); |
1671 | 1671 | ||
1672 | // Coz things might change out from under us, find the current view. | 1672 | // Coz things might change out from under us, find the current view. |
1673 | if (commandMode) view = commandLine; | 1673 | if (commandMode) view = commandLine; |
@@ -1676,14 +1676,23 @@ static int handleKeySequence(long extra, char *sequence) | |||
1676 | // Search for a key sequence bound to a command. | 1676 | // Search for a key sequence bound to a command. |
1677 | for (j = 0; commands[j].key; j++) | 1677 | for (j = 0; commands[j].key; j++) |
1678 | { | 1678 | { |
1679 | if (strcmp(commands[j].key, sequence) == 0) | 1679 | if (strncmp(commands[j].key, sequence, l) == 0) |
1680 | { | 1680 | { |
1681 | doCommand(view, commands[j].command); | 1681 | // If it's a partial match, keep accumulating them. |
1682 | return 1; | 1682 | if (strlen(commands[j].key) != l) |
1683 | return 0; | ||
1684 | else | ||
1685 | { | ||
1686 | doCommand(view, commands[j].command); | ||
1687 | return 1; | ||
1688 | } | ||
1683 | } | 1689 | } |
1684 | } | 1690 | } |
1685 | 1691 | ||
1686 | if ((0 == sequence[1]) && isprint(sequence[0])) // See if it's an ordinary key. | 1692 | // See if it's ordinary keys. |
1693 | // NOTE - with vi style ordinary keys can be commands, | ||
1694 | // but they would be found by the command check above first. | ||
1695 | if (!isTranslated) | ||
1687 | { | 1696 | { |
1688 | // TODO - Should check for tabs to, and insert them. | 1697 | // TODO - Should check for tabs to, and insert them. |
1689 | // Though better off having a function for that? | 1698 | // Though better off having a function for that? |
@@ -1691,10 +1700,10 @@ static int handleKeySequence(long extra, char *sequence) | |||
1691 | view->oW = formatLine(view, view->line->line, &(view->output)); | 1700 | view->oW = formatLine(view, view->line->line, &(view->output)); |
1692 | moveCursorRelative(view, strlen(sequence), 0, 0, 0); | 1701 | moveCursorRelative(view, strlen(sequence), 0, 0, 0); |
1693 | updateLine(view); | 1702 | updateLine(view); |
1694 | return 1; | ||
1695 | } | 1703 | } |
1696 | 1704 | ||
1697 | return 0; | 1705 | // Tell handle_keys to drop it, coz we dealt with it, or it's not one of ours. |
1706 | return 1; | ||
1698 | } | 1707 | } |
1699 | 1708 | ||
1700 | 1709 | ||