diff options
| author | David Walter Seikel | 2014-01-30 16:45:04 +1000 |
|---|---|---|
| committer | David Walter Seikel | 2014-01-30 16:45:04 +1000 |
| commit | 0deaf20da18fc442417e55e4865ee0293a7bc379 (patch) | |
| tree | 4ed5326bdb3d92b42cab21400d88701841773fe5 | |
| parent | Move all the SIGWINCH stuff inte handle_keys(). (diff) | |
| download | boxes-0deaf20da18fc442417e55e4865ee0293a7bc379.zip boxes-0deaf20da18fc442417e55e4865ee0293a7bc379.tar.gz boxes-0deaf20da18fc442417e55e4865ee0293a7bc379.tar.bz2 boxes-0deaf20da18fc442417e55e4865ee0293a7bc379.tar.xz | |
Move the actual CSI command scanner out of handle_keys().
Diffstat (limited to '')
| -rw-r--r-- | boxes.c | 49 |
1 files changed, 29 insertions, 20 deletions
| @@ -494,7 +494,6 @@ typedef struct _view view; | |||
| 494 | 494 | ||
| 495 | typedef void (*boxFunction) (box *box); | 495 | typedef void (*boxFunction) (box *box); |
| 496 | typedef void (*eventHandler) (view *view); | 496 | typedef void (*eventHandler) (view *view); |
| 497 | typedef void (*CSIhandler) (long extra, int *code, int count); | ||
| 498 | 497 | ||
| 499 | struct function | 498 | struct function |
| 500 | { | 499 | { |
| @@ -1785,6 +1784,14 @@ void nop(view *view) | |||
| 1785 | } | 1784 | } |
| 1786 | 1785 | ||
| 1787 | 1786 | ||
| 1787 | typedef void (*CSIhandler) (long extra, int *code, int count); | ||
| 1788 | |||
| 1789 | struct CSI | ||
| 1790 | { | ||
| 1791 | char *code; | ||
| 1792 | CSIhandler func; | ||
| 1793 | }; | ||
| 1794 | |||
| 1788 | static void termSize(long extra, int *params, int count) | 1795 | static void termSize(long extra, int *params, int count) |
| 1789 | { | 1796 | { |
| 1790 | struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away. | 1797 | struct _view *view = (struct _view *) extra; // Though we pretty much stomp on this straight away. |
| @@ -1811,17 +1818,25 @@ static void termSize(long extra, int *params, int count) | |||
| 1811 | } | 1818 | } |
| 1812 | } | 1819 | } |
| 1813 | 1820 | ||
| 1814 | struct CSI | 1821 | struct CSI CSIcommands[] = |
| 1815 | { | 1822 | { |
| 1816 | char *code; | 1823 | {"R", termSize} // Parameters are cursor line and column. Note this may be sent at other times, not just during terminal resize. |
| 1817 | CSIhandler func; | ||
| 1818 | }; | 1824 | }; |
| 1819 | 1825 | ||
| 1820 | struct CSI CSI_terminators[] = | 1826 | static void handleCSI(long extra, char *command, int *params, int count) |
| 1821 | { | 1827 | { |
| 1822 | {"R", termSize}, // Parameters are cursor line and column. Note this may be sent at other times, not just during terminal resize. | 1828 | int j; |
| 1823 | {NULL, NULL} | 1829 | |
| 1824 | }; | 1830 | for (j = 0; j < (sizeof(CSIcommands) / sizeof(*CSIcommands)); j++) |
| 1831 | { | ||
| 1832 | if (strcmp(CSIcommands[j].code, command) == 0) | ||
| 1833 | { | ||
| 1834 | CSIcommands[j].func(extra, params, count); | ||
| 1835 | break; | ||
| 1836 | } | ||
| 1837 | } | ||
| 1838 | } | ||
| 1839 | |||
| 1825 | 1840 | ||
| 1826 | static int handleKeySequence(long extra, char *sequence) | 1841 | static int handleKeySequence(long extra, char *sequence) |
| 1827 | { | 1842 | { |
| @@ -1870,7 +1885,7 @@ static void handleSignals(int signo) | |||
| 1870 | // TODO - Unhandled complications - | 1885 | // TODO - Unhandled complications - |
| 1871 | // Less and more have the "ZZ" command, but nothing else seems to have multi ordinary character commands. | 1886 | // Less and more have the "ZZ" command, but nothing else seems to have multi ordinary character commands. |
| 1872 | 1887 | ||
| 1873 | void handle_keys(long extra, int (*handle_sequence)(long extra, char *sequence)) | 1888 | void handle_keys(long extra, int (*handle_sequence)(long extra, char *sequence), void (*handle_CSI)(long extra, char *command, int *params, int count)) |
| 1874 | { | 1889 | { |
| 1875 | fd_set selectFds; | 1890 | fd_set selectFds; |
| 1876 | struct timespec timeout; | 1891 | struct timespec timeout; |
| @@ -2063,16 +2078,10 @@ TODO So abort the current CSI and start from scratch. | |||
| 2063 | } | 2078 | } |
| 2064 | while (t); | 2079 | while (t); |
| 2065 | 2080 | ||
| 2066 | // Get the final command sequence, and search for it. | 2081 | // Get the final command sequence, and pass it to the callback. |
| 2067 | strcat(csFinal, &buffer[csIndex]); | 2082 | strcat(csFinal, &buffer[csIndex]); |
| 2068 | for (j = 0; CSI_terminators[j].code; j++) | 2083 | if (handle_CSI) |
| 2069 | { | 2084 | handle_CSI(extra, csFinal, csParams, p); |
| 2070 | if (strcmp(CSI_terminators[j].code, csFinal) == 0) | ||
| 2071 | { | ||
| 2072 | CSI_terminators[j].func(extra, csParams, p); | ||
| 2073 | break; | ||
| 2074 | } | ||
| 2075 | } | ||
| 2076 | } | 2085 | } |
| 2077 | 2086 | ||
| 2078 | csi = 0; | 2087 | csi = 0; |
| @@ -2081,7 +2090,7 @@ TODO So abort the current CSI and start from scratch. | |||
| 2081 | } | 2090 | } |
| 2082 | 2091 | ||
| 2083 | // Pass the result to the callback. | 2092 | // Pass the result to the callback. |
| 2084 | if (sequence[0] || buffer[0]) | 2093 | if ((handle_sequence) && (sequence[0] || buffer[0])) |
| 2085 | { | 2094 | { |
| 2086 | char b[strlen(sequence) + strlen(buffer) + 1]; | 2095 | char b[strlen(sequence) + strlen(buffer) + 1]; |
| 2087 | 2096 | ||
| @@ -2860,7 +2869,7 @@ void boxes_main(void) | |||
| 2860 | updateLine(currentBox->view); | 2869 | updateLine(currentBox->view); |
| 2861 | 2870 | ||
| 2862 | // Run the main loop. | 2871 | // Run the main loop. |
| 2863 | handle_keys((long) currentBox->view, handleKeySequence); | 2872 | handle_keys((long) currentBox->view, handleKeySequence, handleCSI); |
| 2864 | 2873 | ||
| 2865 | // TODO - Should remember to turn off mouse reporting when we leave. | 2874 | // TODO - Should remember to turn off mouse reporting when we leave. |
| 2866 | 2875 | ||
