X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=petitboot.c;h=ee6893032e6d033be6ddd9d6e8cac16c68a2695c;hp=581d6332f411d5c5b4f847b64700d660da9ad204;hb=e518d1d16c16781d6824ece2ee0ddd1ac2339703;hpb=54ed7f641d0dd17778ce8cae5a5dbfd645366d3c diff --git a/petitboot.c b/petitboot.c index 581d633..ee68930 100644 --- a/petitboot.c +++ b/petitboot.c @@ -1,3 +1,6 @@ + +#define _GNU_SOURCE + #include #include #include @@ -14,6 +17,7 @@ #include #include +#include #include #include @@ -31,8 +35,7 @@ static twin_fbdev_t *pboot_fbdev; static twin_screen_t *pboot_screen; #define PBOOT_INITIAL_MESSAGE \ - "video hack: 0=default 1=720p 2=1080i 3=1080p " \ - "BACKSPACE=return to GameOS" + "keys: 0=safe 1=720p 2=1080i 3=1080p del=GameOS" #define PBOOT_LEFT_PANE_SIZE 160 #define PBOOT_LEFT_PANE_COLOR 0x80000000 @@ -142,6 +145,30 @@ static pboot_lpane_t *pboot_lpane; static pboot_rpane_t *pboot_rpane; static pboot_spane_t *pboot_spane; +/* control to keyboard mappings for the sixaxis controller */ +uint8_t sixaxis_map[] = { + 0, /* 0 Select */ + 0, /* 1 L3 */ + 0, /* 2 R3 */ + 0, /* 3 Start */ + KEY_UP, /* 4 Dpad Up */ + KEY_RIGHT, /* 5 Dpad Right */ + KEY_DOWN, /* 6 Dpad Down */ + KEY_LEFT, /* 7 Dpad Left */ + 0, /* 8 L2 */ + 0, /* 9 R2 */ + 0, /* 10 L1 */ + 0, /* 11 R1 */ + 0, /* 12 Triangle */ + KEY_ENTER, /* 13 Circle */ + 0, /* 14 Cross */ + KEY_DELETE, /* 15 Square */ + 0, /* 16 PS Button */ + 0, /* 17 nothing */ + 0, /* 18 nothing */ +}; + + static int pboot_vmode_change = -1; /* XXX move to twin */ @@ -433,6 +460,7 @@ static void pboot_choose_option(void) pboot_option_t *opt = &dev->options[pboot_rpane->focus_curindex]; LOG("Selected device %s\n", opt->title); + pboot_message("booting %s...", opt->title); /* Give user feedback, make sure errors and panics will be seen */ pboot_exec_option(opt->data); @@ -730,6 +758,20 @@ twin_bool_t pboot_event_filter(twin_screen_t *screen, pboot_cursor_hx, pboot_cursor_hy); break; + case TwinEventJoyButton: + /* map joystick events into key events */ + if (event->u.js.control >= sizeof(sixaxis_map)) + break; + + event->u.key.key = sixaxis_map[event->u.js.control]; + if (event->u.js.value == 0) { + event->kind = TwinEventKeyUp; + break; + } else { + event->kind = TwinEventKeyDown; + } + + /* fall through.. */ case TwinEventKeyDown: switch(event->u.key.key) { /* Gross hack for video modes, need something better ! */ @@ -753,8 +795,8 @@ twin_bool_t pboot_event_filter(twin_screen_t *screen, /* Another gross hack for booting back to gameos */ case KEY_BACKSPACE: case KEY_DELETE: - system("boot-game-os"); - pboot_quit(); + pboot_message("booting to GameOS..."); + system(BOOT_GAMEOS_BIN); } case TwinEventKeyUp: twin_screen_set_cursor(pboot_screen, NULL, 0, 0); @@ -882,16 +924,24 @@ static void pboot_spane_draw(twin_window_t *window) twin_path_destroy(path); } -void pboot_message(const char *message) +void pboot_message(const char *fmt, ...) { + va_list ap; + char *msg; + if (pboot_spane->text) free(pboot_spane->text); - pboot_spane->text = strdup(message); + + va_start(ap, fmt); + vasprintf(&msg, fmt, ap); + va_end(ap); + + pboot_spane->text = msg; twin_window_damage(pboot_spane->window, 0, 0, pboot_spane->window->pixmap->width, pboot_spane->window->pixmap->height); - twin_window_queue_paint(pboot_spane->window); + twin_window_draw(pboot_spane->window); } static void pboot_create_spane(void) @@ -1100,6 +1150,7 @@ int main(int argc, char **argv) } pboot_screen = pboot_fbdev->screen; twin_linux_mouse_create(NULL, pboot_screen); + twin_linux_js_create(pboot_screen); if (pboot_fbdev != NULL) { char *cursor_path = artwork_pathname("cursor.gz");