mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge branch 'master' into makotech222-cwcheat
This commit is contained in:
commit
f184632ecd
13 changed files with 201 additions and 135 deletions
|
@ -33,7 +33,7 @@ enum GPUCore {
|
|||
|
||||
struct CoreParameter
|
||||
{
|
||||
CoreParameter() : collectEmuLog(0), unthrottle(false) {}
|
||||
CoreParameter() : collectEmuLog(0), unthrottle(false), updateRecent(true) {}
|
||||
// 0 = Interpreter
|
||||
// 1 = Jit
|
||||
// 2 = JitIL
|
||||
|
@ -67,4 +67,6 @@ struct CoreParameter
|
|||
// Can be modified at runtime.
|
||||
bool unthrottle;
|
||||
int fpsLimit;
|
||||
|
||||
bool updateRecent;
|
||||
};
|
||||
|
|
|
@ -38,26 +38,15 @@ int mixFrequency = 44100;
|
|||
|
||||
const int hwSampleRate = 44100;
|
||||
const int hwBlockSize = 64;
|
||||
|
||||
// TODO: Tweak
|
||||
#ifdef ANDROID
|
||||
const int hostAttemptBlockSize = 2048;
|
||||
#else
|
||||
const int hostAttemptBlockSize = 512;
|
||||
#endif
|
||||
|
||||
const int audioIntervalUs = (int)(1000000ULL * hwBlockSize / hwSampleRate);
|
||||
const int audioHostIntervalUs = (int)(1000000ULL * hostAttemptBlockSize / hwSampleRate);
|
||||
|
||||
// High and low watermarks, basically. For perfect emulation, the correct values are 0 and 1, respectively.
|
||||
// TODO: Tweak
|
||||
#ifdef ANDROID
|
||||
const int chanQueueMaxSizeFactor = 4;
|
||||
const int chanQueueMinSizeFactor = 2;
|
||||
#else
|
||||
const int chanQueueMaxSizeFactor = 2;
|
||||
const int chanQueueMinSizeFactor = 1;
|
||||
#endif
|
||||
const int chanQueueMaxSizeFactor = 2;
|
||||
const int chanQueueMinSizeFactor = 1
|
||||
|
||||
|
||||
FixedSizeQueue<s16, hostAttemptBlockSize * 16> outAudioQueue;
|
||||
|
||||
|
|
|
@ -22,17 +22,8 @@
|
|||
#include "sceUmd.h"
|
||||
#include "sceKernelThread.h"
|
||||
|
||||
const int PSP_ERROR_UMD_INVALID_PARAM = 0x80010016;
|
||||
|
||||
const u64 MICRO_DELAY_ACTIVATE = 4000;
|
||||
|
||||
#define UMD_NOT_PRESENT 0x01
|
||||
#define UMD_PRESENT 0x02
|
||||
#define UMD_CHANGED 0x04
|
||||
#define UMD_NOT_READY 0x08
|
||||
#define UMD_READY 0x10
|
||||
#define UMD_READABLE 0x20
|
||||
|
||||
struct UmdWaitingThread
|
||||
{
|
||||
SceUID threadID;
|
||||
|
@ -55,11 +46,6 @@ static int umdStatTimeoutEvent = -1;
|
|||
static int umdStatChangeEvent = -1;
|
||||
static std::vector<UmdWaitingThread> umdWaitingThreads;
|
||||
|
||||
|
||||
#define PSP_UMD_TYPE_GAME 0x10
|
||||
#define PSP_UMD_TYPE_VIDEO 0x20
|
||||
#define PSP_UMD_TYPE_AUDIO 0x40
|
||||
|
||||
struct PspUmdInfo {
|
||||
u32 size;
|
||||
u32 type;
|
||||
|
@ -94,14 +80,14 @@ void __UmdDoState(PointerWrap &p)
|
|||
|
||||
u8 __KernelUmdGetState()
|
||||
{
|
||||
u8 state = UMD_PRESENT;
|
||||
u8 state = PSP_UMD_PRESENT;
|
||||
if (umdActivated) {
|
||||
state |= UMD_READY;
|
||||
state |= UMD_READABLE;
|
||||
state |= PSP_UMD_READY;
|
||||
state |= PSP_UMD_READABLE;
|
||||
}
|
||||
// TODO: My tests give UMD_READY but I suppose that's when it's been sitting in the drive?
|
||||
// TODO: My tests give PSP_UMD_READY but I suppose that's when it's been sitting in the drive?
|
||||
else
|
||||
state |= UMD_NOT_READY;
|
||||
state |= PSP_UMD_NOT_READY;
|
||||
return state;
|
||||
}
|
||||
|
||||
|
@ -111,15 +97,13 @@ void __UmdStatChange(u64 userdata, int cyclesLate)
|
|||
umdActivated = userdata & 0xFF;
|
||||
|
||||
// Wake anyone waiting on this.
|
||||
for (size_t i = 0; i < umdWaitingThreads.size(); ++i)
|
||||
{
|
||||
for (size_t i = 0; i < umdWaitingThreads.size(); ++i) {
|
||||
UmdWaitingThread &info = umdWaitingThreads[i];
|
||||
|
||||
u32 error;
|
||||
SceUID waitID = __KernelGetWaitID(info.threadID, WAITTYPE_UMD, error);
|
||||
bool keep = false;
|
||||
if (waitID == 1)
|
||||
{
|
||||
if (waitID == 1) {
|
||||
if ((info.stat & __KernelUmdGetState()) != 0)
|
||||
__KernelResumeThreadFromWait(info.threadID, 0);
|
||||
// Only if they are still waiting do we keep them in the list.
|
||||
|
@ -134,7 +118,7 @@ void __UmdStatChange(u64 userdata, int cyclesLate)
|
|||
|
||||
void __KernelUmdActivate()
|
||||
{
|
||||
u32 notifyArg = UMD_PRESENT | UMD_READABLE;
|
||||
u32 notifyArg = PSP_UMD_PRESENT | PSP_UMD_READABLE;
|
||||
__KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg);
|
||||
|
||||
// Don't activate immediately, take time to "spin up."
|
||||
|
@ -144,7 +128,7 @@ void __KernelUmdActivate()
|
|||
|
||||
void __KernelUmdDeactivate()
|
||||
{
|
||||
u32 notifyArg = UMD_PRESENT | UMD_READY;
|
||||
u32 notifyArg = PSP_UMD_PRESENT | PSP_UMD_READY;
|
||||
__KernelNotifyCallbackType(THREAD_CALLBACK_UMD, -1, notifyArg);
|
||||
|
||||
CoreTiming::RemoveAllEvents(umdStatChangeEvent);
|
||||
|
@ -161,8 +145,7 @@ u32 sceUmdGetDiscInfo(u32 infoAddr)
|
|||
{
|
||||
DEBUG_LOG(HLE, "sceUmdGetDiscInfo(%08x)", infoAddr);
|
||||
|
||||
if (Memory::IsValidAddress(infoAddr))
|
||||
{
|
||||
if (Memory::IsValidAddress(infoAddr)) {
|
||||
PspUmdInfo info;
|
||||
Memory::ReadStruct(infoAddr, &info);
|
||||
if (info.size != 8)
|
||||
|
@ -171,45 +154,38 @@ u32 sceUmdGetDiscInfo(u32 infoAddr)
|
|||
info.type = PSP_UMD_TYPE_GAME;
|
||||
Memory::WriteStruct(infoAddr, &info);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
} else
|
||||
return PSP_ERROR_UMD_INVALID_PARAM;
|
||||
}
|
||||
|
||||
int sceUmdActivate(u32 unknown, const char *name)
|
||||
int sceUmdActivate(u32 mode, const char *name)
|
||||
{
|
||||
if (unknown < 1 || unknown > 2)
|
||||
if (mode < 1 || mode > 2)
|
||||
return PSP_ERROR_UMD_INVALID_PARAM;
|
||||
|
||||
__KernelUmdActivate();
|
||||
|
||||
if (unknown == 1)
|
||||
{
|
||||
DEBUG_LOG(HLE, "0=sceUmdActivate(%d, %s)", unknown, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERROR_LOG(HLE, "UNTESTED 0=sceUmdActivate(%d, %s)", unknown, name);
|
||||
if (mode == 1) {
|
||||
DEBUG_LOG(HLE, "0=sceUmdActivate(%d, %s)", mode, name);
|
||||
} else {
|
||||
ERROR_LOG(HLE, "UNTESTED 0=sceUmdActivate(%d, %s)", mode, name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sceUmdDeactivate(u32 unknown, const char *name)
|
||||
int sceUmdDeactivate(u32 mode, const char *name)
|
||||
{
|
||||
// Why 18? No idea.
|
||||
if (unknown > 18)
|
||||
if (mode > 18)
|
||||
return PSP_ERROR_UMD_INVALID_PARAM;
|
||||
|
||||
__KernelUmdDeactivate();
|
||||
|
||||
if (unknown == 1)
|
||||
{
|
||||
DEBUG_LOG(HLE, "0=sceUmdDeactivate(%d, %s)", unknown, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERROR_LOG(HLE, "UNTESTED 0=sceUmdDeactivate(%d, %s)", unknown, name);
|
||||
if (mode == 1) {
|
||||
DEBUG_LOG(HLE, "0=sceUmdDeactivate(%d, %s)", mode, name);
|
||||
} else {
|
||||
ERROR_LOG(HLE, "UNTESTED 0=sceUmdDeactivate(%d, %s)", mode, name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -222,8 +198,7 @@ u32 sceUmdRegisterUMDCallBack(u32 cbId)
|
|||
// TODO: If the callback is invalid, return PSP_ERROR_UMD_INVALID_PARAM.
|
||||
if (cbId == 0)
|
||||
retVal = PSP_ERROR_UMD_INVALID_PARAM;
|
||||
else
|
||||
{
|
||||
else {
|
||||
// Remove the old one, we're replacing.
|
||||
if (driveCBId != -1)
|
||||
__KernelUnregisterCallback(THREAD_CALLBACK_UMD, driveCBId);
|
||||
|
@ -242,8 +217,7 @@ int sceUmdUnRegisterUMDCallBack(int cbId)
|
|||
|
||||
if (cbId != driveCBId)
|
||||
retVal = PSP_ERROR_UMD_INVALID_PARAM;
|
||||
else
|
||||
{
|
||||
else {
|
||||
retVal = cbId;
|
||||
driveCBId = -1;
|
||||
__KernelUnregisterCallback(THREAD_CALLBACK_UMD, cbId);
|
||||
|
@ -257,7 +231,7 @@ u32 sceUmdGetDriveStat()
|
|||
{
|
||||
//u32 retVal = PSP_UMD_INITED | PSP_UMD_READY | PSP_UMD_PRESENT;
|
||||
u32 retVal = __KernelUmdGetState();
|
||||
DEBUG_LOG(HLE,"0x%02x=sceUmdGetDriveStat()",retVal);
|
||||
DEBUG_LOG(HLE,"0x%02x=sceUmdGetDriveStat()", retVal);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
|
@ -271,8 +245,7 @@ void __UmdStatTimeout(u64 userdata, int cyclesLate)
|
|||
if (waitID == 1)
|
||||
__KernelResumeThreadFromWait(threadID, SCE_KERNEL_ERROR_WAIT_TIMEOUT);
|
||||
|
||||
for (size_t i = 0; i < umdWaitingThreads.size(); ++i)
|
||||
{
|
||||
for (size_t i = 0; i < umdWaitingThreads.size(); ++i) {
|
||||
if (umdWaitingThreads[i].threadID == threadID)
|
||||
umdWaitingThreads.erase(umdWaitingThreads.begin() + i--);
|
||||
}
|
||||
|
@ -300,8 +273,7 @@ int sceUmdWaitDriveStat(u32 stat)
|
|||
{
|
||||
DEBUG_LOG(HLE,"0=sceUmdWaitDriveStat(stat = %08x)", stat);
|
||||
|
||||
if ((stat & __KernelUmdGetState()) == 0)
|
||||
{
|
||||
if ((stat & __KernelUmdGetState()) == 0) {
|
||||
umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat));
|
||||
__KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited");
|
||||
}
|
||||
|
@ -313,13 +285,11 @@ int sceUmdWaitDriveStatWithTimer(u32 stat, u32 timeout)
|
|||
{
|
||||
DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatWithTimer(stat = %08x, timeout = %d)", stat, timeout);
|
||||
|
||||
if ((stat & __KernelUmdGetState()) == 0)
|
||||
{
|
||||
if ((stat & __KernelUmdGetState()) == 0) {
|
||||
__UmdWaitStat(timeout);
|
||||
umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat));
|
||||
__KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, 0, "umd stat waited with timer");
|
||||
}
|
||||
else
|
||||
} else
|
||||
hleReSchedule("umd stat waited with timer");
|
||||
|
||||
return 0;
|
||||
|
@ -330,16 +300,14 @@ int sceUmdWaitDriveStatCB(u32 stat, u32 timeout)
|
|||
DEBUG_LOG(HLE,"0=sceUmdWaitDriveStatCB(stat = %08x, timeout = %d)", stat, timeout);
|
||||
|
||||
hleCheckCurrentCallbacks();
|
||||
if ((stat & __KernelUmdGetState()) == 0)
|
||||
{
|
||||
if ((stat & __KernelUmdGetState()) == 0) {
|
||||
if (timeout == 0)
|
||||
timeout = 8000;
|
||||
|
||||
__UmdWaitStat(timeout);
|
||||
umdWaitingThreads.push_back(UmdWaitingThread::Make(__KernelGetCurThread(), stat));
|
||||
__KernelWaitCurThread(WAITTYPE_UMD, 1, stat, 0, true, "umd stat waited");
|
||||
}
|
||||
else
|
||||
} else
|
||||
hleReSchedule("umd stat waited");
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -18,12 +18,24 @@
|
|||
#pragma once
|
||||
|
||||
enum pspUmdState {
|
||||
PSP_UMD_INIT = 0x00,
|
||||
PSP_UMD_NOT_PRESENT = 0x01,
|
||||
PSP_UMD_PRESENT = 0x02,
|
||||
PSP_UMD_CHANGED = 0x04,
|
||||
PSP_UMD_INITING = 0x08,
|
||||
PSP_UMD_INITED = 0x10,
|
||||
PSP_UMD_READY = 0x20
|
||||
PSP_UMD_PRESENT = 0x02,
|
||||
PSP_UMD_CHANGED = 0x04,
|
||||
PSP_UMD_NOT_READY = 0x08,
|
||||
PSP_UMD_READY = 0x10,
|
||||
PSP_UMD_READABLE = 0x20,
|
||||
};
|
||||
|
||||
enum pspUmdError {
|
||||
PSP_ERROR_UMD_NOT_READY = 0x80210001,
|
||||
PSP_ERROR_UMD_INVALID_PARAM = 0x80010016,
|
||||
};
|
||||
|
||||
enum pspUmdType {
|
||||
PSP_UMD_TYPE_GAME = 0x00,
|
||||
PSP_UMD_TYPE_VIDEO = 0x20,
|
||||
PSP_UMD_TYPE_AUDIO = 0x40,
|
||||
};
|
||||
|
||||
void __UmdInit();
|
||||
|
|
|
@ -108,7 +108,9 @@ bool PSP_Init(const CoreParameter &coreParam, std::string *error_string)
|
|||
return false;
|
||||
}
|
||||
|
||||
g_Config.AddRecent(coreParameter.fileToStart);
|
||||
if (coreParam.updateRecent)
|
||||
g_Config.AddRecent(coreParameter.fileToStart);
|
||||
|
||||
// Setup JIT here.
|
||||
if (coreParameter.startPaused)
|
||||
coreState = CORE_STEPPING;
|
||||
|
|
|
@ -125,7 +125,7 @@ enum DoLightComputation {
|
|||
void GenerateVertexShader(int prim, char *buffer) {
|
||||
char *p = buffer;
|
||||
|
||||
#define USE_FOR_LOOP
|
||||
// #define USE_FOR_LOOP
|
||||
|
||||
#if defined(USING_GLES2)
|
||||
WRITE(p, "precision highp float;\n");
|
||||
|
@ -327,14 +327,14 @@ void GenerateVertexShader(int prim, char *buffer) {
|
|||
|
||||
#else
|
||||
if (numWeights == 1)
|
||||
WRITE(p, " mat4 skinMatrix = bw1 * u_bone[0]");
|
||||
WRITE(p, " mat4 skinMatrix = a_w1 * u_bone[0]");
|
||||
else
|
||||
WRITE(p, " mat4 skinMatrix = bw1.x * u_bone[0]");
|
||||
WRITE(p, " mat4 skinMatrix = a_w1.x * u_bone[0]");
|
||||
for (int i = 1; i < numWeights; i++) {
|
||||
const char *weightAttr = boneWeightAttr[i];
|
||||
// workaround for "cant do .x of scalar" issue
|
||||
if (numWeights == 1 && i == 0) weightAttr = "bw1";
|
||||
if (numWeights == 5 && i == 4) weightAttr = "bw2";
|
||||
if (numWeights == 1 && i == 0) weightAttr = "a_w1";
|
||||
if (numWeights == 5 && i == 4) weightAttr = "a_w2";
|
||||
WRITE(p, " + %s * u_bone[%i]", weightAttr, i);
|
||||
}
|
||||
WRITE(p, ";\n");
|
||||
|
|
|
@ -24,8 +24,6 @@ extern unsigned short analog_ctrl_map[];
|
|||
extern unsigned int dinput_ctrl_map[];
|
||||
extern unsigned int xinput_ctrl_map[];
|
||||
|
||||
#define DINPUT_CAST(inst) static_cast<std::shared_ptr<DinputDevice>>(inst)
|
||||
|
||||
inline UINT* ControlMapping::GetDeviceButtonsMap(UINT curDevice)
|
||||
{
|
||||
switch (curDevice)
|
||||
|
@ -171,6 +169,25 @@ UINT ControlMapping::GetBindCode()
|
|||
return GetBindCode(currentDevicePage, currentButtonIndex);
|
||||
}
|
||||
|
||||
void ControlMapping::SetDisableBind(UINT deviceIdx, UINT buttonIdx)
|
||||
{
|
||||
u32 disableCode = 0;
|
||||
if (deviceIdx == CONTROLS_DIRECT_INPUT_INDEX) {
|
||||
disableCode = 0xFFFFFFFF;
|
||||
}
|
||||
SetBindCode(disableCode, deviceIdx, buttonIdx);
|
||||
}
|
||||
|
||||
void ControlMapping::SetDisableBind(UINT buttonIdx)
|
||||
{
|
||||
SetDisableBind(currentDevicePage, buttonIdx);
|
||||
}
|
||||
|
||||
void ControlMapping::SetDisableBind()
|
||||
{
|
||||
SetDisableBind(currentDevicePage, currentButtonIndex);
|
||||
}
|
||||
|
||||
UINT ControlMapping::GetTargetDevice()
|
||||
{
|
||||
return currentDevicePage;
|
||||
|
|
|
@ -72,6 +72,9 @@ public:
|
|||
UINT GetBindCode();
|
||||
UINT GetBindCode(UINT buttonIdx);
|
||||
UINT GetBindCode(UINT deviceIdx, UINT buttonIdx);
|
||||
void SetDisableBind();
|
||||
void SetDisableBind(UINT buttonIdx);
|
||||
void SetDisableBind(UINT deviceIdx, UINT buttonIdx);
|
||||
|
||||
private:
|
||||
ControlMapping(UINT nButtons);
|
||||
|
|
|
@ -148,7 +148,7 @@ static inline int getPadCodeFromVirtualPovCode(unsigned int povCode)
|
|||
{
|
||||
int mergedCode = 0;
|
||||
for (int i = 0; i < dinput_ctrl_map_size / sizeof(dinput_ctrl_map[0]); i += 2) {
|
||||
if (dinput_ctrl_map[i] > 0xFF && dinput_ctrl_map[i] & povCode)
|
||||
if (dinput_ctrl_map[i] != 0xFFFFFFFF && dinput_ctrl_map[i] > 0xFF && dinput_ctrl_map[i] & povCode)
|
||||
mergedCode |= dinput_ctrl_map[i + 1];
|
||||
}
|
||||
return mergedCode;
|
||||
|
|
|
@ -932,9 +932,9 @@ namespace MainWindow
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
#define CONTROLS_IDC_EDIT_BIGIN IDC_EDIT_KEY_MENU
|
||||
#define CONTROLS_IDC_EDIT_BEGIN IDC_EDIT_KEY_MENU
|
||||
#define CONTROLS_IDC_EDIT_END IDC_EDIT_KEY_ANALOG_RIGHT
|
||||
#define CONTROLS_BUTTONS_COUNT IDC_EDIT_KEYRIGHT - CONTROLS_IDC_EDIT_BIGIN + 1
|
||||
#define CONTROLS_BUTTONS_COUNT (IDC_EDIT_KEYRIGHT - CONTROLS_IDC_EDIT_BEGIN + 1)
|
||||
#define CONTROLS_BUTTONNAME_MAX 16
|
||||
// for controls dialog device polling and bind update.
|
||||
#define TIMER_CONTROLS_BINDUPDATE 1
|
||||
|
@ -969,6 +969,7 @@ namespace MainWindow
|
|||
HWND hCtrlTab;
|
||||
UINT_PTR timerId;
|
||||
WNDPROC orgPSPImageProc;
|
||||
WNDPROC orgEditProc;
|
||||
ControlMapping *pCtrlMap;
|
||||
HWND hStaticPspImage;
|
||||
};
|
||||
|
@ -993,7 +994,7 @@ namespace MainWindow
|
|||
if (pCtrlDlgState->pCtrlMap->GetTargetDevice() == CONTROLS_KEYBOARD_INDEX) {
|
||||
HWND hEdit = GetFocus();
|
||||
UINT nCtrlID = GetDlgCtrlID(hEdit);
|
||||
if (nCtrlID < CONTROLS_IDC_EDIT_BIGIN || nCtrlID > CONTROLS_IDC_EDIT_END) {
|
||||
if (nCtrlID < CONTROLS_IDC_EDIT_BEGIN || nCtrlID > CONTROLS_IDC_EDIT_END) {
|
||||
return CallNextHookEx(pCtrlDlgState->pKeydownHook, nCode, wParam, lParam);
|
||||
}
|
||||
if (!(lParam&(1<<31))) {
|
||||
|
@ -1046,6 +1047,15 @@ namespace MainWindow
|
|||
DeleteObject(hCompDC);
|
||||
}
|
||||
|
||||
inline void SetWindowTextForButton(HWND hEdit, u32 buttonCode, const char *pszButtonName)
|
||||
{
|
||||
if (buttonCode == 0) {
|
||||
SetWindowTextA(hEdit, "Disable");
|
||||
} else {
|
||||
SetWindowTextA(hEdit, pszButtonName);
|
||||
}
|
||||
}
|
||||
|
||||
// Draw background image of Controls Dialog (pspmode.png) by use static control.
|
||||
LRESULT CALLBACK PSPImageProc(HWND hStatic, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
@ -1069,6 +1079,49 @@ namespace MainWindow
|
|||
return CallWindowProc(pCtrlDlgState->orgPSPImageProc, hStatic, message, wParam, lParam);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK ButtonsEditProc(HWND hEdit, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (message) {
|
||||
case WM_RBUTTONUP:
|
||||
{
|
||||
UINT nCtrlID = GetDlgCtrlID(hEdit);
|
||||
int deviceIdx = TabCtrl_GetCurSel(pCtrlDlgState->hCtrlTab);
|
||||
if (deviceIdx != CONTROLS_KEYBOARD_INDEX && nCtrlID >= IDC_EDIT_KEY_ANALOG_UP)
|
||||
return TRUE;
|
||||
|
||||
HMENU hSubMenu = GetSubMenu(g_hPopupMenus, 4);
|
||||
POINT pos;
|
||||
pos.x = LOWORD(lParam);
|
||||
pos.y = HIWORD(lParam);
|
||||
ClientToScreen(hEdit, &pos);
|
||||
switch(TrackPopupMenuEx(GetSubMenu(g_hPopupMenus, 4), TPM_RETURNCMD, pos.x, pos.y, hEdit, NULL))
|
||||
{
|
||||
case ID_CONTROLS_KEY_DISABLE:
|
||||
{
|
||||
if (nCtrlID < IDC_EDIT_KEY_ANALOG_UP) {
|
||||
pCtrlDlgState->pCtrlMap->SetDisableBind(deviceIdx, nCtrlID - CONTROLS_IDC_EDIT_BEGIN);
|
||||
}
|
||||
else if (deviceIdx == CONTROLS_KEYBOARD_INDEX) {
|
||||
pCtrlDlgState->pCtrlMap->SetDisableBind(
|
||||
CONTROLS_KEYBOARD_ANALOG_INDEX, nCtrlID - IDC_EDIT_KEY_ANALOG_UP);
|
||||
}
|
||||
SetWindowTextA(hEdit, "Disable");
|
||||
RECT rc = getRedrawRect(hEdit);
|
||||
HWND hDlg = GetParent(hEdit);
|
||||
InvalidateRect(hDlg, &rc, false);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
default :
|
||||
break;
|
||||
}
|
||||
return CallWindowProc(pCtrlDlgState->orgEditProc, hEdit, message, wParam, lParam);
|
||||
}
|
||||
|
||||
// Message handler for control box.
|
||||
LRESULT CALLBACK Controls(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
@ -1151,15 +1204,27 @@ namespace MainWindow
|
|||
DeleteObject(hResBM);
|
||||
}
|
||||
|
||||
for (u32 i = 0; i <= IDC_EDIT_KEYRIGHT - CONTROLS_IDC_EDIT_BIGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BIGIN + i);
|
||||
SetWindowTextA(hEdit, getVirtualKeyName(pCtrlDlgState->pCtrlMap->GetBindCode(CONTROLS_KEYBOARD_INDEX, i)));
|
||||
pCtrlDlgState->orgEditProc = (WNDPROC)GetWindowLongPtr(
|
||||
GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BEGIN), GWLP_WNDPROC);
|
||||
for (int i = 0; i <= CONTROLS_IDC_EDIT_END - CONTROLS_IDC_EDIT_BEGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BEGIN + i);
|
||||
if (i < CONTROLS_BUTTONS_COUNT) {
|
||||
u32 keyCode = pCtrlDlgState->pCtrlMap->GetBindCode(CONTROLS_KEYBOARD_INDEX, i);
|
||||
SetWindowTextForButton(hEdit, keyCode, getVirtualKeyName(keyCode));
|
||||
} else {
|
||||
u32 analogCode = pCtrlDlgState->pCtrlMap->GetBindCode(
|
||||
CONTROLS_KEYBOARD_ANALOG_INDEX, i - CONTROLS_BUTTONS_COUNT);
|
||||
SetWindowTextForButton(hEdit, analogCode, getVirtualKeyName(analogCode));
|
||||
}
|
||||
if (pCtrlDlgState->orgEditProc != (WNDPROC)GetWindowLongPtr(hEdit, GWLP_WNDPROC)) {
|
||||
MessageBoxA(hDlg,
|
||||
"Can not hook to the inherited Edit control. need wndproc of original edit control.",
|
||||
"Controls dialog init error.", MB_OK);
|
||||
break;
|
||||
}
|
||||
SetWindowLongPtr(hEdit, GWLP_WNDPROC, (LONG_PTR)ButtonsEditProc);
|
||||
}
|
||||
|
||||
}
|
||||
for (u32 i = 0; i <= CONTROLS_IDC_EDIT_END - IDC_EDIT_KEY_ANALOG_UP; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, IDC_EDIT_KEY_ANALOG_UP + i);
|
||||
SetWindowTextA(hEdit, getVirtualKeyName(pCtrlDlgState->pCtrlMap->GetBindCode(CONTROLS_KEYBOARD_ANALOG_INDEX, i)));
|
||||
}
|
||||
ComboBox_AddString(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), "None");
|
||||
ComboBox_AddString(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), "XInput");
|
||||
ComboBox_AddString(GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE), "DirectInput");
|
||||
|
@ -1185,7 +1250,7 @@ namespace MainWindow
|
|||
pCtrlDlgState->pCtrlMap->GetTargetDevice() != CONTROLS_KEYBOARD_INDEX) {
|
||||
HWND hEdit = GetFocus();
|
||||
UINT nCtrlID = GetDlgCtrlID(hEdit);
|
||||
if (nCtrlID < CONTROLS_IDC_EDIT_BIGIN || nCtrlID > IDC_EDIT_KEYRIGHT) {
|
||||
if (nCtrlID < CONTROLS_IDC_EDIT_BEGIN || nCtrlID > IDC_EDIT_KEYRIGHT) {
|
||||
break;
|
||||
}
|
||||
// device polling and update.
|
||||
|
@ -1212,7 +1277,7 @@ namespace MainWindow
|
|||
n++;
|
||||
}
|
||||
snprintf(str, CONTROLS_BUTTONNAME_MAX, "%s",
|
||||
controllist[(IDC_EDIT_KEYUP - CONTROLS_IDC_EDIT_BIGIN - 1) + n]);
|
||||
controllist[(IDC_EDIT_KEYUP - CONTROLS_IDC_EDIT_BEGIN - 1) + n]);
|
||||
} else {
|
||||
snprintf(str, CONTROLS_BUTTONNAME_MAX, "%d", buttonCode + 1);
|
||||
}
|
||||
|
@ -1223,7 +1288,7 @@ namespace MainWindow
|
|||
break;
|
||||
case CONTROLS_XINPUT_INDEX:
|
||||
{
|
||||
SetWindowText(hEdit, getXinputButtonName(buttonCode));
|
||||
SetWindowTextA(hEdit, getXinputButtonName(buttonCode));
|
||||
RECT rc = getRedrawRect(hEdit);
|
||||
InvalidateRect(hDlg, &rc, FALSE);
|
||||
}
|
||||
|
@ -1244,15 +1309,17 @@ namespace MainWindow
|
|||
{
|
||||
case CONTROLS_KEYBOARD_INDEX:
|
||||
{
|
||||
for (u32 i = 0; i <= IDC_EDIT_KEYRIGHT - CONTROLS_IDC_EDIT_BIGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BIGIN + i);
|
||||
SetWindowTextA(hEdit, getVirtualKeyName(pCtrlDlgState->pCtrlMap->GetBindCode(i)));
|
||||
for (u32 i = 0; i <= IDC_EDIT_KEYRIGHT - CONTROLS_IDC_EDIT_BEGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BEGIN + i);
|
||||
u32 keyCode = pCtrlDlgState->pCtrlMap->GetBindCode(i);
|
||||
SetWindowTextForButton(hEdit, keyCode, getVirtualKeyName(keyCode));
|
||||
}
|
||||
for (u32 i = 0; i <= CONTROLS_IDC_EDIT_END - IDC_EDIT_KEY_ANALOG_UP; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, IDC_EDIT_KEY_ANALOG_UP + i);
|
||||
Edit_SetReadOnly(hEdit, FALSE);
|
||||
SetWindowText(hEdit, getVirtualKeyName(pCtrlDlgState->pCtrlMap->GetBindCode(
|
||||
CONTROLS_KEYBOARD_ANALOG_INDEX, i)));
|
||||
u32 analogCode = pCtrlDlgState->pCtrlMap->GetBindCode(
|
||||
CONTROLS_KEYBOARD_ANALOG_INDEX, i);
|
||||
SetWindowTextForButton(hEdit, analogCode, getVirtualKeyName(analogCode));
|
||||
}
|
||||
InvalidateRect(hDlg, 0, 0);
|
||||
}
|
||||
|
@ -1260,46 +1327,44 @@ namespace MainWindow
|
|||
case CONTROLS_DIRECT_INPUT_INDEX:
|
||||
{
|
||||
|
||||
for (u32 i = 0; i <= CONTROLS_IDC_EDIT_END - CONTROLS_IDC_EDIT_BIGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BIGIN + i);
|
||||
for (u32 i = 0; i <= CONTROLS_IDC_EDIT_END - CONTROLS_IDC_EDIT_BEGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BEGIN + i);
|
||||
int buttonCode = (int)pCtrlDlgState->pCtrlMap->GetBindCode(i);
|
||||
char str[16];
|
||||
if (i >= IDC_EDIT_KEYUP - CONTROLS_IDC_EDIT_BIGIN) {
|
||||
if (i >= IDC_EDIT_KEY_ANALOG_UP - CONTROLS_IDC_EDIT_BIGIN) {
|
||||
if (i >= IDC_EDIT_KEYUP - CONTROLS_IDC_EDIT_BEGIN) {
|
||||
if (i >= IDC_EDIT_KEY_ANALOG_UP - CONTROLS_IDC_EDIT_BEGIN) {
|
||||
Edit_SetReadOnly(hEdit, TRUE);
|
||||
SetWindowTextA(hEdit, controllist[i]);
|
||||
} else {
|
||||
int n = 1;
|
||||
int buttonCode = pCtrlDlgState->pCtrlMap->GetBindCode(i);
|
||||
for (int i = buttonCode >> 8; i > 1; i >>= 1) {
|
||||
n++;
|
||||
if (buttonCode != -1) {
|
||||
for (int i = buttonCode >> 8; i > 1; i >>= 1) {
|
||||
n++;
|
||||
}
|
||||
snprintf(str, CONTROLS_BUTTONNAME_MAX, "%s",
|
||||
controllist[(IDC_EDIT_KEYUP - CONTROLS_IDC_EDIT_BEGIN - 1) + n]);
|
||||
}
|
||||
snprintf(str, CONTROLS_BUTTONNAME_MAX, "%s",
|
||||
controllist[(IDC_EDIT_KEYUP - CONTROLS_IDC_EDIT_BIGIN - 1) + n]);
|
||||
SetWindowTextA(hEdit, str);
|
||||
SetWindowTextForButton(hEdit, buttonCode + 1, str);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
snprintf(str, CONTROLS_BUTTONNAME_MAX, "%d", pCtrlDlgState->pCtrlMap->GetBindCode(i) + 1);
|
||||
SetWindowTextA(hEdit, str);
|
||||
SetWindowTextForButton(hEdit, buttonCode + 1, str);
|
||||
}
|
||||
InvalidateRect(hDlg, 0, 0);
|
||||
}
|
||||
break;
|
||||
case CONTROLS_XINPUT_INDEX:
|
||||
{
|
||||
for (u32 i = 0; i <= CONTROLS_IDC_EDIT_END - CONTROLS_IDC_EDIT_BIGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BIGIN + i);
|
||||
if (i >= IDC_EDIT_KEY_ANALOG_UP - CONTROLS_IDC_EDIT_BIGIN) {
|
||||
for (u32 i = 0; i <= CONTROLS_IDC_EDIT_END - CONTROLS_IDC_EDIT_BEGIN; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, CONTROLS_IDC_EDIT_BEGIN + i);
|
||||
if (i >= IDC_EDIT_KEY_ANALOG_UP - CONTROLS_IDC_EDIT_BEGIN) {
|
||||
Edit_SetReadOnly(hEdit, TRUE);
|
||||
SetWindowTextA(hEdit, controllist[i]);
|
||||
continue;
|
||||
}
|
||||
u32 button = pCtrlDlgState->pCtrlMap->GetBindCode(i);
|
||||
if (button == 0) {
|
||||
SetWindowTextA(hEdit, "Disabled");
|
||||
} else {
|
||||
SetWindowTextA(hEdit, getXinputButtonName(button));
|
||||
}
|
||||
SetWindowTextForButton(hEdit, button, getXinputButtonName(button));
|
||||
}
|
||||
InvalidateRect(hDlg, 0, 0);
|
||||
}
|
||||
|
@ -1338,7 +1403,6 @@ namespace MainWindow
|
|||
}
|
||||
return (LRESULT)GetStockObject(NULL_BRUSH);
|
||||
}
|
||||
|
||||
case WM_CTLCOLOREDIT:
|
||||
{
|
||||
if ((HWND)lParam == GetDlgItem(hDlg, IDC_FORCE_INPUT_DEVICE))
|
||||
|
@ -1369,25 +1433,33 @@ namespace MainWindow
|
|||
UnhookWindowsHookEx(pCtrlDlgState->pKeydownHook);
|
||||
KillTimer(hDlg, pCtrlDlgState->timerId);
|
||||
SetWindowLongPtr(pCtrlDlgState->hStaticPspImage, GWLP_WNDPROC, (LONG_PTR)pCtrlDlgState->orgPSPImageProc);
|
||||
for (u32 i = CONTROLS_IDC_EDIT_BEGIN; i <= CONTROLS_IDC_EDIT_END; i++) {
|
||||
HWND hEdit = GetDlgItem(hDlg, i);
|
||||
SetWindowLongPtr(hEdit, GWLP_WNDPROC, (LONG_PTR)pCtrlDlgState->orgEditProc);
|
||||
}
|
||||
EndDialog(hDlg, LOWORD(wParam));
|
||||
if (pCtrlDlgState->hbmPspImage) {
|
||||
DeleteObject(pCtrlDlgState->hbmPspImage);
|
||||
pCtrlDlgState->hbmPspImage = 0;
|
||||
}
|
||||
if (pCtrlDlgState->pCtrlMap) {
|
||||
delete pCtrlDlgState->pCtrlMap;
|
||||
pCtrlDlgState->pCtrlMap = NULL;
|
||||
}
|
||||
if (pCtrlDlgState) {
|
||||
delete pCtrlDlgState;
|
||||
pCtrlDlgState = NULL;
|
||||
}
|
||||
return TRUE;
|
||||
} else if (LOWORD(wParam) >= CONTROLS_IDC_EDIT_BIGIN &&
|
||||
} else if (LOWORD(wParam) >= CONTROLS_IDC_EDIT_BEGIN &&
|
||||
LOWORD(wParam) <= IDC_EDIT_KEYRIGHT &&
|
||||
HIWORD(wParam) == EN_SETFOCUS) {
|
||||
// send about buttonsMap-index of current focus Edit-Control to ControlMapping instance.
|
||||
UINT nCtrlID = LOWORD(wParam);
|
||||
if (nCtrlID < CONTROLS_IDC_EDIT_BIGIN || nCtrlID > IDC_EDIT_KEYRIGHT) {
|
||||
if (nCtrlID < CONTROLS_IDC_EDIT_BEGIN || nCtrlID > IDC_EDIT_KEYRIGHT) {
|
||||
break;
|
||||
}
|
||||
pCtrlDlgState->pCtrlMap->SetTargetButton(nCtrlID - CONTROLS_IDC_EDIT_BIGIN);
|
||||
pCtrlDlgState->pCtrlMap->SetTargetButton(nCtrlID - CONTROLS_IDC_EDIT_BEGIN);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -71,6 +71,7 @@ void RunTests()
|
|||
coreParam.useMediaEngine = false;
|
||||
coreParam.collectEmuLog = &output;
|
||||
coreParam.unthrottle = true;
|
||||
coreParam.updateRecent = false;
|
||||
|
||||
#ifdef IOS
|
||||
std::string baseDirectory = g_Config.flashDirectory + "../";
|
||||
|
|
Loading…
Add table
Reference in a new issue