mirror of
https://git.FreeBSD.org/ports.git
synced 2024-12-09 02:22:18 +00:00
08a006d08a
'__' instead.
199 lines
4.7 KiB
C
199 lines
4.7 KiB
C
--- 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)
|