X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=petitboot.c;h=fc72fd8103c95f2c59bc235ccf36fa49a394597f;hp=236d8e7d448877ee6568279ac5b1ebca1911208d;hb=e8a3e2b1629824cb01c95e2a49b8f31152c0edd2;hpb=d1cf8ce827d553d8133e9e104757eab9e0868d2a diff --git a/petitboot.c b/petitboot.c index 236d8e7..fc72fd8 100644 --- a/petitboot.c +++ b/petitboot.c @@ -14,6 +14,7 @@ #include #include +#include #include #include @@ -31,7 +32,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" + "keys: 0=safe 1=720p 2=1080i 3=1080p del=GameOS" #define PBOOT_LEFT_PANE_SIZE 160 #define PBOOT_LEFT_PANE_COLOR 0x80000000 @@ -141,6 +142,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 */ @@ -521,12 +546,30 @@ int pboot_add_option(int devindex, const char *title, } -static void pboot_set_device_select(int sel) +static void pboot_set_device_select(int sel, int force) { LOG("%s: %d -> %d\n", __FUNCTION__, pboot_dev_sel, sel); - if (sel == pboot_dev_sel || sel >= pboot_dev_count) + if (!force && sel == pboot_dev_sel) + return; + if (sel >= pboot_dev_count) return; pboot_dev_sel = sel; + if (force) { + pboot_lpane->focus_curindex = sel; + if (sel < 0) + pboot_lpane->focus_target = 0 - PBOOT_LEFT_FOCUS_HEIGHT; + else + pboot_lpane->focus_target = PBOOT_LEFT_FOCUS_YOFF + + PBOOT_LEFT_ICON_STRIDE * sel; + pboot_rpane->focus_box.bottom = pboot_lpane->focus_target; + pboot_rpane->focus_box.bottom = pboot_rpane->focus_box.top + + PBOOT_RIGHT_FOCUS_HEIGHT; + twin_window_damage(pboot_lpane->window, + 0, 0, + pboot_lpane->window->pixmap->width, + pboot_lpane->window->pixmap->height); + twin_window_queue_paint(pboot_lpane->window); + } pboot_rpane->focus_curindex = -1; pboot_rpane->mouse_target = -1; pboot_rpane->focus_box.top = -2*PBOOT_RIGHT_FOCUS_HEIGHT; @@ -574,9 +617,10 @@ static twin_time_t pboot_lfocus_timeout (twin_time_t now, void *closure) const int accel[11] = { 7, 4, 2, 1, 1, 1, 1, 1, 2, 2, 3 }; dist = abs(pboot_lpane->focus_target - pboot_lpane->focus_start); + dir = dist > 2 ? 2 : dist; pos = pboot_lpane->focus_target - (int)pboot_lpane->focus_box.top; if (pos == 0) { - pboot_set_device_select(pboot_lpane->focus_curindex); + pboot_set_device_select(pboot_lpane->focus_curindex, 0); return -1; } if (pos < 0) { @@ -710,9 +754,23 @@ 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: - /* Gross hack for video modes, need something better ! */ switch(event->u.key.key) { + /* Gross hack for video modes, need something better ! */ case KEY_0: pboot_vmode_change = 0; /* auto */ pboot_quit(); @@ -729,6 +787,12 @@ twin_bool_t pboot_event_filter(twin_screen_t *screen, pboot_vmode_change = 5; /* 1080p */ pboot_quit(); return TWIN_TRUE; + + /* Another gross hack for booting back to gameos */ + case KEY_BACKSPACE: + case KEY_DELETE: + system("boot-game-os"); + pboot_quit(); } case TwinEventKeyUp: twin_screen_set_cursor(pboot_screen, NULL, 0, 0); @@ -926,8 +990,8 @@ int pboot_add_device(const char *dev_id, const char *name, int pboot_remove_device(const char *dev_id) { - int i, new_dev_index; pboot_device_t *dev = NULL; + int i, newsel = pboot_dev_sel; /* find the matching device */ for (i = 0; i < pboot_dev_count; i++) { @@ -940,22 +1004,16 @@ int pboot_remove_device(const char *dev_id) if (!dev) return TWIN_FALSE; - /* select the newly-focussed device */ - if (i == pboot_dev_count - 1) - new_dev_index = i - 1; - else - new_dev_index = i + 1; - memmove(pboot_devices + i, pboot_devices + i + 1, sizeof(*pboot_devices) * (pboot_dev_count + i - 1)); - pboot_devices[--pboot_dev_count] = NULL; - pboot_set_device_select(new_dev_index); - twin_window_damage(pboot_lpane->window, - dev->box.left, dev->box.top, - dev->box.right, dev->box.bottom); - twin_window_queue_paint(pboot_lpane->window); + /* select the newly-focussed device */ + if (pboot_dev_sel > i) + newsel = pboot_dev_sel - 1; + else if (pboot_dev_sel == i && i >= pboot_dev_count) + newsel = pboot_dev_count - 1; + pboot_set_device_select(newsel, 1); /* todo: free device & options */ @@ -1080,6 +1138,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");