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 == MROBE100_PAD)
117 /* TODO: Check keyboard mappings */
119 #define KBD_SELECT BUTTON_SELECT
120 #define KBD_ABORT BUTTON_POWER
121 #define KBD_LEFT BUTTON_LEFT
122 #define KBD_RIGHT BUTTON_RIGHT
123 #define KBD_UP BUTTON_UP
124 #define KBD_DOWN BUTTON_DOWN
126 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
128 #define KBD_SELECT BUTTON_RC_PLAY
129 #define KBD_ABORT BUTTON_RC_REC
130 #define KBD_LEFT BUTTON_RC_REW
131 #define KBD_RIGHT BUTTON_RC_FF
132 #define KBD_UP BUTTON_RC_VOL_UP
133 #define KBD_DOWN BUTTON_RC_VOL_DOWN
135 #elif CONFIG_KEYPAD == COWOND2_PAD
137 #define KBD_ABORT BUTTON_POWER
143 #define KBD_SELECT BUTTON_CENTER
146 #define KBD_ABORT BUTTON_TOPLEFT
149 #define KBD_LEFT BUTTON_MIDLEFT
152 #define KBD_RIGHT BUTTON_MIDRIGHT
155 #define KBD_UP BUTTON_TOPMIDDLE
158 #define KBD_DOWN BUTTON_BOTTOMMIDDLE
162 struct keyboard_parameters
{
163 const unsigned char* default_kbd
;
165 unsigned short kbd_buf
[KBD_BUF_SIZE
];
186 struct keyboard_parameters param
[NB_SCREENS
];
188 int zx_kbd_input(char* text
/*, int buflen*/)
193 int len_utf8
/*, c = 0*/;
195 /* int statusbar_size = global_settings.statusbar ? STATUSBAR_HEIGHT : 0;*/
196 unsigned short ch
/*, tmp, hlead = 0, hvowel = 0, htail = 0*/;
197 /*bool hangul = false;*/
199 const unsigned char *p
;
200 bool cur_blink
= true;
205 param
[l
].default_kbd
=
213 param
[l
].DEFAULT_LINES
= 7;
217 int button
, lastbutton
= 0;
220 /* Copy default keyboard to buffer */
222 param
[l
].curfont
= FONT_SYSFIXED
;
223 p
= param
[l
].default_kbd
;
225 p
= rb
->utf8decode(p
, ¶m
[l
].kbd_buf
[i
++]);
227 /* param[l].curfont = FONT_UI;*/
231 param
[l
].font
= rb
->font_get(param
[l
].curfont
);
232 param
[l
].font_h
= param
[l
].font
->height
;
234 /* check if FONT_UI fits the screen */
235 if (2*param
[l
].font_h
+3 + BUTTONBAR_HEIGHT
> rb
->screens
[l
]->height
) {
236 param
[l
].font
= rb
->font_get(FONT_SYSFIXED
);
237 param
[l
].font_h
= param
[l
].font
->height
;
238 param
[l
].curfont
= FONT_SYSFIXED
;
241 rb
->screens
[l
]->setfont(param
[l
].curfont
);
242 /* find max width of keyboard glyphs */
243 for (i
=0; i
<param
[l
].nchars
; i
++) {
244 w
= rb
->font_get_width(param
[l
].font
, param
[l
].kbd_buf
[i
]);
245 if (w
> param
[l
].font_w
)
248 /* Since we're going to be adding spaces, make sure that we check
250 w
= rb
->font_get_width( param
[l
].font
, ' ' );
251 if( w
> param
[l
].font_w
)
257 /* Pad lines with spaces */
258 while( i
< param
[l
].nchars
)
260 if( param
[l
].kbd_buf
[i
] == '\n' )
262 k
= ( rb
->screens
[l
]->width
/ param
[l
].font_w
)
263 - i
% ( rb
->screens
[l
]->width
/ param
[l
].font_w
) - 1;
264 if( k
== ( rb
->screens
[l
]->width
/ param
[l
].font_w
) - 1 )
267 for( j
= i
; j
< param
[l
].nchars
; j
++ )
269 param
[l
].kbd_buf
[j
] = param
[l
].kbd_buf
[j
+1];
274 if( param
[l
].nchars
+ k
- 1 >= KBD_BUF_SIZE
)
275 { /* We don't want to overflow the buffer */
276 k
= KBD_BUF_SIZE
- param
[l
].nchars
;
278 for( j
= param
[l
].nchars
+ k
- 1; j
> i
+k
; j
-- )
280 param
[l
].kbd_buf
[j
] = param
[l
].kbd_buf
[j
-k
];
282 param
[l
].nchars
+= k
;
286 param
[l
].kbd_buf
[i
++] = ' ';
295 /* find max width for text string */
299 text_w
= param
[l
].font_w
;
301 utf8
= (unsigned char*)rb
->utf8decode(utf8
, &ch
);
302 w
= rb
->font_get_width(param
[l
].font
, ch
);
306 param
[l
].max_chars_text
= rb
->screens
[l
]->width
/ text_w
- 2;
308 /* calculate keyboard grid size */
309 param
[l
].max_chars
= rb
->screens
[l
]->width
/ param
[l
].font_w
;
311 param
[l
].lines
= param
[l
].DEFAULT_LINES
;
312 param
[l
].keyboard_margin
= DEFAULT_MARGIN
;
314 param
[l
].lines
= (rb
->screens
[l
]->height
- BUTTONBAR_HEIGHT
- statusbar_size
) / param
[l
].font_h
- 1;
315 param
[l
].keyboard_margin
= rb
->screens
[l
]->height
- BUTTONBAR_HEIGHT
-
316 statusbar_size
- (param
[l
].lines
+1)*param
[l
].font_h
;
317 if (param
[l
].keyboard_margin
< 3) {
319 param
[l
].keyboard_margin
+= param
[l
].font_h
;
321 if (param
[l
].keyboard_margin
> 6)
322 param
[l
].keyboard_margin
= 6;
325 param
[l
].pages
= (param
[l
].nchars
+ (param
[l
].lines
*param
[l
].max_chars
-1))
326 /(param
[l
].lines
*param
[l
].max_chars
);
327 if (param
[l
].pages
== 1 && kbd_loaded
)
328 param
[l
].lines
= (param
[l
].nchars
+ param
[l
].max_chars
- 1) / param
[l
].max_chars
;
330 param
[l
].main_y
= param
[l
].font_h
*param
[l
].lines
+ param
[l
].keyboard_margin
+ statusbar_size
;
332 param
[l
].keyboard_margin
-= param
[l
].keyboard_margin
/2;
335 editpos
= rb
->utf8length(text
);
341 len_utf8
= rb
->utf8length(text
);
343 rb
->screens
[l
]->clear_display();
349 rb
->screens
[l
]->setfont(param
[l
].curfont
);
350 k
= param
[l
].page
*param
[l
].max_chars
*param
[l
].lines
;
351 for (i
=j
=0; j
< param
[l
].lines
&& k
< param
[l
].nchars
; k
++) {
352 utf8
= rb
->utf8encode(param
[l
].kbd_buf
[k
], outline
);
354 rb
->screens
[l
]->getstringsize(outline
, &w
, NULL
);
355 rb
->screens
[l
]->putsxy(i
*param
[l
].font_w
+ (param
[l
].font_w
-w
)/2, j
*param
[l
].font_h
356 + statusbar_size
, outline
);
357 if (++i
== param
[l
].max_chars
) {
368 rb
->screens
[l
]->hline(0, rb
->screens
[l
]->width
- 1, param
[l
].main_y
- param
[l
].keyboard_margin
);
370 /* write out the text */
372 rb
->screens
[l
]->setfont(param
[l
].curfont
);
375 param
[l
].curpos
= MIN(editpos
, param
[l
].max_chars_text
376 - MIN(len_utf8
- editpos
, 2));
377 param
[l
].leftpos
= editpos
- param
[l
].curpos
;
378 utf8
= text
+ rb
->utf8seek(text
, param
[l
].leftpos
);
380 text_w
= param
[l
].font_w
;
381 while (*utf8
&& i
< param
[l
].max_chars_text
) {
382 outline
[j
++] = *utf8
++;
383 if ((*utf8
& MASK
) != COMP
) {
387 rb
->screens
[l
]->getstringsize(outline
, &w
, NULL
);
388 rb
->screens
[l
]->putsxy(i
*text_w
+ (text_w
-w
)/2, param
[l
].main_y
, outline
);
392 if (param
[l
].leftpos
) {
393 rb
->screens
[l
]->getstringsize("<", &w
, NULL
);
394 rb
->screens
[l
]->putsxy(text_w
- w
, param
[l
].main_y
, "<");
396 if (len_utf8
- param
[l
].leftpos
> param
[l
].max_chars_text
)
397 rb
->screens
[l
]->putsxy(rb
->screens
[l
]->width
- text_w
, param
[l
].main_y
, ">");
400 i
= (param
[l
].curpos
+ 1) * text_w
;
402 rb
->screens
[l
]->vline(i
, param
[l
].main_y
, param
[l
].main_y
+ param
[l
].font_h
-1);
404 if (hangul
) /* draw underbar */
405 rb
->screens
[l
]->hline(param
[l
].curpos
*text_w
, (param
[l
].curpos
+1)*text_w
,
406 param
[l
].main_y
+param
[l
].font_h
-1);
409 cur_blink
= !cur_blink
;
412 /* highlight the key that has focus */
415 rb
->screens
[l
]->set_drawmode(DRMODE_COMPLEMENT
);
416 rb
->screens
[l
]->fillrect(param
[l
].font_w
* param
[l
].x
,
417 statusbar_size
+ param
[l
].font_h
* param
[l
].y
,
418 param
[l
].font_w
, param
[l
].font_h
);
419 rb
->screens
[l
]->set_drawmode(DRMODE_SOLID
);
423 /* gui_syncstatusbar_draw(&statusbars, true);*/
425 rb
->screens
[l
]->update();
427 button
= rb
->button_get_w_tmo(HZ
/2);
433 rb
->screens
[l
]->setfont(FONT_UI
);
439 case KBD_RIGHT
| BUTTON_REPEAT
:
443 if (++param
[l
].x
== param
[l
].max_chars
) {
445 /* no dedicated flip key - flip page on wrap */
446 if (++param
[l
].page
== param
[l
].pages
)
449 k
= (param
[l
].page
*param
[l
].lines
+ param
[l
].y
)*param
[l
].max_chars
+ param
[l
].x
;
450 /*kbd_spellchar(param[l].kbd_buf[k]);*/
455 case KBD_LEFT
| BUTTON_REPEAT
:
463 /* no dedicated flip key - flip page on wrap */
464 if (--param
[l
].page
< 0)
465 param
[l
].page
= (param
[l
].pages
-1);
466 param
[l
].x
= param
[l
].max_chars
- 1;
468 k
= (param
[l
].page
*param
[l
].lines
+
469 param
[l
].y
)*param
[l
].max_chars
+ param
[l
].x
;
470 /* kbd_spellchar(param[l].kbd_buf[k]);*/
476 case KBD_DOWN
| BUTTON_REPEAT
:
480 if (param
[l
].y
< param
[l
].lines
- 1)
487 k
= (param
[l
].page
*param
[l
].lines
+ param
[l
].y
)*
488 param
[l
].max_chars
+ param
[l
].x
;
489 /*kbd_spellchar(param[l].kbd_buf[k]);*/
495 case KBD_UP
| BUTTON_REPEAT
:
502 param
[l
].y
= param
[l
].lines
- 1;
506 k
= (param
[l
].page
*param
[l
].lines
+ param
[l
].y
)*
507 param
[l
].max_chars
+ param
[l
].x
;
508 /*kbd_spellchar(param[l].kbd_buf[k]);*/
515 if (button
== KBD_SELECT
)
518 /* inserts the selected char */
520 /* find input char */
521 k
= (param
[char_screen
].page
*param
[char_screen
].lines
+
522 param
[char_screen
].y
)*param
[char_screen
].max_chars
+
523 param
[char_screen
].x
;
524 if (k
< param
[char_screen
].nchars
)
525 ch
= param
[char_screen
].kbd_buf
[k
];
534 /*gui_syncstatusbar_draw(&statusbars, false);*/
539 if(rb
->default_event_handler(button
) == SYS_USB_CONNECTED
)
541 rb
->screens
[l
]->setfont(FONT_SYSFIXED
);
545 if (button
!= BUTTON_NONE
)
552 rb
->screens
[l
]->setfont(FONT_UI
);