aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--boxes.c83
1 files changed, 42 insertions, 41 deletions
diff --git a/boxes.c b/boxes.c
index 8bd97e6..0c9efc4 100644
--- a/boxes.c
+++ b/boxes.c
@@ -1799,7 +1799,7 @@ static void lineChar(long extra, char *buffer)
1799 updateLine(view); 1799 updateLine(view);
1800} 1800}
1801 1801
1802static struct keyCommand * lineCommand(long extra, char *command) 1802static struct keyCommand * lineCommand(long extra, char *sequence)
1803{ 1803{
1804 struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away. 1804 struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away.
1805 1805
@@ -1807,7 +1807,7 @@ static struct keyCommand * lineCommand(long extra, char *command)
1807 if (commandMode) view = commandLine; 1807 if (commandMode) view = commandLine;
1808 else view = currentBox->view; 1808 else view = currentBox->view;
1809 1809
1810 doCommand(view, command); 1810 doCommand(view, sequence);
1811 1811
1812 // This is using the currentBox instead of view, coz the command line keys are part of the box context now, not separate. 1812 // This is using the currentBox instead of view, coz the command line keys are part of the box context now, not separate.
1813 return currentBox->view->content->context->modes[currentBox->view->mode].keys; 1813 return currentBox->view->content->context->modes[currentBox->view->mode].keys;
@@ -1862,22 +1862,22 @@ Some editors have a shortcut command concept. The smallest unique first part of
1862 A further complication is if we are not implementing some commands that might change what is "shortest unique prefix". 1862 A further complication is if we are not implementing some commands that might change what is "shortest unique prefix".
1863*/ 1863*/
1864 1864
1865void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct keyCommand * (*lineCommand)(long extra, char *command)) 1865void handle_keys(long extra, void (*lineChar)(long extra, char *buffer), struct keyCommand * (*lineCommand)(long extra, char *sequence))
1866{ 1866{
1867 fd_set selectFds; 1867 fd_set selectFds;
1868 struct timespec timeout; 1868 struct timespec timeout;
1869 sigset_t signalMask; 1869 sigset_t signalMask;
1870 1870
1871 // Get the initial command set. 1871 // Get the initial command set.
1872 struct keyCommand *ourKeys = lineCommand(extra, ""); 1872 struct keyCommand *commands = lineCommand(extra, "");
1873 char buffer[20], command[20], csFinal[8]; 1873 char buffer[20], sequence[20], csFinal[8];
1874 int csi = 0, csCount = 0, csIndex = 0, csParams[8], index = 0, pollcount = 1; 1874 int csi = 0, csCount = 0, csIndex = 0, csParams[8], buffIndex = 0;
1875// TODO - multiline editLine is an advanced feature. Editing boxes just moves the editLine up and down. 1875// TODO - multiline editLine is an advanced feature. Editing boxes just moves the editLine up and down.
1876// uint16_t h = 1; 1876// uint16_t h = 1;
1877// TODO - should check if it's at the top of the box, then grow it down instead of up if so. 1877// TODO - should check if it's at the top of the box, then grow it down instead of up if so.
1878 1878
1879 buffer[0] = 0; 1879 buffer[0] = 0;
1880 command[0] = 0; 1880 sequence[0] = 0;
1881 1881
1882 sigemptyset(&signalMask); 1882 sigemptyset(&signalMask);
1883 sigaddset(&signalMask, SIGWINCH); 1883 sigaddset(&signalMask, SIGWINCH);
@@ -1887,9 +1887,9 @@ void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct key
1887 while (TT.stillRunning) 1887 while (TT.stillRunning)
1888 { 1888 {
1889 int j, p; 1889 int j, p;
1890 char *found = NULL; 1890 char *command = NULL;
1891 1891
1892 if (0 == index) 1892 if (0 == buffIndex)
1893 { 1893 {
1894 buffer[0] = 0; 1894 buffer[0] = 0;
1895 csi = 0; 1895 csi = 0;
@@ -1925,11 +1925,11 @@ void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct key
1925 } 1925 }
1926 if (0 == p) // A timeout, trigger a time event. 1926 if (0 == p) // A timeout, trigger a time event.
1927 { 1927 {
1928 if ((1 == index) && ('\x1B' == buffer[0])) 1928 if ((1 == buffIndex) && ('\x1B' == buffer[0]))
1929 { 1929 {
1930 // After a short delay to check, this is a real Escape key, not part of an escape sequence, so deal with it. 1930 // After a short delay to check, this is a real Escape key, not part of an escape sequence, so deal with it.
1931 strcpy(command, "^["); 1931 strcpy(sequence, "^[");
1932 index = 0; 1932 buffIndex = 0;
1933 } 1933 }
1934 // TODO - Send a timer event to lineCommand(). This wont be a precise timed event, but don't think we need one. 1934 // TODO - Send a timer event to lineCommand(). This wont be a precise timed event, but don't think we need one.
1935 } 1935 }
@@ -1980,7 +1980,7 @@ void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct key
1980 buffer[0] = '\x9B'; 1980 buffer[0] = '\x9B';
1981 for (j = 1; buffer[j]; j++) 1981 for (j = 1; buffer[j]; j++)
1982 buffer[j] = buffer[j + 1]; 1982 buffer[j] = buffer[j + 1];
1983 index--; 1983 buffIndex--;
1984 csi = 1; 1984 csi = 1;
1985 } 1985 }
1986 1986
@@ -1991,8 +1991,8 @@ void editLine(long extra, void (*lineChar)(long extra, char *buffer), struct key
1991 { 1991 {
1992 if (strcmp(keys[j].code, buffer) == 0) 1992 if (strcmp(keys[j].code, buffer) == 0)
1993 { 1993 {
1994 strcat(command, keys[j].name); 1994 strcat(sequence, keys[j].name);
1995 index = 0; 1995 buffIndex = 0;
1996 csi = 0; 1996 csi = 0;
1997 break; 1997 break;
1998 } 1998 }
@@ -2030,9 +2030,8 @@ TODO So abort the current CSI and start from scratch.
2030 } 2030 }
2031 else 2031 else
2032 { 2032 {
2033 // TODO - Using rindex here, coz index is a variable in this scope. Should rename index.
2034 // Check for the private bit. 2033 // Check for the private bit.
2035 if (rindex("<=>?", buffer[1])) 2034 if (index("<=>?", buffer[1]))
2036 { 2035 {
2037 csFinal[0] = buffer[1]; 2036 csFinal[0] = buffer[1];
2038 csFinal[1] = 0; 2037 csFinal[1] = 0;
@@ -2044,7 +2043,7 @@ TODO So abort the current CSI and start from scratch.
2044 do 2043 do
2045 { 2044 {
2046 // So we know when we get to the end of parameter space. 2045 // So we know when we get to the end of parameter space.
2047 t = rindex("01234567890:;<=>?", buffer[j + 1]); 2046 t = index("01234567890:;<=>?", buffer[j + 1]);
2048 // See if we passed a paremeter. 2047 // See if we passed a paremeter.
2049 if ((';' == buffer[j]) || (!t)) 2048 if ((';' == buffer[j]) || (!t))
2050 { 2049 {
@@ -2072,7 +2071,7 @@ TODO So abort the current CSI and start from scratch.
2072 { 2071 {
2073 t = CSI_terminators[j].func(extra, csParams, csCount); 2072 t = CSI_terminators[j].func(extra, csParams, csCount);
2074 if (t) 2073 if (t)
2075 strcpy(command, t); 2074 strcpy(sequence, t);
2076 break; 2075 break;
2077 } 2076 }
2078 } 2077 }
@@ -2080,55 +2079,57 @@ TODO So abort the current CSI and start from scratch.
2080 2079
2081 csi = 0; 2080 csi = 0;
2082 // Wether or not it's a CSI we understand, it's been handled either here or in the key sequence scanning above. 2081 // Wether or not it's a CSI we understand, it's been handled either here or in the key sequence scanning above.
2083 index = 0; 2082 buffIndex = 0;
2084 } 2083 }
2085 2084
2086 // See if it's an ordinary key, 2085 // See if it's an ordinary key,
2087 if ((1 == index) && isprint(buffer[0])) 2086 if ((1 == buffIndex) && isprint(buffer[0]))
2088 { 2087 {
2089 // Here we want to run it through the command finder first, and only "insert" it if it's not a command. 2088 // Here we want to run it through the command finder first, and only "insert" it if it's not a command.
2090 for (j = 0; ourKeys[j].key; j++) 2089 // Yes, this is duplicated below.
2090 for (j = 0; commands[j].key; j++)
2091 { 2091 {
2092 if (strcmp(ourKeys[j].key, buffer) == 0) 2092 if (strcmp(commands[j].key, buffer) == 0)
2093 { 2093 {
2094 strcpy(command, buffer); 2094 strcpy(sequence, buffer);
2095 found = command; 2095 command = sequence;
2096 break; 2096 break;
2097 } 2097 }
2098 } 2098 }
2099 if (NULL == found) 2099 if (NULL == command)
2100 { 2100 {
2101 // If there's an outstanding command, add this to the end of it. 2101 // If there's an outstanding sequence, add this to the end of it.
2102 if (command[0]) strcat(command, buffer); 2102 if (sequence[0]) strcat(sequence, buffer);
2103 else lineChar(extra, buffer); 2103 else lineChar(extra, buffer);
2104 } 2104 }
2105 index = 0; 2105 buffIndex = 0;
2106 } 2106 }
2107 2107
2108 if (command[0]) // Search for a bound key. 2108 // Search for a key sequence bound to a command.
2109 if (sequence[0])
2109 { 2110 {
2110 if (sizeof(command) < (strlen(command) + 1)) 2111 if (sizeof(sequence) < (strlen(sequence) + 1))
2111 { 2112 {
2112 fprintf(stderr, "Full command buffer - %s \n", command); 2113 fprintf(stderr, "Full key sequence buffer - %s \n", sequence);
2113 fflush(stderr); 2114 fflush(stderr);
2114 command[0] = 0; 2115 sequence[0] = 0;
2115 } 2116 }
2116 2117
2117 if (NULL == found) 2118 if (NULL == command)
2118 { 2119 {
2119 for (j = 0; ourKeys[j].key; j++) 2120 for (j = 0; commands[j].key; j++)
2120 { 2121 {
2121 if (strcmp(ourKeys[j].key, command) == 0) 2122 if (strcmp(commands[j].key, sequence) == 0)
2122 { 2123 {
2123 found = ourKeys[j].command; 2124 command = commands[j].command;
2124 break; 2125 break;
2125 } 2126 }
2126 } 2127 }
2127 } 2128 }
2128 if (found) 2129 if (command)
2129 { 2130 {
2130 ourKeys = lineCommand(extra, found); 2131 commands = lineCommand(extra, command);
2131 command[0] = 0; 2132 sequence[0] = 0;
2132 } 2133 }
2133 } 2134 }
2134 } 2135 }
@@ -2909,7 +2910,7 @@ void boxes_main(void)
2909 updateLine(currentBox->view); 2910 updateLine(currentBox->view);
2910 2911
2911 // Run the main loop. 2912 // Run the main loop.
2912 editLine((long) currentBox->view, lineChar, lineCommand); 2913 handle_keys((long) currentBox->view, lineChar, lineCommand);
2913 2914
2914 // TODO - Should remember to turn off mouse reporting when we leave. 2915 // TODO - Should remember to turn off mouse reporting when we leave.
2915 2916