summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/recorder/keyboard.c124
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, &param[l].kbd_buf[i[l]]); 262 utf8decode(buf, &param[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, &param[l].kbd_buf[i]); 418 p = utf8decode(p, &param[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);