1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Björn Stenberg
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
28 #include "statusbar.h"
31 #include "rbunicode.h"
36 #define KBD_BUF_SIZE 64
37 #define KEYBOARD_PAGES 3
39 static unsigned short *kbd_setupkeys(int page
, int* len
)
41 static unsigned short kbdline
[KBD_BUF_SIZE
];
42 const unsigned char *p
;
47 case 0: /* Capitals */
48 p
= "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅ"
49 "ÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ";
53 p
= "abcdefghijklmnopqrstuvwxyzßàáâãä"
54 "åçèéêëìíîïñòóôõöøùúûüýÿ";
58 p
= " !\"#$%&'()*+,-./0123456789:;<=>?@[]_{}~";
63 p
= utf8decode(p
, &kbdline
[i
++]);
70 /* Delimiters for highlighting the character selected for insertion */
71 #define KEYBOARD_INSERT_LEFT 0xe110
72 #define KEYBOARD_INSERT_RIGHT 0xe10f
74 #define KEYBOARD_CURSOR 0x7f
75 #define KEYBOARD_ARROW 0xe10c
77 /* helper function to spell a char if voice UI is enabled */
78 static void kbd_spellchar(unsigned short c
)
80 if (global_settings
.talk_menu
) /* voice UI? */
83 /* store char to pass to talk_spell */
84 unsigned char* utf8
= utf8encode(c
, tmp
);
88 talk_id(VOICE_BLANK
, false);
90 talk_spell(tmp
, false);
94 static void say_edit(void)
96 if (global_settings
.talk_menu
)
97 talk_id(VOICE_EDIT
, false);
100 int kbd_input(char* text
, int buflen
)
104 bool line_edit
= false;
108 int len
, len_utf8
, i
, j
;
109 int editpos
, curpos
, leftpos
;
110 unsigned short *line
= kbd_setupkeys(page
, &linelen
);
111 unsigned char temptext
[36];
114 int button
, lastbutton
= 0;
115 int ret
= 0; /* assume success */
117 editpos
= utf8length(text
);
119 if (global_settings
.talk_menu
) /* voice UI? */
120 talk_spell(text
, true); /* spell initial text */
125 len_utf8
= utf8length(text
);
132 lcd_putc(0, 1, KEYBOARD_ARROW
);
136 lcd_putc(0, 0, KEYBOARD_ARROW
);
140 lcd_putc(1, 0, KEYBOARD_INSERT_LEFT
);
141 lcd_putc(2, 0, line
[x
]);
142 lcd_putc(3, 0, KEYBOARD_INSERT_RIGHT
);
143 for (i
= 1; i
< 8; i
++)
145 lcd_putc(i
+ 3, 0, line
[(x
+i
)%linelen
]);
148 /* write out the text */
149 curpos
= MIN(MIN(editpos
, 10 - MIN(len_utf8
- editpos
, 3)), 9);
150 leftpos
= editpos
- curpos
;
152 utf8
= text
+ utf8seek(text
, leftpos
);
159 utf8
= text
+ utf8seek(text
, leftpos
+1);
161 while (*utf8
&& i
< 10) {
162 temptext
[j
++] = *utf8
++;
163 if ((*utf8
& MASK
) != COMP
)
169 if (len_utf8
- leftpos
> 10) {
170 utf8
= temptext
+ utf8seek(temptext
, 9);
176 lcd_puts(1, 1, temptext
);
177 lcd_put_cursor(curpos
+ 1, 1, KEYBOARD_CURSOR
);
179 gui_syncstatusbar_draw(&statusbars
, true);
182 /* The default action is to redraw */
185 button
= button_get_w_tmo(HZ
/2);
188 case BUTTON_STOP
: /* abort */
189 ret
= -1; done
= true;
192 case BUTTON_MENU
: /* page flip */
193 if (++page
== KEYBOARD_PAGES
)
195 line
= kbd_setupkeys(page
, &linelen
);
198 kbd_spellchar(line
[x
]);
201 case BUTTON_ON
: /* toggle mode */
202 line_edit
= !line_edit
;
206 kbd_spellchar(line
[x
]);
210 case BUTTON_RIGHT
| BUTTON_REPEAT
:
213 if (editpos
< len_utf8
)
216 int c
= utf8seek(text
, editpos
);
217 kbd_spellchar(text
[c
]);
224 kbd_spellchar(line
[x
]);
229 case BUTTON_LEFT
| BUTTON_REPEAT
:
235 int c
= utf8seek(text
, editpos
);
236 kbd_spellchar(text
[c
]);
243 kbd_spellchar(line
[x
]);
247 case BUTTON_PLAY
| BUTTON_REPEAT
:
248 /* accepts what was entered and continues */
249 ret
= 0; done
= true;
252 case BUTTON_PLAY
| BUTTON_REL
:
253 if (lastbutton
!= BUTTON_PLAY
)
255 if (line_edit
) /* backspace in line_edit */
259 utf8
= text
+ utf8seek(text
, editpos
);
264 } while ((*utf8
& MASK
) == COMP
);
273 else /* inserts the selected char */
275 utf8
= utf8encode(line
[x
], temptext
);
277 j
= strlen(temptext
);
278 if (len
+ j
< buflen
)
281 for (i
= len
+j
; k
>= editpos
; i
--) {
283 if ((text
[i
] & MASK
) != COMP
)
287 text
[i
--] = temptext
[j
];
291 if (global_settings
.talk_menu
) /* voice UI? */
292 talk_spell(text
, false); /* speak revised text */
296 gui_syncstatusbar_draw(&statusbars
, false);
301 default_event_handler(button
);
304 if (button
!= BUTTON_NONE
)
309 splash(HZ
/2, ID2P(LANG_CANCEL
));