Initial work on keyboard widget
This commit is contained in:
		@@ -12,6 +12,7 @@ common_SRC_FILES := \
 | 
			
		||||
    fstab.c \
 | 
			
		||||
    input.c \
 | 
			
		||||
    listview.c \
 | 
			
		||||
    keyboard.c \
 | 
			
		||||
    mrom_data.c \
 | 
			
		||||
    notification_card.c \
 | 
			
		||||
    progressdots.c \
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user