implement caret moving for left and right.
@@ -82,6 +82,11 @@ | ||
82 | 82 | return line->pos[pos]; |
83 | 83 | } |
84 | 84 | |
85 | +EXPORT W bchank_line_length(bchank_line_t *line) | |
86 | +{ | |
87 | + return line->pos_len; | |
88 | +} | |
89 | + | |
85 | 90 | LOCAL bchank_line_t* bchank_line_new() |
86 | 91 | { |
87 | 92 | bchank_line_t *line; |
@@ -495,7 +495,8 @@ | ||
495 | 495 | |
496 | 496 | LOCAL VOID bchank_hmi_keydown(bchank_t *bchank, UH keycode, TC ch, UW stat) |
497 | 497 | { |
498 | - W lines; | |
498 | + W lines, chars; | |
499 | + bchank_line_t *line; | |
499 | 500 | |
500 | 501 | switch (ch) { |
501 | 502 | case KC_CC_U: |
@@ -503,6 +504,11 @@ | ||
503 | 504 | break; |
504 | 505 | } |
505 | 506 | bchank->insert_pos.y--; |
507 | + line = bchank_linelist_get(bchank->text, bchank->insert_pos.y); | |
508 | + chars = bchank_line_length(line); | |
509 | + if (bchank->insert_pos.x > chars) { | |
510 | + bchank->insert_pos.x = chars; | |
511 | + } | |
506 | 512 | bchank_caretupdate(bchank); |
507 | 513 | break; |
508 | 514 | case KC_CC_D: |
@@ -511,11 +517,42 @@ | ||
511 | 517 | break; |
512 | 518 | } |
513 | 519 | bchank->insert_pos.y++; |
520 | + line = bchank_linelist_get(bchank->text, bchank->insert_pos.y); | |
521 | + chars = bchank_line_length(line); | |
522 | + if (bchank->insert_pos.x > chars) { | |
523 | + bchank->insert_pos.x = chars; | |
524 | + } | |
514 | 525 | bchank_caretupdate(bchank); |
515 | 526 | break; |
516 | 527 | case KC_CC_R: |
528 | + line = bchank_linelist_get(bchank->text, bchank->insert_pos.y); | |
529 | + chars = bchank_line_length(line); | |
530 | + if (bchank->insert_pos.x + 1 > chars) { | |
531 | + lines = bchank_linelist_length(bchank->text); | |
532 | + if (bchank->insert_pos.y + 1 >= lines) { | |
533 | + break; | |
534 | + } | |
535 | + bchank->insert_pos.x = 0; | |
536 | + bchank->insert_pos.y++; | |
537 | + } else { | |
538 | + bchank->insert_pos.x++; | |
539 | + } | |
540 | + bchank_caretupdate(bchank); | |
517 | 541 | break; |
518 | 542 | case KC_CC_L: |
543 | + if (bchank->insert_pos.x - 1 < 0) { | |
544 | + if (bchank->insert_pos.y - 1 < 0) { | |
545 | + break; | |
546 | + } | |
547 | + line = bchank_linelist_get(bchank->text, bchank->insert_pos.y - 1); | |
548 | + chars = bchank_line_length(line); | |
549 | + | |
550 | + bchank->insert_pos.x = chars; | |
551 | + bchank->insert_pos.y--; | |
552 | + } else { | |
553 | + bchank->insert_pos.x--; | |
554 | + } | |
555 | + bchank_caretupdate(bchank); | |
519 | 556 | break; |
520 | 557 | case KC_PG_U: |
521 | 558 | break; |
@@ -542,6 +579,7 @@ | ||
542 | 579 | if (editorwindow_startredisp(window, &r) == 0) { |
543 | 580 | break; |
544 | 581 | } |
582 | + bchank_caret_disappear(&bchank->caret); | |
545 | 583 | editorwindow_eraseworkarea(window, &r); |
546 | 584 | bchank_draw(bchank, editorwindow_getGID(window), r); |
547 | 585 | bchank_caret_appear(&bchank->caret, editorwindow_getGID(window)); |
@@ -38,6 +38,7 @@ | ||
38 | 38 | IMPORT W bchank_line_inserttext(bchank_line_t *line, W pos, TC *str, W len); |
39 | 39 | IMPORT W bchank_line_removetext(bchank_line_t *line, W pos, W len); |
40 | 40 | IMPORT W bchank_line_getX(bchank_line_t *line, W pos); |
41 | +IMPORT W bchank_line_length(bchank_line_t *line); | |
41 | 42 | |
42 | 43 | typedef struct bchank_linelist_t_ bchank_linelist_t; |
43 | 44 |