void button_init_ui(button *b, const char *text, int size) { b->touch_id = -1; if(text != NULL) { b->c[CLR_NORMAL][0] = C_HIGHLIGHT_BG; b->c[CLR_NORMAL][1] = C_HIGHLIGHT_TEXT; b->c[CLR_HOVER][0] = C_HIGHLIGHT_HOVER; b->c[CLR_HOVER][1] = C_HIGHLIGHT_TEXT; b->c[CLR_DIS][0] = GRAY; b->c[CLR_DIS][1] = WHITE; b->c[CLR_CHECK][0] = C_HIGHLIGHT_BG; b->c[CLR_CHECK][1] = C_HIGHLIGHT_TEXT; b->rect = fb_add_rect_lvl(b->level_off + LEVEL_RECT, b->x, b->y, b->w, b->h, b->c[CLR_NORMAL][0]); fb_text_proto *p = fb_text_create(0, 0, b->c[CLR_NORMAL][1], size, text); p->level = b->level_off + LEVEL_TEXT; b->text = fb_text_finalize(p); center_text(b->text, b->x, b->y, b->w, b->h); } else { b->text = NULL; b->rect = NULL; } add_touch_handler(&button_touch_handler, b); }
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); }
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); }
checkbox *checkbox_create(int x, int y, void (*clicked)(int)) { checkbox *c = malloc(sizeof(checkbox)); memset(c, 0, sizeof(checkbox)); c->touch_id = -1; c->clicked = clicked; c->borders[BORDER_L] = fb_add_rect(0, 0, BORDER_SIZE, CHECKBOX_SIZE, WHITE); c->borders[BORDER_R] = fb_add_rect(0, 0, BORDER_SIZE, CHECKBOX_SIZE, WHITE); c->borders[BORDER_T] = fb_add_rect(0, 0, CHECKBOX_SIZE, BORDER_SIZE, WHITE); c->borders[BORDER_B] = fb_add_rect(0, 0, CHECKBOX_SIZE, BORDER_SIZE, WHITE); checkbox_set_pos(c, x, y); if(c->clicked) add_touch_handler(&checkbox_touch_handler, c); return c; }
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; }