static void tab_rom_init(multirom_theme_data *t, tab_data_roms *d, int tab_type) { int base_y = fb_height-ROMS_FOOTER_H; d->rom_name = fb_add_text(HEADER_WIDTH, center_y(base_y, ROMS_FOOTER_H, SIZE_NORMAL), WHITE, SIZE_NORMAL, ""); d->list->x = HEADER_WIDTH; d->list->y = ROMS_HEADER_H; d->list->w = fb_width-HEADER_WIDTH; d->list->h = fb_height - d->list->y - ROMS_FOOTER_H-20; // header int y = center_y(0, ROMS_HEADER_H, SIZE_BIG); d->title_text = fb_add_text(HEADER_WIDTH, y, CLR_PRIMARY, SIZE_BIG, ""); list_add(d->title_text, &d->ui_elements); // footer fb_rect *sep = fb_add_rect(HEADER_WIDTH+2, fb_height-ROMS_FOOTER_H, fb_width-HEADER_WIDTH-2, 2, CLR_PRIMARY); list_add(sep, &d->ui_elements); // boot btn d->boot_btn->x = fb_width - BOOTBTN_W - 5; d->boot_btn->y = base_y + (ROMS_FOOTER_H-BOOTBTN_H)/2; d->boot_btn->w = BOOTBTN_W; d->boot_btn->h = BOOTBTN_H; }
void pong(void) { enable_computer = 1; paddle_touch_id[L] = -1; paddle_touch_id[R] = -1; // middle line fb_add_rect(0, fb_height/2 - 1, fb_width, 1, WHITE); score[L] = fb_add_text(0, fb_height/2 - SIZE_EXTRA*16 - 20, WHITE, SIZE_EXTRA, "0"); score[R] = fb_add_text(0, fb_height/2 + 20, WHITE, SIZE_EXTRA, "0"); paddles[L] = fb_add_rect(100, PADDLE_Y, PADDLE_W, PADDLE_H, WHITE); paddles[R] = fb_add_rect(100, fb_height-PADDLE_Y-PADDLE_H, PADDLE_W, PADDLE_H, WHITE); ball = fb_add_rect(0, 0, BALL_W, BALL_W, WHITE); pong_spawn_ball(rand()%2); pong_calc_movement(); add_touch_handler(&pong_touch_handler, NULL); int step = 0; volatile int run = 1; while(run) { switch(get_last_key()) { case KEY_POWER: run = 0; break; case KEY_VOLUMEUP: ball_speed += 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; case KEY_VOLUMEDOWN: if(ball_speed > 5) ball_speed -= 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; } step = pong_do_movement(step); fb_draw(); usleep(1000); } rm_touch_handler(&pong_touch_handler, NULL); list_clear(&movement_steps, &free); }
void button_init_ui(button *b, const char *text, int size) { b->touch_id = -1; if(text != NULL) { b->c[CLR_NORMAL][0] = CLR_PRIMARY; b->c[CLR_NORMAL][1] = WHITE; b->c[CLR_HOVER][0] = CLR_SECONDARY; b->c[CLR_HOVER][1] = WHITE; b->c[CLR_DIS][0] = GRAY; b->c[CLR_DIS][1] = WHITE; b->c[CLR_CHECK][0] = CLR_SECONDARY; b->c[CLR_CHECK][1] = WHITE; b->rect = fb_add_rect(b->x, b->y, b->w, b->h, b->c[CLR_NORMAL][0]); int text_x = center_x(b->x, b->w, size, text); int text_y = center_y(b->y, b->h, size); b->text = fb_add_text(text_x, text_y, b->c[CLR_NORMAL][1], size, text); } else { b->text = NULL; b->rect = NULL; } add_touch_handler(&button_touch_handler, b); }
static void init_header(multirom_theme_data *t) { button **tab_btns = t->tab_btns; fb_text **tab_texts = t->tab_texts; int i, text_x, text_y; int x = fb_width - (TAB_BTN_WIDTH*TAB_COUNT); static const char *str[] = { "Internal", "USB", "Misc", "MultiROM" }; text_x = center_x(0, x, SIZE_EXTRA, str[3]); fb_add_text(text_x, 5, WHITE, SIZE_EXTRA, str[3]); pong_btn = mzalloc(sizeof(button)); pong_btn->w = x; pong_btn->h = HEADER_HEIGHT; pong_btn->clicked = &multirom_ui_start_pong; button_init_ui(pong_btn, NULL, 0); for(i = 0; i < TAB_COUNT; ++i) { text_x = center_x(x, TAB_BTN_WIDTH, SIZE_NORMAL, str[i]); text_y = center_y(0, HEADER_HEIGHT, SIZE_NORMAL); tab_texts[i] = fb_add_text(text_x, text_y, WHITE, SIZE_NORMAL, str[i]); fb_add_rect(x, 0, 2, HEADER_HEIGHT, WHITE); tab_btns[i] = malloc(sizeof(button)); memset(tab_btns[i], 0, sizeof(button)); tab_btns[i]->x = x; tab_btns[i]->w = TAB_BTN_WIDTH; tab_btns[i]->h = HEADER_HEIGHT; tab_btns[i]->action = i; tab_btns[i]->clicked = &multirom_ui_switch; button_init_ui(tab_btns[i], NULL, 0); x += TAB_BTN_WIDTH; } fb_add_rect(0, HEADER_HEIGHT, fb_width, 2, WHITE); }
static void init_header(multirom_theme_data *t) { button **tab_btns = t->tab_btns; fb_text **tab_texts = t->tab_texts; int i, text_x, text_y; int y = TAB_BTN_HEIGHT; static const char *str[] = { "Internal", "USB", "Misc", "MultiROM" }; text_x = center_x(0, HEADER_WIDTH, SIZE_EXTRA, str[3]); fb_add_text(text_x, 5, WHITE, SIZE_EXTRA, str[3]); for(i = 0; i < TAB_COUNT; ++i) { text_x = center_x(0, HEADER_WIDTH, SIZE_NORMAL, str[i]); text_y = center_y(y, TAB_BTN_HEIGHT, SIZE_NORMAL); tab_texts[i] = fb_add_text(text_x, text_y, WHITE, SIZE_NORMAL, str[i]); fb_add_rect(0, y, HEADER_WIDTH, 2, WHITE); tab_btns[i] = malloc(sizeof(button)); memset(tab_btns[i], 0, sizeof(button)); tab_btns[i]->y = y; tab_btns[i]->w = HEADER_WIDTH; tab_btns[i]->h = TAB_BTN_HEIGHT; tab_btns[i]->action = i; tab_btns[i]->clicked = &multirom_ui_switch; button_init_ui(tab_btns[i], NULL, 0); y += TAB_BTN_HEIGHT; } fb_add_rect(0, y, HEADER_WIDTH, 2, WHITE); fb_add_rect(HEADER_WIDTH-2, 0, 2, fb_height, WHITE); }
void multirom_ui_tab_rom_set_empty(void *data, int empty) { assert(empty == 0 || empty == 1); tab_data_roms *t = (tab_data_roms*)data; int width = cur_theme->get_tab_width(themes_info->data); static const char *str[] = { "Select ROM to boot:", "No ROMs in this location!" }; t->title_text->head.x = center_x(t->list->x, width, SIZE_BIG, str[empty]); t->title_text->text = realloc(t->title_text->text, strlen(str[empty])+1); strcpy(t->title_text->text, str[empty]); if(t->boot_btn) button_enable(t->boot_btn, !empty); if(empty && !t->usb_text) { const int line_len = 37; static const char *txt = "This list is refreshed automagically,\njust plug in the USB drive and wait."; int x = t->list->x + (width/2 - (line_len*ISO_CHAR_WIDTH*SIZE_NORMAL)/2); int y = center_y(t->list->y, t->list->h, SIZE_NORMAL); t->usb_text = fb_add_text(x, y, WHITE, SIZE_NORMAL, txt); list_add(t->usb_text, &t->ui_elements); x = t->list->x + ((width/2) - (PROGDOTS_W/2)); t->usb_prog = progdots_create(x, y+100*DPI_MUL); } else if(!empty && t->usb_text) { progdots_destroy(t->usb_prog); t->usb_prog = NULL; list_rm(t->usb_text, &t->ui_elements, &fb_remove_item); t->usb_text = NULL; } }
static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_scheme) { int x = HEADER_WIDTH + ((fb_width - HEADER_WIDTH)/2 - MISCBTN_W/2); int y = 10; button *b = mzalloc(sizeof(button)); b->x = x; b->y = y; b->w = MISCBTN_W; b->h = MISCBTN_H; b->clicked = &multirom_ui_tab_misc_copy_log; button_init_ui(b, "Copy log to /sdcard", SIZE_BIG); list_add(b, &d->buttons); y += MISCBTN_H+50; static const char *texts[] = { "Reboot", // 0 "Reboot to recovery", // 1 "Reboot to bootloader", // 2 "Shutdown", // 3 NULL }; static const int exit_codes[] = { UI_EXIT_REBOOT, UI_EXIT_REBOOT_RECOVERY, UI_EXIT_REBOOT_BOOTLOADER, UI_EXIT_SHUTDOWN }; int i; for(i = 0; texts[i]; ++i) { b = mzalloc(sizeof(button)); b->x = x; b->y = y; b->w = MISCBTN_W; b->h = MISCBTN_H; b->action = exit_codes[i]; b->clicked = &multirom_ui_reboot_btn; button_init_ui(b, texts[i], SIZE_BIG); list_add(b, &d->buttons); y += MISCBTN_H+20; if(i == 2) y += 30; } fb_text *text = fb_add_text(HEADER_WIDTH+5, fb_height-16, WHITE, SIZE_SMALL, "MultiROM v%d"VERSION_DEV_FIX" with trampoline v%d.", VERSION_MULTIROM, multirom_get_trampoline_ver()); list_add(text, &d->ui_elements); char bat_text[16]; sprintf(bat_text, "Battery: %d%%", multirom_get_battery()); text = fb_add_text_long(fb_width-strlen(bat_text)*8, fb_height-16, WHITE, SIZE_SMALL, bat_text); list_add(text, &d->ui_elements); x = HEADER_WIDTH + ((fb_width - HEADER_WIDTH)/2 - (CLRS_MAX*CLRBTN_TOTAL)/2); uint32_t p, s; fb_rect *r; for(i = 0; i < CLRS_MAX; ++i) { multirom_ui_setup_colors(i, &p, &s); if(i == color_scheme) { r = fb_add_rect(x, CLRBTN_Y, CLRBTN_TOTAL, CLRBTN_TOTAL, WHITE); list_add(r, &d->ui_elements); } r = fb_add_rect(x+CLRBTN_B/2, CLRBTN_Y+CLRBTN_B/2, CLRBTN_W, CLRBTN_W, p); list_add(r, &d->ui_elements); b = mzalloc(sizeof(button)); b->x = x; b->y = CLRBTN_Y; b->w = CLRBTN_TOTAL; b->h = CLRBTN_TOTAL; b->action = i; b->clicked = &multirom_ui_tab_misc_change_clr; button_init_ui(b, NULL, 0); list_add(b, &d->buttons); x += CLRBTN_TOTAL; } }
static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_scheme) { int i; int x = fb_width/2 - (MISCBTN_W + 30*DPI_MUL); int y = HEADER_HEIGHT + ((fb_height - HEADER_HEIGHT)/2 - 2*(MISCBTN_H + 30*DPI_MUL)); fb_rect *shadow; y += MISCBTN_H + 30*DPI_MUL; button *b = mzalloc(sizeof(button)); b->x = x; b->y = y; b->w = MISCBTN_W; b->h = MISCBTN_H; b->clicked = &multirom_ui_tab_misc_copy_log; shadow = fb_add_rect_lvl(LEVEL_RECT, b->x + BTN_SHADOW_OFF, b->y + BTN_SHADOW_OFF, b->w, b->h, C_BTN_FAKE_SHADOW); button_init_ui(b, "COPY LOG TO /SDCARD", SIZE_NORMAL); list_add(&d->buttons, b); list_add(&d->ui_elements, shadow); tabview_add_item(t->tabs, TAB_MISC, b->text); tabview_add_item(t->tabs, TAB_MISC, b->rect); tabview_add_item(t->tabs, TAB_MISC, b); const int max_colors = colors_count(); x += (MISCBTN_W/2 - (max_colors*(CLRBTN_TOTAL+CLRBTN_MARGIN))/2); y += MISCBTN_H+30*DPI_MUL + (MISCBTN_H/2 - CLRBTN_TOTAL/2); fb_rect *r; for(i = 0; i < max_colors; ++i) { const struct mrom_color_theme *th = colors_get(i); r = fb_add_rect(x, y, CLRBTN_TOTAL, CLRBTN_TOTAL, i == color_scheme ? 0xFFFFCC00 : WHITE); list_add(&d->ui_elements, r); r = fb_add_rect(x+CLRBTN_B/2, y+CLRBTN_B/2, CLRBTN_W, CLRBTN_W, th->highlight_bg); list_add(&d->ui_elements, r); b = mzalloc(sizeof(button)); b->x = x; b->y = y; b->w = CLRBTN_TOTAL; b->h = CLRBTN_TOTAL; 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); tabview_add_item(t->tabs, TAB_MISC, b); x += CLRBTN_TOTAL + CLRBTN_MARGIN; } x = fb_width/2 - (MISCBTN_W + 30*DPI_MUL) + MISCBTN_W + 30*DPI_MUL; y = HEADER_HEIGHT + ((fb_height - HEADER_HEIGHT)/2 - 2*(MISCBTN_H + 30*DPI_MUL)); static const char *texts[] = { "REBOOT", // 0 "REBOOT TO RECOVERY", // 1 "REBOOT TO BOOTLOADER", // 2 "SHUTDOWN", // 3 NULL }; static const int exit_codes[] = { UI_EXIT_REBOOT, UI_EXIT_REBOOT_RECOVERY, UI_EXIT_REBOOT_BOOTLOADER, UI_EXIT_SHUTDOWN }; for(i = 0; texts[i]; ++i) { b = mzalloc(sizeof(button)); b->x = x; b->y = y; b->w = MISCBTN_W; b->h = MISCBTN_H; b->clicked_data = malloc(sizeof(int)); *((int*)b->clicked_data) = exit_codes[i]; b->clicked = &multirom_ui_reboot_btn; shadow = fb_add_rect_lvl(LEVEL_RECT, b->x + BTN_SHADOW_OFF, b->y + BTN_SHADOW_OFF, b->w, b->h, C_BTN_FAKE_SHADOW); button_init_ui(b, texts[i], SIZE_NORMAL); list_add(&d->buttons, b); list_add(&d->ui_elements, shadow); tabview_add_item(t->tabs, TAB_MISC, b->text); tabview_add_item(t->tabs, TAB_MISC, b->rect); tabview_add_item(t->tabs, TAB_MISC, b); y += MISCBTN_H+30*DPI_MUL; } fb_text *text = fb_add_text(5*DPI_MUL, 0, C_TEXT_SECONDARY, SIZE_SMALL, "MultiROM v%d"VERSION_DEV_FIX" with trampoline v%d.", VERSION_MULTIROM, multirom_get_trampoline_ver()); text->y = fb_height - text->h; list_add(&d->ui_elements, text); text = fb_add_text(0, 0, C_TEXT_SECONDARY, SIZE_SMALL, "Battery: %d%%", multirom_get_battery()); text->x = fb_width - text->w - 5*DPI_MUL; text->y = fb_height - text->h; list_add(&d->ui_elements, text); for(i = 0; d->buttons[i]; ++i) keyaction_add(d->buttons[i], button_keyaction_call, d->buttons[i]); tabview_add_items(t->tabs, TAB_MISC, d->ui_elements); }
void pong(void) { enable_computer = 1; paddle_touch_id[L] = -1; paddle_touch_id[R] = -1; score_val[L] = 0; score_val[R] = 0; fb_set_background(BLACK); fb_text_proto *p = fb_text_create(0, 0, GRAYISH, SIZE_SMALL, "Press power button to go back"); p->style = STYLE_ITALIC; fb_text *help = fb_text_finalize(p); help->y = fb_height/2 - help->h*1.5; center_text(help, 0, -1, fb_width, -1); // middle line fb_add_rect(0, fb_height/2 - 1, fb_width, 1, WHITE); score[L] = fb_add_text(0, 0, WHITE, SIZE_EXTRA, "0"); score[L]->y = fb_height/2 - score[L]->h - 20*DPI_MUL; score[R] = fb_add_text(0, fb_height/2 + 20*DPI_MUL, WHITE, SIZE_EXTRA, "0"); paddles[L] = fb_add_rect(100, PADDLE_Y, PADDLE_W, PADDLE_H, WHITE); paddles[R] = fb_add_rect(100, fb_height-PADDLE_Y-PADDLE_H, PADDLE_W, PADDLE_H, WHITE); ball = fb_add_rect(0, 0, BALL_W, BALL_W, WHITE); pong_spawn_ball(rand()%2); pong_calc_movement(); add_touch_handler(&pong_touch_handler, NULL); int step = 0; volatile int run = 1; while(run) { switch(get_last_key()) { case KEY_POWER: run = 0; break; case KEY_VOLUMEUP: ball_speed += 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; case KEY_VOLUMEDOWN: if(ball_speed > 5) ball_speed -= 5; pong_spawn_ball(rand()%2); pong_calc_movement(); step = 0; break; } step = pong_do_movement(step); fb_request_draw(); usleep(16000); } rm_touch_handler(&pong_touch_handler, NULL); list_clear(&movement_steps, &free); }
int multirom_ui(struct multirom_status *s, struct multirom_rom **to_boot) { if(multirom_init_fb(s->rotation) < 0) return UI_EXIT_BOOT_ROM; fb_freeze(1); mrom_status = s; exit_ui_code = -1; selected_rom = NULL; active_msgbox = NULL; multirom_ui_setup_colors(s->colors, &CLR_PRIMARY, &CLR_SECONDARY); themes_info = multirom_ui_init_themes(); if((cur_theme = multirom_ui_select_theme(themes_info, fb_width, fb_height)) == NULL) { fb_freeze(0); ERROR("Couldn't find theme for resolution %dx%d!\n", fb_width, fb_height); fb_add_text(0, 0, WHITE, SIZE_SMALL, "Couldn't find theme for resolution %dx%d!\nPress POWER to reboot.", fb_width, fb_height); fb_draw(); fb_clear(); fb_close(); start_input_thread(); while(wait_for_key() != KEY_POWER); stop_input_thread(); return UI_EXIT_REBOOT; } workers_start(); multirom_ui_init_header(); multirom_ui_switch(TAB_INTERNAL); add_touch_handler(&multirom_ui_touch_handler, NULL); start_input_thread(); keyaction_enable(1); keyaction_set_destroy_msgbox_handle(multirom_ui_destroy_msgbox); multirom_set_brightness(s->brightness); fb_freeze(0); if(s->auto_boot_rom && s->auto_boot_seconds > 0) multirom_ui_auto_boot(); else fb_draw(); while(1) { pthread_mutex_lock(&exit_code_mutex); if(exit_ui_code != -1) { pthread_mutex_unlock(&exit_code_mutex); break; } if(loop_act & LOOP_UPDATE_USB) { multirom_find_usb_roms(mrom_status); if(themes_info->data->selected_tab == TAB_USB) multirom_ui_tab_rom_update_usb(themes_info->data->tab_data); loop_act &= ~(LOOP_UPDATE_USB); } if(loop_act & LOOP_START_PONG) { loop_act &= ~(LOOP_START_PONG); keyaction_enable(0); input_push_context(); fb_push_context(); pong(); fb_pop_context(); input_pop_context(); keyaction_enable(1); } if(loop_act & LOOP_CHANGE_CLR) { fb_freeze(1); multirom_ui_setup_colors(s->colors, &CLR_PRIMARY, &CLR_SECONDARY); // force redraw tab int tab = themes_info->data->selected_tab; themes_info->data->selected_tab = -1; multirom_ui_destroy_tab(tab); multirom_ui_switch(tab); fb_freeze(0); fb_draw(); loop_act &= ~(LOOP_CHANGE_CLR); } pthread_mutex_unlock(&exit_code_mutex); usleep(100000); } keyaction_enable(0); keyaction_clear(); rm_touch_handler(&multirom_ui_touch_handler, NULL); fb_create_msgbox(500*DPI_MUL, 250*DPI_MUL, CLR_PRIMARY); switch(exit_ui_code) { case UI_EXIT_BOOT_ROM: *to_boot = selected_rom; fb_msgbox_add_text(-1, 40*DPI_MUL, SIZE_BIG, "Booting ROM..."); fb_msgbox_add_text(-1, -1, SIZE_NORMAL, selected_rom->name); break; case UI_EXIT_REBOOT: case UI_EXIT_REBOOT_RECOVERY: case UI_EXIT_REBOOT_BOOTLOADER: fb_msgbox_add_text(-1, -1, SIZE_BIG, "Rebooting..."); break; case UI_EXIT_SHUTDOWN: fb_msgbox_add_text(-1, -1, SIZE_BIG, "Shutting down..."); break; } fb_draw(); fb_freeze(1); cur_theme->destroy(themes_info->data); int i; for(i = 0; i < TAB_COUNT; ++i) { button_destroy(themes_info->data->tab_btns[i]); themes_info->data->tab_btns[i] = NULL; } stop_input_thread(); multirom_ui_destroy_tab(themes_info->data->selected_tab); multirom_ui_free_themes(themes_info); themes_info = NULL; workers_stop(); fb_clear(); #if MR_DEVICE_HOOKS >= 2 mrom_hook_before_fb_close(); #endif fb_close(); return exit_ui_code; }
static void tab_misc_init(multirom_theme_data *t, tab_data_misc *d, int color_scheme) { int x = fb_width/2 - MISCBTN_W/2; int y = 270*DPI_MUL; button *b = mzalloc(sizeof(button)); b->x = x; b->y = y; b->w = MISCBTN_W; b->h = MISCBTN_H; b->clicked = &multirom_ui_tab_misc_copy_log; button_init_ui(b, "Copy log to /sdcard", SIZE_BIG); list_add(&d->buttons, b); tabview_add_item(t->tabs, TAB_MISC, b->text); tabview_add_item(t->tabs, TAB_MISC, b->rect); tabview_add_item(t->tabs, TAB_MISC, b); y += MISCBTN_H+70*DPI_MUL; static const char *texts[] = { "Reboot", // 0 "Reboot to recovery", // 1 "Reboot to bootloader", // 2 "Shutdown", // 3 NULL }; static const int exit_codes[] = { UI_EXIT_REBOOT, UI_EXIT_REBOOT_RECOVERY, UI_EXIT_REBOOT_BOOTLOADER, UI_EXIT_SHUTDOWN }; int i; for(i = 0; texts[i]; ++i) { b = mzalloc(sizeof(button)); b->x = x; b->y = y; b->w = MISCBTN_W; b->h = MISCBTN_H; b->action = exit_codes[i]; b->clicked = &multirom_ui_reboot_btn; button_init_ui(b, texts[i], SIZE_BIG); list_add(&d->buttons, b); tabview_add_item(t->tabs, TAB_MISC, b->text); tabview_add_item(t->tabs, TAB_MISC, b->rect); tabview_add_item(t->tabs, TAB_MISC, b); y += MISCBTN_H+20*DPI_MUL; if(i == 2) y += 50*DPI_MUL; } fb_text *text = fb_add_text(5*DPI_MUL, 0, C_TEXT_SECONDARY, SIZE_SMALL, "MultiROM v%d"VERSION_DEV_FIX" with trampoline v%d.", VERSION_MULTIROM, multirom_get_trampoline_ver()); text->y = fb_height - text->h; list_add(&d->ui_elements, text); text = fb_add_text(0, 0, C_TEXT_SECONDARY, SIZE_SMALL, "Battery: %d%%", multirom_get_battery()); text->x = fb_width - text->w - 5*DPI_MUL; text->y = fb_height - text->h; list_add(&d->ui_elements, text); const int max_colors = multirom_ui_get_color_theme_count(); x = fb_width/2 - (max_colors*(CLRBTN_TOTAL+CLRBTN_MARGIN))/2; fb_rect *r; for(i = 0; i < max_colors; ++i) { const struct multirom_color_theme *th = multirom_ui_get_color_theme(i); r = fb_add_rect(x, CLRBTN_Y, CLRBTN_TOTAL, CLRBTN_TOTAL, i == color_scheme ? 0xFFFFCC00 : WHITE); list_add(&d->ui_elements, r); r = fb_add_rect(x+CLRBTN_B/2, CLRBTN_Y+CLRBTN_B/2, CLRBTN_W, CLRBTN_W, th->highlight_bg); list_add(&d->ui_elements, r); b = mzalloc(sizeof(button)); b->x = x; b->y = CLRBTN_Y; b->w = CLRBTN_TOTAL; b->h = CLRBTN_TOTAL; b->action = i; b->clicked = &multirom_ui_tab_misc_change_clr; button_init_ui(b, NULL, 0); list_add(&d->buttons, b); tabview_add_item(t->tabs, TAB_MISC, b); x += CLRBTN_TOTAL + CLRBTN_MARGIN; } for(i = 0; d->buttons[i]; ++i) keyaction_add(d->buttons[i], button_keyaction_call, d->buttons[i]); tabview_add_items(t->tabs, TAB_MISC, d->ui_elements); }