7 #if CONFIG_KEYPAD == RECORDER_PAD
8 #define BUTTONBAR_HEIGHT 8
10 #define BUTTONBAR_HEIGHT 0
13 #define DEFAULT_MARGIN 6
14 #define KBD_BUF_SIZE 500
15 #define kbd_loaded false
16 #define statusbar_size 0
18 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
19 (CONFIG_KEYPAD == IRIVER_H300_PAD)
20 #define KBD_SELECT BUTTON_SELECT
21 #define KBD_ABORT BUTTON_OFF
22 #define KBD_LEFT BUTTON_LEFT
23 #define KBD_RIGHT BUTTON_RIGHT
24 #define KBD_UP BUTTON_UP
25 #define KBD_DOWN BUTTON_DOWN
27 #elif CONFIG_KEYPAD == RECORDER_PAD
28 #define KBD_SELECT BUTTON_PLAY
29 #define KBD_ABORT BUTTON_OFF
30 #define KBD_LEFT BUTTON_LEFT
31 #define KBD_RIGHT BUTTON_RIGHT
32 #define KBD_UP BUTTON_UP
33 #define KBD_DOWN BUTTON_DOWN
35 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
36 #define KBD_SELECT BUTTON_SELECT
37 #define KBD_ABORT BUTTON_OFF
38 #define KBD_LEFT BUTTON_LEFT
39 #define KBD_RIGHT BUTTON_RIGHT
40 #define KBD_UP BUTTON_UP
41 #define KBD_DOWN BUTTON_DOWN
43 #elif CONFIG_KEYPAD == ONDIO_PAD /* restricted Ondio keypad */
44 #define KBD_SELECT BUTTON_MENU
45 #define KBD_ABORT BUTTON_OFF
46 #define KBD_LEFT BUTTON_LEFT
47 #define KBD_RIGHT BUTTON_RIGHT
48 #define KBD_UP BUTTON_UP
49 #define KBD_DOWN BUTTON_DOWN
51 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
52 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
53 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
55 #define KBD_SELECT BUTTON_SELECT
56 #define KBD_ABORT BUTTON_MENU
57 #define KBD_LEFT BUTTON_LEFT
58 #define KBD_RIGHT BUTTON_RIGHT
59 #define KBD_UP BUTTON_SCROLL_BACK
60 #define KBD_DOWN BUTTON_SCROLL_FWD
62 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
64 /* TODO: Check keyboard mappings */
66 #define KBD_SELECT BUTTON_SELECT
67 #define KBD_ABORT BUTTON_PLAY
68 #define KBD_LEFT BUTTON_LEFT
69 #define KBD_RIGHT BUTTON_RIGHT
70 #define KBD_UP BUTTON_UP
71 #define KBD_DOWN BUTTON_DOWN
73 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
75 /* TODO: Check keyboard mappings */
77 #define KBD_SELECT BUTTON_SELECT
78 #define KBD_ABORT BUTTON_REC
79 #define KBD_LEFT BUTTON_LEFT
80 #define KBD_RIGHT BUTTON_RIGHT
81 #define KBD_UP BUTTON_UP
82 #define KBD_DOWN BUTTON_DOWN
84 #elif CONFIG_KEYPAD == GIGABEAT_PAD
86 #define KBD_SELECT BUTTON_SELECT
87 #define KBD_ABORT BUTTON_POWER
88 #define KBD_LEFT BUTTON_LEFT
89 #define KBD_RIGHT BUTTON_RIGHT
90 #define KBD_UP BUTTON_UP
91 #define KBD_DOWN BUTTON_DOWN
93 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
95 #define KBD_SELECT BUTTON_SELECT
96 #define KBD_ABORT BUTTON_POWER
97 #define KBD_LEFT BUTTON_LEFT
98 #define KBD_RIGHT BUTTON_RIGHT
99 #define KBD_UP BUTTON_UP
100 #define KBD_DOWN BUTTON_DOWN
102 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
104 /* TODO: Check keyboard mappings */
106 #define KBD_SELECT BUTTON_REW
107 #define KBD_ABORT BUTTON_FF
108 #define KBD_LEFT BUTTON_LEFT
109 #define KBD_RIGHT BUTTON_RIGHT
110 #define KBD_UP BUTTON_SCROLL_UP
111 #define KBD_DOWN BUTTON_SCROLL_DOWN
113 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
114 (CONFIG_KEYPAD == SANSA_C200_PAD) || \
115 (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
116 (CONFIG_KEYPAD == SANSA_M200_PAD) || \
117 (CONFIG_KEYPAD == SANSA_FUZE_PAD) || \
118 (CONFIG_KEYPAD == MROBE100_PAD)
120 /* TODO: Check keyboard mappings */
122 #define KBD_SELECT BUTTON_SELECT
123 #define KBD_ABORT BUTTON_POWER
124 #define KBD_LEFT BUTTON_LEFT
125 #define KBD_RIGHT BUTTON_RIGHT
126 #define KBD_UP BUTTON_UP
127 #define KBD_DOWN BUTTON_DOWN
129 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
131 #define KBD_SELECT BUTTON_RC_PLAY
132 #define KBD_ABORT BUTTON_RC_REC
133 #define KBD_LEFT BUTTON_RC_REW
134 #define KBD_RIGHT BUTTON_RC_FF
135 #define KBD_UP BUTTON_RC_VOL_UP
136 #define KBD_DOWN BUTTON_RC_VOL_DOWN
138 #elif CONFIG_KEYPAD == COWON_D2_PAD
140 #define KBD_ABORT BUTTON_POWER
142 #elif CONFIG_KEYPAD == IAUDIO67_PAD
144 #define KBD_SELECT BUTTON_MENU
145 #define KBD_ABORT BUTTON_POWER
146 #define KBD_LEFT BUTTON_LEFT
147 #define KBD_RIGHT BUTTON_RIGHT
148 #define KBD_UP BUTTON_STOP
149 #define KBD_DOWN BUTTON_PLAY
151 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
153 #define KBD_SELECT BUTTON_SELECT
154 #define KBD_ABORT BUTTON_BACK
155 #define KBD_LEFT BUTTON_LEFT
156 #define KBD_RIGHT BUTTON_RIGHT
157 #define KBD_UP BUTTON_UP
158 #define KBD_DOWN BUTTON_DOWN
160 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
162 #define KBD_SELECT BUTTON_MENU
163 #define KBD_ABORT BUTTON_POWER
164 #define KBD_LEFT BUTTON_LEFT
165 #define KBD_RIGHT BUTTON_RIGHT
166 #define KBD_UP BUTTON_UP
167 #define KBD_DOWN BUTTON_DOWN
169 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
171 #define KBD_SELECT BUTTON_MENU
172 #define KBD_ABORT BUTTON_POWER
173 #define KBD_LEFT BUTTON_LEFT
174 #define KBD_RIGHT BUTTON_RIGHT
175 #define KBD_UP BUTTON_UP
176 #define KBD_DOWN BUTTON_DOWN
178 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
180 #define KBD_SELECT BUTTON_MENU
181 #define KBD_ABORT BUTTON_POWER
182 #define KBD_LEFT BUTTON_PREV
183 #define KBD_RIGHT BUTTON_NEXT
184 #define KBD_UP BUTTON_UP
185 #define KBD_DOWN BUTTON_DOWN
187 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
189 #define KBD_SELECT BUTTON_PLAY
190 #define KBD_ABORT BUTTON_REW
191 #define KBD_LEFT BUTTON_LEFT
192 #define KBD_RIGHT BUTTON_RIGHT
193 #define KBD_UP BUTTON_UP
194 #define KBD_DOWN BUTTON_DOWN
196 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
198 #define KBD_SELECT BUTTON_OK
199 #define KBD_ABORT BUTTON_CANCEL
200 #define KBD_LEFT BUTTON_PREV
201 #define KBD_RIGHT BUTTON_NEXT
202 #define KBD_UP BUTTON_UP
203 #define KBD_DOWN BUTTON_DOWN
205 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
207 #define KBD_SELECT BUTTON_FUNC
208 #define KBD_ABORT BUTTON_REC
209 #define KBD_LEFT BUTTON_VOL_DOWN
210 #define KBD_RIGHT BUTTON_VOL_UP
211 #define KBD_UP BUTTON_REW
212 #define KBD_DOWN BUTTON_FF
214 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
216 #define KBD_SELECT BUTTON_ENTER
217 #define KBD_ABORT BUTTON_MENU
218 #define KBD_LEFT BUTTON_REW
219 #define KBD_RIGHT BUTTON_FF
220 #define KBD_UP BUTTON_UP
221 #define KBD_DOWN BUTTON_DOWN
225 #ifdef HAVE_TOUCHSCREEN
227 #define KBD_SELECT BUTTON_CENTER
230 #define KBD_ABORT BUTTON_TOPLEFT
233 #define KBD_LEFT BUTTON_MIDLEFT
236 #define KBD_RIGHT BUTTON_MIDRIGHT
239 #define KBD_UP BUTTON_TOPMIDDLE
242 #define KBD_DOWN BUTTON_BOTTOMMIDDLE
246 struct keyboard_parameters
{
247 const unsigned char* default_kbd
;
249 unsigned short kbd_buf
[KBD_BUF_SIZE
];
270 struct keyboard_parameters param
[NB_SCREENS
];
272 int zx_kbd_input(char* text
/*, int buflen*/)
277 int len_utf8
/*, c = 0*/;
279 /* int statusbar_size = global_settings.statusbar ? STATUSBAR_HEIGHT : 0;*/
280 unsigned short ch
/*, tmp, hlead = 0, hvowel = 0, htail = 0*/;
281 /*bool hangul = false;*/
283 const unsigned char *p
;
284 bool cur_blink
= true;
289 param
[l
].default_kbd
=
297 param
[l
].DEFAULT_LINES
= 7;
301 int button
, lastbutton
= 0;
304 /* Copy default keyboard to buffer */
306 param
[l
].curfont
= FONT_SYSFIXED
;
307 p
= param
[l
].default_kbd
;
309 p
= rb
->utf8decode(p
, ¶m
[l
].kbd_buf
[i
++]);
311 /* param[l].curfont = FONT_UI;*/
315 param
[l
].font
= rb
->font_get(param
[l
].curfont
);
316 param
[l
].font_h
= param
[l
].font
->height
;
318 /* check if FONT_UI fits the screen */
319 if (2*param
[l
].font_h
+3 + BUTTONBAR_HEIGHT
>
320 rb
->screens
[l
]->getheight()) {
321 param
[l
].font
= rb
->font_get(FONT_SYSFIXED
);
322 param
[l
].font_h
= param
[l
].font
->height
;
323 param
[l
].curfont
= FONT_SYSFIXED
;
326 rb
->screens
[l
]->setfont(param
[l
].curfont
);
327 /* find max width of keyboard glyphs */
328 for (i
=0; i
<param
[l
].nchars
; i
++) {
329 w
= rb
->font_get_width(param
[l
].font
, param
[l
].kbd_buf
[i
]);
330 if (w
> param
[l
].font_w
)
333 /* Since we're going to be adding spaces, make sure that we check
335 w
= rb
->font_get_width( param
[l
].font
, ' ' );
336 if( w
> param
[l
].font_w
)
342 /* Pad lines with spaces */
343 while( i
< param
[l
].nchars
)
345 if( param
[l
].kbd_buf
[i
] == '\n' )
347 k
= ( rb
->screens
[l
]->getwidth() / param
[l
].font_w
) -
348 i
% ( rb
->screens
[l
]->getwidth() / param
[l
].font_w
) - 1;
349 if( k
== ( rb
->screens
[l
]->getwidth() / param
[l
].font_w
) - 1 )
352 for( j
= i
; j
< param
[l
].nchars
; j
++ )
354 param
[l
].kbd_buf
[j
] = param
[l
].kbd_buf
[j
+1];
359 if( param
[l
].nchars
+ k
- 1 >= KBD_BUF_SIZE
)
360 { /* We don't want to overflow the buffer */
361 k
= KBD_BUF_SIZE
- param
[l
].nchars
;
363 for( j
= param
[l
].nchars
+ k
- 1; j
> i
+k
; j
-- )
365 param
[l
].kbd_buf
[j
] = param
[l
].kbd_buf
[j
-k
];
367 param
[l
].nchars
+= k
;
371 param
[l
].kbd_buf
[i
++] = ' ';
380 /* find max width for text string */
384 text_w
= param
[l
].font_w
;
386 utf8
= (unsigned char*)rb
->utf8decode(utf8
, &ch
);
387 w
= rb
->font_get_width(param
[l
].font
, ch
);
391 param
[l
].max_chars_text
= rb
->screens
[l
]->getwidth() / text_w
- 2;
393 /* calculate keyboard grid size */
394 param
[l
].max_chars
= rb
->screens
[l
]->getwidth() / param
[l
].font_w
;
396 param
[l
].lines
= param
[l
].DEFAULT_LINES
;
397 param
[l
].keyboard_margin
= DEFAULT_MARGIN
;
399 param
[l
].lines
= (rb
->screens
[l
]->lcdheight
- BUTTONBAR_HEIGHT
-
400 statusbar_size
) / param
[l
].font_h
- 1;
401 param
[l
].keyboard_margin
= rb
->screens
[l
]->lcdheight
-
402 BUTTONBAR_HEIGHT
- statusbar_size
-
403 (param
[l
].lines
+1)*param
[l
].font_h
;
404 if (param
[l
].keyboard_margin
< 3) {
406 param
[l
].keyboard_margin
+= param
[l
].font_h
;
408 if (param
[l
].keyboard_margin
> 6)
409 param
[l
].keyboard_margin
= 6;
412 param
[l
].pages
= (param
[l
].nchars
+ (param
[l
].lines
*param
[l
].max_chars
-1))
413 /(param
[l
].lines
*param
[l
].max_chars
);
414 if (param
[l
].pages
== 1 && kbd_loaded
)
415 param
[l
].lines
= (param
[l
].nchars
+ param
[l
].max_chars
- 1) / param
[l
].max_chars
;
417 param
[l
].main_y
= param
[l
].font_h
*param
[l
].lines
+ param
[l
].keyboard_margin
+ statusbar_size
;
419 param
[l
].keyboard_margin
-= param
[l
].keyboard_margin
/2;
422 editpos
= rb
->utf8length(text
);
428 len_utf8
= rb
->utf8length(text
);
430 rb
->screens
[l
]->clear_display();
436 rb
->screens
[l
]->setfont(param
[l
].curfont
);
437 k
= param
[l
].page
*param
[l
].max_chars
*param
[l
].lines
;
438 for (i
=j
=0; j
< param
[l
].lines
&& k
< param
[l
].nchars
; k
++) {
439 utf8
= rb
->utf8encode(param
[l
].kbd_buf
[k
], outline
);
441 rb
->screens
[l
]->getstringsize(outline
, &w
, NULL
);
442 rb
->screens
[l
]->putsxy(i
*param
[l
].font_w
+ (param
[l
].font_w
-w
)/2, j
*param
[l
].font_h
443 + statusbar_size
, outline
);
444 if (++i
== param
[l
].max_chars
) {
455 rb
->screens
[l
]->hline(0, rb
->screens
[l
]->getwidth() - 1,
456 param
[l
].main_y
- param
[l
].keyboard_margin
);
458 /* write out the text */
460 rb
->screens
[l
]->setfont(param
[l
].curfont
);
463 param
[l
].curpos
= MIN(editpos
, param
[l
].max_chars_text
464 - MIN(len_utf8
- editpos
, 2));
465 param
[l
].leftpos
= editpos
- param
[l
].curpos
;
466 utf8
= text
+ rb
->utf8seek(text
, param
[l
].leftpos
);
468 text_w
= param
[l
].font_w
;
469 while (*utf8
&& i
< param
[l
].max_chars_text
) {
470 outline
[j
++] = *utf8
++;
471 if ((*utf8
& MASK
) != COMP
) {
475 rb
->screens
[l
]->getstringsize(outline
, &w
, NULL
);
476 rb
->screens
[l
]->putsxy(i
*text_w
+ (text_w
-w
)/2, param
[l
].main_y
, outline
);
480 if (param
[l
].leftpos
) {
481 rb
->screens
[l
]->getstringsize("<", &w
, NULL
);
482 rb
->screens
[l
]->putsxy(text_w
- w
, param
[l
].main_y
, "<");
484 if (len_utf8
- param
[l
].leftpos
> param
[l
].max_chars_text
)
485 rb
->screens
[l
]->putsxy(rb
->screens
[l
]->width
- text_w
, param
[l
].main_y
, ">");
488 i
= (param
[l
].curpos
+ 1) * text_w
;
490 rb
->screens
[l
]->vline(i
, param
[l
].main_y
, param
[l
].main_y
+ param
[l
].font_h
-1);
492 if (hangul
) /* draw underbar */
493 rb
->screens
[l
]->hline(param
[l
].curpos
*text_w
, (param
[l
].curpos
+1)*text_w
,
494 param
[l
].main_y
+param
[l
].font_h
-1);
497 cur_blink
= !cur_blink
;
500 /* highlight the key that has focus */
503 rb
->screens
[l
]->set_drawmode(DRMODE_COMPLEMENT
);
504 rb
->screens
[l
]->fillrect(param
[l
].font_w
* param
[l
].x
,
505 statusbar_size
+ param
[l
].font_h
* param
[l
].y
,
506 param
[l
].font_w
, param
[l
].font_h
);
507 rb
->screens
[l
]->set_drawmode(DRMODE_SOLID
);
511 rb
->screens
[l
]->update();
513 button
= rb
->button_get_w_tmo(HZ
/2);
519 rb
->screens
[l
]->setfont(FONT_UI
);
525 case KBD_RIGHT
| BUTTON_REPEAT
:
529 if (++param
[l
].x
== param
[l
].max_chars
) {
531 /* no dedicated flip key - flip page on wrap */
532 if (++param
[l
].page
== param
[l
].pages
)
535 k
= (param
[l
].page
*param
[l
].lines
+ param
[l
].y
)*param
[l
].max_chars
+ param
[l
].x
;
536 /*kbd_spellchar(param[l].kbd_buf[k]);*/
541 case KBD_LEFT
| BUTTON_REPEAT
:
549 /* no dedicated flip key - flip page on wrap */
550 if (--param
[l
].page
< 0)
551 param
[l
].page
= (param
[l
].pages
-1);
552 param
[l
].x
= param
[l
].max_chars
- 1;
554 k
= (param
[l
].page
*param
[l
].lines
+
555 param
[l
].y
)*param
[l
].max_chars
+ param
[l
].x
;
556 /* kbd_spellchar(param[l].kbd_buf[k]);*/
562 case KBD_DOWN
| BUTTON_REPEAT
:
566 if (param
[l
].y
< param
[l
].lines
- 1)
573 k
= (param
[l
].page
*param
[l
].lines
+ param
[l
].y
)*
574 param
[l
].max_chars
+ param
[l
].x
;
575 /*kbd_spellchar(param[l].kbd_buf[k]);*/
581 case KBD_UP
| BUTTON_REPEAT
:
588 param
[l
].y
= param
[l
].lines
- 1;
592 k
= (param
[l
].page
*param
[l
].lines
+ param
[l
].y
)*
593 param
[l
].max_chars
+ param
[l
].x
;
594 /*kbd_spellchar(param[l].kbd_buf[k]);*/
601 if (button
== KBD_SELECT
)
604 /* inserts the selected char */
606 /* find input char */
607 k
= (param
[char_screen
].page
*param
[char_screen
].lines
+
608 param
[char_screen
].y
)*param
[char_screen
].max_chars
+
609 param
[char_screen
].x
;
610 if (k
< param
[char_screen
].nchars
)
611 ch
= param
[char_screen
].kbd_buf
[k
];
621 if(rb
->default_event_handler(button
) == SYS_USB_CONNECTED
)
623 rb
->screens
[l
]->setfont(FONT_SYSFIXED
);
627 if (button
!= BUTTON_NONE
)
634 rb
->screens
[l
]->setfont(FONT_UI
);