Path: blob/main/chinese/bitchx/files/patch-source__input.c
16461 views
--- source/input.c~ Tue Aug 5 20:43:47 20031+++ source/input.c Tue Aug 5 20:43:49 20032@@ -94,6 +94,7 @@3#define MIN_CHAR INPUT_BUFFER[MIN_POS]4#define PREV_CHAR INPUT_BUFFER[THIS_POS-1]5#define NEXT_CHAR INPUT_BUFFER[THIS_POS+1]6+#define NTH_CHAR(offset) INPUT_BUFFER[THIS_POS+(offset)]7#define ADD_TO_INPUT(x) strmcat(INPUT_BUFFER, (x), INPUT_BUFFER_SIZE);8#define INPUT_ONSCREEN current_screen->input_visible9#define INPUT_VISIBLE INPUT_BUFFER[INPUT_ONSCREEN]10@@ -107,7 +108,11 @@111213#define HOLDLAST current_screen->current_window->screen_hold14-15+16+#define MY_ROLE_ENG 017+#define MY_ROLE_HI 118+#define MY_ROLE_LO 219+20Display *get_screen_hold(Window *win)21{22return win->screen_hold;23@@ -124,6 +129,24 @@24return i;25}2627+static int check_my_role (int my_pos)28+{29+ int i = MIN_POS;30+ while (i <= my_pos) {31+ if ( is_big5_hi( INPUT_BUFFER[i] ) ) {32+ if ( i+1 <= my_pos ) {33+ if (is_big5( INPUT_BUFFER[i],INPUT_BUFFER[i+1]) ){34+ if (i+1 == my_pos) return MY_ROLE_LO;35+ else i+=1;36+ }37+ }38+ else return MY_ROLE_HI;39+ }40+ i+=1;41+ }42+ return MY_ROLE_ENG;43+}44+45/* cursor_to_input: move the cursor to the input line, if not there already */46extern void BX_cursor_to_input (void)47{48@@ -480,6 +503,13 @@49{50if (THIS_CHAR)51{52+#ifdef WANT_BIG553+ if (NEXT_CHAR && is_big5(THIS_CHAR,NEXT_CHAR) )54+ {55+ THIS_POS++;56+ term_cursor_right();57+ }58+#endif /* WANT_BIG5 */59THIS_POS++;60term_cursor_right();61}62@@ -490,6 +520,13 @@63{64THIS_POS--;65term_cursor_left();66+#ifdef WANT_BIG567+ if ( check_my_role(THIS_POS) == MY_ROLE_LO)68+ {69+ THIS_POS--;70+ term_cursor_left();71+ }72+#endif /* WANT_BIG5 */73}74}75update_input(NO_UPDATE);76@@ -584,15 +621,33 @@77BUILT_IN_KEYBINDING(input_delete_character)78{79int pos;80+#ifdef WANT_BIG581+ int count=1 ;82+ int big5_delete=0 ;83+#endif84cursor_to_input();85in_completion = STATE_NORMAL;86if (!THIS_CHAR)87return;88+#ifdef WANT_BIG589+ if ((THIS_CHAR && NEXT_CHAR) && is_big5(THIS_CHAR, NEXT_CHAR))90+ {91+ ov_strcpy(&THIS_CHAR, &NTH_CHAR(2));92+ big5_delete=1 ;93+ }94+ else95+ ov_strcpy(&THIS_CHAR, &NEXT_CHAR);96+#else97ov_strcpy(&THIS_CHAR, &NEXT_CHAR);98+#endif /* WANT_BIG5 */99if (!(termfeatures & TERM_CAN_DELETE))100update_input(UPDATE_FROM_CURSOR);101else102{103+#ifdef WANT_BIG5104+ if (big5_delete) count = 2 ;105+ while ( count -- > 0) {106+#endif107term_delete(1);108pos = INPUT_ONSCREEN + last_input_screen->co - 1;109if (pos < strlen(INPUT_BUFFER))110@@ -601,6 +656,9 @@111term_putchar(INPUT_BUFFER[pos]);112term_move_cursor(INPUT_CURSOR, INPUT_LINE);113}114+#ifdef WANT_BIG5115+ } /* while -- > 0 */116+#endif /* WANT_BIG5 */117update_input(NO_UPDATE);118}119}120@@ -614,6 +672,15 @@121char *ptr = NULL;122int pos;123124+#ifdef WANT_BIG5125+ int count=1 ;126+#endif127+#ifdef WANT_BIG5128+ if ( check_my_role(THIS_POS -1 ) == MY_ROLE_LO)129+ count=2 ;130+131+ while (count-->0) {132+#endif133ptr = LOCAL_COPY(&THIS_CHAR);134strcpy(&(PREV_CHAR), ptr);135THIS_POS--;136@@ -650,6 +717,9 @@137update_input(UPDATE_FROM_CURSOR);138#endif139}140+#ifdef WANT_BIG5141+ } /* while (count-- > 0)*/142+#endif143}144if (THIS_POS == MIN_POS)145HOLDLAST = NULL;146@@ -688,6 +758,10 @@147{148cursor_to_input();149THIS_POS = strlen(INPUT_BUFFER);150+#ifdef WANT_BIG5151+ if (is_big5(PREV_CHAR,THIS_CHAR))152+ THIS_POS-- ;153+#endif154update_input(UPDATE_JUST_CURSOR);155}156157@@ -791,11 +865,17 @@158THIS_CHAR = key;159NEXT_CHAR = 0;160ADD_TO_INPUT(ptr);161- if (termfeatures & TERM_CAN_INSERT)162- term_insert(key);163+ if (termfeatures & TERM_CAN_INSERT) {164+ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_insert(key);165+ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_insert(PREV_CHAR); term_insert(key); }166+ if (NEXT_CHAR)167+ display_flag = UPDATE_FROM_CURSOR;168+ }169else170{171- term_putchar(key);172+ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_putchar(key);173+ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_putchar(PREV_CHAR); term_putchar(key);}174+175if (NEXT_CHAR)176display_flag = UPDATE_FROM_CURSOR;177else178@@ -806,7 +886,8 @@179{180THIS_CHAR = key;181NEXT_CHAR = 0;182- term_putchar(key);183+ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_putchar(key);184+ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_putchar(PREV_CHAR); term_putchar(key);}185}186}187else188@@ -814,7 +895,8 @@189if (THIS_CHAR == 0)190NEXT_CHAR = 0;191THIS_CHAR = key;192- term_putchar(key);193+ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_putchar(key);194+ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_putchar(PREV_CHAR); term_putchar(key);}195}196197if (!THIS_POS)198199200