LilyPad: Minor GUI rearrangements and attempts to beautify. Relabeled "Hacks" that aren't really all that hackish. To be released as 0.9.11.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@802 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
mattmenke 2009-03-17 05:37:09 +00:00
parent 2c0f8fe41e
commit e5f8c7dbe9
6 changed files with 81 additions and 105 deletions

View File

@ -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;
@ -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;

View File

@ -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();

View File

@ -9,10 +9,12 @@
#include "PS2Etypes.h"
#include <stdio.h>
// 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; i<numPhysicalControls; i++) {
formats[i].pguid = 0;
formats[i].dwType = physicalControls[i].type | DIDFT_MAKEINSTANCE(physicalControls[i].id);
formats[i].dwOfs = 4*i;
formats[i].dwFlags = 0;
}
DIDATAFORMAT format;
format.dwSize = sizeof(format);
@ -336,7 +336,6 @@ public:
if (diEffects[i].die) {
diEffects[i].die->Stop();
diEffects[i].die->Release();
diEffects[i].die = 0;
}
}
free(diEffects);

View File

@ -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();

View File

@ -3,6 +3,9 @@
#include <Dbt.h>
#include <stdio.h>
// For escape timer, so as not to break GSDX+DX9.
#include <time.h>
#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; i<dm->numDevices; 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;
@ -1125,7 +1128,6 @@ void CALLBACK PADabout() {
s32 CALLBACK PADtest() {
return 0;
}
#include <time.h>
DWORD WINAPI RenameWindowThreadProc(void *lpParameter) {
wchar_t newTitle[200];

View File

@ -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