aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--boxes.c49
1 files changed, 34 insertions, 15 deletions
diff --git a/boxes.c b/boxes.c
index 560c9ab..5152c20 100644
--- a/boxes.c
+++ b/boxes.c
@@ -1798,6 +1798,10 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H)
1798 // TODO - We can reuse one or two of these to have less of them. 1798 // TODO - We can reuse one or two of these to have less of them.
1799 int j = 0, p, ret, y, len; 1799 int j = 0, p, ret, y, len;
1800 1800
1801 // This is using the currentBox instead of view, coz the command line keys are part of the box context now, not separate.
1802 // More importantly, the currentBox may change due to a command.
1803 struct keyCommand *ourKeys = currentBox->view->content->context->modes[currentBox->view->mode].keys;
1804
1801 // Coz things might change out from under us, find the current view. 1805 // Coz things might change out from under us, find the current view.
1802 // TODO - see if I can get this lot out of here. 1806 // TODO - see if I can get this lot out of here.
1803 if (commandMode) view = commandLine; 1807 if (commandMode) view = commandLine;
@@ -1814,6 +1818,8 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H)
1814 pollfds[0].events = POLLIN; 1818 pollfds[0].events = POLLIN;
1815 pollfds[0].fd = 0; 1819 pollfds[0].fd = 0;
1816 1820
1821// TODO - A bit unstable at the moment, something makes it go into a horrid CPU eating edit line flicker mode sometimes. And / or vi mode can crash on exit (stack smash).
1822
1817 // TODO - Should only ask for a time out after we get an Escape. 1823 // TODO - Should only ask for a time out after we get an Escape.
1818 p = poll(pollfds, pollcount, 100); // Timeout of one tenth of a second (100). 1824 p = poll(pollfds, pollcount, 100); // Timeout of one tenth of a second (100).
1819 if (0 > p) perror_exit("poll"); 1825 if (0 > p) perror_exit("poll");
@@ -1865,8 +1871,6 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H)
1865 } 1871 }
1866 } 1872 }
1867 1873
1868// TODO - think vi got screwed up now. sigh
1869
1870 // For a real timeout checked Esc, buffer is now empty, so this for loop wont find it anyway. 1874 // For a real timeout checked Esc, buffer is now empty, so this for loop wont find it anyway.
1871 // While it's true we could avoid it by checking, the user already had to wait for a time out, and this loop wont take THAT long. 1875 // While it's true we could avoid it by checking, the user already had to wait for a time out, and this loop wont take THAT long.
1872 for (j = 0; keys[j].code; j++) // Search for multibyte keys and some control keys. 1876 for (j = 0; keys[j].code; j++) // Search for multibyte keys and some control keys.
@@ -1883,17 +1887,36 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H)
1883 // See if it's an ordinary key, 1887 // See if it's an ordinary key,
1884 if ((1 == index) && isprint(buffer[0])) 1888 if ((1 == index) && isprint(buffer[0]))
1885 { 1889 {
1890 int visucks = 0;
1891
1892 // Here we want to pass it to the command finder first, and only "insert" it if it's not a command.
1893 // Less and more have the "ZZ" command, but nothing else seems to have multi ordinary character commands.
1894 // Less and more also have some ordinary character commands, mostly vi like.
1895 for (j = 0; ourKeys[j].key; j++)
1896 {
1897 // Yes, that's right, we are scanning ourKeys twice, coz vi.
1898 // TODO - We can wriggle out of this later by bumping visucks up a scope and storing a pointer to ourKeys[j].command.
1899 // In fact, visucks could be that pointer.
1900 if (strcmp(ourKeys[j].key, buffer) == 0)
1901 {
1902 strcpy(command, buffer);
1903 visucks = 1;
1904 break;
1905 }
1906 }
1886 // If there's an outstanding command, add this to the end of it. 1907 // If there's an outstanding command, add this to the end of it.
1887 if (command[0]) 1908 if (!visucks)
1888 strcat(command, buffer);
1889 else
1890 { 1909 {
1891 // TODO - Should check for tabs to, and insert them. 1910 if (command[0]) strcat(command, buffer);
1892 // Though better off having a function for that? 1911 else
1893 // TODO - see if I can get these out of here. Some sort of pushCharacter(buffer, blob) that is passed in. 1912 {
1894 mooshStrings(view->line, buffer, view->iX, 0, !TT.overWriteMode); 1913 // TODO - Should check for tabs to, and insert them.
1895 view->oW = formatLine(view, view->line->line, &(view->output)); 1914 // Though better off having a function for that?
1896 moveCursorRelative(view, strlen(buffer), 0, 0, 0); 1915 // TODO - see if I can get these out of here. Some sort of pushCharacter(buffer, blob) that is passed in.
1916 mooshStrings(view->line, buffer, view->iX, 0, !TT.overWriteMode);
1917 view->oW = formatLine(view, view->line->line, &(view->output));
1918 moveCursorRelative(view, strlen(buffer), 0, 0, 0);
1919 }
1897 } 1920 }
1898 index = 0; 1921 index = 0;
1899 buffer[0] = 0; 1922 buffer[0] = 0;
@@ -1909,10 +1932,6 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H)
1909 command[0] = 0; 1932 command[0] = 0;
1910 } 1933 }
1911 1934
1912 // This is using the currentBox instead of view, coz the command line keys are part of the box context now, not separate.
1913 // More importantly, the currentBox may change due to a command.
1914 struct keyCommand *ourKeys = currentBox->view->content->context->modes[currentBox->view->mode].keys;
1915
1916 for (j = 0; ourKeys[j].key; j++) 1935 for (j = 0; ourKeys[j].key; j++)
1917 { 1936 {
1918 if (strcmp(ourKeys[j].key, command) == 0) 1937 if (strcmp(ourKeys[j].key, command) == 0)