diff options
Diffstat (limited to 'chinese/bitchx/files/patch-source__input.c')
-rw-r--r-- | chinese/bitchx/files/patch-source__input.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/chinese/bitchx/files/patch-source__input.c b/chinese/bitchx/files/patch-source__input.c new file mode 100644 index 000000000000..62e38c1d5261 --- /dev/null +++ b/chinese/bitchx/files/patch-source__input.c @@ -0,0 +1,198 @@ +--- source/input.c~ Tue Aug 5 20:43:47 2003 ++++ source/input.c Tue Aug 5 20:43:49 2003 +@@ -94,6 +94,7 @@ + #define MIN_CHAR INPUT_BUFFER[MIN_POS] + #define PREV_CHAR INPUT_BUFFER[THIS_POS-1] + #define NEXT_CHAR INPUT_BUFFER[THIS_POS+1] ++#define NTH_CHAR(offset) INPUT_BUFFER[THIS_POS+(offset)] + #define ADD_TO_INPUT(x) strmcat(INPUT_BUFFER, (x), INPUT_BUFFER_SIZE); + #define INPUT_ONSCREEN current_screen->input_visible + #define INPUT_VISIBLE INPUT_BUFFER[INPUT_ONSCREEN] +@@ -107,7 +108,11 @@ + + + #define HOLDLAST current_screen->current_window->screen_hold +- ++ ++#define MY_ROLE_ENG 0 ++#define MY_ROLE_HI 1 ++#define MY_ROLE_LO 2 ++ + Display *get_screen_hold(Window *win) + { + return win->screen_hold; +@@ -124,6 +129,24 @@ + return i; + } + ++static int check_my_role (int my_pos) ++{ ++ int i = MIN_POS; ++ while (i <= my_pos) { ++ if ( is_big5_hi( INPUT_BUFFER[i] ) ) { ++ if ( i+1 <= my_pos ) { ++ if (is_big5( INPUT_BUFFER[i],INPUT_BUFFER[i+1]) ){ ++ if (i+1 == my_pos) return MY_ROLE_LO; ++ else i+=1; ++ } ++ } ++ else return MY_ROLE_HI; ++ } ++ i+=1; ++ } ++ return MY_ROLE_ENG; ++} ++ + /* cursor_to_input: move the cursor to the input line, if not there already */ + extern void BX_cursor_to_input (void) + { +@@ -480,6 +503,13 @@ + { + if (THIS_CHAR) + { ++#ifdef WANT_BIG5 ++ if (NEXT_CHAR && is_big5(THIS_CHAR,NEXT_CHAR) ) ++ { ++ THIS_POS++; ++ term_cursor_right(); ++ } ++#endif /* WANT_BIG5 */ + THIS_POS++; + term_cursor_right(); + } +@@ -490,6 +520,13 @@ + { + THIS_POS--; + term_cursor_left(); ++#ifdef WANT_BIG5 ++ if ( check_my_role(THIS_POS) == MY_ROLE_LO) ++ { ++ THIS_POS--; ++ term_cursor_left(); ++ } ++#endif /* WANT_BIG5 */ + } + } + update_input(NO_UPDATE); +@@ -584,15 +621,33 @@ + BUILT_IN_KEYBINDING(input_delete_character) + { + int pos; ++#ifdef WANT_BIG5 ++ int count=1 ; ++ int big5_delete=0 ; ++#endif + cursor_to_input(); + in_completion = STATE_NORMAL; + if (!THIS_CHAR) + return; ++#ifdef WANT_BIG5 ++ if ((THIS_CHAR && NEXT_CHAR) && is_big5(THIS_CHAR, NEXT_CHAR)) ++ { ++ ov_strcpy(&THIS_CHAR, &NTH_CHAR(2)); ++ big5_delete=1 ; ++ } ++ else ++ ov_strcpy(&THIS_CHAR, &NEXT_CHAR); ++#else + ov_strcpy(&THIS_CHAR, &NEXT_CHAR); ++#endif /* WANT_BIG5 */ + if (!(termfeatures & TERM_CAN_DELETE)) + update_input(UPDATE_FROM_CURSOR); + else + { ++#ifdef WANT_BIG5 ++ if (big5_delete) count = 2 ; ++ while ( count -- > 0) { ++#endif + term_delete(1); + pos = INPUT_ONSCREEN + last_input_screen->co - 1; + if (pos < strlen(INPUT_BUFFER)) +@@ -601,6 +656,9 @@ + term_putchar(INPUT_BUFFER[pos]); + term_move_cursor(INPUT_CURSOR, INPUT_LINE); + } ++#ifdef WANT_BIG5 ++ } /* while -- > 0 */ ++#endif /* WANT_BIG5 */ + update_input(NO_UPDATE); + } + } +@@ -614,6 +672,15 @@ + char *ptr = NULL; + int pos; + ++#ifdef WANT_BIG5 ++ int count=1 ; ++#endif ++#ifdef WANT_BIG5 ++ if ( check_my_role(THIS_POS -1 ) == MY_ROLE_LO) ++ count=2 ; ++ ++ while (count-->0) { ++#endif + ptr = LOCAL_COPY(&THIS_CHAR); + strcpy(&(PREV_CHAR), ptr); + THIS_POS--; +@@ -650,6 +717,9 @@ + update_input(UPDATE_FROM_CURSOR); + #endif + } ++#ifdef WANT_BIG5 ++ } /* while (count-- > 0)*/ ++#endif + } + if (THIS_POS == MIN_POS) + HOLDLAST = NULL; +@@ -688,6 +758,10 @@ + { + cursor_to_input(); + THIS_POS = strlen(INPUT_BUFFER); ++#ifdef WANT_BIG5 ++ if (is_big5(PREV_CHAR,THIS_CHAR)) ++ THIS_POS-- ; ++#endif + update_input(UPDATE_JUST_CURSOR); + } + +@@ -791,11 +865,17 @@ + THIS_CHAR = key; + NEXT_CHAR = 0; + ADD_TO_INPUT(ptr); +- if (termfeatures & TERM_CAN_INSERT) +- term_insert(key); ++ if (termfeatures & TERM_CAN_INSERT) { ++ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_insert(key); ++ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_insert(PREV_CHAR); term_insert(key); } ++ if (NEXT_CHAR) ++ display_flag = UPDATE_FROM_CURSOR; ++ } + else + { +- term_putchar(key); ++ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_putchar(key); ++ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_putchar(PREV_CHAR); term_putchar(key);} ++ + if (NEXT_CHAR) + display_flag = UPDATE_FROM_CURSOR; + else +@@ -806,7 +886,8 @@ + { + THIS_CHAR = key; + NEXT_CHAR = 0; +- term_putchar(key); ++ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_putchar(key); ++ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_putchar(PREV_CHAR); term_putchar(key);} + } + } + else +@@ -814,7 +895,8 @@ + if (THIS_CHAR == 0) + NEXT_CHAR = 0; + THIS_CHAR = key; +- term_putchar(key); ++ if ( check_my_role(THIS_POS) == MY_ROLE_ENG) term_putchar(key); ++ else if (check_my_role(THIS_POS) == MY_ROLE_LO) {term_cursor_left(); term_putchar(PREV_CHAR); term_putchar(key);} + } + + if (!THIS_POS) |