#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>
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
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 */
}
-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;
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) {
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();
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);
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++) {
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 */
}
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");