diff options
Diffstat (limited to '')
-rw-r--r-- | boxes.c | 67 |
1 files changed, 32 insertions, 35 deletions
@@ -49,7 +49,6 @@ GLOBALS( | |||
49 | #define FLAG_h 8 | 49 | #define FLAG_h 8 |
50 | #define FLAG_w 16 | 50 | #define FLAG_w 16 |
51 | 51 | ||
52 | #define MEM_SIZE 128 | ||
53 | 52 | ||
54 | /* This is trying to be a generic text editing, text viewing, and terminal | 53 | /* This is trying to be a generic text editing, text viewing, and terminal |
55 | * handling system. The current code is a work in progress, and the design | 54 | * handling system. The current code is a work in progress, and the design |
@@ -423,6 +422,15 @@ struct key keys[] = | |||
423 | {"\x1B\x39", "F9"}, | 422 | {"\x1B\x39", "F9"}, |
424 | {"\x1B\x30", "F10"}, | 423 | {"\x1B\x30", "F10"}, |
425 | 424 | ||
425 | /* TODO - Rob says - | ||
426 | ...you don't need a NULL terminator for | ||
427 | an array, you can do sizeof(table)/sizeof(*table). Divide the size of | ||
428 | the table (in bytes) by the size of a member of the table (in bytes) to | ||
429 | get the number of entries. | ||
430 | |||
431 | I should try that trick. | ||
432 | */ | ||
433 | |||
426 | {NULL, NULL} | 434 | {NULL, NULL} |
427 | }; | 435 | }; |
428 | 436 | ||
@@ -464,8 +472,7 @@ struct function | |||
464 | 472 | ||
465 | struct keyCommand | 473 | struct keyCommand |
466 | { | 474 | { |
467 | char *key; // Key name. | 475 | char *key, *command; |
468 | char *command; | ||
469 | }; | 476 | }; |
470 | 477 | ||
471 | struct item | 478 | struct item |
@@ -483,8 +490,7 @@ struct item | |||
483 | 490 | ||
484 | struct borderWidget | 491 | struct borderWidget |
485 | { | 492 | { |
486 | char *text; | 493 | char *text, *command; |
487 | char *command; | ||
488 | }; | 494 | }; |
489 | 495 | ||
490 | // TODO - No idea if we will actually need this. | 496 | // TODO - No idea if we will actually need this. |
@@ -549,14 +555,9 @@ struct context // Defines a context for content. Text viewer, editor, file br | |||
549 | // Status lines can have them to. | 555 | // Status lines can have them to. |
550 | struct border | 556 | struct border |
551 | { | 557 | { |
552 | struct borderWidget *topLeft; | 558 | struct borderWidget *topLeft, *topMiddle, *topRight; |
553 | struct borderWidget *topMiddle; | 559 | struct borderWidget *bottomLeft, *bottomMiddle, *bottomRight; |
554 | struct borderWidget *topRight; | 560 | struct borderWidget *left, *right; |
555 | struct borderWidget *bottomLeft; | ||
556 | struct borderWidget *bottomMiddle; | ||
557 | struct borderWidget *bottomRight; | ||
558 | struct borderWidget *left; | ||
559 | struct borderWidget *right; | ||
560 | }; | 561 | }; |
561 | 562 | ||
562 | struct line | 563 | struct line |
@@ -658,6 +659,8 @@ void doCommand(struct function *functions, char *command, view *view, event *eve | |||
658 | } | 659 | } |
659 | } | 660 | } |
660 | 661 | ||
662 | #define MEM_SIZE 128 // Chunk size for line memory allocation. | ||
663 | |||
661 | // Inserts the line after the given line, or at the end of content if no line. | 664 | // Inserts the line after the given line, or at the end of content if no line. |
662 | struct line *addLine(struct content *content, struct line *line, char *text, uint32_t length) | 665 | struct line *addLine(struct content *content, struct line *line, char *text, uint32_t length) |
663 | { | 666 | { |
@@ -1738,9 +1741,6 @@ void nop(box *box, event *event) | |||
1738 | } | 1741 | } |
1739 | 1742 | ||
1740 | 1743 | ||
1741 | |||
1742 | #define BUFFER_LEN 16 | ||
1743 | |||
1744 | // Basically this is the main loop. | 1744 | // Basically this is the main loop. |
1745 | 1745 | ||
1746 | // X and Y are screen coords. | 1746 | // X and Y are screen coords. |
@@ -1751,10 +1751,10 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H) | |||
1751 | { | 1751 | { |
1752 | struct termios termio, oldtermio; | 1752 | struct termios termio, oldtermio; |
1753 | struct pollfd pollfds[1]; | 1753 | struct pollfd pollfds[1]; |
1754 | char buffer[BUFFER_LEN + 1]; | 1754 | char buffer[20]; |
1755 | char command[BUFFER_LEN + 1]; | 1755 | char command[20]; |
1756 | int pollcount = 1; | 1756 | int pollcount = 1; |
1757 | int i = 0; | 1757 | int index = 0; |
1758 | // TODO - multiline editLine is an advanced feature. Editing boxes just moves the editLine up and down. | 1758 | // TODO - multiline editLine is an advanced feature. Editing boxes just moves the editLine up and down. |
1759 | // uint16_t h = 1; | 1759 | // uint16_t h = 1; |
1760 | // TODO - should check if it's at the top of the box, then grow it down instead of up if so. | 1760 | // TODO - should check if it's at the top of the box, then grow it down instead of up if so. |
@@ -1800,10 +1800,8 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H) | |||
1800 | 1800 | ||
1801 | // Coz things might change out from under us, find the current view. | 1801 | // Coz things might change out from under us, find the current view. |
1802 | // TODO - see if I can get this lot out of here. | 1802 | // TODO - see if I can get this lot out of here. |
1803 | if (commandMode) | 1803 | if (commandMode) view = commandLine; |
1804 | view = commandLine; | 1804 | else view = currentBox->view; |
1805 | else | ||
1806 | view = currentBox->view; | ||
1807 | y = view->Y + (view->cY - view->offsetY); | 1805 | y = view->Y + (view->cY - view->offsetY); |
1808 | len = strlen(view->prompt); | 1806 | len = strlen(view->prompt); |
1809 | drawLine(y, view->X, view->X + view->W, "\0", " ", view->prompt, '\0', 0); | 1807 | drawLine(y, view->X, view->X + view->W, "\0", " ", view->prompt, '\0', 0); |
@@ -1821,11 +1819,11 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H) | |||
1821 | if (0 > p) perror_exit("poll"); | 1819 | if (0 > p) perror_exit("poll"); |
1822 | if (0 == p) // A timeout, trigger a time event. | 1820 | if (0 == p) // A timeout, trigger a time event. |
1823 | { | 1821 | { |
1824 | if ((1 == i) && ('\x1B' == buffer[0])) | 1822 | if ((1 == index) && ('\x1B' == buffer[0])) |
1825 | { | 1823 | { |
1826 | // After a short delay to check, this is a real Escape key, not part of an escape sequence, so deal with it. | 1824 | // After a short delay to check, this is a real Escape key, not part of an escape sequence, so deal with it. |
1827 | strcpy(command, "^["); | 1825 | strcpy(command, "^["); |
1828 | i = 0; | 1826 | index = 0; |
1829 | buffer[0] = 0; | 1827 | buffer[0] = 0; |
1830 | } | 1828 | } |
1831 | // TODO - Send a timer event somewhere. This wont be a precise timed event, but don't think we need one. | 1829 | // TODO - Send a timer event somewhere. This wont be a precise timed event, but don't think we need one. |
@@ -1838,7 +1836,7 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H) | |||
1838 | { | 1836 | { |
1839 | // I am assuming that we get the input atomically, each multibyte key fits neatly into one read. | 1837 | // I am assuming that we get the input atomically, each multibyte key fits neatly into one read. |
1840 | // If that's not true (which is entirely likely), then we have to get complicated with circular buffers and stuff, or just one byte at a time. | 1838 | // If that's not true (which is entirely likely), then we have to get complicated with circular buffers and stuff, or just one byte at a time. |
1841 | ret = read(pollfds[p].fd, &buffer[i], BUFFER_LEN - i); | 1839 | ret = read(pollfds[p].fd, &buffer[index], sizeof(buffer) - (index + 1)); |
1842 | if (ret < 0) // An error happened. | 1840 | if (ret < 0) // An error happened. |
1843 | { | 1841 | { |
1844 | // For now, just ignore errors. | 1842 | // For now, just ignore errors. |
@@ -1852,18 +1850,17 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H) | |||
1852 | } | 1850 | } |
1853 | else | 1851 | else |
1854 | { | 1852 | { |
1855 | i += ret; | 1853 | index += ret; |
1856 | if (BUFFER_LEN <= i) // Ran out of buffer. | 1854 | if (sizeof(buffer) < (index + 1)) // Ran out of buffer. |
1857 | { | 1855 | { |
1858 | fprintf(stderr, "Full buffer - %s -> %s\n", buffer, command); | 1856 | fprintf(stderr, "Full buffer - %s -> %s\n", buffer, command); |
1859 | for (j = 0; buffer[j + 1]; j++) | 1857 | for (j = 0; buffer[j + 1]; j++) |
1860 | fprintf(stderr, "(%x) %c, ", (int) buffer[j], buffer[j]); | 1858 | fprintf(stderr, "(%x) %c, ", (int) buffer[j], buffer[j]); |
1861 | fflush(stderr); | 1859 | fflush(stderr); |
1862 | i = 0; | 1860 | index = 0; |
1863 | buffer[0] = 0; | 1861 | buffer[0] = 0; |
1864 | } | 1862 | } |
1865 | else | 1863 | else buffer[index] = 0; |
1866 | buffer[i] = 0; | ||
1867 | } | 1864 | } |
1868 | } | 1865 | } |
1869 | } | 1866 | } |
@@ -1877,14 +1874,14 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H) | |||
1877 | if (strcmp(keys[j].code, buffer) == 0) | 1874 | if (strcmp(keys[j].code, buffer) == 0) |
1878 | { | 1875 | { |
1879 | strcat(command, keys[j].name); | 1876 | strcat(command, keys[j].name); |
1880 | i = 0; | 1877 | index = 0; |
1881 | buffer[0] = 0; | 1878 | buffer[0] = 0; |
1882 | break; | 1879 | break; |
1883 | } | 1880 | } |
1884 | } | 1881 | } |
1885 | 1882 | ||
1886 | // See if it's an ordinary key, | 1883 | // See if it's an ordinary key, |
1887 | if ((1 == i) && isprint(buffer[0])) | 1884 | if ((1 == index) && isprint(buffer[0])) |
1888 | { | 1885 | { |
1889 | // If there's an outstanding command, add this to the end of it. | 1886 | // If there's an outstanding command, add this to the end of it. |
1890 | if (command[0]) | 1887 | if (command[0]) |
@@ -1898,14 +1895,14 @@ void editLine(view *view, int16_t X, int16_t Y, int16_t W, int16_t H) | |||
1898 | view->oW = formatLine(view, view->line->line, &(view->output)); | 1895 | view->oW = formatLine(view, view->line->line, &(view->output)); |
1899 | moveCursorRelative(view, strlen(buffer), 0, 0, 0); | 1896 | moveCursorRelative(view, strlen(buffer), 0, 0, 0); |
1900 | } | 1897 | } |
1901 | i = 0; | 1898 | index = 0; |
1902 | buffer[0] = 0; | 1899 | buffer[0] = 0; |
1903 | } | 1900 | } |
1904 | 1901 | ||
1905 | // TODO - If the view->context has an event handler, use it, otherwise look up the specific event handler in the context modes ourselves. | 1902 | // TODO - If the view->context has an event handler, use it, otherwise look up the specific event handler in the context modes ourselves. |
1906 | if (command[0]) // Search for a bound key. | 1903 | if (command[0]) // Search for a bound key. |
1907 | { | 1904 | { |
1908 | if (BUFFER_LEN <= strlen(command)) | 1905 | if (sizeof(command) < (strlen(command) + 1)) |
1909 | { | 1906 | { |
1910 | fprintf(stderr, "Full command buffer - %s \n", command); | 1907 | fprintf(stderr, "Full command buffer - %s \n", command); |
1911 | fflush(stderr); | 1908 | fflush(stderr); |