frontend: add fast forward support
[pcsx_rearmed.git] / frontend / plat_sdl.c
index b9a27c3..61f904d 100644 (file)
 
 #include <stdio.h>
 #include <SDL.h>
-#include "common/input.h"
-#include "common/in_sdl.h"
-#include "common/menu.h"
+
+#include "libpicofe/input.h"
+#include "libpicofe/in_sdl.h"
+#include "libpicofe/menu.h"
 #include "plugin_lib.h"
 #include "main.h"
 #include "plat.h"
 #include "revision.h"
 
 static const struct in_default_bind in_sdl_defbinds[] = {
-       { SDLK_UP,      IN_BINDTYPE_PLAYER12, DKEY_UP },
-       { SDLK_DOWN,    IN_BINDTYPE_PLAYER12, DKEY_DOWN },
-       { SDLK_LEFT,    IN_BINDTYPE_PLAYER12, DKEY_LEFT },
-       { SDLK_RIGHT,   IN_BINDTYPE_PLAYER12, DKEY_RIGHT },
-       { SDLK_d,       IN_BINDTYPE_PLAYER12, DKEY_TRIANGLE },
-       { SDLK_z,       IN_BINDTYPE_PLAYER12, DKEY_CROSS },
-       { SDLK_x,       IN_BINDTYPE_PLAYER12, DKEY_CIRCLE },
-       { SDLK_s,       IN_BINDTYPE_PLAYER12, DKEY_SQUARE },
-       { SDLK_v,       IN_BINDTYPE_PLAYER12, DKEY_START },
-       { SDLK_c,       IN_BINDTYPE_PLAYER12, DKEY_SELECT },
-       { SDLK_w,       IN_BINDTYPE_PLAYER12, DKEY_L1 },
-       { SDLK_r,       IN_BINDTYPE_PLAYER12, DKEY_R1 },
-       { SDLK_e,       IN_BINDTYPE_PLAYER12, DKEY_L2 },
-       { SDLK_t,       IN_BINDTYPE_PLAYER12, DKEY_R2 },
-       { SDLK_ESCAPE,  IN_BINDTYPE_EMU, SACTION_ENTER_MENU },
-       { 0, 0, 0 }
+  { SDLK_UP,     IN_BINDTYPE_PLAYER12, DKEY_UP },
+  { SDLK_DOWN,   IN_BINDTYPE_PLAYER12, DKEY_DOWN },
+  { SDLK_LEFT,   IN_BINDTYPE_PLAYER12, DKEY_LEFT },
+  { SDLK_RIGHT,  IN_BINDTYPE_PLAYER12, DKEY_RIGHT },
+  { SDLK_d,      IN_BINDTYPE_PLAYER12, DKEY_TRIANGLE },
+  { SDLK_z,      IN_BINDTYPE_PLAYER12, DKEY_CROSS },
+  { SDLK_x,      IN_BINDTYPE_PLAYER12, DKEY_CIRCLE },
+  { SDLK_s,      IN_BINDTYPE_PLAYER12, DKEY_SQUARE },
+  { SDLK_v,      IN_BINDTYPE_PLAYER12, DKEY_START },
+  { SDLK_c,      IN_BINDTYPE_PLAYER12, DKEY_SELECT },
+  { SDLK_w,      IN_BINDTYPE_PLAYER12, DKEY_L1 },
+  { SDLK_r,      IN_BINDTYPE_PLAYER12, DKEY_R1 },
+  { SDLK_e,      IN_BINDTYPE_PLAYER12, DKEY_L2 },
+  { SDLK_t,      IN_BINDTYPE_PLAYER12, DKEY_R2 },
+  { SDLK_ESCAPE, IN_BINDTYPE_EMU, SACTION_ENTER_MENU },
+  { SDLK_F1,     IN_BINDTYPE_EMU, SACTION_SAVE_STATE },
+  { SDLK_F2,     IN_BINDTYPE_EMU, SACTION_LOAD_STATE },
+  { SDLK_F3,     IN_BINDTYPE_EMU, SACTION_PREV_SSLOT },
+  { SDLK_F4,     IN_BINDTYPE_EMU, SACTION_NEXT_SSLOT },
+  { SDLK_F5,     IN_BINDTYPE_EMU, SACTION_TOGGLE_FSKIP },
+  { SDLK_F6,     IN_BINDTYPE_EMU, SACTION_SCREENSHOT },
+  { SDLK_F7,     IN_BINDTYPE_EMU, SACTION_FAST_FORWARD },
+  { SDLK_F8,     IN_BINDTYPE_EMU, SACTION_SWITCH_DISPMODE },
+  { 0, 0, 0 }
 };
 
 static SDL_Surface *screen;
+static void *menubg_img;
 
 static int change_video_mode(int w, int h)
 {
@@ -78,6 +88,10 @@ void plat_init(void)
   }
   SDL_WM_SetCaption("PCSX-ReARMed " REV, NULL);
 
+  menubg_img = malloc(640 * 512 * 2);
+  if (menubg_img == NULL)
+    goto fail;
+
   in_sdl_init(in_sdl_defbinds);
   in_probe();
   pl_rearmed_cbs.only_16bpp = 1;
@@ -90,10 +104,12 @@ fail:
 
 void plat_finish(void)
 {
+  free(menubg_img);
+  menubg_img = NULL;
   SDL_Quit();
 }
 
-void plat_gvideo_open(void)
+void plat_gvideo_open(int is_pal)
 {
 }
 
@@ -103,6 +119,7 @@ void *plat_gvideo_set_mode(int *w, int *h, int *bpp)
   return screen->pixels;
 }
 
+/* XXX: missing SDL_LockSurface() */
 void *plat_gvideo_flip(void)
 {
   SDL_Flip(screen);
@@ -115,6 +132,10 @@ void plat_gvideo_close(void)
 
 void plat_video_menu_enter(int is_rom_loaded)
 {
+  /* surface will be lost, must adjust pl_vout_buf for menu bg */
+  memcpy(menubg_img, screen->pixels, screen->w * screen->h * 2);
+  pl_vout_buf = menubg_img;
+
   change_video_mode(g_menuscreen_w, g_menuscreen_h);
 }