diff options
Diffstat (limited to 'boxes.c')
-rw-r--r-- | boxes.c | 85 |
1 files changed, 48 insertions, 37 deletions
@@ -662,23 +662,6 @@ static box *currentBox; | |||
662 | static view *commandLine; | 662 | static view *commandLine; |
663 | static int commandMode; | 663 | static int commandMode; |
664 | 664 | ||
665 | void doCommand(struct function *functions, char *command, view *view) | ||
666 | { | ||
667 | if (command) | ||
668 | { | ||
669 | int i; | ||
670 | |||
671 | for (i = 0; functions[i].name; i++) | ||
672 | { | ||
673 | if (strcmp(functions[i].name, command) == 0) | ||
674 | { | ||
675 | if (functions[i].handler); | ||
676 | functions[i].handler(view); | ||
677 | break; | ||
678 | } | ||
679 | } | ||
680 | } | ||
681 | } | ||
682 | 665 | ||
683 | #define MEM_SIZE 128 // Chunk size for line memory allocation. | 666 | #define MEM_SIZE 128 // Chunk size for line memory allocation. |
684 | 667 | ||
@@ -1085,6 +1068,43 @@ void drawContentLine(view *view, int y, int start, int end, char *left, char *in | |||
1085 | drawLine(y, start, end, left, internal, &(temp[offset]), right, current); | 1068 | drawLine(y, start, end, left, internal, &(temp[offset]), right, current); |
1086 | } | 1069 | } |
1087 | 1070 | ||
1071 | void doCommand(view *view, char *command) | ||
1072 | { | ||
1073 | if (command) | ||
1074 | { | ||
1075 | struct function *functions = view->content->context->commands; | ||
1076 | int i; | ||
1077 | |||
1078 | for (i = 0; functions[i].name; i++) | ||
1079 | { | ||
1080 | if (strcmp(functions[i].name, command) == 0) | ||
1081 | { | ||
1082 | if (functions[i].handler); | ||
1083 | { | ||
1084 | int y, len; | ||
1085 | |||
1086 | functions[i].handler(view); | ||
1087 | |||
1088 | // Coz things might change out from under us, find the current view. Again. | ||
1089 | if (commandMode) view = commandLine; | ||
1090 | else view = currentBox->view; | ||
1091 | |||
1092 | // TODO - When doing scripts and such, might want to turn off the line update until finished. | ||
1093 | // Draw the prompt and the current line. | ||
1094 | y = view->Y + (view->cY - view->offsetY); | ||
1095 | len = strlen(view->prompt); | ||
1096 | drawLine(y, view->X, view->X + view->W, "", " ", view->prompt, "", 0); | ||
1097 | drawContentLine(view, y, view->X + len, view->X + view->W, "", " ", view->line->line, "", 1); | ||
1098 | // Move the cursor. | ||
1099 | printf("\x1B[%d;%dH", y + 1, view->X + len + (view->cX - view->offsetX) + 1); | ||
1100 | fflush(stdout); | ||
1101 | } | ||
1102 | break; | ||
1103 | } | ||
1104 | } | ||
1105 | } | ||
1106 | } | ||
1107 | |||
1088 | int moveCursorAbsolute(view *view, long cX, long cY, long sX, long sY) | 1108 | int moveCursorAbsolute(view *view, long cX, long cY, long sX, long sY) |
1089 | { | 1109 | { |
1090 | struct line *newLine = view->line; | 1110 | struct line *newLine = view->line; |
@@ -1717,7 +1737,7 @@ void executeLine(view *view) | |||
1717 | // Don't bother doing much if there's nothing on this line. | 1737 | // Don't bother doing much if there's nothing on this line. |
1718 | if (result->line[0]) | 1738 | if (result->line[0]) |
1719 | { | 1739 | { |
1720 | doCommand(currentBox->view->content->context->commands, result->line, currentBox->view); | 1740 | doCommand(currentBox->view, result->line); |
1721 | // If we are not at the end of the history contents. | 1741 | // If we are not at the end of the history contents. |
1722 | if (&(view->content->lines) != result->next) | 1742 | if (&(view->content->lines) != result->next) |
1723 | { | 1743 | { |
@@ -1756,7 +1776,7 @@ void quit(view *view) | |||
1756 | TT.stillRunning = 0; | 1776 | TT.stillRunning = 0; |
1757 | } | 1777 | } |
1758 | 1778 | ||
1759 | void nop(box *box) | 1779 | void nop(view *view) |
1760 | { | 1780 | { |
1761 | // 'tis a nop, don't actually do anything. | 1781 | // 'tis a nop, don't actually do anything. |
1762 | } | 1782 | } |
@@ -1777,30 +1797,15 @@ static void lineChar(long extra, char *buffer) | |||
1777 | moveCursorRelative(view, strlen(buffer), 0, 0, 0); | 1797 | moveCursorRelative(view, strlen(buffer), 0, 0, 0); |
1778 | } | 1798 | } |
1779 | 1799 | ||
1780 | // TODO - should merge this and the real one. Note that when doing scripts and such, might want to turn off the line update until finished. | ||
1781 | static struct keyCommand * lineCommand(long extra, char *command) | 1800 | static struct keyCommand * lineCommand(long extra, char *command) |
1782 | { | 1801 | { |
1783 | struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away. | 1802 | struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away. |
1784 | int y, len; | ||
1785 | 1803 | ||
1786 | // Coz things might change out from under us, find the current view. | 1804 | // Coz things might change out from under us, find the current view. |
1787 | if (commandMode) view = commandLine; | 1805 | if (commandMode) view = commandLine; |
1788 | else view = currentBox->view; | 1806 | else view = currentBox->view; |
1789 | 1807 | ||
1790 | doCommand(view->content->context->commands, command, view); | 1808 | doCommand(view, command); |
1791 | |||
1792 | // Coz things might change out from under us, find the current view. Again | ||
1793 | if (commandMode) view = commandLine; | ||
1794 | else view = currentBox->view; | ||
1795 | |||
1796 | // Draw the prompt and the current line. | ||
1797 | y = view->Y + (view->cY - view->offsetY); | ||
1798 | len = strlen(view->prompt); | ||
1799 | drawLine(y, view->X, view->X + view->W, "", " ", view->prompt, "", 0); | ||
1800 | drawContentLine(view, y, view->X + len, view->X + view->W, "", " ", view->line->line, "", 1); | ||
1801 | // Move the cursor. | ||
1802 | printf("\x1B[%d;%dH", y + 1, view->X + len + (view->cX - view->offsetX) + 1); | ||
1803 | fflush(stdout); | ||
1804 | 1809 | ||
1805 | // This is using the currentBox instead of view, coz the command line keys are part of the box context now, not separate. | 1810 | // This is using the currentBox instead of view, coz the command line keys are part of the box context now, not separate. |
1806 | return currentBox->view->content->context->modes[currentBox->view->mode].keys; | 1811 | return currentBox->view->content->context->modes[currentBox->view->mode].keys; |
@@ -1825,8 +1830,8 @@ The response from a terminal size check command includes a prefix, a suffix, wit | |||
1825 | void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct keyCommand * (*lineCommand)(long extra, char *command)) | 1830 | void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct keyCommand * (*lineCommand)(long extra, char *command)) |
1826 | { | 1831 | { |
1827 | struct pollfd pollfds[1]; | 1832 | struct pollfd pollfds[1]; |
1828 | // Get the initial command set, and trigger the first cursor move. | 1833 | // Get the initial command set, and trigger the first cursor move. Assumes the command set has a nop that otherwise does nothing. |
1829 | struct keyCommand *ourKeys = lineCommand(extra, ""); | 1834 | struct keyCommand *ourKeys = lineCommand(extra, "nop"); |
1830 | char buffer[20]; | 1835 | char buffer[20]; |
1831 | char command[20]; | 1836 | char command[20]; |
1832 | int pollcount = 1; | 1837 | int pollcount = 1; |
@@ -1983,6 +1988,7 @@ struct function simpleEditCommands[] = | |||
1983 | {"endOfLine", "Go to end of line.", 0, {endOfLine}}, | 1988 | {"endOfLine", "Go to end of line.", 0, {endOfLine}}, |
1984 | {"executeLine", "Execute a line as a script.", 0, {executeLine}}, | 1989 | {"executeLine", "Execute a line as a script.", 0, {executeLine}}, |
1985 | {"leftChar", "Move cursor left one character.", 0, {leftChar}}, | 1990 | {"leftChar", "Move cursor left one character.", 0, {leftChar}}, |
1991 | {"nop", "Do nothing.", 0, {nop}}, | ||
1986 | {"quit", "Quit the application.", 0, {quit}}, | 1992 | {"quit", "Quit the application.", 0, {quit}}, |
1987 | {"rightChar", "Move cursor right one character.", 0, {rightChar}}, | 1993 | {"rightChar", "Move cursor right one character.", 0, {rightChar}}, |
1988 | {"save", "Save.", 0, {saveContent}}, | 1994 | {"save", "Save.", 0, {saveContent}}, |
@@ -2029,6 +2035,7 @@ struct keyCommand simpleCommandKeys[] = | |||
2029 | // readline uses these same commands, and defaults to emacs keystrokes. | 2035 | // readline uses these same commands, and defaults to emacs keystrokes. |
2030 | struct function simpleEmacsCommands[] = | 2036 | struct function simpleEmacsCommands[] = |
2031 | { | 2037 | { |
2038 | {"nop", "Do nothing.", 0, {nop}}, | ||
2032 | {"delete-backward-char", "Back space last character.", 0, {backSpaceChar}}, | 2039 | {"delete-backward-char", "Back space last character.", 0, {backSpaceChar}}, |
2033 | {"delete-window", "Delete a box.", 0, {deleteBox}}, | 2040 | {"delete-window", "Delete a box.", 0, {deleteBox}}, |
2034 | {"delete-char", "Delete current character.", 0, {deleteChar}}, | 2041 | {"delete-char", "Delete current character.", 0, {deleteChar}}, |
@@ -2135,6 +2142,7 @@ struct context simpleEmacs = | |||
2135 | // TODO - Some of these might be wrong. Just going by the inadequate joe docs for now. | 2142 | // TODO - Some of these might be wrong. Just going by the inadequate joe docs for now. |
2136 | struct function simpleJoeCommands[] = | 2143 | struct function simpleJoeCommands[] = |
2137 | { | 2144 | { |
2145 | {"nop", "Do nothing.", 0, {nop}}, | ||
2138 | {"backs", "Back space last character.", 0, {backSpaceChar}}, | 2146 | {"backs", "Back space last character.", 0, {backSpaceChar}}, |
2139 | {"abort", "Delete a box.", 0, {deleteBox}}, | 2147 | {"abort", "Delete a box.", 0, {deleteBox}}, |
2140 | {"delch", "Delete current character.", 0, {deleteChar}}, | 2148 | {"delch", "Delete current character.", 0, {deleteChar}}, |
@@ -2363,6 +2371,7 @@ struct context simpleMcedit = | |||
2363 | 2371 | ||
2364 | struct function simpleNanoCommands[] = | 2372 | struct function simpleNanoCommands[] = |
2365 | { | 2373 | { |
2374 | {"nop", "Do nothing.", 0, {nop}}, | ||
2366 | {"backSpaceChar", "Back space last character.", 0, {backSpaceChar}}, | 2375 | {"backSpaceChar", "Back space last character.", 0, {backSpaceChar}}, |
2367 | {"delete", "Delete current character.", 0, {deleteChar}}, | 2376 | {"delete", "Delete current character.", 0, {deleteChar}}, |
2368 | {"down", "Move cursor down one line.", 0, {downLine}}, | 2377 | {"down", "Move cursor down one line.", 0, {downLine}}, |
@@ -2497,6 +2506,8 @@ void viStartOfNextLine(view *view) | |||
2497 | // TODO - ex uses "shortest unique string" to match commands, should implement that, and do it for the other contexts to. | 2506 | // TODO - ex uses "shortest unique string" to match commands, should implement that, and do it for the other contexts to. |
2498 | struct function simpleViCommands[] = | 2507 | struct function simpleViCommands[] = |
2499 | { | 2508 | { |
2509 | {"nop", "Do nothing.", 0, {nop}}, | ||
2510 | |||
2500 | // These are actual ex commands. | 2511 | // These are actual ex commands. |
2501 | {"insert", "Switch to insert mode.", 0, {viInsertMode}}, | 2512 | {"insert", "Switch to insert mode.", 0, {viInsertMode}}, |
2502 | {"quit", "Quit the application.", 0, {quit}}, | 2513 | {"quit", "Quit the application.", 0, {quit}}, |