1
0
Fork 0
forked from len0rd/rockbox

Keyboard rework & fixes: (1) Separator line no longr wraps at the right border. (2) More compact & straightfoward calculation of cursor position & string part. (3) Code cleanup. (4) Also spell the string when characters are deleted.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5822 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2005-02-07 00:56:26 +00:00
parent 4e7c201b73
commit 0b31a007bb

View file

@ -19,6 +19,7 @@
#include "lcd.h"
#include "button.h"
#include "kernel.h"
#include "system.h"
#include "version.h"
#include "debug_menu.h"
#include "sprintf.h"
@ -74,41 +75,40 @@
static void kbd_setupkeys(const char* line[KEYBOARD_LINES], int page)
{
switch (page) {
case 0:
line[0] = "ABCDEFG !?\" @#$%+'";
line[1] = "HIJKLMN 789 &_()-`";
line[2] = "OPQRSTU 456 §|{}/<";
line[3] = "VWXYZ.,0123 ~=[]*>";
break;
switch (page)
{
case 0:
line[0] = "ABCDEFG !?\" @#$%+'";
line[1] = "HIJKLMN 789 &_()-`";
line[2] = "OPQRSTU 456 §|{}/<";
line[3] = "VWXYZ.,0123 ~=[]*>";
break;
case 1:
line[0] = "abcdefg ¢£¤¥¦§©®¬";
line[1] = "hijklmn «»°ºª¹²³¶";
line[2] = "opqrstu ¯±×÷¡¿µ·¨";
line[3] = "vwxyz., ¼½¾ ";
break;
case 1:
line[0] = "abcdefg ¢£¤¥¦§©®¬";
line[1] = "hijklmn «»°ºª¹²³¶";
line[2] = "opqrstu ¯±×÷¡¿µ·¨";
line[3] = "vwxyz., ¼½¾ ";
break;
case 2:
line[0] = "ÀÁÂÃÄÅÆ ÌÍÎÏ ÈÉÊË";
line[1] = "àáâãäåæ ìíîï èéêë";
line[2] = "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ";
line[3] = "òóôõöø çðþýÿ ùúûü";
break;
case 2:
line[0] = "ÀÁÂÃÄÅÆ ÌÍÎÏ ÈÉÊË";
line[1] = "àáâãäåæ ìíîï èéêë";
line[2] = "ÓÒÔÕÖØ ÇÐÞÝß ÙÚÛÜ";
line[3] = "òóôõöø çðþýÿ ùúûü";
break;
}
}
/* helper function to spell a char if voice UI is enabled */
void kbd_spellchar(char c)
static void kbd_spellchar(char c)
{
char spell_char[2]; /* store char to pass to talk_spell */
static char spell_char[2] = "\0\0"; /* store char to pass to talk_spell */
if (global_settings.talk_menu) /* voice UI? */
{
spell_char[0] = c;
spell_char[1] = '\0'; /* mark end of char string */
talk_spell(spell_char, false);
talk_spell(spell_char, false);
}
}
@ -120,9 +120,9 @@ int kbd_input(char* text, int buflen)
int font_w = 0, font_h = 0, i;
int x = 0, y = 0;
int main_x, main_y, max_chars, margin;
int status_y1, status_y2, curpos;
int status_y1, status_y2;
int len;
int editpos;
int editpos, curpos, leftpos;
bool redraw = true;
const char* line[KEYBOARD_LINES];
#ifdef KBD_MODES
@ -146,7 +146,7 @@ int kbd_input(char* text, int buflen)
editpos = strlen(text);
max_chars = LCD_WIDTH / font_w;
max_chars = LCD_WIDTH / font_w - 2; /* leave room for < and > */
kbd_setupkeys(line, page);
if (global_settings.talk_menu) /* voice UI? */
@ -159,75 +159,38 @@ int kbd_input(char* text, int buflen)
if(redraw)
{
lcd_clear_display();
lcd_setfont(FONT_SYSFIXED);
lcd_setfont(FONT_SYSFIXED);
/* draw page */
for (i=0; i < KEYBOARD_LINES; i++)
lcd_putsxy(0, 8+i * font_h, line[i]);
/* separator */
lcd_drawline(0, main_y - margin, LCD_WIDTH, main_y - margin);
lcd_drawline(0, main_y - margin, LCD_WIDTH - 1, main_y - margin);
/* write out the text */
if (editpos < max_chars - 3 )
{
strncpy(outline, text, max_chars - 2);
if (len > max_chars - 2)
lcd_putsxy(LCD_WIDTH - font_w, main_y, ">");
curpos = (1 + editpos) * font_w;
}
else
{
/* not room for all text, cut left, right or both */
if (editpos == len )
{
if ( max_chars - 3 == len)
{
strncpy(outline, text, max_chars - 2);
curpos = (1 + editpos) * font_w;
}
else
{
strncpy(outline, text + editpos - max_chars + 2,
max_chars - 2);
if (len > max_chars - 2)
lcd_putsxy(0, main_y, "<");
curpos = ( max_chars - 1) * font_w;
}
}
else
{
if (len - 1 == editpos)
{
strncpy(outline, text + editpos - max_chars + 3,
max_chars - 2);
curpos = ( max_chars - 2) * font_w;
}
else
{
strncpy(outline, text + editpos - max_chars + 4,
max_chars - 2);
curpos = ( max_chars - 3) * font_w;
}
lcd_putsxy(LCD_WIDTH - font_w, main_y, ">");
lcd_putsxy(0, main_y, "<");
}
}
/* Zero terminate the string */
outline[max_chars - 2] = '\0';
curpos = MIN(editpos, max_chars - MIN(len - editpos, 2));
leftpos = editpos - curpos;
strncpy(outline, text + leftpos, max_chars);
outline[max_chars] = 0;
lcd_putsxy(font_w,main_y,outline);
lcd_putsxy(font_w, main_y, outline);
if (leftpos)
lcd_putsxy(0, main_y, "<");
if (len - leftpos > max_chars)
lcd_putsxy(LCD_WIDTH - font_w, main_y, ">");
/* cursor */
lcd_drawline(curpos, main_y, curpos, main_y + font_h);
i = (curpos + 1) * font_w;
lcd_drawline(i, main_y, i, main_y + font_h);
#if CONFIG_KEYPAD == RECORDER_PAD
/* draw the status bar */
buttonbar_set("Shift", "OK", "Del");
buttonbar_draw();
#endif
#endif
#ifdef KBD_MODES
if (!line_edit)
@ -265,11 +228,11 @@ int kbd_input(char* text, int buflen)
#ifdef KBD_MODES
if (line_edit) /* right doubles as cursor_right in line_edit */
{
editpos++;
if (editpos > len)
editpos = len;
else
if (editpos < len)
{
editpos++;
kbd_spellchar(text[editpos]);
}
}
else
#endif
@ -294,11 +257,11 @@ int kbd_input(char* text, int buflen)
#ifdef KBD_MODES
if (line_edit) /* left doubles as cursor_left in line_edit */
{
editpos--;
if (editpos < 0)
editpos = 0;
else
if (editpos)
{
editpos--;
kbd_spellchar(text[editpos]);
}
}
else
#endif
@ -382,38 +345,34 @@ int kbd_input(char* text, int buflen)
{
if (editpos > 0)
{
for (i = editpos; i <= (len - 1);i++)
{
for (i = editpos; i < len; i++)
text[i-1] = text[i];
}
text[i-1]='\0';
text[i-1] = '\0';
editpos--;
if (editpos < 0)
editpos=0;
}
}
else
#endif
{
if (len<buflen)
if (len < buflen)
{
c = line[y][x];
if ( editpos == len )
if (editpos == len)
{
text[len] = c;
text[len+1] = 0;
}
else
{
for (i = len ; i + 1 > editpos; i--)
for (i = len ; i >= editpos; i--)
text[i+1] = text[i];
text[editpos] = c;
}
editpos++;
}
if (global_settings.talk_menu) /* voice UI? */
talk_spell(text, false); /* speak revised text */
}
if (global_settings.talk_menu) /* voice UI? */
talk_spell(text, false); /* speak revised text */
break;
#ifndef KBD_MODES
@ -421,33 +380,31 @@ int kbd_input(char* text, int buflen)
case KBD_BACKSPACE | BUTTON_REPEAT:
if (editpos > 0)
{
for (i = editpos; i <= (len - 1);i++)
{
for (i = editpos; i < len; i++)
text[i-1] = text[i];
}
text[i-1]='\0';
text[i-1] = '\0';
editpos--;
if (editpos < 0)
editpos=0;
}
if (global_settings.talk_menu) /* voice UI? */
talk_spell(text, false); /* speak revised text */
break;
case KBD_CURSOR_RIGHT:
case KBD_CURSOR_RIGHT | BUTTON_REPEAT:
editpos++;
if (editpos > len)
editpos = len;
else
if (editpos < len)
{
editpos++;
kbd_spellchar(text[editpos]);
}
break;
case KBD_CURSOR_LEFT:
case KBD_CURSOR_LEFT | BUTTON_REPEAT:
editpos--;
if (editpos < 0)
editpos = 0;
else
if (editpos)
{
editpos--;
kbd_spellchar(text[editpos]);
}
break;
#endif /* !KBD_MODES */