aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--boxes.c67
1 files changed, 32 insertions, 35 deletions
diff --git a/boxes.c b/boxes.c
index 5420ed1..02af59e 100644
--- a/boxes.c
+++ b/boxes.c
@@ -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
427an array, you can do sizeof(table)/sizeof(*table). Divide the size of
428the table (in bytes) by the size of a member of the table (in bytes) to
429get the number of entries.
430
431I should try that trick.
432*/
433
426 {NULL, NULL} 434 {NULL, NULL}
427}; 435};
428 436
@@ -464,8 +472,7 @@ struct function
464 472
465struct keyCommand 473struct keyCommand
466{ 474{
467 char *key; // Key name. 475 char *key, *command;
468 char *command;
469}; 476};
470 477
471struct item 478struct item
@@ -483,8 +490,7 @@ struct item
483 490
484struct borderWidget 491struct 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.
550struct border 556struct 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
562struct line 563struct 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.
662struct line *addLine(struct content *content, struct line *line, char *text, uint32_t length) 665struct 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);