aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid Walter Seikel2014-01-28 22:57:53 +1000
committerDavid Walter Seikel2014-01-28 22:57:53 +1000
commit34595e01e980bbd353e885b172142f0f2b8f642d (patch)
tree5f7a453feb1c0ba5ba8ffbef07d358bce9f49c7b
parentReorganise doCommand() and friends a bit. (diff)
downloadboxes-34595e01e980bbd353e885b172142f0f2b8f642d.zip
boxes-34595e01e980bbd353e885b172142f0f2b8f642d.tar.gz
boxes-34595e01e980bbd353e885b172142f0f2b8f642d.tar.bz2
boxes-34595e01e980bbd353e885b172142f0f2b8f642d.tar.xz
Split out the line updating to it's own function.
-rw-r--r--boxes.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/boxes.c b/boxes.c
index 622aef3..254f14f 100644
--- a/boxes.c
+++ b/boxes.c
@@ -1068,6 +1068,25 @@ void drawContentLine(view *view, int y, int start, int end, char *left, char *in
1068 drawLine(y, start, end, left, internal, &(temp[offset]), right, current); 1068 drawLine(y, start, end, left, internal, &(temp[offset]), right, current);
1069} 1069}
1070 1070
1071void updateLine(view *view)
1072{
1073 int y, len;
1074
1075 // Coz things might change out from under us, find the current view. Again.
1076 if (commandMode) view = commandLine;
1077 else view = currentBox->view;
1078
1079 // TODO - When doing scripts and such, might want to turn off the line update until finished.
1080 // Draw the prompt and the current line.
1081 y = view->Y + (view->cY - view->offsetY);
1082 len = strlen(view->prompt);
1083 drawLine(y, view->X, view->X + view->W, "", " ", view->prompt, "", 0);
1084 drawContentLine(view, y, view->X + len, view->X + view->W, "", " ", view->line->line, "", 1);
1085 // Move the cursor.
1086 printf("\x1B[%d;%dH", y + 1, view->X + len + (view->cX - view->offsetX) + 1);
1087 fflush(stdout);
1088}
1089
1071void doCommand(view *view, char *command) 1090void doCommand(view *view, char *command)
1072{ 1091{
1073 if (command) 1092 if (command)
@@ -1081,23 +1100,8 @@ void doCommand(view *view, char *command)
1081 { 1100 {
1082 if (functions[i].handler); 1101 if (functions[i].handler);
1083 { 1102 {
1084 int y, len;
1085
1086 functions[i].handler(view); 1103 functions[i].handler(view);
1087 1104 updateLine(view);
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 } 1105 }
1102 break; 1106 break;
1103 } 1107 }
@@ -1795,6 +1799,7 @@ static void lineChar(long extra, char *buffer)
1795 mooshStrings(view->line, buffer, view->iX, 0, !TT.overWriteMode); 1799 mooshStrings(view->line, buffer, view->iX, 0, !TT.overWriteMode);
1796 view->oW = formatLine(view, view->line->line, &(view->output)); 1800 view->oW = formatLine(view, view->line->line, &(view->output));
1797 moveCursorRelative(view, strlen(buffer), 0, 0, 0); 1801 moveCursorRelative(view, strlen(buffer), 0, 0, 0);
1802 updateLine(view);
1798} 1803}
1799 1804
1800static struct keyCommand * lineCommand(long extra, char *command) 1805static struct keyCommand * lineCommand(long extra, char *command)
@@ -1830,8 +1835,8 @@ The response from a terminal size check command includes a prefix, a suffix, wit
1830void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct keyCommand * (*lineCommand)(long extra, char *command)) 1835void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct keyCommand * (*lineCommand)(long extra, char *command))
1831{ 1836{
1832 struct pollfd pollfds[1]; 1837 struct pollfd pollfds[1];
1833 // Get the initial command set, and trigger the first cursor move. Assumes the command set has a nop that otherwise does nothing. 1838 // Get the initial command set.
1834 struct keyCommand *ourKeys = lineCommand(extra, "nop"); 1839 struct keyCommand *ourKeys = lineCommand(extra, "");
1835 char buffer[20]; 1840 char buffer[20];
1836 char command[20]; 1841 char command[20];
1837 int pollcount = 1; 1842 int pollcount = 1;
@@ -2717,6 +2722,8 @@ void boxes_main(void)
2717 2722
2718 calcBoxes(currentBox); 2723 calcBoxes(currentBox);
2719 drawBoxes(currentBox); 2724 drawBoxes(currentBox);
2725 // Do the first cursor update.
2726 updateLine(currentBox->view);
2720 2727
2721 // Run the main loop. 2728 // Run the main loop.
2722 editLine((long) currentBox->view, lineChar, lineCommand); 2729 editLine((long) currentBox->view, lineChar, lineCommand);