diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/recorder/keyboard.c | 124 |
1 files changed, 83 insertions, 41 deletions
diff --git a/apps/recorder/keyboard.c b/apps/recorder/keyboard.c index 91ed968cd7..109f7452a4 100644 --- a/apps/recorder/keyboard.c +++ b/apps/recorder/keyboard.c | |||
@@ -223,7 +223,7 @@ int load_kbd(unsigned char* filename) | |||
223 | int fd, count, l; | 223 | int fd, count, l; |
224 | int i[NB_SCREENS]; | 224 | int i[NB_SCREENS]; |
225 | unsigned char buf[4]; | 225 | unsigned char buf[4]; |
226 | 226 | ||
227 | FOR_NB_SCREENS(l) | 227 | FOR_NB_SCREENS(l) |
228 | i[l] = 0; | 228 | i[l] = 0; |
229 | 229 | ||
@@ -260,8 +260,8 @@ int load_kbd(unsigned char* filename) | |||
260 | } | 260 | } |
261 | 261 | ||
262 | utf8decode(buf, ¶m[l].kbd_buf[i[l]]); | 262 | utf8decode(buf, ¶m[l].kbd_buf[i[l]]); |
263 | if (param[l].kbd_buf[i[l]] != 0xFEFF && param[l].kbd_buf[i[l]] != '\n' && | 263 | if (param[l].kbd_buf[i[l]] != 0xFEFF && |
264 | param[l].kbd_buf[i[l]] != '\r') /*skip BOM & newlines */ | 264 | param[l].kbd_buf[i[l]] != '\r') /*skip BOM & carriage returns */ |
265 | i[l]++; | 265 | i[l]++; |
266 | } | 266 | } |
267 | } | 267 | } |
@@ -352,9 +352,9 @@ int kbd_input(char* text, int buflen) | |||
352 | unsigned char morse_code = 0; | 352 | unsigned char morse_code = 0; |
353 | int morse_tick = 0, morse_len; | 353 | int morse_tick = 0, morse_len; |
354 | char buf[2]; | 354 | char buf[2]; |
355 | #endif | 355 | #endif |
356 | int char_screen = 0; | 356 | int char_screen = 0; |
357 | 357 | ||
358 | FOR_NB_SCREENS(l) | 358 | FOR_NB_SCREENS(l) |
359 | { | 359 | { |
360 | if ((screens[l].width >= 160) && (screens[l].height >= 96)) | 360 | if ((screens[l].width >= 160) && (screens[l].height >= 96)) |
@@ -368,7 +368,7 @@ int kbd_input(char* text, int buflen) | |||
368 | "àáâãäåæ ìíîï èéêë «»°ºª¹²³\n" | 368 | "àáâãäåæ ìíîï èéêë «»°ºª¹²³\n" |
369 | "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ ¯±×÷¡¿µ·\n" | 369 | "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ ¯±×÷¡¿µ·\n" |
370 | "òóôõöø çðþýÿ ùúûü ¼½¾¬¶¨"; | 370 | "òóôõöø çðþýÿ ùúûü ¼½¾¬¶¨"; |
371 | 371 | ||
372 | param[l].DEFAULT_LINES = 8; | 372 | param[l].DEFAULT_LINES = 8; |
373 | } | 373 | } |
374 | else | 374 | else |
@@ -388,7 +388,7 @@ int kbd_input(char* text, int buflen) | |||
388 | "àáâãäåæ ìíîï èéêë\n" | 388 | "àáâãäåæ ìíîï èéêë\n" |
389 | "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ\n" | 389 | "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ\n" |
390 | "òóôõöø çðþýÿ ùúûü"; | 390 | "òóôõöø çðþýÿ ùúûü"; |
391 | 391 | ||
392 | param[l].DEFAULT_LINES = 4; | 392 | param[l].DEFAULT_LINES = 4; |
393 | } | 393 | } |
394 | } | 394 | } |
@@ -408,18 +408,14 @@ int kbd_input(char* text, int buflen) | |||
408 | #endif | 408 | #endif |
409 | FOR_NB_SCREENS(l) | 409 | FOR_NB_SCREENS(l) |
410 | { | 410 | { |
411 | i = 0; | 411 | if( !kbd_loaded ) |
412 | if (!kbd_loaded) { | 412 | { |
413 | /* Copy default keyboard to buffer */ | ||
414 | i = 0; | ||
413 | param[l].curfont = FONT_SYSFIXED; | 415 | param[l].curfont = FONT_SYSFIXED; |
414 | p = param[l].default_kbd; | 416 | p = param[l].default_kbd; |
415 | while (*p != 0) { | 417 | while (*p != 0) |
416 | p = utf8decode(p, ¶m[l].kbd_buf[i]); | 418 | p = utf8decode(p, ¶m[l].kbd_buf[i++]); |
417 | if (param[l].kbd_buf[i] == '\n') | ||
418 | while (i % (screens[l].width/6)) | ||
419 | param[l].kbd_buf[i++] = ' '; | ||
420 | else | ||
421 | i++; | ||
422 | } | ||
423 | param[l].nchars = i; | 419 | param[l].nchars = i; |
424 | } | 420 | } |
425 | else | 421 | else |
@@ -444,6 +440,51 @@ int kbd_input(char* text, int buflen) | |||
444 | if (w > param[l].font_w) | 440 | if (w > param[l].font_w) |
445 | param[l].font_w = w; | 441 | param[l].font_w = w; |
446 | } | 442 | } |
443 | /* Since we're going to be adding spaces, make sure that we check | ||
444 | * their width too */ | ||
445 | w = font_get_width( param[l].font, ' ' ); | ||
446 | if( w > param[l].font_w ) | ||
447 | param[l].font_w = w; | ||
448 | } | ||
449 | FOR_NB_SCREENS(l) | ||
450 | { | ||
451 | i = 0; | ||
452 | /* Pad lines with spaces */ | ||
453 | while( i < param[l].nchars ) | ||
454 | { | ||
455 | if( param[l].kbd_buf[i] == '\n' ) | ||
456 | { | ||
457 | k = ( screens[l].width / param[l].font_w ) | ||
458 | - i % ( screens[l].width / param[l].font_w ) - 1; | ||
459 | if( k == ( screens[l].width / param[l].font_w ) - 1 ) | ||
460 | { | ||
461 | param[l].nchars--; | ||
462 | for( j = i; j < param[l].nchars; j++ ) | ||
463 | { | ||
464 | param[l].kbd_buf[j] = param[l].kbd_buf[j+1]; | ||
465 | } | ||
466 | } | ||
467 | else | ||
468 | { | ||
469 | if( param[l].nchars + k - 1 >= KBD_BUF_SIZE ) | ||
470 | { /* We don't want to overflow the buffer */ | ||
471 | k = KBD_BUF_SIZE - param[l].nchars; | ||
472 | } | ||
473 | for( j = param[l].nchars + k - 1; j > i+k; j-- ) | ||
474 | { | ||
475 | param[l].kbd_buf[j] = param[l].kbd_buf[j-k]; | ||
476 | } | ||
477 | param[l].nchars += k; | ||
478 | k++; | ||
479 | while( k-- ) | ||
480 | { | ||
481 | param[l].kbd_buf[i++] = ' '; | ||
482 | } | ||
483 | } | ||
484 | } | ||
485 | else | ||
486 | i++; | ||
487 | } | ||
447 | } | 488 | } |
448 | 489 | ||
449 | /* find max width for text string */ | 490 | /* find max width for text string */ |
@@ -455,7 +496,7 @@ int kbd_input(char* text, int buflen) | |||
455 | utf8 = (unsigned char*)utf8decode(utf8, &ch); | 496 | utf8 = (unsigned char*)utf8decode(utf8, &ch); |
456 | w = font_get_width(param[l].font, ch); | 497 | w = font_get_width(param[l].font, ch); |
457 | if (w > text_w) | 498 | if (w > text_w) |
458 | text_w = w; | 499 | text_w = w; |
459 | } | 500 | } |
460 | param[l].max_chars_text = screens[l].width / text_w - 2; | 501 | param[l].max_chars_text = screens[l].width / text_w - 2; |
461 | 502 | ||
@@ -466,7 +507,7 @@ int kbd_input(char* text, int buflen) | |||
466 | param[l].keyboard_margin = DEFAULT_MARGIN; | 507 | param[l].keyboard_margin = DEFAULT_MARGIN; |
467 | } else { | 508 | } else { |
468 | param[l].lines = (screens[l].height - BUTTONBAR_HEIGHT - statusbar_size) / param[l].font_h - 1; | 509 | param[l].lines = (screens[l].height - BUTTONBAR_HEIGHT - statusbar_size) / param[l].font_h - 1; |
469 | param[l].keyboard_margin = screens[l].height - BUTTONBAR_HEIGHT - | 510 | param[l].keyboard_margin = screens[l].height - BUTTONBAR_HEIGHT - |
470 | statusbar_size - (param[l].lines+1)*param[l].font_h; | 511 | statusbar_size - (param[l].lines+1)*param[l].font_h; |
471 | if (param[l].keyboard_margin < 3) { | 512 | if (param[l].keyboard_margin < 3) { |
472 | param[l].lines--; | 513 | param[l].lines--; |
@@ -569,13 +610,14 @@ int kbd_input(char* text, int buflen) | |||
569 | 610 | ||
570 | /* write out the text */ | 611 | /* write out the text */ |
571 | screens[l].setfont(param[l].curfont); | 612 | screens[l].setfont(param[l].curfont); |
572 | 613 | ||
573 | i=j=0; | 614 | i=j=0; |
574 | param[l].curpos = MIN(editpos, param[l].max_chars_text | 615 | param[l].curpos = MIN(editpos, param[l].max_chars_text |
575 | - MIN(len_utf8 - editpos, 2)); | 616 | - MIN(len_utf8 - editpos, 2)); |
576 | param[l].leftpos = editpos - param[l].curpos; | 617 | param[l].leftpos = editpos - param[l].curpos; |
577 | utf8 = text + utf8seek(text, param[l].leftpos); | 618 | utf8 = text + utf8seek(text, param[l].leftpos); |
578 | 619 | ||
620 | text_w = param[l].font_w; | ||
579 | while (*utf8 && i < param[l].max_chars_text) { | 621 | while (*utf8 && i < param[l].max_chars_text) { |
580 | outline[j++] = *utf8++; | 622 | outline[j++] = *utf8++; |
581 | if ((*utf8 & MASK) != COMP) { | 623 | if ((*utf8 & MASK) != COMP) { |
@@ -650,7 +692,7 @@ int kbd_input(char* text, int buflen) | |||
650 | button = KBD_CURSOR_LEFT; | 692 | button = KBD_CURSOR_LEFT; |
651 | if (button == KBD_RIGHT || button == (KBD_RIGHT | BUTTON_REPEAT)) | 693 | if (button == KBD_RIGHT || button == (KBD_RIGHT | BUTTON_REPEAT)) |
652 | button = KBD_CURSOR_RIGHT; | 694 | button = KBD_CURSOR_RIGHT; |
653 | #ifdef KBD_RC_LEFT | 695 | #ifdef KBD_RC_LEFT |
654 | if (button == KBD_RC_LEFT || button == (KBD_RC_LEFT | BUTTON_REPEAT)) | 696 | if (button == KBD_RC_LEFT || button == (KBD_RC_LEFT | BUTTON_REPEAT)) |
655 | button = KBD_RC_CURSOR_LEFT; | 697 | button = KBD_RC_CURSOR_LEFT; |
656 | if (button == KBD_RC_RIGHT || button == (KBD_RC_RIGHT | BUTTON_REPEAT)) | 698 | if (button == KBD_RC_RIGHT || button == (KBD_RC_RIGHT | BUTTON_REPEAT)) |
@@ -667,7 +709,7 @@ int kbd_input(char* text, int buflen) | |||
667 | case KBD_ABORT: | 709 | case KBD_ABORT: |
668 | FOR_NB_SCREENS(l) | 710 | FOR_NB_SCREENS(l) |
669 | screens[l].setfont(FONT_UI); | 711 | screens[l].setfont(FONT_UI); |
670 | 712 | ||
671 | #ifdef HAS_BUTTONBAR | 713 | #ifdef HAS_BUTTONBAR |
672 | global_settings.buttonbar=buttonbar_config; | 714 | global_settings.buttonbar=buttonbar_config; |
673 | #endif | 715 | #endif |
@@ -687,7 +729,7 @@ int kbd_input(char* text, int buflen) | |||
687 | { | 729 | { |
688 | if (++param[l].page == param[l].pages) | 730 | if (++param[l].page == param[l].pages) |
689 | param[l].page = 0; | 731 | param[l].page = 0; |
690 | k = (param[l].page*param[l].lines + | 732 | k = (param[l].page*param[l].lines + |
691 | param[l].y)*param[l].max_chars + param[l].x; | 733 | param[l].y)*param[l].max_chars + param[l].x; |
692 | kbd_spellchar(param[l].kbd_buf[k]); | 734 | kbd_spellchar(param[l].kbd_buf[k]); |
693 | } | 735 | } |
@@ -792,7 +834,7 @@ int kbd_input(char* text, int buflen) | |||
792 | #endif | 834 | #endif |
793 | param[l].x = param[l].max_chars - 1; | 835 | param[l].x = param[l].max_chars - 1; |
794 | } | 836 | } |
795 | k = (param[l].page*param[l].lines + | 837 | k = (param[l].page*param[l].lines + |
796 | param[l].y)*param[l].max_chars + param[l].x; | 838 | param[l].y)*param[l].max_chars + param[l].x; |
797 | kbd_spellchar(param[l].kbd_buf[k]); | 839 | kbd_spellchar(param[l].kbd_buf[k]); |
798 | } | 840 | } |
@@ -885,7 +927,7 @@ int kbd_input(char* text, int buflen) | |||
885 | } | 927 | } |
886 | break; | 928 | break; |
887 | 929 | ||
888 | #ifdef KBD_RC_DONE | 930 | #ifdef KBD_RC_DONE |
889 | case KBD_RC_DONE: | 931 | case KBD_RC_DONE: |
890 | #endif | 932 | #endif |
891 | case KBD_DONE: | 933 | case KBD_DONE: |
@@ -918,12 +960,12 @@ int kbd_input(char* text, int buflen) | |||
918 | 960 | ||
919 | #ifdef KBD_RC_SELECT | 961 | #ifdef KBD_RC_SELECT |
920 | case KBD_RC_SELECT: | 962 | case KBD_RC_SELECT: |
921 | 963 | ||
922 | if (button == KBD_RC_SELECT) | 964 | if (button == KBD_RC_SELECT) |
923 | char_screen = 1; | 965 | char_screen = 1; |
924 | #endif | 966 | #endif |
925 | case KBD_SELECT: | 967 | case KBD_SELECT: |
926 | 968 | ||
927 | if (button == KBD_SELECT) | 969 | if (button == KBD_SELECT) |
928 | char_screen = 0; | 970 | char_screen = 0; |
929 | #ifdef KBD_MORSE_INPUT | 971 | #ifdef KBD_MORSE_INPUT |
@@ -972,7 +1014,7 @@ int kbd_input(char* text, int buflen) | |||
972 | { | 1014 | { |
973 | /* find input char */ | 1015 | /* find input char */ |
974 | k = (param[char_screen].page*param[char_screen].lines + | 1016 | k = (param[char_screen].page*param[char_screen].lines + |
975 | param[char_screen].y)*param[char_screen].max_chars + | 1017 | param[char_screen].y)*param[char_screen].max_chars + |
976 | param[char_screen].x; | 1018 | param[char_screen].x; |
977 | if (k < param[char_screen].nchars) | 1019 | if (k < param[char_screen].nchars) |
978 | ch = param[char_screen].kbd_buf[k]; | 1020 | ch = param[char_screen].kbd_buf[k]; |
@@ -981,7 +1023,7 @@ int kbd_input(char* text, int buflen) | |||
981 | /* check for hangul input */ | 1023 | /* check for hangul input */ |
982 | if (ch >= 0x3131 && ch <= 0x3163) | 1024 | if (ch >= 0x3131 && ch <= 0x3163) |
983 | { | 1025 | { |
984 | if (!hangul) | 1026 | if (!hangul) |
985 | { | 1027 | { |
986 | hlead=hvowel=htail=0; | 1028 | hlead=hvowel=htail=0; |
987 | hangul = true; | 1029 | hangul = true; |
@@ -990,10 +1032,10 @@ int kbd_input(char* text, int buflen) | |||
990 | hvowel = ch; | 1032 | hvowel = ch; |
991 | else if (!htail) | 1033 | else if (!htail) |
992 | htail = ch; | 1034 | htail = ch; |
993 | else | 1035 | else |
994 | { /* previous hangul complete */ | 1036 | { /* previous hangul complete */ |
995 | /* check whether tail is actually lead of next char */ | 1037 | /* check whether tail is actually lead of next char */ |
996 | if ((tmp = hangul_join(htail, ch, 0)) != 0xfffd) | 1038 | if ((tmp = hangul_join(htail, ch, 0)) != 0xfffd) |
997 | { | 1039 | { |
998 | tmp = hangul_join(hlead, hvowel, 0); | 1040 | tmp = hangul_join(hlead, hvowel, 0); |
999 | kbd_delchar(text, &editpos); | 1041 | kbd_delchar(text, &editpos); |
@@ -1004,33 +1046,33 @@ int kbd_input(char* text, int buflen) | |||
1004 | hvowel = ch; | 1046 | hvowel = ch; |
1005 | htail = 0; | 1047 | htail = 0; |
1006 | } | 1048 | } |
1007 | else | 1049 | else |
1008 | { | 1050 | { |
1009 | hvowel=htail=0; | 1051 | hvowel=htail=0; |
1010 | hlead = ch; | 1052 | hlead = ch; |
1011 | } | 1053 | } |
1012 | } | 1054 | } |
1013 | /* combine into hangul */ | 1055 | /* combine into hangul */ |
1014 | if ((tmp = hangul_join(hlead, hvowel, htail)) != 0xfffd) | 1056 | if ((tmp = hangul_join(hlead, hvowel, htail)) != 0xfffd) |
1015 | { | 1057 | { |
1016 | kbd_delchar(text, &editpos); | 1058 | kbd_delchar(text, &editpos); |
1017 | ch = tmp; | 1059 | ch = tmp; |
1018 | } | 1060 | } |
1019 | else | 1061 | else |
1020 | { | 1062 | { |
1021 | hvowel=htail=0; | 1063 | hvowel=htail=0; |
1022 | hlead = ch; | 1064 | hlead = ch; |
1023 | } | 1065 | } |
1024 | } | 1066 | } |
1025 | else | 1067 | else |
1026 | hangul = false; | 1068 | hangul = false; |
1027 | 1069 | ||
1028 | /* insert char */ | 1070 | /* insert char */ |
1029 | kbd_inschar(text, buflen, &editpos, ch); | 1071 | kbd_inschar(text, buflen, &editpos, ch); |
1030 | } | 1072 | } |
1031 | if (global_settings.talk_menu) /* voice UI? */ | 1073 | if (global_settings.talk_menu) /* voice UI? */ |
1032 | talk_spell(text, false); | 1074 | talk_spell(text, false); |
1033 | 1075 | ||
1034 | /* speak revised text */ | 1076 | /* speak revised text */ |
1035 | break; | 1077 | break; |
1036 | 1078 | ||
@@ -1041,7 +1083,7 @@ int kbd_input(char* text, int buflen) | |||
1041 | #endif | 1083 | #endif |
1042 | case KBD_BACKSPACE: | 1084 | case KBD_BACKSPACE: |
1043 | case KBD_BACKSPACE | BUTTON_REPEAT: | 1085 | case KBD_BACKSPACE | BUTTON_REPEAT: |
1044 | if (hangul) | 1086 | if (hangul) |
1045 | { | 1087 | { |
1046 | if (htail) | 1088 | if (htail) |
1047 | htail = 0; | 1089 | htail = 0; |
@@ -1051,7 +1093,7 @@ int kbd_input(char* text, int buflen) | |||
1051 | hangul = false; | 1093 | hangul = false; |
1052 | } | 1094 | } |
1053 | kbd_delchar(text, &editpos); | 1095 | kbd_delchar(text, &editpos); |
1054 | if (hangul) | 1096 | if (hangul) |
1055 | { | 1097 | { |
1056 | if (hvowel) | 1098 | if (hvowel) |
1057 | ch = hangul_join(hlead, hvowel, htail); | 1099 | ch = hangul_join(hlead, hvowel, htail); |