diff --git a/plugins/LilyPad/Config.cpp b/plugins/LilyPad/Config.cpp index e968b206e9..3ba081f37f 100644 --- a/plugins/LilyPad/Config.cpp +++ b/plugins/LilyPad/Config.cpp @@ -122,18 +122,6 @@ void RefreshEnabledDevices(int updateDeviceList) { else dm->DisableDevice(i); } - - // Older code. Newer version is a bit uglier, but doesn't - // release devices that are enabled both before and afterwards. - // So a bit nicer, in theory. - /* - dm->DisableAllDevices(); - dm->EnableDevices(KEYBOARD, config.keyboardApi); - dm->EnableDevices(MOUSE, config.mouseApi); - if (config.gameApis.directInput) { - dm->EnableDevices(OTHER, DI); - } - //*/ } // Disables/enables devices as necessary. Also updates diagnostic list @@ -278,8 +266,8 @@ void SelChanged(int port, int slot) { LVITEMW item; item.iItem = index; item.mask = LVIF_TEXT; + item.pszText = temp[3]; for (j=0; j<3; j++) { - item.pszText = temp[3]; item.iSubItem = j; item.cchTextMax = sizeof(temp[0])/sizeof(temp[3][0]); if (!ListView_GetItem(hWndList, &item)) break; @@ -682,7 +670,7 @@ int SaveSettings(wchar_t *file=0) { } DeleteFileW(file); - WritePrivateProfileStringW(L"General Settings", L"Last Config Path", config.lastSaveConfigPath, ini); + WritePrivateProfileStringW(L"General Settings", L"Last Config Path", config.lastSaveConfigPath, ini); WritePrivateProfileStringW(L"General Settings", L"Last Config Name", config.lastSaveConfigFileName, ini); // Just check first, last, and all pad bindings. Should be more than enough. No real need to check @@ -1289,20 +1277,15 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l EndBinding(hWnd); UnselectAll(hWndList); int index = -1; - if (command == 0x7F) { - if (dev->api == IGNORE_KEYBOARD) { - index = BindCommand(dev, uid, 0, 0, command, BASE_SENSITIVITY, 0); - } + if (command == 0x7F && dev->api == IGNORE_KEYBOARD) { + index = BindCommand(dev, uid, 0, 0, command, BASE_SENSITIVITY, 0); } else if (command < 0x30) { - if (!(uid & UID_POV)) { - index = BindCommand(dev, uid, port, slot, command, BASE_SENSITIVITY, 0); - } + index = BindCommand(dev, uid, port, slot, command, BASE_SENSITIVITY, 0); } if (index >= 0) { PropSheet_Changed(hWndProp, hWnds[port][slot]); - if (index >= 0) - ListView_SetItemState(hWndList, index, LVIS_SELECTED, LVIS_SELECTED); + ListView_SetItemState(hWndList, index, LVIS_SELECTED, LVIS_SELECTED); } } } @@ -1332,6 +1315,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l SetWindowLong(hWnd, DWL_MSGRESULT, PSNRET_NOERROR); return 1; } + break; } else if (n->hdr.idFrom == IDC_LIST) { static int NeedUpdate = 0; @@ -1355,11 +1339,9 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l NeedUpdate = 0; SelChanged(port, slot); } - EndBinding(hWnd); - } - else { - EndBinding(hWnd); } + // Stop binding when user does something else. + EndBinding(hWnd); } break; case WM_HSCROLL: @@ -1384,21 +1366,22 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l Binding *b; Device *dev; if (GetBinding(port, slot, index, dev, b, ffb)) { - int uid = dev->virtualControls[b->controlIndex].uid; const static unsigned int axisUIDs[3] = {UID_AXIS_NEG, UID_AXIS_POS, UID_AXIS}; + int uid = dev->virtualControls[b->controlIndex].uid; uid = (uid&0x00FFFFFF) | axisUIDs[cbsel]; Binding backup = *b; DeleteSelected(port, slot); int index = BindCommand(dev, uid, port, slot, backup.command, backup.sensitivity, backup.turbo); ListView_SetItemState(hWndList, index, LVIS_SELECTED, LVIS_SELECTED); + PropSheet_Changed(hWndProp, hWnd); } } } } else if (HIWORD(wParam)==CBN_SELCHANGE && LOWORD(wParam) == IDC_FF_EFFECT) { - unsigned int typeIndex = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0); + int typeIndex = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0); if (typeIndex >= 0) - ChangeEffect(port, slot, 0, 0, &typeIndex); + ChangeEffect(port, slot, 0, 0, (unsigned int*)&typeIndex); } else if (HIWORD(wParam)==BN_CLICKED) { EndBinding(hWnd); @@ -1408,10 +1391,7 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l PropSheet_Changed(hWndProp, hWnd); } else if (cmd == ID_CLEAR) { - int changed=0; - while (DeleteByIndex(port, slot, 0)) changed++; - if (changed) - PropSheet_Changed(hWndProp, hWnd); + while (DeleteByIndex(port, slot, 0)) PropSheet_Changed(hWndProp, hWnd); } else if (cmd == ID_BIG_MOTOR || cmd == ID_SMALL_MOTOR) { int i = (int)SendMessage(GetDlgItem(hWnd, IDC_FORCEFEEDBACK), CB_GETCURSEL, 0, 0); @@ -1788,7 +1768,6 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L SetVolume(100); } - config.debug = (IsDlgButtonChecked(hWnd, IDC_DEBUG_FILE) == BST_CHECKED); config.multipleBinding = (IsDlgButtonChecked(hWnd, IDC_MULTIPLE_BINDING) == BST_CHECKED); @@ -1821,10 +1800,6 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L UpdatePadList(hWnd); PropSheet_Changed(hWndProp, hWnd); - /* - if (needUpdate) { - UpdatePadPages(); - }//*/ } break; case WM_NOTIFY: @@ -1838,6 +1813,7 @@ INT_PTR CALLBACK GeneralDialogProc(HWND hWnd, unsigned int msg, WPARAM wParam, L return 0; case PSN_SETACTIVE: //selected = 0; + UpdatePadList(hWnd); return 0; case PSN_APPLY: selected = 0; diff --git a/plugins/LilyPad/Diagnostics.cpp b/plugins/LilyPad/Diagnostics.cpp index 9efab71a60..07c2f3812a 100644 --- a/plugins/LilyPad/Diagnostics.cpp +++ b/plugins/LilyPad/Diagnostics.cpp @@ -8,12 +8,12 @@ Device *dev; -INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM lParam) { +INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM lParam) { int i; HWND hWndList = GetDlgItem(hWnd, IDC_LIST); static int fullRefresh; if (dev) { - switch (msg) { + switch (uMsg) { case WM_INITDIALOG: { fullRefresh = 1; @@ -91,16 +91,15 @@ INT_PTR CALLBACK DiagDialog(HWND hWnd, unsigned int msg, WPARAM wParam, LPARAM l } break; case WM_NOTIFY: - if (1) { - PSHNOTIFY* n = (PSHNOTIFY*) lParam; - if (n->hdr.idFrom != IDC_LIST || n->hdr.code != LVN_KEYDOWN) break; - NMLVKEYDOWN *key = (NMLVKEYDOWN *) n; - if (key->wVKey != VK_ESCAPE) break; + { + NMLVKEYDOWN *n = (NMLVKEYDOWN *) lParam; + // Don't always get the notification when testing DirectInput non-keyboard devices. + // Don't get it (Or want it) when testing keyboards. + if (n->hdr.idFrom != IDC_LIST || n->hdr.code != LVN_KEYDOWN || n->wVKey != VK_ESCAPE) break; } - else { case WM_ACTIVATE: - if (wParam != WA_INACTIVE) break; - } + if (uMsg == WM_ACTIVATE && wParam != WA_INACTIVE) break; + break; case WM_CLOSE: KillTimer(hWnd, 1); dm->ReleaseInput(); diff --git a/plugins/LilyPad/DirectInput.cpp b/plugins/LilyPad/DirectInput.cpp index f66235e064..5f0f388154 100644 --- a/plugins/LilyPad/DirectInput.cpp +++ b/plugins/LilyPad/DirectInput.cpp @@ -9,10 +9,12 @@ #include "PS2Etypes.h" #include +// Aka htons, without the winsock dependency. inline static u16 flipShort(u16 s) { return (s>>8) | (s<<8); } +// Aka htonl, without the winsock dependency. inline static u32 flipLong(u32 l) { return (((u32)flipShort((u16)l))<<16) | flipShort((u16)(l>>16)); } @@ -158,12 +160,10 @@ public: } { - DIOBJECTDATAFORMAT *formats = (DIOBJECTDATAFORMAT*)malloc(sizeof(DIOBJECTDATAFORMAT) * numPhysicalControls); + DIOBJECTDATAFORMAT *formats = (DIOBJECTDATAFORMAT*)calloc(numPhysicalControls, sizeof(DIOBJECTDATAFORMAT)); for (i=0; iStop(); diEffects[i].die->Release(); - diEffects[i].die = 0; } } free(diEffects); diff --git a/plugins/LilyPad/InputManager.h b/plugins/LilyPad/InputManager.h index 97e7c95227..a5f0587e11 100644 --- a/plugins/LilyPad/InputManager.h +++ b/plugins/LilyPad/InputManager.h @@ -276,7 +276,6 @@ public: virtual void PostRead(); }; -// Don't need objects for devices with no bound controls. class InputDeviceManager { public: Device **devices; @@ -289,8 +288,8 @@ public: // All old bindings are copied to matching devices. // When old devices are missing, I do a slightly more careful search - // using id2s and create new dummy devices if no matches. - + // using productIDs and then (in desperation) displayName. + // Finally create new dummy devices if no matches found. void CopyBindings(int numDevices, Device **devices); @@ -300,6 +299,7 @@ public: void AddDevice(Device *d); Device *GetActiveDevice(void *info, unsigned int *uid, int *index, int *value); void Update(void *attachInfo); + // Called after reading state, after Update(). void PostRead(); diff --git a/plugins/LilyPad/LilyPad.cpp b/plugins/LilyPad/LilyPad.cpp index 3fc6ad00f0..ad01d03fa7 100644 --- a/plugins/LilyPad/LilyPad.cpp +++ b/plugins/LilyPad/LilyPad.cpp @@ -3,6 +3,9 @@ #include #include +// For escape timer, so as not to break GSDX+DX9. +#include + #define PADdefs #include "PS2Etypes.h" #include "PS2Edefs.h" @@ -27,7 +30,7 @@ CRITICAL_SECTION readInputCriticalSection; HINSTANCE hInst; HWND hWnd; -// Used to toggle mouse binding. +// Used to toggle mouse listening. u8 miceEnabled; // 2 when both pads are initialized, 1 for one pad, etc. @@ -43,7 +46,6 @@ unsigned char inBuf[50]; #define MODE_ANALOG 0x73 #define MODE_DS2_NATIVE 0x79 - int IsWindowMaximized (HWND hWnd) { RECT rect; if (GetWindowRect(hWnd, &rect)) { @@ -108,8 +110,9 @@ struct ButtonSum { struct PadFreezeData { - // Digital / Analog / Full Analog (aka DS2 Native) + // Digital / Analog / DS2 Native u8 mode; + u8 modeLock; // In config mode @@ -125,8 +128,13 @@ public: int lockedState; + // Vibration indices. u8 vibrateI[2]; + + // Last vibration value. Only used so as not to call vibration + // functions when old and new values are both 0. u8 vibrateVal[2]; + // Used to keep track of which pads I'm running. // Note that initialized pads *can* be disabled. // I keep track of state of non-disabled non-initialized @@ -159,16 +167,12 @@ void UpdateEnabledDevices(int updateList = 0) { // Enable all devices I might want. Can ignore the rest. RefreshEnabledDevices(updateList); // Figure out which pads I'm getting input for. - int padsEnabled[2][4] = { - {pads[0][0].initialized && config.padConfigs[0][0].type != DisabledPad, - pads[0][1].initialized && config.padConfigs[0][1].type != DisabledPad, - pads[0][2].initialized && config.padConfigs[0][2].type != DisabledPad, - pads[0][3].initialized && config.padConfigs[0][3].type != DisabledPad}, - {pads[1][0].initialized && config.padConfigs[1][0].type != DisabledPad, - pads[1][1].initialized && config.padConfigs[1][1].type != DisabledPad, - pads[1][2].initialized && config.padConfigs[1][2].type != DisabledPad, - pads[1][3].initialized && config.padConfigs[1][3].type != DisabledPad} - }; + int padsEnabled[2][4]; + for (int port = 0; port<2; port++) { + for (int slot = 0; slot<4; slot++) { + padsEnabled[port][slot] = pads[port][slot].initialized && config.padConfigs[port][slot].type != DisabledPad; + } + } for (int i=0; inumDevices; i++) { Device *dev = dm->devices[i]; @@ -482,7 +486,6 @@ void Update(int pad) { pads[port][slot].lockedState = 0; } } - lockStateChanged[port][slot] = 0; } } for (i=0; i<8; i++) { @@ -510,7 +513,7 @@ u32 CALLBACK PS2EgetLibType(void) { return PS2E_LT_PAD; } -#define VERSION ((0<<8) | 9 | (10<<24)) +#define VERSION ((0<<8) | 9 | (11<<24)) u32 CALLBACK PS2EgetLibVersion2(u32 type) { ps2e = 1; @@ -851,7 +854,7 @@ u8 CALLBACK PADpoll(u8 value) { /* { query.numBytes = 35; - u8 test[35] = {0xFF, 0x80, 0x5A, + u8 test[35] = {0xFF, 0x80, 0x5A, 0x73, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x73, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x73, 0x5A, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80, @@ -1125,7 +1128,6 @@ void CALLBACK PADabout() { s32 CALLBACK PADtest() { return 0; } -#include DWORD WINAPI RenameWindowThreadProc(void *lpParameter) { wchar_t newTitle[200]; diff --git a/plugins/LilyPad/LilyPad.rc b/plugins/LilyPad/LilyPad.rc index 02e58ca82b..4f9d958551 100644 --- a/plugins/LilyPad/LilyPad.rc +++ b/plugins/LilyPad/LilyPad.rc @@ -74,7 +74,7 @@ BEGIN PUSHBUTTON "R2",ID_R2,372,73,45,15 PUSHBUTTON "L3",ID_L3,195,93,45,15 PUSHBUTTON "R3",ID_R3,371,93,46,15 - GROUPBOX "D-Pad",IDC_DPAD,251,44,110,68 + GROUPBOX "D-Pad",IDC_DPAD,251,44,110,70 PUSHBUTTON "Up",ID_DPAD_UP,285,55,35,15 PUSHBUTTON "Left",ID_DPAD_LEFT,267,74,35,15 PUSHBUTTON "Right",ID_DPAD_RIGHT,307,74,35,15 @@ -117,7 +117,7 @@ BEGIN EDITTEXT IDC_FF_AXIS6_SCALE,375,240,33,12,ES_RIGHT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_RTLREADING PUSHBUTTON "Test",ID_TEST,196,260,59,15 PUSHBUTTON "Back to Controls",ID_CONTROLS,196,296,59,15 - GROUPBOX "Binding Details",ID_SENSITIVITY,195,188,222,66 + GROUPBOX "Sensitivity",ID_SENSITIVITY,195,188,222,66 EDITTEXT IDC_AXIS_DEVICE1,203,202,208,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP COMBOBOX IDC_AXIS_DIRECTION,202,218,70,47,CBS_DROPDOWNLIST | WS_TABSTOP EDITTEXT IDC_AXIS_CONTROL1,203,240,74,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP @@ -128,7 +128,7 @@ BEGIN PUSHBUTTON "Lock Input",ID_LOCK,196,260,59,15 PUSHBUTTON "Lock Direction",ID_LOCK_DIRECTION,196,278,59,15 PUSHBUTTON "Lock Buttons",ID_LOCK_BUTTONS,196,296,59,15 - GROUPBOX "New Force Feedback Effect",IDC_STATIC,262,260,155,51 + GROUPBOX "Add Force Feedback Effect",IDC_STATIC,262,260,155,51 COMBOBOX IDC_FORCEFEEDBACK,269,273,142,106,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Big Motor",ID_BIG_MOTOR,269,291,64,14 PUSHBUTTON "Small Motor",ID_SMALL_MOTOR,347,291,64,14 @@ -204,48 +204,48 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN GROUPBOX "Input APIs",IDC_STATIC,7,6,410,131 GROUPBOX "Keyboard API",IDC_STATIC,16,16,192,61 - CONTROL "Windows messaging (Recommended)",IDC_KB_WM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,23,28,134,10 - CONTROL "Raw input (XP and later only)",IDC_KB_RAW,"Button",BS_AUTORADIOBUTTON,23,40,112,10 - CONTROL "DirectInput",IDC_KB_DI,"Button",BS_AUTORADIOBUTTON,23,52,112,10 + CONTROL "Windows messaging (Recommended)",IDC_KB_WM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,22,28,134,10 + CONTROL "Raw input (XP and later only)",IDC_KB_RAW,"Button",BS_AUTORADIOBUTTON,22,40,112,10 + CONTROL "DirectInput",IDC_KB_DI,"Button",BS_AUTORADIOBUTTON,22,52,112,10 CONTROL "Disable (Intended for use with other pad plugins)",IDC_KB_DISABLE, - "Button",BS_AUTORADIOBUTTON,23,64,175,10 + "Button",BS_AUTORADIOBUTTON,22,64,175,10 GROUPBOX "Game Device APIs",IDC_STATIC,16,81,191,49 - CONTROL "DirectInput",IDC_G_DI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,92,65,10 - CONTROL "XInput (Xbox 360 controllers only)",IDC_G_XI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,104,125,10 - CONTROL "Monitor when in background",IDC_BACKGROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,116,106,10 + CONTROL "DirectInput",IDC_G_DI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,92,65,10 + CONTROL "XInput (Xbox 360 controllers only)",IDC_G_XI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,104,125,10 + CONTROL "Monitor when in background",IDC_BACKGROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,116,106,10 GROUPBOX "Mouse API",IDC_STATIC,216,16,192,85 - CONTROL "Windows messaging (Recommended)",IDC_M_WM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,224,27,134,10 - CONTROL "Raw input (XP and later only)",IDC_M_RAW,"Button",BS_AUTORADIOBUTTON,224,39,112,10 - CONTROL "DirectInput",IDC_M_DI,"Button",BS_AUTORADIOBUTTON,224,51,112,10 - CONTROL "Disable",IDC_M_DISABLE,"Button",BS_AUTORADIOBUTTON,224,63,39,10 - CONTROL "Start without mouse focus",IDC_MOUSE_UNFOCUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,75,97,10 - CONTROL "Always hide cursor",IDC_FORCE_HIDE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,87,71,10 + CONTROL "Windows messaging (Recommended)",IDC_M_WM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,223,27,134,10 + CONTROL "Raw input (XP and later only)",IDC_M_RAW,"Button",BS_AUTORADIOBUTTON,223,39,112,10 + CONTROL "DirectInput",IDC_M_DI,"Button",BS_AUTORADIOBUTTON,223,51,112,10 + CONTROL "Disable",IDC_M_DISABLE,"Button",BS_AUTORADIOBUTTON,223,63,39,10 + CONTROL "Start without mouse focus",IDC_MOUSE_UNFOCUS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,75,97,10 + CONTROL "Always hide cursor",IDC_FORCE_HIDE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,87,71,10 GROUPBOX "Advanced",IDC_STATIC,216,105,192,25 CONTROL "Allow binding multiple PS2 controls to one PC control",IDC_MULTIPLE_BINDING, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,116,182,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,116,182,10 GROUPBOX "Pads",IDC_STATIC,7,140,410,67 CONTROL "",IDC_PAD_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_ALIGNLEFT | WS_TABSTOP,17,152,183,48,WS_EX_CLIENTEDGE - COMBOBOX IDC_PAD_TYPE,211,153,140,41,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_PAD_TYPE,209,153,140,41,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "Use analog mode whenever possible",IDC_ANALOG_START1, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,211,172,132,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,209,172,132,10 GROUPBOX "Device Diagnostics",IDC_STATIC,7,211,201,99 CONTROL "",IDC_LIST,"SysListView32",LVS_LIST | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_VSCROLL | WS_TABSTOP,15,224,185,61,WS_EX_CLIENTEDGE PUSHBUTTON "Test Device",ID_TEST,86,289,57,15 PUSHBUTTON "Refresh",ID_REFRESH,152,289,48,15 - GROUPBOX "Hacks",IDC_STATIC,216,211,201,73 - CONTROL "Send escape on window close",IDC_CLOSE_HACK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,223,113,10 - CONTROL "Exit emulator on window close",IDC_CLOSE_HACK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,235,112,10 - CONTROL "Disable screensaver",IDC_DISABLE_SCREENSAVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,247,80,10 + GROUPBOX "Miscellaneous",IDC_STATIC,216,211,201,35 + CONTROL "Use GS thread (Recommended)",IDC_GS_THREAD_INPUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,221,221,116,10 + CONTROL "Disable screensaver",IDC_DISABLE_SCREENSAVER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,221,232,80,10 + CONTROL "Local volume control",IDC_VISTA_VOLUME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,221,77,10 + CONTROL "Enable logging",IDC_DEBUG_FILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,232,62,10 + GROUPBOX "Hacks",IDC_STATIC,216,247,201,45 + CONTROL "Send escape on window close",IDC_CLOSE_HACK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,257,113,10 + CONTROL "Exit emulator on window close",IDC_CLOSE_HACK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,268,112,10 CONTROL "Safe fullscreen exit on escape",IDC_ESCAPE_FULLSCREEN_HACK, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,259,112,10 - CONTROL "Use GS thread (Recommended)",IDC_GS_THREAD_INPUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,271,116,10 - CONTROL "Save state # in title",IDC_SAVE_STATE_TITLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,223,79,10 - CONTROL "Local volume control",IDC_VISTA_VOLUME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,235,77,10 - CONTROL "Guitar Hero 2 Hack",IDC_GH2_HACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,247,76,10 - GROUPBOX "Debugging",IDC_STATIC,216,285,79,25 - CONTROL "Enable logging",IDC_DEBUG_FILE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,296,63,10 - PUSHBUTTON "Load",ID_LOAD,313,295,48,15 - PUSHBUTTON "Save",ID_SAVE,369,295,48,15 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,279,112,10 + CONTROL "Save state # in title",IDC_SAVE_STATE_TITLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,257,79,10 + CONTROL "Guitar Hero 2 Hack",IDC_GH2_HACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,336,268,76,10 + PUSHBUTTON "Load Bindings",ID_LOAD,283,295,62,15 + PUSHBUTTON "Save Bindings",ID_SAVE,355,295,62,15 END IDD_ABOUT DIALOGEX 0, 0, 108, 66