diff options
author | mongo <mongo@iomega> | 2016-04-14 16:40:08 -0300 |
---|---|---|
committer | mongo <mongo@iomega> | 2016-04-14 16:40:08 -0300 |
commit | 4e102657f3714fa7ba14270970554fb90ebbb82f (patch) | |
tree | 1ec206a75d85f15531a27c6b76212f613929d830 | |
parent | 3ee5473af7e3c277dbab33f5a44f64ed64864168 (diff) |
EDIT_MODE - More movement fixes to support full width chars
-rwxr-xr-x | src.scim2/cmds_edit.c | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/src.scim2/cmds_edit.c b/src.scim2/cmds_edit.c index 45b5152..307b5ed 100755 --- a/src.scim2/cmds_edit.c +++ b/src.scim2/cmds_edit.c @@ -166,16 +166,14 @@ void do_editmode(struct block * sb) { show_header(input_win); return; - - - //FIXME - from here } else if (sb->value == L'R') { // R curs_set(1); wint_t c = get_key(); while (c != OKEY_ENTER && c != -1) { if (iswprint(c)) { - inputline[inputline_pos] = c; - ++inputline_pos; + inputline[real_inputline_pos] = c; + ++real_inputline_pos; + inputline_pos = wcswidth(inputline, real_inputline_pos); mvwprintw(input_win, 0, 1 + rescol, "%ls", inputline); wmove(input_win, 0, inputline_pos + 1 + rescol); @@ -191,33 +189,37 @@ void do_editmode(struct block * sb) { if ( (c = get_key()) != -1 ) { switch (c) { case L'e': // de or ce - del_range_wchars(inputline, inputline_pos, for_word(1, 0, 0)); + del_range_wchars(inputline, real_inputline_pos, for_word(1, 0, 0)); break; case L'E': // dE or cE - del_range_wchars(inputline, inputline_pos, for_word(1, 0, 1)); + del_range_wchars(inputline, real_inputline_pos, for_word(1, 0, 1)); break; case L'w': // dw or cw - del_range_wchars(inputline, inputline_pos, for_word(0, 1, 0) - 1); - if (inputline_pos == wcslen(inputline) && inputline_pos) inputline_pos--; + del_range_wchars(inputline, real_inputline_pos, for_word(0, 1, 0) - 1); + inputline_pos = wcswidth(inputline, real_inputline_pos); + if (real_inputline_pos == wcslen(inputline) && real_inputline_pos) real_inputline_pos--; break; case L'W': // dW or cW - del_range_wchars(inputline, inputline_pos, for_word(0, 1, 1) - 1); - if (inputline_pos == wcslen(inputline) && inputline_pos) inputline_pos--; + del_range_wchars(inputline, real_inputline_pos, for_word(0, 1, 1) - 1); + inputline_pos = wcswidth(inputline, real_inputline_pos); + if (real_inputline_pos == wcslen(inputline) && real_inputline_pos) real_inputline_pos--; break; case L'b': // db or cb d = back_word(0); - del_range_wchars(inputline, d, inputline_pos-1); - inputline_pos = d; + del_range_wchars(inputline, d, real_inputline_pos-1); + real_inputline_pos = d; + inputline_pos = wcswidth(inputline, real_inputline_pos); break; case L'B': // dB or cB d = back_word(1); - del_range_wchars(inputline, d, inputline_pos-1); - inputline_pos = d; + del_range_wchars(inputline, d, real_inputline_pos-1); + real_inputline_pos = d; + inputline_pos = wcswidth(inputline, real_inputline_pos); break; case L'l': // dl or cl @@ -232,13 +234,15 @@ void do_editmode(struct block * sb) { case L'a': if ( (d = get_key()) == L'W' ) { // daW or caW - c = ( inputline_pos && inputline[inputline_pos-1] == ' ' ) ? inputline_pos : back_word(1); + c = ( real_inputline_pos && inputline[real_inputline_pos-1] == L' ' ) ? real_inputline_pos : back_word(1); del_range_wchars(inputline, c, for_word(0, 1, 1) - 1); - inputline_pos = (wcslen(inputline) > inputline_pos) ? c : wcslen(inputline)-2; + real_inputline_pos = (wcslen(inputline) > real_inputline_pos) ? c : wcslen(inputline)-2; + inputline_pos = wcswidth(inputline, real_inputline_pos); } else if ( d == L'w' ) { // daw or caw - d = ( inputline_pos && ! istext( inputline[inputline_pos-1]) ) ? inputline_pos : back_word(0); + d = ( real_inputline_pos && ! istext( inputline[real_inputline_pos-1]) ) ? real_inputline_pos : back_word(0); del_range_wchars(inputline, d, for_word(0, 1, 0) - 1); - inputline_pos = (wcslen(inputline) > inputline_pos) ? d : wcslen(inputline)-2; + real_inputline_pos = (wcslen(inputline) > real_inputline_pos) ? d : wcslen(inputline)-2; + inputline_pos = wcswidth(inputline, real_inputline_pos); } break; } @@ -250,15 +254,7 @@ void do_editmode(struct block * sb) { return; } - //FIXME - up to here - - - - - - // looks for a char in inputline -// REVISED int look_for(wchar_t cb) { int c, cpos = inputline_pos; while (++cpos < wcslen(inputline)) @@ -268,7 +264,6 @@ int look_for(wchar_t cb) { } // move backwards a word -// REVISED int back_word(int big_word) { int c, cpos = real_inputline_pos; if (inputline[cpos-1] == L' ' ) cpos--; @@ -283,7 +278,6 @@ int back_word(int big_word) { // end_of_word is used for moving forward to end of a WORD // big_word looks for ' ', else looks for istext. // delete 1 is used when typing dw command -// REVISED int for_word(int end_of_word, int delete, int big_word) { int cpos = real_inputline_pos; |