mirror of https://github.com/snes9xgit/snes9x.git
Merge branch 'win32-saveload-preview'
This commit is contained in:
commit
6af12f272f
180
snapshot.cpp
180
snapshot.cpp
|
@ -1069,6 +1069,38 @@ int S9xUnfreezeGameMem (const uint8 *buf, uint32 bufSize)
|
|||
return result;
|
||||
}
|
||||
|
||||
void S9xMessageFromResult(int result, const char* base)
|
||||
{
|
||||
switch(result)
|
||||
{
|
||||
case WRONG_FORMAT:
|
||||
S9xMessage(S9X_ERROR, S9X_WRONG_FORMAT, SAVE_ERR_WRONG_FORMAT);
|
||||
break;
|
||||
|
||||
case WRONG_VERSION:
|
||||
S9xMessage(S9X_ERROR, S9X_WRONG_VERSION, SAVE_ERR_WRONG_VERSION);
|
||||
break;
|
||||
|
||||
case WRONG_MOVIE_SNAPSHOT:
|
||||
S9xMessage(S9X_ERROR, S9X_WRONG_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_WRONG_MOVIE);
|
||||
break;
|
||||
|
||||
case NOT_A_MOVIE_SNAPSHOT:
|
||||
S9xMessage(S9X_ERROR, S9X_NOT_A_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_NOT_MOVIE);
|
||||
break;
|
||||
|
||||
case SNAPSHOT_INCONSISTENT:
|
||||
S9xMessage(S9X_ERROR, S9X_SNAPSHOT_INCONSISTENT, MOVIE_ERR_SNAPSHOT_INCONSISTENT);
|
||||
break;
|
||||
|
||||
case FILE_NOT_FOUND:
|
||||
default:
|
||||
sprintf(String, SAVE_ERR_ROM_NOT_FOUND, base);
|
||||
S9xMessage(S9X_ERROR, S9X_ROM_NOT_FOUND, String);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool8 S9xUnfreezeGame (const char *filename)
|
||||
{
|
||||
STREAM stream = NULL;
|
||||
|
@ -1088,35 +1120,7 @@ bool8 S9xUnfreezeGame (const char *filename)
|
|||
|
||||
if (result != SUCCESS)
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
case WRONG_FORMAT:
|
||||
S9xMessage(S9X_ERROR, S9X_WRONG_FORMAT, SAVE_ERR_WRONG_FORMAT);
|
||||
break;
|
||||
|
||||
case WRONG_VERSION:
|
||||
S9xMessage(S9X_ERROR, S9X_WRONG_VERSION, SAVE_ERR_WRONG_VERSION);
|
||||
break;
|
||||
|
||||
case WRONG_MOVIE_SNAPSHOT:
|
||||
S9xMessage(S9X_ERROR, S9X_WRONG_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_WRONG_MOVIE);
|
||||
break;
|
||||
|
||||
case NOT_A_MOVIE_SNAPSHOT:
|
||||
S9xMessage(S9X_ERROR, S9X_NOT_A_MOVIE_SNAPSHOT, MOVIE_ERR_SNAPSHOT_NOT_MOVIE);
|
||||
break;
|
||||
|
||||
case SNAPSHOT_INCONSISTENT:
|
||||
S9xMessage(S9X_ERROR, S9X_SNAPSHOT_INCONSISTENT, MOVIE_ERR_SNAPSHOT_INCONSISTENT);
|
||||
break;
|
||||
|
||||
case FILE_NOT_FOUND:
|
||||
default:
|
||||
sprintf(String, SAVE_ERR_ROM_NOT_FOUND, base);
|
||||
S9xMessage(S9X_ERROR, S9X_ROM_NOT_FOUND, String);
|
||||
break;
|
||||
}
|
||||
|
||||
S9xMessageFromResult(result, base);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
|
@ -1141,6 +1145,34 @@ bool8 S9xUnfreezeGame (const char *filename)
|
|||
return (FALSE);
|
||||
}
|
||||
|
||||
bool8 S9xUnfreezeScreenshot(const char *filename, uint16 **image_buffer, int &width, int &height)
|
||||
{
|
||||
STREAM stream = NULL;
|
||||
|
||||
const char *base = S9xBasename(filename);
|
||||
|
||||
if(S9xOpenSnapshotFile(filename, TRUE, &stream))
|
||||
{
|
||||
int result;
|
||||
|
||||
result = S9xUnfreezeScreenshotFromStream(stream, image_buffer, width, height);
|
||||
S9xCloseSnapshotFile(stream);
|
||||
|
||||
if(result != SUCCESS)
|
||||
{
|
||||
S9xMessageFromResult(result, base);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
sprintf(String, SAVE_ERR_SAVE_NOT_FOUND, base);
|
||||
S9xMessage(S9X_INFO, S9X_FREEZE_FILE_INFO, String);
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
void S9xFreezeToStream (STREAM stream)
|
||||
{
|
||||
char buffer[8192];
|
||||
|
@ -1801,6 +1833,96 @@ int S9xUnfreezeFromStream (STREAM stream)
|
|||
return (result);
|
||||
}
|
||||
|
||||
// load screenshot from file, allocating memory for it
|
||||
int S9xUnfreezeScreenshotFromStream(STREAM stream, uint16 **image_buffer, int &width, int &height)
|
||||
{
|
||||
int result = SUCCESS;
|
||||
int version, len;
|
||||
char buffer[PATH_MAX + 1];
|
||||
|
||||
len = strlen(SNAPSHOT_MAGIC) + 1 + 4 + 1;
|
||||
if(READ_STREAM(buffer, len, stream) != (unsigned int)len)
|
||||
return (WRONG_FORMAT);
|
||||
|
||||
if(strncmp(buffer, SNAPSHOT_MAGIC, strlen(SNAPSHOT_MAGIC)) != 0)
|
||||
return (WRONG_FORMAT);
|
||||
|
||||
version = atoi(&buffer[strlen(SNAPSHOT_MAGIC) + 1]);
|
||||
if(version > SNAPSHOT_VERSION)
|
||||
return (WRONG_VERSION);
|
||||
|
||||
result = UnfreezeBlock(stream, "NAM", (uint8 *)buffer, PATH_MAX);
|
||||
if(result != SUCCESS)
|
||||
return (result);
|
||||
|
||||
uint8 *local_screenshot = NULL;
|
||||
|
||||
// skip all blocks until screenshot
|
||||
SkipBlockWithName(stream, "CPU");
|
||||
SkipBlockWithName(stream, "REG");
|
||||
SkipBlockWithName(stream, "PPU");
|
||||
SkipBlockWithName(stream, "DMA");
|
||||
SkipBlockWithName(stream, "VRA");
|
||||
SkipBlockWithName(stream, "RAM");
|
||||
SkipBlockWithName(stream, "SRA");
|
||||
SkipBlockWithName(stream, "FIL");
|
||||
SkipBlockWithName(stream, "SND");
|
||||
SkipBlockWithName(stream, "CTL");
|
||||
SkipBlockWithName(stream, "TIM");
|
||||
SkipBlockWithName(stream, "SFX");
|
||||
SkipBlockWithName(stream, "SA1");
|
||||
SkipBlockWithName(stream, "SAR");
|
||||
SkipBlockWithName(stream, "DP1");
|
||||
SkipBlockWithName(stream, "DP2");
|
||||
SkipBlockWithName(stream, "DP4");
|
||||
SkipBlockWithName(stream, "CX4");
|
||||
SkipBlockWithName(stream, "ST0");
|
||||
SkipBlockWithName(stream, "OBC");
|
||||
SkipBlockWithName(stream, "OBM");
|
||||
SkipBlockWithName(stream, "S71");
|
||||
SkipBlockWithName(stream, "SRT");
|
||||
SkipBlockWithName(stream, "CLK");
|
||||
SkipBlockWithName(stream, "BSX");
|
||||
SkipBlockWithName(stream, "MSU");
|
||||
result = UnfreezeStructCopy(stream, "SHO", &local_screenshot, SnapScreenshot, COUNT(SnapScreenshot), version);
|
||||
|
||||
|
||||
if(result == SUCCESS && local_screenshot)
|
||||
{
|
||||
SnapshotScreenshotInfo *ssi = new SnapshotScreenshotInfo;
|
||||
|
||||
UnfreezeStructFromCopy(ssi, SnapScreenshot, COUNT(SnapScreenshot), local_screenshot, version);
|
||||
|
||||
width = min(ssi->Width, IMAGE_WIDTH);
|
||||
height = min(ssi->Height, IMAGE_HEIGHT);
|
||||
|
||||
*image_buffer = (uint16 *)malloc(width * height * sizeof(uint16));
|
||||
|
||||
uint8 *rowpix = ssi->Data;
|
||||
uint16 *screen = (*image_buffer);
|
||||
|
||||
for(int y = 0; y < height; y++, screen += width)
|
||||
{
|
||||
for(int x = 0; x < width; x++)
|
||||
{
|
||||
uint32 r, g, b;
|
||||
|
||||
r = *(rowpix++);
|
||||
g = *(rowpix++);
|
||||
b = *(rowpix++);
|
||||
|
||||
screen[x] = BUILD_PIXEL(r, g, b);
|
||||
}
|
||||
}
|
||||
|
||||
delete ssi;
|
||||
}
|
||||
|
||||
if(local_screenshot) delete[] local_screenshot;
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
static int FreezeSize (int size, int type)
|
||||
{
|
||||
switch (type)
|
||||
|
|
|
@ -31,5 +31,7 @@ bool8 S9xUnfreezeGame (const char *);
|
|||
int S9xUnfreezeGameMem (const uint8 *,uint32);
|
||||
void S9xFreezeToStream (STREAM);
|
||||
int S9xUnfreezeFromStream (STREAM);
|
||||
bool8 S9xUnfreezeScreenshot(const char *filename, uint16 **image_buffer, int &width, int &height);
|
||||
int S9xUnfreezeScreenshotFromStream(STREAM stream, uint16 **image_buffer, int &width, int &height);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,278 @@
|
|||
/*****************************************************************************\
|
||||
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
||||
This file is licensed under the Snes9x License.
|
||||
For further information, consult the LICENSE file in the root directory.
|
||||
\*****************************************************************************/
|
||||
|
||||
#include "CSaveLoadWithPreviewDlg.h"
|
||||
|
||||
#include "wsnes9x.h"
|
||||
#include "../snes9x.h"
|
||||
#include "../ppu.h"
|
||||
#include "../display.h"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <shlwapi.h>
|
||||
|
||||
CSaveLoadWithPreviewDlg::CSaveLoadWithPreviewDlg(bool is_save_dialog)
|
||||
{
|
||||
for(int i = 0; i < NUM_DIALOG_SLOTS; i++)
|
||||
{
|
||||
previewHbmps[i] = NULL;
|
||||
}
|
||||
this->is_save_dialog = is_save_dialog;
|
||||
}
|
||||
|
||||
|
||||
CSaveLoadWithPreviewDlg::~CSaveLoadWithPreviewDlg()
|
||||
{
|
||||
delete_preview_bmps();
|
||||
}
|
||||
|
||||
bool CreatePreviewHbitmap(HBITMAP *hbmp)
|
||||
{
|
||||
// create a HBITMAP to store the preview images in 32bit RGB
|
||||
uint8_t* buffer = NULL;
|
||||
BITMAPINFO *bm = (BITMAPINFO *)calloc(sizeof(BITMAPINFOHEADER), 1);
|
||||
bm->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bm->bmiHeader.biWidth = PREVIEW_IMAGE_WIDTH;
|
||||
bm->bmiHeader.biHeight = -PREVIEW_IMAGE_HEIGHT; // negative is top-down
|
||||
bm->bmiHeader.biPlanes = 1;
|
||||
bm->bmiHeader.biBitCount = 32;
|
||||
bm->bmiHeader.biCompression = BI_RGB;
|
||||
bm->bmiHeader.biSizeImage = 0;
|
||||
*hbmp = CreateDIBSection(NULL, bm, DIB_RGB_COLORS, (void**)&buffer, 0, 0);
|
||||
if(*hbmp == NULL) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CSaveLoadWithPreviewDlg::delete_preview_bmps()
|
||||
{
|
||||
for(int i = 0; i < NUM_DIALOG_SLOTS; i++)
|
||||
{
|
||||
if(previewHbmps[i])
|
||||
{
|
||||
DeleteObject(previewHbmps[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CSaveLoadWithPreviewDlg::init_preview_bmps()
|
||||
{
|
||||
for(int i = 0; i < NUM_DIALOG_SLOTS; i++)
|
||||
{
|
||||
if(!CreatePreviewHbitmap(&previewHbmps[i]))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CSaveLoadWithPreviewDlg::load_slot_image_text(int slot, HWND hDlg)
|
||||
{
|
||||
uint16 *image_buffer;
|
||||
int width, height;
|
||||
|
||||
// load the saved screenshot from a snapshot
|
||||
if(UnfreezeScreenshotSlot(slot, &image_buffer, width, height))
|
||||
{
|
||||
// create temporary bitmap storage for screenshot, 16bit RGB
|
||||
uint8_t* buffer = NULL;
|
||||
BITMAPINFO *bm = (BITMAPINFO *)calloc(sizeof(BITMAPINFOHEADER) + 3 * sizeof(RGBQUAD), 1);
|
||||
bm->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||
bm->bmiHeader.biWidth = width;
|
||||
bm->bmiHeader.biHeight = -height; // negative is top-down
|
||||
bm->bmiHeader.biPlanes = 1;
|
||||
bm->bmiHeader.biBitCount = 16;
|
||||
bm->bmiHeader.biCompression = BI_BITFIELDS;
|
||||
bm->bmiHeader.biSizeImage = width * height * 2;
|
||||
*(unsigned long *)&bm->bmiColors[0] = FIRST_COLOR_MASK_RGB565;
|
||||
*(unsigned long *)&bm->bmiColors[1] = SECOND_COLOR_MASK_RGB565;
|
||||
*(unsigned long *)&bm->bmiColors[2] = THIRD_COLOR_MASK_RGB565;
|
||||
HBITMAP imageBmp = CreateDIBSection(NULL, bm, DIB_RGB_COLORS, (void**)&buffer, 0, 0);
|
||||
if(imageBmp == NULL)
|
||||
{
|
||||
free(bm);
|
||||
return;
|
||||
}
|
||||
|
||||
int row_bytes = width * 2 / 4 * 4; // DIBs always have 4-byte aligned rows
|
||||
if(width * 2 % 4)
|
||||
row_bytes += 4;
|
||||
|
||||
// copy saved screenshot into temporary bitmap
|
||||
uint16 *screen = image_buffer;
|
||||
for(int h = 0; h < height; h++, screen += width)
|
||||
{
|
||||
uint16_t *row_start = (uint16_t*)(buffer + (h * row_bytes));
|
||||
for(int w = 0; w < width; w++)
|
||||
{
|
||||
row_start[w] = screen[w];
|
||||
}
|
||||
}
|
||||
|
||||
// strech temporary bitmap into HBIMAP for button
|
||||
HDC cdc = CreateCompatibleDC(GetDC(NULL));
|
||||
HGDIOBJ old = SelectObject(cdc, previewHbmps[slot]);
|
||||
int ret = StretchDIBits(cdc, 0, 0, PREVIEW_IMAGE_WIDTH, PREVIEW_IMAGE_HEIGHT, 0, 0, width, height, buffer, bm, DIB_RGB_COLORS, SRCCOPY);
|
||||
SelectObject(cdc, old);
|
||||
DeleteDC(cdc);
|
||||
|
||||
free(bm);
|
||||
|
||||
// set image to button
|
||||
SendMessage(GetDlgItem(hDlg, IDC_BUTTON_SLOT_1 + slot), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)previewHbmps[slot]);
|
||||
|
||||
char filename[_MAX_PATH + 1];
|
||||
GetSlotFilename(slot, filename);
|
||||
Utf8ToWide filenameW(filename);
|
||||
|
||||
// text with filename and last write time
|
||||
std::wstring static_text(PathFindFileName(filenameW));
|
||||
|
||||
// get file time details
|
||||
HANDLE file_handle = CreateFile(filenameW, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if(file_handle != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
FILETIME ft;
|
||||
SYSTEMTIME stUTC, stLocal;
|
||||
// transform from file time to local time
|
||||
if(GetFileTime(file_handle, NULL, NULL, &ft) &&
|
||||
FileTimeToSystemTime(&ft, &stUTC) &&
|
||||
SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal))
|
||||
{
|
||||
// reserve space for date and time (both received individually)
|
||||
std::vector<wchar_t> date_string;
|
||||
date_string.resize(max(
|
||||
GetDateFormatEx(LOCALE_NAME_USER_DEFAULT, DATE_AUTOLAYOUT | DATE_LONGDATE, &stLocal, NULL, NULL, 0, NULL),
|
||||
GetTimeFormatEx(LOCALE_NAME_USER_DEFAULT, 0, &stLocal, NULL, NULL, 0)
|
||||
));
|
||||
|
||||
GetDateFormatEx(LOCALE_NAME_USER_DEFAULT, DATE_AUTOLAYOUT | DATE_LONGDATE, &stLocal, NULL, &date_string[0], 100, NULL);
|
||||
static_text.append(L"\n").append(&date_string[0]);
|
||||
GetTimeFormatEx(LOCALE_NAME_USER_DEFAULT, 0, &stLocal, NULL, &date_string[0], 100);
|
||||
static_text.append(L" ").append(&date_string[0]);
|
||||
}
|
||||
}
|
||||
|
||||
// set the description text
|
||||
SetWindowText(GetDlgItem(hDlg, IDC_STATIC_SLOT_1 + slot), static_text.c_str());
|
||||
|
||||
free(image_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
void CSaveLoadWithPreviewDlg::init_window(HWND hDlg)
|
||||
{
|
||||
if(is_save_dialog)
|
||||
SetWindowText(hDlg, L"Save with preview");
|
||||
|
||||
int x_pos = 0;
|
||||
int y_pos = 0;
|
||||
for(int i = 0; i < NUM_DIALOG_SLOTS; i++)
|
||||
{
|
||||
// second row
|
||||
if(i == NUM_DIALOG_SLOTS / 2)
|
||||
{
|
||||
x_pos = 0;
|
||||
y_pos = PREVIEW_HEIGHT + PREVIEW_TEXT_STATIC_HEIGHT;
|
||||
}
|
||||
|
||||
// create button and static for one slot
|
||||
CreateWindow(TEXT("BUTTON"), NULL, WS_CHILDWINDOW | WS_VISIBLE | BS_BITMAP, x_pos, y_pos, PREVIEW_WIDHT, PREVIEW_HEIGHT, hDlg, (HMENU)(UINT_PTR)(IDC_BUTTON_SLOT_1 + i), GUI.hInstance, NULL);
|
||||
HWND hStatic = CreateWindow(TEXT("STATIC"), TEXT(""), WS_CHILDWINDOW | WS_VISIBLE | SS_CENTER, x_pos, y_pos + PREVIEW_HEIGHT, PREVIEW_WIDHT, PREVIEW_TEXT_STATIC_HEIGHT, hDlg, (HMENU)(UINT_PTR)(IDC_STATIC_SLOT_1 + i), GUI.hInstance, NULL);
|
||||
x_pos += PREVIEW_WIDHT;
|
||||
|
||||
// set dialog font to static
|
||||
HFONT dlg_font = (HFONT)SendMessage(hDlg, WM_GETFONT, 0, 0);
|
||||
SendMessage(hStatic, WM_SETFONT, (WPARAM)dlg_font, MAKELPARAM(FALSE, 0));
|
||||
|
||||
// load one slot
|
||||
load_slot_image_text(i, hDlg);
|
||||
}
|
||||
|
||||
// resize dialog to fit all buttons and text
|
||||
int dialog_width = NUM_DIALOG_SLOTS / 2 * PREVIEW_WIDHT;
|
||||
int dialog_height = 2 * (PREVIEW_HEIGHT + PREVIEW_TEXT_STATIC_HEIGHT) + 40; // +40 for cancel button
|
||||
|
||||
// reposition cancel button
|
||||
RECT rect_cancel, client_rect;
|
||||
GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &rect_cancel);
|
||||
POINT topleft = { rect_cancel.left, rect_cancel.top };
|
||||
ScreenToClient(hDlg, &topleft);
|
||||
GetClientRect(hDlg, &client_rect);
|
||||
MoveWindow(GetDlgItem(hDlg, IDCANCEL), dialog_width - (client_rect.right - topleft.x), dialog_height - 30, rect_cancel.right - rect_cancel.left, rect_cancel.bottom - rect_cancel.top, TRUE);
|
||||
|
||||
// get monitor dimensions
|
||||
HMONITOR hm;
|
||||
MONITORINFO mi;
|
||||
hm = MonitorFromWindow(GUI.hWnd, MONITOR_DEFAULTTONEAREST);
|
||||
mi.cbSize = sizeof(mi);
|
||||
GetMonitorInfo(hm, &mi);
|
||||
|
||||
// get title bar and borders
|
||||
RECT rcMargins = { 0,0,0,0 };
|
||||
AdjustWindowRectEx(&rcMargins, GetWindowStyle(hDlg), FALSE, GetWindowExStyle(hDlg));
|
||||
rcMargins.left = abs(rcMargins.left);
|
||||
rcMargins.top = abs(rcMargins.top);
|
||||
|
||||
// add margins to window dimensions and position window in center of screen
|
||||
dialog_height += rcMargins.top + rcMargins.bottom;
|
||||
dialog_width += rcMargins.left + rcMargins.right;
|
||||
int left = (mi.rcWork.right - mi.rcWork.left - dialog_width) / 2;
|
||||
int top = (mi.rcWork.bottom - mi.rcWork.top - dialog_height) / 2;
|
||||
SetWindowPos(hDlg, NULL, left, top, dialog_width, dialog_height, SWP_NOZORDER);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK CSaveLoadWithPreviewDlg::DlgLoadWithPreview(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
CSaveLoadWithPreviewDlg* dlg = (CSaveLoadWithPreviewDlg*)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
||||
switch(msg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam);
|
||||
dlg = (CSaveLoadWithPreviewDlg*)lParam;
|
||||
dlg->init_window(hDlg);
|
||||
}
|
||||
return true;
|
||||
case WM_COMMAND:
|
||||
{
|
||||
// return which button was pressed, or -1 for cancel
|
||||
int id = LOWORD(wParam);
|
||||
if(id >= IDC_BUTTON_SLOT_1 && id < IDC_BUTTON_SLOT_1 + NUM_DIALOG_SLOTS)
|
||||
{
|
||||
EndDialog(hDlg, id - IDC_BUTTON_SLOT_1);
|
||||
return true;
|
||||
}
|
||||
else if(id == IDCANCEL)
|
||||
{
|
||||
EndDialog(hDlg, -1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int CSaveLoadWithPreviewDlg::show()
|
||||
{
|
||||
// disable text and confirm for the duration of the dialog
|
||||
uint32 save_timeout = Settings.InitialInfoStringTimeout;
|
||||
bool save_confirm = GUI.ConfirmSaveLoad;
|
||||
Settings.InitialInfoStringTimeout = 0;
|
||||
GUI.ConfirmSaveLoad = false;
|
||||
|
||||
int ret = -1;
|
||||
delete_preview_bmps();
|
||||
if(init_preview_bmps())
|
||||
{
|
||||
ret = DialogBoxParam(GUI.hInstance, MAKEINTRESOURCE(IDD_DIALOG_LOAD_PREVIEW), GUI.hWnd, DlgLoadWithPreview, (LPARAM)this);
|
||||
}
|
||||
|
||||
GUI.ConfirmSaveLoad = save_confirm;
|
||||
Settings.InitialInfoStringTimeout = save_timeout;
|
||||
return ret;
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/*****************************************************************************\
|
||||
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
|
||||
This file is licensed under the Snes9x License.
|
||||
For further information, consult the LICENSE file in the root directory.
|
||||
\*****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
#include "windows.h"
|
||||
|
||||
#define NUM_DIALOG_SLOTS 10
|
||||
|
||||
#define PREVIEW_IMAGE_WIDTH SNES_WIDTH
|
||||
#define PREVIEW_IMAGE_HEIGHT SNES_HEIGHT
|
||||
#define PREVIEW_WIDHT (PREVIEW_IMAGE_WIDTH + 10)
|
||||
#define PREVIEW_HEIGHT (PREVIEW_IMAGE_HEIGHT + 10)
|
||||
#define PREVIEW_TEXT_STATIC_HEIGHT 50
|
||||
|
||||
class CSaveLoadWithPreviewDlg
|
||||
{
|
||||
private:
|
||||
static INT_PTR CALLBACK DlgLoadWithPreview(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
HBITMAP previewHbmps[NUM_DIALOG_SLOTS];
|
||||
bool is_save_dialog;
|
||||
|
||||
void delete_preview_bmps();
|
||||
bool init_preview_bmps();
|
||||
void load_slot_image_text(int slot, HWND hDlg);
|
||||
void init_window(HWND hDlg);
|
||||
|
||||
public:
|
||||
CSaveLoadWithPreviewDlg(bool is_save_dialog = false);
|
||||
virtual ~CSaveLoadWithPreviewDlg();
|
||||
|
||||
int show();
|
||||
};
|
||||
|
|
@ -488,16 +488,15 @@ int GetNumHotKeysAssignedTo (WORD Key, int modifiers)
|
|||
if(MATCHES_KEY(SlotMinus)) count++;
|
||||
if(MATCHES_KEY(SlotSave)) count++;
|
||||
if(MATCHES_KEY(SlotLoad)) count++;
|
||||
if(MATCHES_KEY(DialogSave)) count++;
|
||||
if(MATCHES_KEY(DialogLoad)) count++;
|
||||
if(MATCHES_KEY(BGL1)) count++;
|
||||
if(MATCHES_KEY(BGL2)) count++;
|
||||
if(MATCHES_KEY(BGL3)) count++;
|
||||
if(MATCHES_KEY(BGL4)) count++;
|
||||
if(MATCHES_KEY(BGL5)) count++;
|
||||
if(MATCHES_KEY(ClippingWindows)) count++;
|
||||
// if(MATCHES_KEY(BGLHack)) count++;
|
||||
if(MATCHES_KEY(Transparency)) count++;
|
||||
// if(MATCHES_KEY(GLCube)) count++;
|
||||
// if(MATCHES_KEY(InterpMode7)) count++;
|
||||
if(MATCHES_KEY(JoypadSwap)) count++;
|
||||
if(MATCHES_KEY(SwitchControllers)) count++;
|
||||
if(MATCHES_KEY(TurboA)) count++;
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#define IDI_ICON3 161
|
||||
#define IDI_ICON4 162
|
||||
#define IDD_DIALOG_HACKS 164
|
||||
#define IDD_DIALOG_LOAD_PREVIEW 167
|
||||
#define IDC_DRIVER 1001
|
||||
#define IDC_BUFLEN 1002
|
||||
#define IDC_RATE 1003
|
||||
|
@ -280,6 +281,7 @@
|
|||
#define IDC_LABEL_UP19 1198
|
||||
#define IDC_ASPECT 1199
|
||||
#define IDC_LABEL_UP26 1199
|
||||
#define IDC_LABEL_UP27 1200
|
||||
#define IDC_MESSAGES_IN_IMAGE 1200
|
||||
#define IDC_RECORD_NOW 1201
|
||||
#define IDC_MESSAGES_SCALE 1201
|
||||
|
@ -308,6 +310,7 @@
|
|||
#define IDC_MOVIEROMINFO 1216
|
||||
#define IDC_SAVE10 1217
|
||||
#define IDC_CURRENTROMINFO 1217
|
||||
#define IDC_DIALOGSAVE 1218
|
||||
#define IDC_SAVE11 1219
|
||||
#define IDC_DISPLAY_INPUT 1220
|
||||
#define IDC_SAVE12 1220
|
||||
|
@ -321,6 +324,7 @@
|
|||
#define IDC_SAVE20 1228
|
||||
#define IDC_LABEL_UP20 1229
|
||||
#define IDC_LABEL_UP21 1230
|
||||
#define IDC_DIALOGLOAD 1231
|
||||
#define IDC_LABEL_UP22 1234
|
||||
#define IDC_SLOTMINUS 1235
|
||||
#define IDC_LABEL_UP23 1236
|
||||
|
@ -404,6 +408,8 @@
|
|||
#define IDC_SFX_CLOCK_SPEED_SPIN 3036
|
||||
#define IDC_NO_SPRITE_LIMIT 3037
|
||||
#define IDC_SET_DEFAULTS 3038
|
||||
#define IDC_BUTTON_SLOT_1 3039
|
||||
#define IDC_STATIC_SLOT_1 3059
|
||||
#define ID_FILE_EXIT 40001
|
||||
#define ID_WINDOW_HIDEMENUBAR 40004
|
||||
#define ID_FILE_AVI_RECORDING 40005
|
||||
|
@ -520,6 +526,8 @@
|
|||
#define ID_INPUT_BACKGROUNDKEYBOARDHOTKEYS 40176
|
||||
#define ID_INPUT_DETECTGAMEPADCHANGES 40177
|
||||
#define ID_EMULATION_HACKS 40178
|
||||
#define ID_FILE_LOAD_PREVIEW 40179
|
||||
#define ID_FILE_SAVE_PREVIEW 40180
|
||||
#define ID_FILE_SAVE0 44000
|
||||
#define ID_FILE_SAVE1 44001
|
||||
#define ID_FILE_SAVE2 44002
|
||||
|
@ -541,7 +549,7 @@
|
|||
#define ID_FILE_LOAD7 44027
|
||||
#define ID_FILE_LOAD8 44028
|
||||
#define ID_FILE_LOAD9 44029
|
||||
#define ID_FILE_LOAD_OOPS 44030
|
||||
#define ID_FILE_LOAD_OOPS 44030
|
||||
#define ID_FILE_LOAD_FILE 44031
|
||||
#define IDM_MACSRIFLE_TOGGLE 44032
|
||||
#define IDC_STATIC -1
|
||||
|
@ -550,9 +558,9 @@
|
|||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 167
|
||||
#define _APS_NEXT_COMMAND_VALUE 40179
|
||||
#define _APS_NEXT_CONTROL_VALUE 3039
|
||||
#define _APS_NEXT_RESOURCE_VALUE 169
|
||||
#define _APS_NEXT_COMMAND_VALUE 40181
|
||||
#define _APS_NEXT_CONTROL_VALUE 3040
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -26,6 +26,14 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||
// Dialog
|
||||
//
|
||||
|
||||
IDD_DIALOG_LOAD_PREVIEW DIALOGEX 0, 0, 567, 247
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Load with Preview"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
PUSHBUTTON "Cancel",IDCANCEL,510,226,50,14
|
||||
END
|
||||
|
||||
IDD_SOUND_OPTS DIALOGEX 0, 0, 414, 158
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Sound Settings"
|
||||
|
@ -418,91 +426,95 @@ BEGIN
|
|||
CONTROL "Clear SRAM",IDC_CLEARSRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,96,70,10
|
||||
END
|
||||
|
||||
IDD_KEYCUSTOM DIALOGEX 0, 0, 408, 206
|
||||
IDD_KEYCUSTOM DIALOGEX 0, 0, 409, 272
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION
|
||||
CAPTION "Customize Special Keys"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
PUSHBUTTON "Cancel",IDCANCEL,354,186,48,14
|
||||
PUSHBUTTON "OK",IDOK,300,186,48,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,354,252,48,14
|
||||
PUSHBUTTON "OK",IDOK,300,252,48,14
|
||||
RTEXT "Speed +:",IDC_LABEL_HK1,12,30,72,12
|
||||
RTEXT "Frame advance:",IDC_LABEL_HK4,12,66,72,12
|
||||
RTEXT "Speed -:",IDC_LABEL_HK2,12,42,72,12
|
||||
RTEXT "Pause:",IDC_LABEL_HK3,12,54,72,12
|
||||
RTEXT "Frameskip +:",IDC_LABEL_HK6,12,90,72,12
|
||||
RTEXT "Movie frame count:",IDC_LABEL_HK11,12,150,72,12
|
||||
RTEXT "SuperScope turbo:",IDC_LABEL_HK8,12,114,72,12
|
||||
RTEXT "Movie read-only:",IDC_LABEL_HK12,12,162,72,12
|
||||
RTEXT "SuperScope pause:",IDC_LABEL_HK9,12,126,72,12
|
||||
RTEXT "Frameskip -:",IDC_LABEL_HK7,12,102,72,12
|
||||
CONTROL "",IDC_HOTKEY1,"InputCustomHot",WS_TABSTOP,90,30,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY2,"InputCustomHot",WS_TABSTOP,90,42,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY3,"InputCustomHot",WS_TABSTOP,90,54,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY4,"InputCustomHot",WS_TABSTOP,90,66,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY5,"InputCustomHot",WS_TABSTOP,90,78,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY6,"InputCustomHot",WS_TABSTOP,90,90,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY7,"InputCustomHot",WS_TABSTOP,90,102,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY8,"InputCustomHot",WS_TABSTOP,90,114,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY9,"InputCustomHot",WS_TABSTOP,90,126,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY10,"InputCustomHot",WS_TABSTOP,90,138,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY11,"InputCustomHot",WS_TABSTOP,90,150,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY12,"InputCustomHot",WS_TABSTOP,90,162,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY13,"InputCustomHot",WS_TABSTOP,90,174,90,11,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_SAVE1,"InputCustomHot",WS_TABSTOP,234,18,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 1:",IDC_LABEL_UP2,198,30,30,12
|
||||
CONTROL "",IDC_SAVE2,"InputCustomHot",WS_TABSTOP,234,30,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 2:",IDC_LABEL_UP3,198,42,30,12
|
||||
CONTROL "",IDC_SAVE3,"InputCustomHot",WS_TABSTOP,234,42,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 3:",IDC_LABEL_UP4,198,54,30,12
|
||||
CONTROL "",IDC_SAVE4,"InputCustomHot",WS_TABSTOP,234,54,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 4:",IDC_LABEL_UP5,198,66,30,12
|
||||
CONTROL "",IDC_SAVE5,"InputCustomHot",WS_TABSTOP,234,66,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 5:",IDC_LABEL_UP6,198,78,30,12
|
||||
CONTROL "",IDC_SAVE6,"InputCustomHot",WS_TABSTOP,234,78,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 6:",IDC_LABEL_UP7,198,90,30,12
|
||||
CONTROL "",IDC_SAVE7,"InputCustomHot",WS_TABSTOP,234,90,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 7:",IDC_LABEL_UP8,198,102,30,12
|
||||
CONTROL "",IDC_SAVE8,"InputCustomHot",WS_TABSTOP,234,102,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 8:",IDC_LABEL_UP9,198,114,30,12
|
||||
CONTROL "",IDC_SAVE9,"InputCustomHot",WS_TABSTOP,234,114,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 9:",IDC_LABEL_UP10,198,126,30,12
|
||||
CONTROL "",IDC_SAVE10,"InputCustomHot",WS_TABSTOP,234,126,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 0:",IDC_LABEL_UP11,198,18,30,12
|
||||
CONTROL "",IDC_SAVE11,"InputCustomHot",WS_TABSTOP,336,18,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 1:",IDC_LABEL_UP12,300,30,30,12
|
||||
CONTROL "",IDC_SAVE12,"InputCustomHot",WS_TABSTOP,336,30,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 2:",IDC_LABEL_UP13,300,42,30,12
|
||||
CONTROL "",IDC_SAVE13,"InputCustomHot",WS_TABSTOP,336,42,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 3:",IDC_LABEL_UP14,300,54,30,12
|
||||
CONTROL "",IDC_SAVE14,"InputCustomHot",WS_TABSTOP,336,54,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 4:",IDC_LABEL_UP15,300,66,30,12
|
||||
CONTROL "",IDC_SAVE15,"InputCustomHot",WS_TABSTOP,336,66,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 5:",IDC_LABEL_UP16,300,78,30,12
|
||||
CONTROL "",IDC_SAVE16,"InputCustomHot",WS_TABSTOP,336,78,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 6:",IDC_LABEL_UP17,300,90,30,12
|
||||
CONTROL "",IDC_SAVE17,"InputCustomHot",WS_TABSTOP,336,90,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 7:",IDC_LABEL_UP18,300,102,30,12
|
||||
CONTROL "",IDC_SAVE18,"InputCustomHot",WS_TABSTOP,336,102,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 8:",IDC_LABEL_UP19,300,114,30,12
|
||||
CONTROL "",IDC_SAVE19,"InputCustomHot",WS_TABSTOP,336,114,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 9:",IDC_LABEL_UP20,300,126,30,12
|
||||
CONTROL "",IDC_SAVE20,"InputCustomHot",WS_TABSTOP,336,126,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 0:",IDC_LABEL_UP21,300,18,30,12
|
||||
RTEXT "Fast-forward:",IDC_LABEL_HK5,12,78,72,12
|
||||
RTEXT "Show pressed keys:",IDC_LABEL_HK10,12,138,72,12
|
||||
RTEXT "Save screenshot:",IDC_LABEL_HK13,12,174,72,12
|
||||
RTEXT "Slot -:",IDC_LABEL_UP22,198,150,30,12
|
||||
CONTROL "",IDC_SLOTMINUS,"InputCustomHot",WS_TABSTOP,234,150,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Slot +:",IDC_LABEL_UP23,300,150,30,12
|
||||
CONTROL "",IDC_SLOTPLUS,"InputCustomHot",WS_TABSTOP,336,150,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save #:",IDC_LABEL_UP24,198,162,30,12
|
||||
CONTROL "",IDC_SLOTSAVE,"InputCustomHot",WS_TABSTOP,234,162,60,11,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load #:",IDC_LABEL_UP25,300,162,30,12
|
||||
CONTROL "",IDC_SLOTLOAD,"InputCustomHot",WS_TABSTOP,336,162,60,11,WS_EX_CLIENTEDGE
|
||||
LTEXT "Blue means the hotkey is already mapped. Pink means it conflicts with a game button. Red means it's reserved by Windows. A hotkey can be disabled using Escape.",IDC_LABEL_BLUE,192,186,78,12,NOT WS_VISIBLE
|
||||
RTEXT "Frame advance:",IDC_LABEL_HK4,12,75,72,12
|
||||
RTEXT "Speed -:",IDC_LABEL_HK2,12,45,72,12
|
||||
RTEXT "Pause:",IDC_LABEL_HK3,12,60,72,12
|
||||
RTEXT "Frameskip +:",IDC_LABEL_HK6,12,105,72,12
|
||||
RTEXT "Movie frame count:",IDC_LABEL_HK11,12,180,72,12
|
||||
RTEXT "SuperScope turbo:",IDC_LABEL_HK8,12,135,72,12
|
||||
RTEXT "Movie read-only:",IDC_LABEL_HK12,12,195,72,12
|
||||
RTEXT "SuperScope pause:",IDC_LABEL_HK9,12,150,72,12
|
||||
RTEXT "Frameskip -:",IDC_LABEL_HK7,12,120,72,12
|
||||
CONTROL "",IDC_HOTKEY1,"InputCustomHot",WS_TABSTOP,90,30,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY2,"InputCustomHot",WS_TABSTOP,90,45,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY3,"InputCustomHot",WS_TABSTOP,90,60,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY4,"InputCustomHot",WS_TABSTOP,90,75,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY5,"InputCustomHot",WS_TABSTOP,90,90,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY6,"InputCustomHot",WS_TABSTOP,90,105,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY7,"InputCustomHot",WS_TABSTOP,90,120,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY8,"InputCustomHot",WS_TABSTOP,90,135,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY9,"InputCustomHot",WS_TABSTOP,90,150,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY10,"InputCustomHot",WS_TABSTOP,90,165,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY11,"InputCustomHot",WS_TABSTOP,90,180,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY12,"InputCustomHot",WS_TABSTOP,90,195,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_HOTKEY13,"InputCustomHot",WS_TABSTOP,90,210,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_SAVE1,"InputCustomHot",WS_TABSTOP,217,30,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 1:",IDC_LABEL_UP2,181,45,30,12
|
||||
CONTROL "",IDC_SAVE2,"InputCustomHot",WS_TABSTOP,217,45,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 2:",IDC_LABEL_UP3,181,60,30,12
|
||||
CONTROL "",IDC_SAVE3,"InputCustomHot",WS_TABSTOP,217,60,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 3:",IDC_LABEL_UP4,181,75,30,12
|
||||
CONTROL "",IDC_SAVE4,"InputCustomHot",WS_TABSTOP,217,75,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 4:",IDC_LABEL_UP5,181,90,30,12
|
||||
CONTROL "",IDC_SAVE5,"InputCustomHot",WS_TABSTOP,217,90,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 5:",IDC_LABEL_UP6,181,105,30,12
|
||||
CONTROL "",IDC_SAVE6,"InputCustomHot",WS_TABSTOP,217,105,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 6:",IDC_LABEL_UP7,181,120,30,12
|
||||
CONTROL "",IDC_SAVE7,"InputCustomHot",WS_TABSTOP,217,120,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 7:",IDC_LABEL_UP8,181,135,30,12
|
||||
CONTROL "",IDC_SAVE8,"InputCustomHot",WS_TABSTOP,217,135,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 8:",IDC_LABEL_UP9,181,150,30,12
|
||||
CONTROL "",IDC_SAVE9,"InputCustomHot",WS_TABSTOP,217,150,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 9:",IDC_LABEL_UP10,181,165,30,12
|
||||
CONTROL "",IDC_SAVE10,"InputCustomHot",WS_TABSTOP,217,165,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save 0:",IDC_LABEL_UP11,181,30,30,12
|
||||
CONTROL "",IDC_SAVE11,"InputCustomHot",WS_TABSTOP,336,30,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 1:",IDC_LABEL_UP12,300,45,30,12
|
||||
CONTROL "",IDC_SAVE12,"InputCustomHot",WS_TABSTOP,336,45,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 2:",IDC_LABEL_UP13,300,60,30,12
|
||||
CONTROL "",IDC_SAVE13,"InputCustomHot",WS_TABSTOP,336,60,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 3:",IDC_LABEL_UP14,300,75,30,12
|
||||
CONTROL "",IDC_SAVE14,"InputCustomHot",WS_TABSTOP,336,75,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 4:",IDC_LABEL_UP15,300,90,30,12
|
||||
CONTROL "",IDC_SAVE15,"InputCustomHot",WS_TABSTOP,336,90,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 5:",IDC_LABEL_UP16,300,105,30,12
|
||||
CONTROL "",IDC_SAVE16,"InputCustomHot",WS_TABSTOP,336,105,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 6:",IDC_LABEL_UP17,300,120,30,12
|
||||
CONTROL "",IDC_SAVE17,"InputCustomHot",WS_TABSTOP,336,120,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 7:",IDC_LABEL_UP18,300,135,30,12
|
||||
CONTROL "",IDC_SAVE18,"InputCustomHot",WS_TABSTOP,336,135,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 8:",IDC_LABEL_UP19,300,150,30,12
|
||||
CONTROL "",IDC_SAVE19,"InputCustomHot",WS_TABSTOP,336,150,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 9:",IDC_LABEL_UP20,300,165,30,12
|
||||
CONTROL "",IDC_SAVE20,"InputCustomHot",WS_TABSTOP,336,165,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load 0:",IDC_LABEL_UP21,300,30,30,12
|
||||
RTEXT "Fast-forward:",IDC_LABEL_HK5,12,90,72,12
|
||||
RTEXT "Show pressed keys:",IDC_LABEL_HK10,12,165,72,12
|
||||
RTEXT "Save screenshot:",IDC_LABEL_HK13,12,210,72,12
|
||||
RTEXT "Slot -:",IDC_LABEL_UP22,181,195,30,12
|
||||
CONTROL "",IDC_SLOTMINUS,"InputCustomHot",WS_TABSTOP,217,195,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Slot +:",IDC_LABEL_UP23,300,195,30,12
|
||||
CONTROL "",IDC_SLOTPLUS,"InputCustomHot",WS_TABSTOP,336,195,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Save #:",IDC_LABEL_UP24,181,210,30,12
|
||||
CONTROL "",IDC_SLOTSAVE,"InputCustomHot",WS_TABSTOP,217,210,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load #:",IDC_LABEL_UP25,300,210,30,12
|
||||
CONTROL "",IDC_SLOTLOAD,"InputCustomHot",WS_TABSTOP,336,210,60,12,WS_EX_CLIENTEDGE
|
||||
LTEXT "Blue means the hotkey is already mapped. Pink means it conflicts with a game button. Red means it's reserved by Windows. A hotkey can be disabled using Escape.",IDC_LABEL_BLUE,7,232,269,34
|
||||
COMBOBOX IDC_HKCOMBO,6,6,60,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
|
||||
GROUPBOX "",IDC_STATIC,6,18,180,174,0,WS_EX_TRANSPARENT
|
||||
GROUPBOX "Save States",IDC_STATIC,192,6,210,174,0,WS_EX_TRANSPARENT
|
||||
GROUPBOX "",IDC_STATIC,6,21,149,207,0,WS_EX_TRANSPARENT
|
||||
GROUPBOX "Save States",IDC_STATIC,161,21,241,207,0,WS_EX_TRANSPARENT
|
||||
RTEXT "Save Dialog:",IDC_LABEL_UP26,165,180,46,12
|
||||
CONTROL "",IDC_DIALOGSAVE,"InputCustomHot",WS_TABSTOP,217,180,60,12,WS_EX_CLIENTEDGE
|
||||
CONTROL "",IDC_DIALOGLOAD,"InputCustomHot",WS_TABSTOP,336,180,60,12,WS_EX_CLIENTEDGE
|
||||
RTEXT "Load Dialog:",IDC_LABEL_UP27,284,180,46,12
|
||||
END
|
||||
|
||||
IDD_MULTICART DIALOGEX 0, 0, 390, 90
|
||||
|
@ -592,6 +604,14 @@ END
|
|||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO
|
||||
BEGIN
|
||||
IDD_DIALOG_LOAD_PREVIEW, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 560
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 240
|
||||
END
|
||||
|
||||
IDD_SOUND_OPTS, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
|
@ -711,10 +731,9 @@ BEGIN
|
|||
|
||||
IDD_KEYCUSTOM, DIALOG
|
||||
BEGIN
|
||||
RIGHTMARGIN, 406
|
||||
VERTGUIDE, 72
|
||||
VERTGUIDE, 92
|
||||
BOTTOMMARGIN, 200
|
||||
RIGHTMARGIN, 407
|
||||
VERTGUIDE, 90
|
||||
BOTTOMMARGIN, 266
|
||||
END
|
||||
|
||||
IDD_MULTICART, DIALOG
|
||||
|
@ -912,6 +931,8 @@ BEGIN
|
|||
BEGIN
|
||||
MENUITEM "Dummy", ID_RECENT_DUMMY, INACTIVE
|
||||
END
|
||||
MENUITEM "Load MultiCart...", ID_FILE_LOADMULTICART
|
||||
MENUITEM SEPARATOR
|
||||
POPUP "&Save Game Position"
|
||||
BEGIN
|
||||
MENUITEM "Slot #&0", ID_FILE_SAVE0
|
||||
|
@ -944,7 +965,8 @@ BEGIN
|
|||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Select File", ID_FILE_LOAD_FILE
|
||||
END
|
||||
MENUITEM "Load MultiCart...", ID_FILE_LOADMULTICART
|
||||
MENUITEM "&Save with Preview", ID_FILE_SAVE_PREVIEW
|
||||
MENUITEM "&Load with Preview", ID_FILE_LOAD_PREVIEW
|
||||
MENUITEM SEPARATOR
|
||||
POPUP "Save Other"
|
||||
BEGIN
|
||||
|
@ -1182,6 +1204,11 @@ BEGIN
|
|||
0
|
||||
END
|
||||
|
||||
IDD_DIALOG_LOAD_PREVIEW AFX_DIALOG_LAYOUT
|
||||
BEGIN
|
||||
0
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
|
|
@ -438,6 +438,7 @@
|
|||
<ClInclude Include="cgFunctions.h" />
|
||||
<ClInclude Include="CGLCG.h" />
|
||||
<ClInclude Include="cgMini.h" />
|
||||
<ClInclude Include="CSaveLoadWithPreviewDlg.h" />
|
||||
<ClInclude Include="COpenGL.h" />
|
||||
<ClInclude Include="CShaderParamDlg.h" />
|
||||
<ClInclude Include="CWaveOut.h" />
|
||||
|
@ -582,6 +583,7 @@
|
|||
<ClCompile Include="CDirectDraw.cpp" />
|
||||
<ClCompile Include="cgFunctions.cpp" />
|
||||
<ClCompile Include="CGLCG.cpp" />
|
||||
<ClCompile Include="CSaveLoadWithPreviewDlg.cpp" />
|
||||
<ClCompile Include="COpenGL.cpp" />
|
||||
<ClCompile Include="CShaderParamDlg.cpp" />
|
||||
<ClCompile Include="CWaveOut.cpp" />
|
||||
|
|
|
@ -285,6 +285,9 @@
|
|||
<ClInclude Include="..\filter\snes_ntsc_impl.h">
|
||||
<Filter>Filter</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CSaveLoadWithPreviewDlg.h">
|
||||
<Filter>GUI</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\bsx.cpp">
|
||||
|
@ -626,6 +629,9 @@
|
|||
<ClCompile Include="..\filter\snes_ntsc.c">
|
||||
<Filter>Filter</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CSaveLoadWithPreviewDlg.cpp">
|
||||
<Filter>GUI</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="rsrc\nodrop.cur">
|
||||
|
@ -886,4 +892,4 @@
|
|||
</CustomBuild>
|
||||
<CustomBuild Include="snes9x.cfg" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
|
@ -917,7 +917,7 @@ void WinRegisterConfigItems()
|
|||
ADDN(Save[0],SaveSlot0); ADDN(Save[1],SaveSlot1); ADDN(Save[2],SaveSlot2); ADDN(Save[3],SaveSlot3); ADDN(Save[4],SaveSlot4); ADDN(Save[5],SaveSlot5); ADDN(Save[6],SaveSlot6); ADDN(Save[7],SaveSlot7); ADDN(Save[8],SaveSlot8); ADDN(Save[9],SaveSlot9);
|
||||
ADDN(Load[0],LoadSlot0); ADDN(Load[1],LoadSlot1); ADDN(Load[2],LoadSlot2); ADDN(Load[3],LoadSlot3); ADDN(Load[4],LoadSlot4); ADDN(Load[5],LoadSlot5); ADDN(Load[6],LoadSlot6); ADDN(Load[7],LoadSlot7); ADDN(Load[8],LoadSlot8); ADDN(Load[9],LoadSlot9);
|
||||
ADDN(SelectSave[0],SelectSlot0); ADDN(SelectSave[1],SelectSlot1); ADDN(SelectSave[2],SelectSlot2); ADDN(SelectSave[3],SelectSlot3); ADDN(SelectSave[4],SelectSlot4); ADDN(SelectSave[5],SelectSlot5); ADDN(SelectSave[6],SelectSlot6); ADDN(SelectSave[7],SelectSlot7); ADDN(SelectSave[8],SelectSlot8); ADDN(SelectSave[9],SelectSlot9);
|
||||
ADD(SaveScreenShot); ADD(SlotPlus); ADD(SlotMinus); ADD(SlotSave); ADD(SlotLoad);
|
||||
ADD(SaveScreenShot); ADD(SlotPlus); ADD(SlotMinus); ADD(SlotSave); ADD(SlotLoad); ADD(DialogSave); ADD(DialogLoad);
|
||||
ADD(BGL1); ADD(BGL2); ADD(BGL3); ADD(BGL4); ADD(BGL5);
|
||||
ADD(ClippingWindows); /*ADD(BGLHack);*/ ADD(Transparency); /*ADD(HDMA)*/; /*ADD(GLCube);*/
|
||||
/*ADD(InterpMode7);*/ ADD(JoypadSwap); ADD(SwitchControllers); ADD(ResetGame); ADD(ToggleCheats);
|
||||
|
|
|
@ -81,15 +81,15 @@ Nintendo is a trademark.")
|
|||
#define HOTKEYS_LABEL_1_1 TEXT("Speed +:")
|
||||
#define HOTKEYS_LABEL_1_2 TEXT("Speed -:")
|
||||
#define HOTKEYS_LABEL_1_3 TEXT("Pause:")
|
||||
#define HOTKEYS_LABEL_1_4 TEXT("Frame advance:")
|
||||
#define HOTKEYS_LABEL_1_4 TEXT("Fast-forward toggle:")
|
||||
#define HOTKEYS_LABEL_1_5 TEXT("Fast forward:")
|
||||
#define HOTKEYS_LABEL_1_6 TEXT("Skip frames +:")
|
||||
#define HOTKEYS_LABEL_1_7 TEXT("Skip frames -:")
|
||||
#define HOTKEYS_LABEL_1_8 TEXT("SuperScope turbo:")
|
||||
#define HOTKEYS_LABEL_1_9 TEXT("SuperScope pause:")
|
||||
#define HOTKEYS_LABEL_1_10 TEXT("Show pressed keys:")
|
||||
#define HOTKEYS_LABEL_1_11 TEXT("Movie frame count:")
|
||||
#define HOTKEYS_LABEL_1_12 TEXT("Movie read-only:")
|
||||
#define HOTKEYS_LABEL_1_6 TEXT("Rewind:")
|
||||
#define HOTKEYS_LABEL_1_7 TEXT("Skip frames +:")
|
||||
#define HOTKEYS_LABEL_1_8 TEXT("Skip frames -:")
|
||||
#define HOTKEYS_LABEL_1_9 TEXT("Toggle mute:")
|
||||
#define HOTKEYS_LABEL_1_10 TEXT("Toggle cheats:")
|
||||
#define HOTKEYS_LABEL_1_11 TEXT("Quit Snes9x:")
|
||||
#define HOTKEYS_LABEL_1_12 TEXT("Reset game:")
|
||||
#define HOTKEYS_LABEL_1_13 TEXT("Save screenshot")
|
||||
#define HOTKEYS_LABEL_2_1 TEXT("Graphics layer 1:")
|
||||
#define HOTKEYS_LABEL_2_2 TEXT("Graphics layer 2:")
|
||||
|
@ -98,12 +98,12 @@ Nintendo is a trademark.")
|
|||
#define HOTKEYS_LABEL_2_5 TEXT("Sprites layer:")
|
||||
#define HOTKEYS_LABEL_2_6 TEXT("Clipping Windows:")
|
||||
#define HOTKEYS_LABEL_2_7 TEXT("Transparency:")
|
||||
#define HOTKEYS_LABEL_2_8 TEXT("Fast-forward toggle:")
|
||||
#define HOTKEYS_LABEL_2_9 TEXT("Rewind:")
|
||||
#define HOTKEYS_LABEL_2_8 TEXT("Frame advance:")
|
||||
#define HOTKEYS_LABEL_2_9 TEXT("SuperScope pause:")
|
||||
#define HOTKEYS_LABEL_2_10 TEXT("Switch controllers:")
|
||||
#define HOTKEYS_LABEL_2_11 TEXT("Joypad swap:")
|
||||
#define HOTKEYS_LABEL_2_12 TEXT("Reset game:")
|
||||
#define HOTKEYS_LABEL_2_13 TEXT("Toggle cheats:")
|
||||
#define HOTKEYS_LABEL_2_12 TEXT("Show pressed keys:")
|
||||
#define HOTKEYS_LABEL_2_13 TEXT("Movie frame count:")
|
||||
#define HOTKEYS_LABEL_3_1 TEXT("Turbo A mode:")
|
||||
#define HOTKEYS_LABEL_3_2 TEXT("Turbo B mode:")
|
||||
#define HOTKEYS_LABEL_3_3 TEXT("Turbo Y mode:")
|
||||
|
@ -116,10 +116,20 @@ Nintendo is a trademark.")
|
|||
#define HOTKEYS_LABEL_3_10 TEXT("Turbo Up mode:")
|
||||
#define HOTKEYS_LABEL_3_11 TEXT("Turbo Right mode:")
|
||||
#define HOTKEYS_LABEL_3_12 TEXT("Turbo Down mode:")
|
||||
#define HOTKEYS_LABEL_3_13 TEXT("Toggle mute:")
|
||||
#define HOTKEYS_LABEL_3_13 TEXT("SuperScope turbo:")
|
||||
#define HOTKEYS_LABEL_4_1 TEXT("Select Slot 0:")
|
||||
#define HOTKEYS_LABEL_4_2 TEXT("Select Slot 1:")
|
||||
#define HOTKEYS_LABEL_4_3 TEXT("Select Slot 2:")
|
||||
#define HOTKEYS_LABEL_4_4 TEXT("Select Slot 3:")
|
||||
#define HOTKEYS_LABEL_4_5 TEXT("Select Slot 4:")
|
||||
#define HOTKEYS_LABEL_4_6 TEXT("Select Slot 5:")
|
||||
#define HOTKEYS_LABEL_4_7 TEXT("Select Slot 6:")
|
||||
#define HOTKEYS_LABEL_4_8 TEXT("Select Slot 7:")
|
||||
#define HOTKEYS_LABEL_4_9 TEXT("Select Slot 8:")
|
||||
#define HOTKEYS_LABEL_4_10 TEXT("Select Slot 9:")
|
||||
#define HOTKEYS_LABEL_4_11 TEXT("Save to file:")
|
||||
#define HOTKEYS_LABEL_4_12 TEXT("Load from file:")
|
||||
#define HOTKEYS_LABEL_4_13 TEXT("Quit Snes9x:")
|
||||
#define HOTKEYS_LABEL_4_13 TEXT("Movie read-only:")
|
||||
|
||||
// gaming buttons and axes
|
||||
#define GAMEDEVICE_JOYNUMPREFIX "(J%x)" // don't change this
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "CCGShader.h"
|
||||
#include "../shaders/glsl.h"
|
||||
#include "CShaderParamDlg.h"
|
||||
#include "CSaveLoadWithPreviewDlg.h"
|
||||
#include "../snes9x.h"
|
||||
#include "../memmap.h"
|
||||
#include "../cpuexec.h"
|
||||
|
@ -125,6 +126,8 @@ void S9xDetectJoypads();
|
|||
#define TIMER_SCANJOYPADS (99999)
|
||||
#define NC_SEARCHDB 0x8000
|
||||
|
||||
#define MAX_SWITCHABLE_HOTKEY_DIALOG_ITEMS 13
|
||||
|
||||
#ifdef UNICODE
|
||||
#define S9XW_SHARD_PATH SHARD_PATHW
|
||||
#else
|
||||
|
@ -367,16 +370,15 @@ struct SCustomKeys CustomKeys = {
|
|||
{0,0}, // slot minus (disabled by default)
|
||||
{0,0}, // slot save (disabled by default)
|
||||
{0,0}, // slot load (disabled by default)
|
||||
{VK_F11,CUSTKEY_SHIFT_MASK}, // dialog save
|
||||
{VK_F11,0}, // dialog load
|
||||
{0,0}, // background layer 1
|
||||
{0,0}, // background layer 2
|
||||
{0,0}, // background layer 3
|
||||
{0,0}, // background layer 4
|
||||
{0,0}, // sprite layer
|
||||
{0,0}, // Clipping Windows
|
||||
// {'8',0}, // BG Layering hack
|
||||
{0,0}, // Transparency
|
||||
// {'6',CUSTKEY_SHIFT_MASK}, // GLCube Mode
|
||||
// {'9',CUSTKEY_SHIFT_MASK}, // Interpolate Mode 7
|
||||
{'6',0}, // Joypad Swap
|
||||
{'7',0}, // Switch Controllers
|
||||
{VK_NEXT,CUSTKEY_SHIFT_MASK}, // Turbo A
|
||||
|
@ -462,9 +464,6 @@ void DoAVIOpen(const TCHAR* filename);
|
|||
void DoAVIClose(int reason);
|
||||
void RestoreGUIDisplay ();
|
||||
void RestoreSNESDisplay ();
|
||||
void FreezeUnfreezeDialog(bool8 freeze);
|
||||
void FreezeUnfreezeSlot(int slot, bool8 freeze);
|
||||
void FreezeUnfreeze (const char *filename, bool8 freeze);
|
||||
void CheckDirectoryIsWritable (const char *filename);
|
||||
static void CheckMenuStates ();
|
||||
static void ResetFrameTimer ();
|
||||
|
@ -858,6 +857,18 @@ int HandleKeyMessage(WPARAM wParam, LPARAM lParam)
|
|||
FreezeUnfreezeSlot (GUI.CurrentSaveSlot, false);
|
||||
hitHotKey = true;
|
||||
}
|
||||
if(wParam == CustomKeys.DialogSave.key
|
||||
&& modifiers == CustomKeys.DialogSave.modifiers)
|
||||
{
|
||||
FreezeUnfreezeDialogPreview(true);
|
||||
hitHotKey = true;
|
||||
}
|
||||
if(wParam == CustomKeys.DialogLoad.key
|
||||
&& modifiers == CustomKeys.DialogLoad.modifiers)
|
||||
{
|
||||
FreezeUnfreezeDialogPreview(false);
|
||||
hitHotKey = true;
|
||||
}
|
||||
if(wParam == CustomKeys.SlotPlus.key
|
||||
&& modifiers == CustomKeys.SlotPlus.modifiers)
|
||||
{
|
||||
|
@ -2148,6 +2159,9 @@ LRESULT CALLBACK WinProc(
|
|||
case ID_FILE_LOAD_FILE:
|
||||
FreezeUnfreezeDialog(FALSE);
|
||||
break;
|
||||
case ID_FILE_LOAD_PREVIEW:
|
||||
FreezeUnfreezeDialogPreview(FALSE);
|
||||
break;
|
||||
case ID_FILE_SAVE0:
|
||||
FreezeUnfreezeSlot (0, TRUE);
|
||||
break;
|
||||
|
@ -2180,6 +2194,9 @@ LRESULT CALLBACK WinProc(
|
|||
break;
|
||||
case ID_FILE_SAVE_FILE:
|
||||
FreezeUnfreezeDialog(TRUE);
|
||||
break;
|
||||
case ID_FILE_SAVE_PREVIEW:
|
||||
FreezeUnfreezeDialogPreview(TRUE);
|
||||
break;
|
||||
case ID_CHEAT_ENTER:
|
||||
RestoreGUIDisplay ();
|
||||
|
@ -3608,16 +3625,32 @@ void FreezeUnfreezeDialog(bool8 freeze)
|
|||
}
|
||||
}
|
||||
|
||||
void FreezeUnfreezeDialogPreview(bool8 freeze)
|
||||
{
|
||||
if(Settings.StopEmulation)
|
||||
return;
|
||||
|
||||
CSaveLoadWithPreviewDlg dlg(freeze);
|
||||
int slot = dlg.show();
|
||||
if(slot >= 0)
|
||||
FreezeUnfreezeSlot(slot, freeze);
|
||||
}
|
||||
|
||||
void GetSlotFilename(int slot, char filename[_MAX_PATH + 1])
|
||||
{
|
||||
char ext[_MAX_EXT + 1];
|
||||
|
||||
if(slot == -1)
|
||||
strcpy(ext, ".oops");
|
||||
else
|
||||
snprintf(ext, _MAX_EXT, ".%03d", slot);
|
||||
strcpy(filename, S9xGetFilename(ext, SNAPSHOT_DIR));
|
||||
}
|
||||
|
||||
void FreezeUnfreezeSlot(int slot, bool8 freeze)
|
||||
{
|
||||
char filename[_MAX_PATH + 1];
|
||||
char ext[_MAX_EXT + 1];
|
||||
|
||||
if (slot == -1)
|
||||
strcpy(ext, ".oops");
|
||||
else
|
||||
snprintf(ext, _MAX_EXT, ".%03d", slot);
|
||||
strcpy(filename, S9xGetFilename(ext, SNAPSHOT_DIR));
|
||||
GetSlotFilename(slot, filename);
|
||||
|
||||
FreezeUnfreeze(filename, freeze);
|
||||
}
|
||||
|
@ -3633,6 +3666,9 @@ void FreezeUnfreeze (const char *filename, bool8 freeze)
|
|||
}
|
||||
#endif
|
||||
|
||||
if(Settings.StopEmulation)
|
||||
return;
|
||||
|
||||
if (GUI.ConfirmSaveLoad)
|
||||
{
|
||||
std::string msg, title;
|
||||
|
@ -3684,6 +3720,14 @@ void FreezeUnfreeze (const char *filename, bool8 freeze)
|
|||
S9xClearPause (PAUSE_FREEZE_FILE);
|
||||
}
|
||||
|
||||
bool UnfreezeScreenshotSlot(int slot, uint16 **image_buffer, int &width, int &height)
|
||||
{
|
||||
char filename[_MAX_PATH + 1];
|
||||
GetSlotFilename(slot, filename);
|
||||
|
||||
return S9xUnfreezeScreenshot(filename, image_buffer, width, height);
|
||||
}
|
||||
|
||||
void CheckDirectoryIsWritable (const char *filename)
|
||||
{
|
||||
FILE *fs = fopen (filename, "w+");
|
||||
|
@ -3743,6 +3787,9 @@ static void CheckMenuStates ()
|
|||
for (int i = ID_FILE_LOAD0; i <= ID_FILE_LOAD_FILE; i++)
|
||||
SetMenuItemInfo(GUI.hMenu, i, FALSE, &mii);
|
||||
|
||||
SetMenuItemInfo(GUI.hMenu, ID_FILE_SAVE_PREVIEW, FALSE, &mii);
|
||||
SetMenuItemInfo(GUI.hMenu, ID_FILE_LOAD_PREVIEW, FALSE, &mii);
|
||||
|
||||
SetMenuItemInfo (GUI.hMenu, ID_FILE_RESET, FALSE, &mii);
|
||||
SetMenuItemInfo (GUI.hMenu, ID_CHEAT_ENTER, FALSE, &mii);
|
||||
SetMenuItemInfo (GUI.hMenu, ID_CHEAT_SEARCH_MODAL, FALSE, &mii);
|
||||
|
@ -8301,138 +8348,105 @@ switch(msg)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
struct hotkey_dialog_item {
|
||||
SCustomKey *key_entry;
|
||||
TCHAR *description;
|
||||
};
|
||||
|
||||
// this structure defines the four sub pages in the hotkey config dialog
|
||||
// to keep an entry blank, set the SCustomKey pointer to NULL and the text to an empty string
|
||||
static hotkey_dialog_item hotkey_dialog_items[4][MAX_SWITCHABLE_HOTKEY_DIALOG_ITEMS] = {
|
||||
{
|
||||
{ &CustomKeys.SpeedUp, HOTKEYS_LABEL_1_1 },
|
||||
{ &CustomKeys.SpeedDown, HOTKEYS_LABEL_1_2 },
|
||||
{ &CustomKeys.Pause, HOTKEYS_LABEL_1_3 },
|
||||
{ &CustomKeys.FastForwardToggle, HOTKEYS_LABEL_1_4 },
|
||||
{ &CustomKeys.FastForward, HOTKEYS_LABEL_1_5 },
|
||||
{ &CustomKeys.Rewind, HOTKEYS_LABEL_1_6 },
|
||||
{ &CustomKeys.SkipUp, HOTKEYS_LABEL_1_7 },
|
||||
{ &CustomKeys.SkipDown, HOTKEYS_LABEL_1_8 },
|
||||
{ &CustomKeys.Mute, HOTKEYS_LABEL_1_9 },
|
||||
{ &CustomKeys.ToggleCheats, HOTKEYS_LABEL_1_10 },
|
||||
{ &CustomKeys.QuitS9X, HOTKEYS_LABEL_1_11 },
|
||||
{ &CustomKeys.ResetGame, HOTKEYS_LABEL_1_12 },
|
||||
{ &CustomKeys.SaveScreenShot, HOTKEYS_LABEL_1_13 },
|
||||
},
|
||||
{
|
||||
{ &CustomKeys.BGL1, HOTKEYS_LABEL_2_1 },
|
||||
{ &CustomKeys.BGL2, HOTKEYS_LABEL_2_2 },
|
||||
{ &CustomKeys.BGL3, HOTKEYS_LABEL_2_3 },
|
||||
{ &CustomKeys.BGL4, HOTKEYS_LABEL_2_4 },
|
||||
{ &CustomKeys.BGL5, HOTKEYS_LABEL_2_5 },
|
||||
{ &CustomKeys.ClippingWindows, HOTKEYS_LABEL_2_6 },
|
||||
{ &CustomKeys.Transparency, HOTKEYS_LABEL_2_7 },
|
||||
{ &CustomKeys.FrameAdvance, HOTKEYS_LABEL_2_8 },
|
||||
{ &CustomKeys.ScopePause, HOTKEYS_LABEL_2_9 },
|
||||
{ &CustomKeys.SwitchControllers, HOTKEYS_LABEL_2_10 },
|
||||
{ &CustomKeys.JoypadSwap, HOTKEYS_LABEL_2_11 },
|
||||
{ &CustomKeys.ShowPressed, HOTKEYS_LABEL_2_12 },
|
||||
{ &CustomKeys.FrameCount, HOTKEYS_LABEL_2_13 },
|
||||
},
|
||||
{
|
||||
{ &CustomKeys.TurboA, HOTKEYS_LABEL_3_1 },
|
||||
{ &CustomKeys.TurboB, HOTKEYS_LABEL_3_2 },
|
||||
{ &CustomKeys.TurboY, HOTKEYS_LABEL_3_3 },
|
||||
{ &CustomKeys.TurboX, HOTKEYS_LABEL_3_4 },
|
||||
{ &CustomKeys.TurboL, HOTKEYS_LABEL_3_5 },
|
||||
{ &CustomKeys.TurboR, HOTKEYS_LABEL_3_6 },
|
||||
{ &CustomKeys.TurboStart, HOTKEYS_LABEL_3_7 },
|
||||
{ &CustomKeys.TurboSelect, HOTKEYS_LABEL_3_8 },
|
||||
{ &CustomKeys.TurboLeft, HOTKEYS_LABEL_3_9 },
|
||||
{ &CustomKeys.TurboUp, HOTKEYS_LABEL_3_10 },
|
||||
{ &CustomKeys.TurboRight, HOTKEYS_LABEL_3_11 },
|
||||
{ &CustomKeys.TurboDown, HOTKEYS_LABEL_3_12 },
|
||||
{ &CustomKeys.ScopeTurbo, HOTKEYS_LABEL_3_13 },
|
||||
},
|
||||
{
|
||||
{ &CustomKeys.SelectSave[0], HOTKEYS_LABEL_4_1 },
|
||||
{ &CustomKeys.SelectSave[1], HOTKEYS_LABEL_4_2 },
|
||||
{ &CustomKeys.SelectSave[2], HOTKEYS_LABEL_4_3 },
|
||||
{ &CustomKeys.SelectSave[3], HOTKEYS_LABEL_4_4 },
|
||||
{ &CustomKeys.SelectSave[4], HOTKEYS_LABEL_4_5 },
|
||||
{ &CustomKeys.SelectSave[5], HOTKEYS_LABEL_4_6 },
|
||||
{ &CustomKeys.SelectSave[6], HOTKEYS_LABEL_4_7 },
|
||||
{ &CustomKeys.SelectSave[7], HOTKEYS_LABEL_4_8 },
|
||||
{ &CustomKeys.SelectSave[8], HOTKEYS_LABEL_4_9 },
|
||||
{ &CustomKeys.SelectSave[9], HOTKEYS_LABEL_4_10 },
|
||||
{ &CustomKeys.SaveFileSelect, HOTKEYS_LABEL_4_11 },
|
||||
{ &CustomKeys.LoadFileSelect, HOTKEYS_LABEL_4_12 },
|
||||
{ &CustomKeys.ReadOnly, HOTKEYS_LABEL_4_13 },
|
||||
},
|
||||
};
|
||||
|
||||
static void set_hotkeyinfo(HWND hDlg)
|
||||
{
|
||||
int index = SendDlgItemMessage(hDlg,IDC_HKCOMBO,CB_GETCURSEL,0,0);
|
||||
|
||||
switch(index)
|
||||
{
|
||||
case 0:
|
||||
// set page 1 fields
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY1,WM_USER+44,CustomKeys.SpeedUp.key,CustomKeys.SpeedUp.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY2,WM_USER+44,CustomKeys.SpeedDown.key,CustomKeys.SpeedDown.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY3,WM_USER+44,CustomKeys.Pause.key,CustomKeys.Pause.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY4,WM_USER+44,CustomKeys.FrameAdvance.key,CustomKeys.FrameAdvance.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY5,WM_USER+44,CustomKeys.FastForward.key,CustomKeys.FastForward.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY6,WM_USER+44,CustomKeys.SkipUp.key,CustomKeys.SkipUp.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY7,WM_USER+44,CustomKeys.SkipDown.key,CustomKeys.SkipDown.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY8,WM_USER+44,CustomKeys.ScopeTurbo.key,CustomKeys.ScopeTurbo.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY9,WM_USER+44,CustomKeys.ScopePause.key,CustomKeys.ScopePause.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY10,WM_USER+44,CustomKeys.ShowPressed.key,CustomKeys.ShowPressed.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY11,WM_USER+44,CustomKeys.FrameCount.key,CustomKeys.FrameCount.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY12,WM_USER+44,CustomKeys.ReadOnly.key,CustomKeys.ReadOnly.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY13,WM_USER+44,CustomKeys.SaveScreenShot.key,CustomKeys.SaveScreenShot.modifiers);
|
||||
break;
|
||||
case 1:
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY1,WM_USER+44,CustomKeys.BGL1.key,CustomKeys.BGL1.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY2,WM_USER+44,CustomKeys.BGL2.key,CustomKeys.BGL2.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY3,WM_USER+44,CustomKeys.BGL3.key,CustomKeys.BGL3.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY4,WM_USER+44,CustomKeys.BGL4.key,CustomKeys.BGL4.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY5,WM_USER+44,CustomKeys.BGL5.key,CustomKeys.BGL5.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY6,WM_USER+44,CustomKeys.ClippingWindows.key,CustomKeys.ClippingWindows.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY7,WM_USER+44,CustomKeys.Transparency.key,CustomKeys.Transparency.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY8,WM_USER+44,CustomKeys.FastForwardToggle.key,CustomKeys.FastForwardToggle.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY9,WM_USER+44,CustomKeys.Rewind.key,CustomKeys.Rewind.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY10,WM_USER+44,CustomKeys.SwitchControllers.key,CustomKeys.SwitchControllers.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY11,WM_USER+44,CustomKeys.JoypadSwap.key,CustomKeys.JoypadSwap.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY12,WM_USER+44,CustomKeys.ResetGame.key,CustomKeys.ResetGame.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY13,WM_USER+44,CustomKeys.ToggleCheats.key,CustomKeys.ToggleCheats.modifiers);
|
||||
break;
|
||||
case 2:
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY1,WM_USER+44,CustomKeys.TurboA.key,CustomKeys.TurboA.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY2,WM_USER+44,CustomKeys.TurboB.key,CustomKeys.TurboB.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY3,WM_USER+44,CustomKeys.TurboY.key,CustomKeys.TurboY.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY4,WM_USER+44,CustomKeys.TurboX.key,CustomKeys.TurboX.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY5,WM_USER+44,CustomKeys.TurboL.key,CustomKeys.TurboL.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY6,WM_USER+44,CustomKeys.TurboR.key,CustomKeys.TurboR.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY7,WM_USER+44,CustomKeys.TurboStart.key,CustomKeys.TurboStart.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY8,WM_USER+44,CustomKeys.TurboSelect.key,CustomKeys.TurboSelect.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY9,WM_USER+44,CustomKeys.TurboLeft.key,CustomKeys.TurboLeft.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY10,WM_USER+44,CustomKeys.TurboUp.key,CustomKeys.TurboUp.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY11,WM_USER+44,CustomKeys.TurboRight.key,CustomKeys.TurboRight.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY12,WM_USER+44,CustomKeys.TurboDown.key,CustomKeys.TurboDown.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY13,WM_USER+44, CustomKeys.Mute.key, CustomKeys.Mute.modifiers);
|
||||
break;
|
||||
case 3:
|
||||
for(int i = 0 ; i < 10 ; i++)
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY1+i,WM_USER+44,CustomKeys.SelectSave[i].key,CustomKeys.SelectSave[i].modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY11,WM_USER+44, CustomKeys.SaveFileSelect.key, CustomKeys.SaveFileSelect.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY12,WM_USER+44, CustomKeys.LoadFileSelect.key, CustomKeys.LoadFileSelect.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_HOTKEY13,WM_USER+44,CustomKeys.QuitS9X.key,CustomKeys.QuitS9X.modifiers);
|
||||
break;
|
||||
}
|
||||
for(int i = 0; i < MAX_SWITCHABLE_HOTKEY_DIALOG_ITEMS; i++)
|
||||
{
|
||||
int wParam = 0, lParam = 0;
|
||||
if(hotkey_dialog_items[index][i].key_entry)
|
||||
{
|
||||
wParam = hotkey_dialog_items[index][i].key_entry->key;
|
||||
lParam = hotkey_dialog_items[index][i].key_entry->modifiers;
|
||||
}
|
||||
SendDlgItemMessage(hDlg, IDC_HOTKEY1 + i, WM_USER + 44, wParam, lParam);
|
||||
}
|
||||
|
||||
SendDlgItemMessage(hDlg,IDC_SLOTPLUS,WM_USER+44,CustomKeys.SlotPlus.key,CustomKeys.SlotPlus.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_SLOTMINUS,WM_USER+44,CustomKeys.SlotMinus.key,CustomKeys.SlotMinus.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_SLOTSAVE,WM_USER+44,CustomKeys.SlotSave.key,CustomKeys.SlotSave.modifiers);
|
||||
SendDlgItemMessage(hDlg,IDC_SLOTLOAD,WM_USER+44,CustomKeys.SlotLoad.key,CustomKeys.SlotLoad.modifiers);
|
||||
SendDlgItemMessage(hDlg, IDC_DIALOGSAVE, WM_USER + 44, CustomKeys.DialogSave.key, CustomKeys.DialogSave.modifiers);
|
||||
SendDlgItemMessage(hDlg, IDC_DIALOGLOAD, WM_USER + 44, CustomKeys.DialogLoad.key, CustomKeys.DialogLoad.modifiers);
|
||||
int i;
|
||||
for(i = 0 ; i < 10 ; i++) SendDlgItemMessage(hDlg,IDC_SAVE1+i,WM_USER+44,CustomKeys.Save[i].key,CustomKeys.Save[i].modifiers);
|
||||
for(i = 0 ; i < 10 ; i++) SendDlgItemMessage(hDlg,IDC_SAVE11+i,WM_USER+44,CustomKeys.Load[i].key,CustomKeys.Load[i].modifiers);
|
||||
|
||||
switch(index)
|
||||
{
|
||||
case 0:
|
||||
// set page 1 label text
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK1,HOTKEYS_LABEL_1_1);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK2,HOTKEYS_LABEL_1_2);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK3,HOTKEYS_LABEL_1_3);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK4,HOTKEYS_LABEL_1_4);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK5,HOTKEYS_LABEL_1_5);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK6,HOTKEYS_LABEL_1_6);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK7,HOTKEYS_LABEL_1_7);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK8,HOTKEYS_LABEL_1_8);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK9,HOTKEYS_LABEL_1_9);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK10,HOTKEYS_LABEL_1_10);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK11,HOTKEYS_LABEL_1_11);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK12,HOTKEYS_LABEL_1_12);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK13,HOTKEYS_LABEL_1_13);
|
||||
break;
|
||||
case 1:
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK1,HOTKEYS_LABEL_2_1);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK2,HOTKEYS_LABEL_2_2);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK3,HOTKEYS_LABEL_2_3);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK4,HOTKEYS_LABEL_2_4);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK5,HOTKEYS_LABEL_2_5);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK6,HOTKEYS_LABEL_2_6);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK7,HOTKEYS_LABEL_2_7);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK8,HOTKEYS_LABEL_2_8);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK9,HOTKEYS_LABEL_2_9);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK10,HOTKEYS_LABEL_2_10);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK11,HOTKEYS_LABEL_2_11);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK12,HOTKEYS_LABEL_2_12);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK13,HOTKEYS_LABEL_2_13);
|
||||
break;
|
||||
case 2:
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK1,HOTKEYS_LABEL_3_1);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK2,HOTKEYS_LABEL_3_2);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK3,HOTKEYS_LABEL_3_3);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK4,HOTKEYS_LABEL_3_4);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK5,HOTKEYS_LABEL_3_5);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK6,HOTKEYS_LABEL_3_6);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK7,HOTKEYS_LABEL_3_7);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK8,HOTKEYS_LABEL_3_8);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK9,HOTKEYS_LABEL_3_9);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK10,HOTKEYS_LABEL_3_10);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK11,HOTKEYS_LABEL_3_11);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK12,HOTKEYS_LABEL_3_12);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK13, HOTKEYS_LABEL_3_13);
|
||||
|
||||
break;
|
||||
case 3:
|
||||
for(int i = 0 ; i < 10 ; i++)
|
||||
{
|
||||
TCHAR temp [64];
|
||||
_stprintf(temp, TEXT("Select Slot %d"), i);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK1+i,temp);
|
||||
}
|
||||
SetDlgItemText(hDlg, IDC_LABEL_HK11, HOTKEYS_LABEL_4_11);
|
||||
SetDlgItemText(hDlg, IDC_LABEL_HK12, HOTKEYS_LABEL_4_12);
|
||||
SetDlgItemText(hDlg,IDC_LABEL_HK13,HOTKEYS_LABEL_4_13);
|
||||
|
||||
break;
|
||||
}
|
||||
for(int i = 0; i < MAX_SWITCHABLE_HOTKEY_DIALOG_ITEMS; i++)
|
||||
{
|
||||
SetDlgItemText(hDlg, IDC_LABEL_HK1 + i, hotkey_dialog_items[index][i].description);
|
||||
}
|
||||
}
|
||||
|
||||
// DlgHotkeyConfig
|
||||
|
@ -8513,85 +8527,6 @@ switch(msg)
|
|||
|
||||
switch(which)
|
||||
{
|
||||
case IDC_HOTKEY1:
|
||||
if(index == 0) CustomKeys.SpeedUp.key = wParam, CustomKeys.SpeedUp.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.BGL1.key = wParam, CustomKeys.BGL1.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboA.key = wParam, CustomKeys.TurboA.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[0].key = wParam, CustomKeys.SelectSave[0].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY2:
|
||||
if(index == 0) CustomKeys.SpeedDown.key = wParam, CustomKeys.SpeedDown.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.BGL2.key = wParam, CustomKeys.BGL2.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboB.key = wParam, CustomKeys.TurboB.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[1].key = wParam, CustomKeys.SelectSave[1].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY3:
|
||||
if(index == 0) CustomKeys.Pause.key = wParam, CustomKeys.Pause.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.BGL3.key = wParam, CustomKeys.BGL3.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboY.key = wParam, CustomKeys.TurboY.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[2].key = wParam, CustomKeys.SelectSave[2].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY4:
|
||||
if(index == 0) CustomKeys.FrameAdvance.key = wParam, CustomKeys.FrameAdvance.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.BGL4.key = wParam, CustomKeys.BGL4.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboX.key = wParam, CustomKeys.TurboX.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[3].key = wParam, CustomKeys.SelectSave[3].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY5:
|
||||
if(index == 0) CustomKeys.FastForward.key = wParam, CustomKeys.FastForward.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.BGL5.key = wParam, CustomKeys.BGL5.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboL.key = wParam, CustomKeys.TurboL.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[4].key = wParam, CustomKeys.SelectSave[4].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY6:
|
||||
if(index == 0) CustomKeys.SkipUp.key = wParam, CustomKeys.SkipUp.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.ClippingWindows.key = wParam, CustomKeys.ClippingWindows.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboR.key = wParam, CustomKeys.TurboR.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[5].key = wParam, CustomKeys.SelectSave[5].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY7:
|
||||
if(index == 0) CustomKeys.SkipDown.key = wParam, CustomKeys.SkipDown.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.Transparency.key = wParam, CustomKeys.Transparency.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboStart.key = wParam, CustomKeys.TurboStart.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[6].key = wParam, CustomKeys.SelectSave[6].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY8:
|
||||
if(index == 0) CustomKeys.ScopeTurbo.key = wParam, CustomKeys.ScopeTurbo.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.FastForwardToggle.key = wParam, CustomKeys.FastForwardToggle.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboSelect.key = wParam, CustomKeys.TurboSelect.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[7].key = wParam, CustomKeys.SelectSave[7].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY9:
|
||||
if(index == 0) CustomKeys.ScopePause.key = wParam, CustomKeys.ScopePause.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.Rewind.key = wParam, CustomKeys.Rewind.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboLeft.key = wParam, CustomKeys.TurboLeft.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[8].key = wParam, CustomKeys.SelectSave[8].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY10:
|
||||
if(index == 0) CustomKeys.ShowPressed.key = wParam, CustomKeys.ShowPressed.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.SwitchControllers.key = wParam, CustomKeys.SwitchControllers.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboUp.key = wParam, CustomKeys.TurboUp.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SelectSave[9].key = wParam, CustomKeys.SelectSave[9].modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY11:
|
||||
if(index == 0) CustomKeys.FrameCount.key = wParam, CustomKeys.FrameCount.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.JoypadSwap.key = wParam, CustomKeys.JoypadSwap.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboRight.key = wParam, CustomKeys.TurboRight.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.SaveFileSelect.key = wParam, CustomKeys.SaveFileSelect.modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY12:
|
||||
if(index == 0) CustomKeys.ReadOnly.key = wParam, CustomKeys.ReadOnly.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.ResetGame.key = wParam, CustomKeys.ResetGame.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.TurboDown.key = wParam, CustomKeys.TurboDown.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.LoadFileSelect.key = wParam, CustomKeys.LoadFileSelect.modifiers = modifiers;
|
||||
break;
|
||||
case IDC_HOTKEY13:
|
||||
if(index == 0) CustomKeys.SaveScreenShot.key = wParam, CustomKeys.SaveScreenShot.modifiers = modifiers;
|
||||
if(index == 1) CustomKeys.ToggleCheats.key = wParam, CustomKeys.ToggleCheats.modifiers = modifiers;
|
||||
if(index == 2) CustomKeys.Mute.key = wParam, CustomKeys.Mute.modifiers = modifiers;
|
||||
if(index == 3) CustomKeys.QuitS9X.key = wParam, CustomKeys.QuitS9X.modifiers = modifiers;
|
||||
break;
|
||||
|
||||
case IDC_SLOTPLUS:
|
||||
CustomKeys.SlotPlus.key = wParam;
|
||||
CustomKeys.SlotPlus.modifiers = modifiers;
|
||||
|
@ -8611,8 +8546,25 @@ switch(msg)
|
|||
CustomKeys.SlotSave.key = wParam;
|
||||
CustomKeys.SlotSave.modifiers = modifiers;
|
||||
break;
|
||||
|
||||
case IDC_DIALOGSAVE:
|
||||
CustomKeys.DialogSave.key = wParam;
|
||||
CustomKeys.DialogSave.modifiers = modifiers;
|
||||
break;
|
||||
|
||||
case IDC_DIALOGLOAD:
|
||||
CustomKeys.DialogLoad.key = wParam;
|
||||
CustomKeys.DialogLoad.modifiers = modifiers;
|
||||
break;
|
||||
}
|
||||
|
||||
if(which >= IDC_HOTKEY1 && which <= IDC_HOTKEY13)
|
||||
{
|
||||
int offset = which - IDC_HOTKEY1;
|
||||
hotkey_dialog_items[index][offset].key_entry->key = wParam;
|
||||
hotkey_dialog_items[index][offset].key_entry->modifiers = modifiers;
|
||||
}
|
||||
|
||||
if(which >= IDC_SAVE1 && which <= IDC_SAVE10)
|
||||
{
|
||||
CustomKeys.Save[which-IDC_SAVE1].key = wParam;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <dsound.h>
|
||||
#endif
|
||||
#include "rsrc/resource.h"
|
||||
#include "port.h"
|
||||
|
||||
#define COUNT(a) (sizeof (a) / sizeof (a[0]))
|
||||
#define MAX_AUDIO_NAME_LENGTH 1024
|
||||
|
@ -307,17 +308,15 @@ struct SCustomKeys {
|
|||
SCustomKey SlotMinus;
|
||||
SCustomKey SlotSave;
|
||||
SCustomKey SlotLoad;
|
||||
SCustomKey DialogSave;
|
||||
SCustomKey DialogLoad;
|
||||
SCustomKey BGL1;
|
||||
SCustomKey BGL2;
|
||||
SCustomKey BGL3;
|
||||
SCustomKey BGL4;
|
||||
SCustomKey BGL5;
|
||||
SCustomKey ClippingWindows;
|
||||
// SCustomKey BGLHack;
|
||||
SCustomKey Transparency;
|
||||
// SCustomKey GLCube;
|
||||
// SCustomKey HDMA;
|
||||
// SCustomKey InterpMode7;
|
||||
SCustomKey JoypadSwap;
|
||||
SCustomKey SwitchControllers;
|
||||
SCustomKey TurboA, TurboB, TurboY, TurboX, TurboL, TurboR, TurboStart, TurboSelect, TurboLeft, TurboUp, TurboRight, TurboDown;
|
||||
|
@ -458,5 +457,11 @@ int GetFilterScale(RenderFilter filterID);
|
|||
bool GetFilterHiResSupport(RenderFilter filterID);
|
||||
const TCHAR * S9xGetDirectoryT (enum s9x_getdirtype);
|
||||
RECT GetWindowMargins(HWND hwnd, UINT width);
|
||||
void GetSlotFilename(int slot, char filename[_MAX_PATH + 1]);
|
||||
void FreezeUnfreezeSlot(int slot, bool8 freeze);
|
||||
void FreezeUnfreezeDialog(bool8 freeze);
|
||||
void FreezeUnfreezeDialogPreview(bool8 freeze);
|
||||
void FreezeUnfreeze(const char *filename, bool8 freeze);
|
||||
bool UnfreezeScreenshotSlot(int slot, uint16 **image_buffer, int &width, int &height);
|
||||
|
||||
#endif // !defined(SNES9X_H_INCLUDED)
|
||||
|
|
Loading…
Reference in New Issue