X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=petitboot.c;h=ea7dc57619d1df9f540f6a8642182f3a621f5777;hp=d566e3ff188ff7dc8cf20d36b52545fe2e894205;hb=c26b2a1d05865bc92e795797e5d0535edd2aca77;hpb=f2c8c4c7197ef61c0378ffbeb4649d28bfcbba06 diff --git a/petitboot.c b/petitboot.c index d566e3f..ea7dc57 100644 --- a/petitboot.c +++ b/petitboot.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include @@ -28,14 +30,17 @@ static twin_fbdev_t *pboot_fbdev; static twin_screen_t *pboot_screen; -#define PBOOT_LEFT_PANE_SIZE 200 +#define PBOOT_INITIAL_MESSAGE \ + "video hack: 0=default 1=720p 2=1080i 3=1080p" + +#define PBOOT_LEFT_PANE_SIZE 160 #define PBOOT_LEFT_PANE_COLOR 0x80000000 #define PBOOT_LEFT_LINE_COLOR 0xff000000 #define PBOOT_LEFT_FOCUS_WIDTH 80 #define PBOOT_LEFT_FOCUS_HEIGHT 80 -#define PBOOT_LEFT_FOCUS_XOFF 60 -#define PBOOT_LEFT_FOCUS_YOFF 60 +#define PBOOT_LEFT_FOCUS_XOFF 40 +#define PBOOT_LEFT_FOCUS_YOFF 40 #define PBOOT_LEFT_FOCUS_XRAD (6 * TWIN_FIXED_ONE) #define PBOOT_LEFT_FOCUS_YRAD (6 * TWIN_FIXED_ONE) @@ -47,8 +52,8 @@ static twin_screen_t *pboot_screen; #define PBOOT_LEFT_ICON_WIDTH 64 #define PBOOT_LEFT_ICON_HEIGHT 64 -#define PBOOT_LEFT_ICON_XOFF 70 -#define PBOOT_LEFT_ICON_YOFF 70 +#define PBOOT_LEFT_ICON_XOFF 50 +#define PBOOT_LEFT_ICON_YOFF 50 #define PBOOT_LEFT_ICON_STRIDE 100 #define PBOOT_RIGHT_OPTION_LMARGIN 30 @@ -60,7 +65,7 @@ static twin_screen_t *pboot_screen; #define PBOOT_RIGHT_SUBTITLE_TEXT_SIZE (18 * TWIN_FIXED_ONE) #define PBOOT_RIGHT_TITLE_XOFFSET 80 #define PBOOT_RIGHT_TITLE_YOFFSET 30 -#define PBOOT_RIGHT_SUBTITLE_XOFFSET 200 +#define PBOOT_RIGHT_SUBTITLE_XOFFSET 100 #define PBOOT_RIGHT_SUBTITLE_YOFFSET 50 #define PBOOT_RIGHT_BADGE_XOFFSET 2 #define PBOOT_RIGHT_BADGE_YOFFSET 0 @@ -71,6 +76,12 @@ static twin_screen_t *pboot_screen; #define PBOOT_FOCUS_COLOR 0x10404040 +#define PBOOT_STATUS_PANE_COLOR 0x60606060 +#define PBOOT_STATUS_PANE_HEIGHT 20 +#define PBOOT_STATUS_PANE_XYMARGIN 20 +#define PBOOT_STATUS_TEXT_MARGIN 10 +#define PBOOT_STATUS_TEXT_SIZE (16 * TWIN_FIXED_ONE) +#define PBOOT_STATUS_TEXT_COLOR 0xff000000 typedef struct _pboot_option pboot_option_t; typedef struct _pboot_device pboot_device_t; @@ -121,8 +132,16 @@ typedef struct _pboot_rpane { int mouse_target; } pboot_rpane_t; +typedef struct _pboot_spane { + twin_window_t *window; + char *text; +} pboot_spane_t; + static pboot_lpane_t *pboot_lpane; static pboot_rpane_t *pboot_rpane; +static pboot_spane_t *pboot_spane; + +static int pboot_vmode_change = -1; /* XXX move to twin */ static inline twin_bool_t twin_rect_intersect(twin_rect_t r1, @@ -519,6 +538,36 @@ static void pboot_set_device_select(int sel) twin_window_queue_paint(pboot_rpane->window); } +static void pboot_create_rpane(void) +{ + pboot_rpane = calloc(1, sizeof(pboot_rpane_t)); + assert(pboot_rpane); + + pboot_rpane->window = twin_window_create(pboot_screen, TWIN_ARGB32, + TwinWindowPlain, + PBOOT_LEFT_PANE_SIZE, 0, + pboot_screen->width - + PBOOT_LEFT_PANE_SIZE, + pboot_screen->height); + assert(pboot_rpane->window); + + pboot_rpane->window->draw = pboot_rpane_draw; + pboot_rpane->window->event = pboot_rpane_event; + pboot_rpane->window->client_data = pboot_rpane; + + pboot_rpane->focus_curindex = -1; + pboot_rpane->focus_box.left = PBOOT_RIGHT_FOCUS_XOFF; + pboot_rpane->focus_box.top = -2*PBOOT_RIGHT_FOCUS_HEIGHT; + pboot_rpane->focus_box.right = pboot_rpane->window->pixmap->width - + 2 * PBOOT_RIGHT_FOCUS_XOFF; + pboot_rpane->focus_box.bottom = pboot_rpane->focus_box.top + + PBOOT_RIGHT_FOCUS_HEIGHT; + pboot_rpane->mouse_target = -1; + twin_window_show(pboot_rpane->window); + twin_window_queue_paint(pboot_rpane->window); +} + + static twin_time_t pboot_lfocus_timeout (twin_time_t now, void *closure) { int dir = 1, dist, pos; @@ -642,6 +691,11 @@ static twin_bool_t pboot_lpane_event (twin_window_t *window, return TWIN_FALSE; } +static void pboot_quit(void) +{ + kill(0, SIGINT); +} + twin_bool_t pboot_event_filter(twin_screen_t *screen, twin_event_t *event) { @@ -657,6 +711,25 @@ twin_bool_t pboot_event_filter(twin_screen_t *screen, pboot_cursor_hy); break; case TwinEventKeyDown: + /* Gross hack for video modes, need something better ! */ + switch(event->u.key.key) { + case KEY_0: + pboot_vmode_change = 0; /* auto */ + pboot_quit(); + return TWIN_TRUE; + case KEY_1: + pboot_vmode_change = 3; /* 720p */ + pboot_quit(); + return TWIN_TRUE; + case KEY_2: + pboot_vmode_change = 4; /* 1080i */ + pboot_quit(); + return TWIN_TRUE; + case KEY_3: + pboot_vmode_change = 5; /* 1080p */ + pboot_quit(); + return TWIN_TRUE; + } case TwinEventKeyUp: twin_screen_set_cursor(pboot_screen, NULL, 0, 0); break; @@ -732,9 +805,8 @@ static void pboot_lpane_draw(twin_window_t *window) twin_path_destroy(path); } -static void pboot_create_panels(void) +static void pboot_create_lpane(void) { - /* left pane */ pboot_lpane = calloc(1, sizeof(pboot_lpane_t)); assert(pboot_lpane); @@ -756,32 +828,68 @@ static void pboot_create_panels(void) PBOOT_LEFT_FOCUS_HEIGHT; pboot_lpane->mouse_target = -1; twin_window_show(pboot_lpane->window); + twin_window_queue_paint(pboot_lpane->window); +} - /* right pane */ - pboot_rpane = calloc(1, sizeof(pboot_rpane_t)); - assert(pboot_rpane); +static void pboot_spane_draw(twin_window_t *window) +{ + twin_pixmap_t *px = window->pixmap; + pboot_spane_t *spane = window->client_data; + twin_path_t *path; + twin_fixed_t tx, ty; - pboot_rpane->window = twin_window_create(pboot_screen, TWIN_ARGB32, - TwinWindowPlain, - PBOOT_LEFT_PANE_SIZE, 0, - pboot_screen->width - - PBOOT_LEFT_PANE_SIZE, - pboot_screen->height); - assert(pboot_rpane->window); + /* Fill background */ + twin_fill(px, PBOOT_STATUS_PANE_COLOR, TWIN_SOURCE, + 0, 0, px->width, px->height); - pboot_rpane->window->draw = pboot_rpane_draw; - pboot_rpane->window->event = pboot_rpane_event; - pboot_rpane->window->client_data = pboot_rpane; + path = twin_path_create(); + assert(path); - pboot_rpane->focus_curindex = -1; - pboot_rpane->focus_box.left = PBOOT_RIGHT_FOCUS_XOFF; - pboot_rpane->focus_box.top = -2*PBOOT_RIGHT_FOCUS_HEIGHT; - pboot_rpane->focus_box.right = pboot_rpane->window->pixmap->width - - 2 * PBOOT_RIGHT_FOCUS_XOFF; - pboot_rpane->focus_box.bottom = pboot_rpane->focus_box.top + - PBOOT_RIGHT_FOCUS_HEIGHT; - pboot_rpane->mouse_target = -1; - twin_window_show(pboot_rpane->window); + twin_path_set_font_size(path, PBOOT_STATUS_TEXT_SIZE); + twin_path_set_font_style(path, TWIN_TEXT_UNHINTED); + tx = twin_int_to_fixed(PBOOT_STATUS_TEXT_MARGIN); + ty = twin_int_to_fixed(PBOOT_STATUS_PANE_HEIGHT - 2); + twin_path_move (path, tx, ty); + twin_path_utf8 (path, spane->text); + twin_paint_path (px, PBOOT_STATUS_TEXT_COLOR, path); + + twin_path_destroy(path); +} + +void pboot_message(const char *message) +{ + if (pboot_spane->text) + free(pboot_spane->text); + pboot_spane->text = strdup(message); + 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); +} + +static void pboot_create_spane(void) +{ + pboot_spane = calloc(1, sizeof(pboot_spane_t)); + assert(pboot_spane); + + pboot_spane->window = twin_window_create(pboot_screen, TWIN_ARGB32, + TwinWindowPlain, + PBOOT_LEFT_PANE_SIZE + + PBOOT_STATUS_PANE_XYMARGIN, + pboot_screen->height - + PBOOT_STATUS_PANE_HEIGHT, + pboot_screen->width - + PBOOT_LEFT_PANE_SIZE - + 2*PBOOT_STATUS_PANE_XYMARGIN, + PBOOT_STATUS_PANE_HEIGHT); + assert(pboot_spane->window); + + pboot_spane->window->draw = pboot_spane_draw; + pboot_spane->window->client_data = pboot_spane; + pboot_spane->text = strdup(PBOOT_INITIAL_MESSAGE); + twin_window_show(pboot_spane->window); + twin_window_queue_paint(pboot_spane->window); } int pboot_add_device(const char *dev_id, const char *name, @@ -899,12 +1007,22 @@ static void pboot_make_background(void) twin_screen_set_background(pboot_screen, scaledpic); } +#define PS3FB_IOCTL_SETMODE _IOW('r', 1, int) +#define PS3FB_IOCTL_GETMODE _IOR('r', 2, int) + static void exitfunc(void) { #ifndef _USE_X11 if (pboot_fbdev) twin_fbdev_destroy(pboot_fbdev); pboot_fbdev = NULL; + if (pboot_vmode_change != -1) { + int fd = open("/dev/fb0", O_RDWR); + if (fd >= 0) + ioctl(fd, PS3FB_IOCTL_SETMODE, + (unsigned long)&pboot_vmode_change); + close(fd); + } #endif } @@ -964,7 +1082,7 @@ int main(int argc, char **argv) twin_linux_mouse_create(NULL, pboot_screen); if (pboot_fbdev != NULL) { - char *cursor_path = artwork_pathname("cursor"); + char *cursor_path = artwork_pathname("cursor.gz"); pboot_cursor = twin_load_X_cursor(cursor_path, 2, &pboot_cursor_hx, &pboot_cursor_hy); @@ -979,9 +1097,9 @@ int main(int argc, char **argv) pboot_make_background(); /* Init more stuffs */ - pboot_create_panels(); - twin_window_queue_paint(pboot_lpane->window); - twin_window_queue_paint(pboot_rpane->window); + pboot_create_lpane(); + pboot_create_rpane(); + pboot_create_spane(); if (!pboot_start_device_discovery(udev_trigger)) { LOG("Couldn't start device discovery!\n");