Initial work on keyboard widget

This commit is contained in:
Vojtech Bocek
2015-02-26 14:04:06 +01:00
parent 9d97d0223a
commit 1887f526e7
8 changed files with 75 additions and 27 deletions

View File

@@ -12,6 +12,7 @@ common_SRC_FILES := \
fstab.c \
input.c \
listview.c \
keyboard.c \
mrom_data.c \
notification_card.c \
progressdots.c \

View File

@@ -141,7 +141,7 @@ int button_touch_handler(touch_event *ev, void *data)
if(ev->changed & TCHNG_REMOVED)
{
if((b->flags & BTN_HOVER) && b->clicked)
(*b->clicked)(b->action);
(*b->clicked)(b->clicked_data);
button_set_hover(b, 0);
b->touch_id = -1;
}
@@ -211,7 +211,7 @@ int button_keyaction_call(void *data, int act)
case KEYACT_CONFIRM:
{
if(b->clicked && !(b->flags & BTN_DISABLED))
(*b->clicked)(b->action);
(*b->clicked)(b->clicked_data);
return 0;
}
default:

View File

@@ -17,18 +17,23 @@
#include <stdlib.h>
#include "containers.h"
#include "keyboard.h"
#include "util.h"
#include "log.h"
#define KS(x) ((x-1) << 16)
#define GET_KS(x) ((x & 0xFF0000)>> 16)
#define KEY_EMPTY 0xFF
#define KEY_ENTER 0xFE
#define KEY_CLEAR 0xFD
#define KEY_EMPTY_HALF 0xFE
#define KEY_ENTER 0xFD
#define KEY_CLEAR 0xFC
#define KEY_SHIFT 0xFB
static const char *specialKeys[] = {
NULL, // KEY_EMPTY
NULL, // KEY_EMPTY_HALF
"OK", // KEY_ENTER
"X", // KEY_CLEAR
};
@@ -40,14 +45,25 @@ static const uint32_t pinKeycodeMap[] = {
'1', '2', '3', KEY_EMPTY,
'4', '5', '6', KEY_EMPTY,
'7', '8', '9', KEY_CLEAR,
'0' | KS(3), KEY_EMPTY,
'0' | KS(3), KEY_ENTER,
0
};
// rows, cols
static const uint32_t pinKeycodeMapDimensions[] = { 4, 4 };
#define PADDING (5*DPI_MUL)
static const uint32_t normalKeycodeMap[] = {
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
KEY_EMPTY_HALF, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
KEY_SHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', KEY_CLEAR | KS(2),
KEY_CLEAR, ' ' | KS(6), '.', KEY_ENTER | KS(2),
0
};
// rows, cols
static const uint32_t normalKeycodeMapDimensions[] = { 4, 10 };
#define PADDING (8*DPI_MUL)
struct keyboard_btn_data {
struct keyboard *k;
@@ -57,6 +73,7 @@ struct keyboard_btn_data {
static void keyboard_btn_clicked(void *data)
{
struct keyboard_btn_data *d = data;
INFO("keyboard %c pressed.", (char)(d->k->keycode_map[d->btn_idx] & 0xFF));
}
static int keyboard_init_map(struct keyboard *k, const uint32_t *map, const uint32_t *dimen)
@@ -65,6 +82,7 @@ static int keyboard_init_map(struct keyboard *k, const uint32_t *map, const uint
int i, idx = 0;
uint32_t col = 0;
char buf[2] = { 0 };
uint8_t code;
int x = k->x + PADDING;
int y = k->y + PADDING;
@@ -72,11 +90,14 @@ static int keyboard_init_map(struct keyboard *k, const uint32_t *map, const uint
const int btn_w = (k->w - PADDING*(dimen[1]+1)) /dimen[1];
const int btn_h = (k->h - PADDING*(dimen[0]+1)) /dimen[0];
for(i = 0; map[0]; ++i)
for(i = 0; map[i]; ++i)
{
code = (map[i] & 0xFF);
w = (GET_KS(map[i])+1)*btn_w + PADDING*GET_KS(map[i]);
if((map[i] & 0xFF) != KEY_EMPTY)
if(code == KEY_EMPTY_HALF)
w /= 2;
else if(code != KEY_EMPTY)
{
btn = mzalloc(sizeof(button));
btn->x = x;
@@ -92,9 +113,11 @@ static int keyboard_init_map(struct keyboard *k, const uint32_t *map, const uint
buf[0] = (map[i] & 0xFF);
button_init_ui(btn, buf[0] >= 0 ? buf : specialKeys[0xFF - (map[i] & 0xFF)], SIZE_NORMAL);
list_add(&k->btns, btn);
}
if(++col < dimen[1])
col += GET_KS(map[i])+1;
if(col < dimen[1])
x += w + PADDING;
else
{
@@ -103,6 +126,9 @@ static int keyboard_init_map(struct keyboard *k, const uint32_t *map, const uint
col = 0;
}
}
k->keycode_map = map;
return 0;
}
struct keyboard *keyboard_create(int x, int y, int w, int h)
@@ -113,7 +139,10 @@ struct keyboard *keyboard_create(int x, int y, int w, int h)
k->w = w;
k->h = h;
//keyboard_init_map(k, pinKeycodeMap, pinKeycodeMapDimensions);
keyboard_init_map(k, normalKeycodeMap, normalKeycodeMapDimensions);
return k;
}
void keyboard_destroy(struct keyboard *k)

View File

@@ -30,7 +30,7 @@ struct keyboard
const uint32_t *keycode_map;
};
struct keyboard *keyboard_create(void);
struct keyboard *keyboard_create(int x, int y, int w, int h);
void keyboard_destroy(struct keyboard *k);
#endif

View File

@@ -361,6 +361,11 @@ void multirom_ui_destroy_tab(int tab)
themes_info->data->tab_data[tab] = NULL;
}
void multirom_ui_switch_btn(void *data)
{
multirom_ui_switch(*((int*)data));
}
void multirom_ui_switch(int tab)
{
if(tab == themes_info->data->selected_tab)
@@ -549,10 +554,10 @@ void multirom_ui_tab_rom_destroy(void *data)
void multirom_ui_tab_rom_confirmed(listview_item *it)
{
multirom_ui_tab_rom_boot_btn(0);
multirom_ui_tab_rom_boot();
}
void multirom_ui_tab_rom_boot_btn(int action)
void multirom_ui_tab_rom_boot(void)
{
int cur_tab = themes_info->data->selected_tab;
if(!themes_info->data->tab_data[cur_tab])
@@ -678,8 +683,10 @@ void multirom_ui_tab_misc_destroy(void *data)
free(t);
}
void multirom_ui_tab_misc_change_clr(int clr)
void multirom_ui_tab_misc_change_clr(void *data)
{
int clr = *((int*)data);
if((loop_act & LOOP_CHANGE_CLR) || mrom_status->colors == clr)
return;
@@ -689,14 +696,15 @@ void multirom_ui_tab_misc_change_clr(int clr)
pthread_mutex_unlock(&exit_code_mutex);
}
void multirom_ui_reboot_btn(int action)
void multirom_ui_reboot_btn(void *data)
{
int action = *((int*)data);
pthread_mutex_lock(&exit_code_mutex);
exit_ui_code = action;
pthread_mutex_unlock(&exit_code_mutex);
}
void multirom_ui_tab_misc_copy_log(int action)
void multirom_ui_tab_misc_copy_log(void *data)
{
multirom_dump_status(mrom_status);

View File

@@ -46,6 +46,7 @@ void multirom_ui_change_header_selector_pos(float pos);
void multirom_ui_destroy_tab(int tab);
int multirom_ui_destroy_msgbox(void);
void multirom_ui_switch(int tab);
void multirom_ui_switch_btn(void *data);
void multirom_ui_fill_rom_list(listview *view, int mask);
void multirom_ui_auto_boot(void);
void multirom_ui_refresh_usb_handler(void);
@@ -55,7 +56,7 @@ void multirom_ui_destroy_theme(void);
void *multirom_ui_tab_rom_init(int tab_type);
void multirom_ui_tab_rom_destroy(void *data);
void multirom_ui_tab_rom_boot_btn(int action);
void multirom_ui_tab_rom_boot(void);
void multirom_ui_tab_rom_confirmed(listview_item *it);
void multirom_ui_tab_rom_refresh_usb(int action);
void multirom_ui_tab_rom_update_usb(void);
@@ -63,9 +64,9 @@ void multirom_ui_tab_rom_set_empty(void *data, int empty);
void *multirom_ui_tab_misc_init(void);
void multirom_ui_tab_misc_destroy(void *data);
void multirom_ui_tab_misc_copy_log(int action);
void multirom_ui_tab_misc_change_clr(int clr);
void multirom_ui_tab_misc_copy_log(void *data);
void multirom_ui_tab_misc_change_clr(void *data);
void multirom_ui_reboot_btn(int action);
void multirom_ui_reboot_btn(void *data);
#endif

View File

@@ -91,8 +91,9 @@ static void init_header(multirom_theme_data *t)
tab_btns[i]->y = 0;
tab_btns[i]->w = maxW;
tab_btns[i]->h = HEADER_HEIGHT;
tab_btns[i]->action = i;
tab_btns[i]->clicked = &multirom_ui_switch;
tab_btns[i]->clicked_data = malloc(sizeof(int));
*((int*)tab_btns[i]->clicked_data) = i;
tab_btns[i]->clicked = &multirom_ui_switch_btn;
tab_btns[i]->level_off = 100;
button_init_ui(tab_btns[i], "", 0);
@@ -172,7 +173,8 @@ static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_sc
b->y = y;
b->w = CLRBTN_TOTAL;
b->h = CLRBTN_TOTAL;
b->action = i;
b->clicked_data = malloc(sizeof(int));
*((int*)b->clicked_data) = i;
b->clicked = &multirom_ui_tab_misc_change_clr;
button_init_ui(b, NULL, 0);
list_add(&d->buttons, b);
@@ -205,7 +207,8 @@ static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_sc
b->y = y;
b->w = MISCBTN_W;
b->h = MISCBTN_H;
b->action = exit_codes[i];
b->clicked_data = malloc(sizeof(int));
*((int*)b->clicked_data) = exit_codes[i];
b->clicked = &multirom_ui_reboot_btn;
button_init_ui(b, texts[i], SIZE_BIG);
list_add(&d->buttons, b);

View File

@@ -106,8 +106,9 @@ static void init_header(multirom_theme_data *t)
tab_btns[i]->y = 0;
tab_btns[i]->w = maxW;
tab_btns[i]->h = HEADER_HEIGHT;
tab_btns[i]->action = i;
tab_btns[i]->clicked = &multirom_ui_switch;
tab_btns[i]->clicked_data = malloc(sizeof(int));
*((int*)tab_btns[i]->clicked_data) = i;
tab_btns[i]->clicked = &multirom_ui_switch_btn;
tab_btns[i]->level_off = 100;
button_init_ui(tab_btns[i], "", 0);
@@ -141,12 +142,15 @@ static void header_set_tab_selector_pos(multirom_theme_data *t, float pos)
t->selected_tab_rect->w = dest_w;
}
#include "lib/keyboard.h"
static void tab_rom_init(multirom_theme_data *t, tab_data_roms *d, int tab_type)
{
d->list->x = LISTVIEW_MARGIN;
d->list->y = HEADER_HEIGHT+LISTVIEW_MARGIN;
d->list->w = fb_width - LISTVIEW_MARGIN;
d->list->h = fb_height - d->list->y - LISTVIEW_MARGIN;
keyboard_create(0, (fb_height/3)*2, fb_width, fb_height/3);
}
static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_scheme)
@@ -190,7 +194,8 @@ static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_sc
b->y = y;
b->w = MISCBTN_W;
b->h = MISCBTN_H;
b->action = exit_codes[i];
b->clicked_data = malloc(sizeof(int));
*((int*)b->clicked_data) = exit_codes[i];
b->clicked = &multirom_ui_reboot_btn;
button_init_ui(b, texts[i], SIZE_BIG);
list_add(&d->buttons, b);
@@ -231,7 +236,8 @@ static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_sc
b->y = CLRBTN_Y;
b->w = CLRBTN_TOTAL;
b->h = CLRBTN_TOTAL;
b->action = i;
b->clicked_data = malloc(sizeof(int));
*((int*)b->clicked_data) = i;
b->clicked = &multirom_ui_tab_misc_change_clr;
button_init_ui(b, NULL, 0);
list_add(&d->buttons, b);