#include <linux/input.h>
+#undef _USE_X11
+
#include <libtwin/twin.h>
-#include <libtwin/twin_fbdev.h>
-#include <libtwin/twin_x11.h>
#include <libtwin/twin_linux_mouse.h>
#include <libtwin/twin_png.h>
#include "petitboot.h"
+#include "petitboot-paths.h"
-#define _USE_X11
-
-static twin_fbdev_t *pboot_fbdev;
+#ifdef _USE_X11
+#include <libtwin/twin_x11.h>
static twin_x11_t *pboot_x11;
+#else
+#include <libtwin/twin_fbdev.h>
+static twin_fbdev_t *pboot_fbdev;
+#endif
+
static twin_screen_t *pboot_screen;
#define PBOOT_LEFT_PANE_SIZE 200
twin_pixmap_t *badge;
twin_pixmap_t *cache;
twin_rect_t box;
+ void *data;
};
struct _pboot_device
pboot_rpane->mouse_target = candidate;
}
+static void pboot_choose_option(void)
+{
+ pboot_device_t *dev = pboot_devices[pboot_dev_sel];
+ pboot_option_t *opt = &dev->options[pboot_rpane->focus_curindex];
+
+ LOG("Selected device %s\n", opt->title);
+
+ /* Give user feedback, make sure errors and panics will be seen */
+ pboot_exec_option(opt->data);
+}
+
static twin_bool_t pboot_rpane_event (twin_window_t *window,
twin_event_t *event)
{
pboot_rpane_mousetrack(event->u.pointer.x, event->u.pointer.y);
return TWIN_TRUE;
case TwinEventButtonDown:
+ pboot_select_rpane();
+ pboot_rpane_mousetrack(event->u.pointer.x, event->u.pointer.y);
+ pboot_choose_option();
case TwinEventButtonUp:
return TWIN_TRUE;
case TwinEventKeyDown:
case KEY_LEFT:
pboot_select_lpane();
return TWIN_TRUE;
+ case KEY_ENTER:
+ pboot_choose_option();
default:
break;
}
int pboot_add_option(int devindex, const char *title,
- const char *subtitle, twin_pixmap_t *badge)
+ const char *subtitle, twin_pixmap_t *badge, void *data)
{
pboot_device_t *dev;
pboot_option_t *opt;
index * PBOOT_RIGHT_OPTION_STRIDE;
opt->box.bottom = opt->box.top + PBOOT_RIGHT_OPTION_HEIGHT;
+ opt->data = data;
return index;
}
static void exitfunc(void)
{
+#ifndef _USE_X11
if (pboot_fbdev)
twin_fbdev_destroy(pboot_fbdev);
pboot_fbdev = NULL;
+#endif
}
static void sigint(int sig)
int main(int argc, char **argv)
{
twin_pixmap_t *pic;
+ const char *background_path;
atexit(exitfunc);
signal(SIGINT, sigint);
}
pboot_screen = pboot_fbdev->screen;
twin_linux_mouse_create(NULL, pboot_screen);
-#endif
if (pboot_fbdev != NULL) {
- pboot_cursor = twin_load_X_cursor("artwork/cursor", 2,
+ char *cursor_path = artwork_pathname("cursor");
+ pboot_cursor = twin_load_X_cursor(cursor_path, 2,
&pboot_cursor_hx,
&pboot_cursor_hy);
if (pboot_cursor == NULL)
twin_get_default_cursor(&pboot_cursor_hx,
&pboot_cursor_hy);
}
+#endif
/* Set background pixmap */
- LOG("loading background...");
- pic = twin_png_to_pixmap("artwork/background.png", TWIN_ARGB32);
+ background_path = artwork_pathname("background.png");
+ LOG("loading background: %s...", background_path);
+ pic = twin_png_to_pixmap(background_path, TWIN_ARGB32);
LOG("%s\n", pic ? "ok" : "failed");
if (pic)
twin_screen_set_background(pboot_screen, pic);
pboot_screen->event_filter = pboot_event_filter;
/* Console switch */
+#ifndef _USE_X11
if (pboot_fbdev)
twin_fbdev_activate(pboot_fbdev);
+#endif
/* Process events */
twin_dispatch ();