]> git.ozlabs.org Git - petitboot/blobdiff - petitboot.c
kboot parser: Add UUID and LABEL tests
[petitboot] / petitboot.c
index f8757689b53b59ef2ebc673a26ee6736d730f29f..ee6893032e6d033be6ddd9d6e8cac16c68a2695c 100644 (file)
@@ -1,3 +1,6 @@
+
+#define _GNU_SOURCE
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -14,6 +17,7 @@
 
 #include <libtwin/twin.h>
 #include <libtwin/twin_linux_mouse.h>
+#include <libtwin/twin_linux_js.h>
 #include <libtwin/twin_png.h>
 #include <libtwin/twin_jpeg.h>
 
@@ -141,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 */
@@ -432,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);
@@ -729,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 ! */
@@ -752,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);
@@ -881,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)
@@ -1099,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");