From 43e028136ef84c900f565946d5f694f9e4fc4eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Haoran=20S=2E=20Diao=20=28=E5=88=81=E6=B5=A9=E7=84=B6=29?= <0@hairydiode.xyz> Date: Sat, 6 Sep 2025 02:07:20 -0700 Subject: Fully functional so far. Just need to clean up the code and actually import the input method table --- im.h | 116 +++++++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 72 insertions(+), 44 deletions(-) (limited to 'im.h') diff --git a/im.h b/im.h index 4980938..e038f77 100644 --- a/im.h +++ b/im.h @@ -1,7 +1,17 @@ #include "imtable.h" #define IM_BUFFER_LEN 32 -char im_buffer[IM_BUFFER_LEN]; +#define ENTER_KEY 0x0D +#define BACKSPACE_KEY 0x7F +//#define BACKSPACE_KEY '+' +//setting it to the actual escape character interferes with arrow keys and +//whatnot +//#define ESCAPE_KEY 0x1B +#define ESCAPE_KEY '`' +//Vertical Tab Ctrl+K +#define TOGGLE_KEY 0x0B +char im_buffer[IM_BUFFER_LEN+1]; char im_buffer_pos = 0; +int im_on = 1; //recursive search, returns -1 on failure //searches from [start, end) int im_search(char * input, int start, int end) { @@ -11,7 +21,7 @@ int im_search(char * input, int start, int end) { } //test for middle, works even for 1 width middle=start int middle = start + (end-start)/2; - printf("testing:%s\n",im_table[middle][0]); + //printf("testing:%s\n",im_table[middle][0]); int test = strncmp(im_table[middle][0], input, IM_TABLE_ENTRY_LEN); if (test == 0) { return middle; @@ -37,57 +47,75 @@ int im_search(char * input, int start, int end) { } //returns output len, since we want to be able to handle null bytes as well int update_im_state(char input, char * output) { - if ( ('a' <= input <= 'z')||('0' <= input <= '9')||(input == ' ') ) { - if (im_buffer_pos < IM_BUFFER_LEN) { + if (input == TOGGLE_KEY) { + im_on = !im_on; + //clears the im buffer if its toggling off + if (!im_on) { + im_buffer[0] = 0; + im_buffer_pos = 0; + } + } + //just exit if the im is off + if (!im_on) { + output[0] = input; + output[1] = 0; + return 1; + } + if ( ('a' <= input && input <= 'z')||('0' <= input && input <= '9')||(input == ' ') ) { + if ( (im_buffer_pos < IM_BUFFER_LEN) && (im_buffer_pos < IM_TABLE_ENTRY_LEN) ){ im_buffer[im_buffer_pos] = input; im_buffer_pos++; + im_buffer[im_buffer_pos] = 0; } else { //passthrough output[0] = input; output[1] = 0; return 1; } - } - int im_entry = im_search(im_buffer,0, IM_TABLE_LEN); - if (im_entry != -1) { - strncpy(output, im_table[im_entry][1], IM_TABLE_ENTRY_LEN); - im_buffer[0] = 0; - im_buffer_pos = 0; - return strlen(im_table[im_entry][1]); - } - //these only do something if there's something in the buffer, otherwise - //passthrough - if (im_buffer_pos > 0) { - switch (input) { - //escape, cancels - case 0x1B: - im_buffer[0] = 0; - im_buffer_pos = 0; - return 0; - break; - //enter, enters the buffer - case 0x0A: - for (int i = 0; i 0) { - im_buffer_pos--; - im_buffer[im_buffer_pos] = 0; - } - return 0; - break; + //if there's a match return it + int im_entry = im_search(im_buffer, 0, IM_TABLE_LEN); + if (im_entry != -1) { + //clear the buffer + im_buffer[0] = 0; + im_buffer_pos = 0; + strncpy(output, im_table[im_entry][1], IM_TABLE_ENTRY_LEN); + return strlen(im_table[im_entry][1]); + } + } else { + //these only do something if there's something in the buffer, otherwise + //passthrough + if (im_buffer_pos > 0) { + switch (input) { + //escape, cancels + case ESCAPE_KEY: + im_buffer[0] = 0; + im_buffer_pos = 0; + return 0; + break; + //enter, enters the buffer + case ENTER_KEY: + for (int i = 0; i 0) { + im_buffer_pos--; + im_buffer[im_buffer_pos] = 0; + } + return 0; + break; + } } + //default behavior of passthrough + output[0] = input; + output[1] = 0; + return 1; } - //default behavior of passthrough - output[0] = input; - output[1] = 0; - return 1; } -- cgit v1.1