| Index: dxgl-example.ini |
| — | — | @@ -505,3 +505,27 @@ |
| 506 | 506 | ; GL_KHR_no_error extension is available.
|
| 507 | 507 | ; Default is false
|
| 508 | 508 | DebugDisableErrors = true
|
| | 509 | +
|
| | 510 | +[hacks]
|
| | 511 | +; Hacks are intended for specific scenarios, and may cause undesired effects
|
| | 512 | +; if used with games they do not apply to or are combined.
|
| | 513 | +
|
| | 514 | +; HackCrop640480to640400 - Boolean
|
| | 515 | +; Crops 640x480 display mode to 640x400. This should be used if a game
|
| | 516 | +; displays internally at 640x400 but sets the display mode to 640x480 and
|
| | 517 | +; letterboxes the output. This hack is only active in fullscreen mode at
|
| | 518 | +; 640x480 display mode.
|
| | 519 | +; Default is false
|
| | 520 | +HackCrop640480to640400 = false
|
| | 521 | +
|
| | 522 | +; HackAutoScale512448to640480 - Boolean
|
| | 523 | +; Detects when the application is rendering a 512x448 image in 640x480 mode.
|
| | 524 | +; This can take effect in 640x480 DR mode in ZSNES, or 640x480 mode in Zelda
|
| | 525 | +; Classic. If it is detected that the game is drawing outside the 512x448
|
| | 526 | +; boundaries, for example in ZC's menu, the hack will be temporarily disabled
|
| | 527 | +; to prevent cutting off these items, then automatically go back into effect
|
| | 528 | +; when when it is detected the out-of-bounds area is clear, like going back
|
| | 529 | +; in-game. This hack should only be enabled on games that render 512x448 with
|
| | 530 | +; black bars in 640x480 mode.
|
| | 531 | +; Default is false
|
| | 532 | +HackAutoScale512448to640480 = false
|
| Index: dxglcfg/dxglcfg.cpp |
| — | — | @@ -66,6 +66,7 @@ |
| 67 | 67 | static BOOL ExtraModes_Dropdown = FALSE;
|
| 68 | 68 | static BOOL ColorDepth_Dropdown = FALSE;
|
| 69 | 69 | static HWND hDialog = NULL;
|
| | 70 | +static BOOL EditInterlock = FALSE;
|
| 70 | 71 |
|
| 71 | 72 |
|
| 72 | 73 | typedef struct
|
| — | — | @@ -89,6 +90,7 @@ |
| 90 | 91 | DWORD current_app;
|
| 91 | 92 | BOOL tristate;
|
| 92 | 93 | TCHAR strdefault[] = _T("(global default)");
|
| | 94 | +TCHAR strdefaultshort[] = _T("(default)");
|
| 93 | 95 | HWND hTab;
|
| 94 | 96 | HWND hTabs[6];
|
| 95 | 97 | static int tabopen;
|
| — | — | @@ -541,10 +543,37 @@ |
| 542 | 544 | {
|
| 543 | 545 | TCHAR number[32];
|
| 544 | 546 | if(mask) _sntprintf(number, 31, _T("%.4g"), value);
|
| 545 | | - else number[0] = 0;
|
| | 547 | + else _tcscpy(number, strdefaultshort);
|
| | 548 | + EditInterlock = TRUE;
|
| 546 | 549 | SendDlgItemMessage(hWnd, DlgItem, WM_SETTEXT, 0, (LPARAM)number);
|
| | 550 | + EditInterlock = FALSE;
|
| 547 | 551 | }
|
| 548 | 552 |
|
| | 553 | +void SetResolution(HWND hWnd, int DlgItem, const DXGLCFG *cfg, const DXGLCFG *cfgmask)
|
| | 554 | +{
|
| | 555 | + TCHAR output[104];
|
| | 556 | + TCHAR *ptr;
|
| | 557 | + ptr = output;
|
| | 558 | + if (!cfgmask->CustomResolutionX) _tcscpy(output, strdefault);
|
| | 559 | + else
|
| | 560 | + {
|
| | 561 | + _itot(cfg->CustomResolutionX, ptr, 10);
|
| | 562 | + _tcscat(ptr, _T("x"));
|
| | 563 | + ptr = _tcschr(ptr, 0);
|
| | 564 | + _itot(cfg->CustomResolutionY, ptr, 10);
|
| | 565 | + if (cfgmask->CustomRefresh)
|
| | 566 | + {
|
| | 567 | + _tcscat(ptr, _T(", "));
|
| | 568 | + ptr = _tcschr(ptr, 0);
|
| | 569 | + _itot(cfg->CustomRefresh, ptr, 10);
|
| | 570 | + _tcscat(ptr, _T("Hz"));
|
| | 571 | + }
|
| | 572 | + }
|
| | 573 | + EditInterlock = TRUE;
|
| | 574 | + SendDlgItemMessage(hWnd, DlgItem, WM_SETTEXT, 0, (LPARAM)output);
|
| | 575 | + EditInterlock = FALSE;
|
| | 576 | +}
|
| | 577 | +
|
| 549 | 578 | __inline DWORD EncodePrimaryScale(DWORD scale)
|
| 550 | 579 | {
|
| 551 | 580 | switch (scale)
|
| — | — | @@ -663,6 +692,149 @@ |
| 664 | 693 | }
|
| 665 | 694 | }
|
| 666 | 695 |
|
| | 696 | +void ProcessResolutionString(LPTSTR input)
|
| | 697 | +{
|
| | 698 | + DWORD x, y, refresh;
|
| | 699 | + TCHAR buffer[32];
|
| | 700 | + int ptr;
|
| | 701 | + int number[3];
|
| | 702 | + int length;
|
| | 703 | + int i;
|
| | 704 | + BOOL found = FALSE;
|
| | 705 | + BOOL skip = FALSE;
|
| | 706 | + length = _tcslen(input);
|
| | 707 | + for (i = 0; i < length; i++)
|
| | 708 | + {
|
| | 709 | + if (_istdigit(input[i]))
|
| | 710 | + {
|
| | 711 | + found = TRUE;
|
| | 712 | + ptr = i;
|
| | 713 | + break;
|
| | 714 | + }
|
| | 715 | + }
|
| | 716 | + if (!found) // Totally invalid, no numbers
|
| | 717 | + {
|
| | 718 | + if (current_app)
|
| | 719 | + {
|
| | 720 | + cfgmask->CustomResolutionX = 0;
|
| | 721 | + cfgmask->CustomResolutionY = 0;
|
| | 722 | + cfgmask->CustomRefresh = 0;
|
| | 723 | + }
|
| | 724 | + return;
|
| | 725 | + }
|
| | 726 | + found = FALSE;
|
| | 727 | + for (i = ptr; i < length; i++)
|
| | 728 | + {
|
| | 729 | + if (!(_istdigit(input[i])))
|
| | 730 | + {
|
| | 731 | + found = TRUE;
|
| | 732 | + memset(buffer, 0, 32 * sizeof(TCHAR));
|
| | 733 | + _tcsncpy(buffer, &input[ptr], i - ptr);
|
| | 734 | + number[0] = _ttoi(buffer);
|
| | 735 | + ptr = i;
|
| | 736 | + break;
|
| | 737 | + }
|
| | 738 | + }
|
| | 739 | + if (!found) // No separating character found
|
| | 740 | + {
|
| | 741 | + if (current_app)
|
| | 742 | + {
|
| | 743 | + cfgmask->CustomResolutionX = 0;
|
| | 744 | + cfgmask->CustomResolutionY = 0;
|
| | 745 | + cfgmask->CustomRefresh = 0;
|
| | 746 | + }
|
| | 747 | + return;
|
| | 748 | + }
|
| | 749 | + found = FALSE;
|
| | 750 | + for (i = ptr; i < length; i++)
|
| | 751 | + {
|
| | 752 | + if (_istdigit(input[i]))
|
| | 753 | + {
|
| | 754 | + found = TRUE;
|
| | 755 | + ptr = i;
|
| | 756 | + break;
|
| | 757 | + }
|
| | 758 | + }
|
| | 759 | + if (!found) // Needs two numbers
|
| | 760 | + {
|
| | 761 | + if (current_app)
|
| | 762 | + {
|
| | 763 | + cfgmask->CustomResolutionX = 0;
|
| | 764 | + cfgmask->CustomResolutionY = 0;
|
| | 765 | + cfgmask->CustomRefresh = 0;
|
| | 766 | + }
|
| | 767 | + return;
|
| | 768 | + }
|
| | 769 | + found = FALSE;
|
| | 770 | + for (i = ptr; i < length; i++)
|
| | 771 | + {
|
| | 772 | + if (!(_istdigit(input[i])))
|
| | 773 | + {
|
| | 774 | + found = TRUE;
|
| | 775 | + memset(buffer, 0, 32 * sizeof(TCHAR));
|
| | 776 | + _tcsncpy(buffer, &input[ptr], i - ptr);
|
| | 777 | + number[1] = _ttoi(buffer);
|
| | 778 | + ptr = i;
|
| | 779 | + break;
|
| | 780 | + }
|
| | 781 | + }
|
| | 782 | + if (!found)
|
| | 783 | + {
|
| | 784 | + number[1] = _ttoi(&input[ptr]);
|
| | 785 | + skip = TRUE;
|
| | 786 | + }
|
| | 787 | + found = FALSE;
|
| | 788 | + if (!skip)
|
| | 789 | + {
|
| | 790 | + for (i = ptr; i < length; i++)
|
| | 791 | + {
|
| | 792 | + if (_istdigit(input[i]))
|
| | 793 | + {
|
| | 794 | + found = TRUE;
|
| | 795 | + ptr = i;
|
| | 796 | + break;
|
| | 797 | + }
|
| | 798 | + }
|
| | 799 | + }
|
| | 800 | + if (!found) // Found two numbers
|
| | 801 | + {
|
| | 802 | + cfg->CustomResolutionX = number[0];
|
| | 803 | + cfg->CustomResolutionY = number[1];
|
| | 804 | + cfgmask->CustomResolutionX = 1;
|
| | 805 | + cfgmask->CustomResolutionY = 1;
|
| | 806 | + if (current_app) cfgmask->CustomRefresh = 0;
|
| | 807 | + return;
|
| | 808 | + }
|
| | 809 | + found = FALSE;
|
| | 810 | + for (i = ptr; i < length; i++)
|
| | 811 | + {
|
| | 812 | + if (!(_istdigit(input[i])))
|
| | 813 | + {
|
| | 814 | + found = TRUE;
|
| | 815 | + memset(buffer, 0, 32 * sizeof(TCHAR));
|
| | 816 | + _tcsncpy(buffer, &input[ptr], i - ptr);
|
| | 817 | + number[2] = _ttoi(buffer);
|
| | 818 | + ptr = i;
|
| | 819 | + break;
|
| | 820 | + }
|
| | 821 | + }
|
| | 822 | + if (!found) number[2] = _ttoi(&input[ptr]);
|
| | 823 | + // Found the refresh rate too.
|
| | 824 | + cfg->CustomResolutionX = number[0];
|
| | 825 | + cfg->CustomResolutionY = number[1];
|
| | 826 | + cfg->CustomRefresh = number[2];
|
| | 827 | + cfgmask->CustomResolutionX = 1;
|
| | 828 | + cfgmask->CustomResolutionY = 1;
|
| | 829 | + cfgmask->CustomRefresh = 1;
|
| | 830 | +}
|
| | 831 | +
|
| | 832 | +void GetResolution(HWND hWnd, int dlgitem, DXGLCFG *cfg, DXGLCFG *cfgmask)
|
| | 833 | +{
|
| | 834 | + TCHAR input[104];
|
| | 835 | + SendDlgItemMessage(hWnd, dlgitem, WM_GETTEXT, 104, (LPARAM)input);
|
| | 836 | + ProcessResolutionString(input);
|
| | 837 | +}
|
| | 838 | +
|
| 667 | 839 | void GetPostScaleCombo(HWND hWnd, int DlgItem, float *x, float *y, float *maskx, float *masky)
|
| 668 | 840 | {
|
| 669 | 841 | TCHAR buffer[32];
|
| — | — | @@ -853,6 +1025,128 @@ |
| 854 | 1026 | }
|
| 855 | 1027 | }
|
| 856 | 1028 |
|
| | 1029 | +static int CompareMode(const void *a, const void *b)
|
| | 1030 | +{
|
| | 1031 | + DEVMODE *modea, *modeb;
|
| | 1032 | + modea = (DEVMODE*)a;
|
| | 1033 | + modeb = (DEVMODE*)b;
|
| | 1034 | + if (modea->dmPelsWidth < modeb->dmPelsWidth) return -1;
|
| | 1035 | + else if (modea->dmPelsWidth > modeb->dmPelsWidth) return 1;
|
| | 1036 | + if (modea->dmPelsHeight < modeb->dmPelsHeight) return -1;
|
| | 1037 | + else if (modea->dmPelsHeight > modeb->dmPelsHeight) return 1;
|
| | 1038 | + if (modea->dmDisplayFrequency < modeb->dmDisplayFrequency) return -1;
|
| | 1039 | + else if (modea->dmDisplayFrequency > modeb->dmDisplayFrequency) return 1;
|
| | 1040 | + return 0;
|
| | 1041 | +}
|
| | 1042 | +
|
| | 1043 | +void DiscardDuplicateModes(DEVMODE **array, DWORD *count)
|
| | 1044 | +{
|
| | 1045 | + DEVMODE *newarray = (DEVMODE *)malloc(sizeof(DEVMODE)*(*count));
|
| | 1046 | + if (!newarray) return;
|
| | 1047 | + DWORD newcount = 0;
|
| | 1048 | + bool match;
|
| | 1049 | + for (DWORD x = 0; x < (*count); x++)
|
| | 1050 | + {
|
| | 1051 | + match = false;
|
| | 1052 | + memcpy(&newarray[newcount], &(*array)[x], sizeof(DEVMODE));
|
| | 1053 | + for (int y = newcount; y > 0; y--)
|
| | 1054 | + {
|
| | 1055 | + if ((*array)[x].dmDisplayFrequency == newarray[y - 1].dmDisplayFrequency &&
|
| | 1056 | + (*array)[x].dmPelsWidth == newarray[y - 1].dmPelsWidth &&
|
| | 1057 | + (*array)[x].dmPelsHeight == newarray[y - 1].dmPelsHeight)
|
| | 1058 | + {
|
| | 1059 | + match = true;
|
| | 1060 | + break;
|
| | 1061 | + }
|
| | 1062 | + }
|
| | 1063 | + if (!match) newcount++;
|
| | 1064 | + }
|
| | 1065 | + DEVMODE *newarray2 = (DEVMODE*)realloc(newarray, sizeof(DEVMODE)*newcount);
|
| | 1066 | + if (newarray2) newarray = newarray2;
|
| | 1067 | + free(*array);
|
| | 1068 | + *array = newarray;
|
| | 1069 | + *count = newcount;
|
| | 1070 | +}
|
| | 1071 | +
|
| | 1072 | +LRESULT CALLBACK ModeListCallback(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
| | 1073 | +{
|
| | 1074 | + int newmodex, newmodey, newmoderefresh;
|
| | 1075 | + DEVMODE mode;
|
| | 1076 | + DEVMODE *modes;
|
| | 1077 | + DEVMODE *tmpmodes;
|
| | 1078 | + DWORD modenum;
|
| | 1079 | + DWORD modemax;
|
| | 1080 | + TCHAR str[64];
|
| | 1081 | + TCHAR *ptr;
|
| | 1082 | + int i, j;
|
| | 1083 | + switch (Msg)
|
| | 1084 | + {
|
| | 1085 | + case WM_INITDIALOG:
|
| | 1086 | + modenum = 0;
|
| | 1087 | + modemax = 128;
|
| | 1088 | + modes = (DEVMODE*)malloc(128 * sizeof(DEVMODE));
|
| | 1089 | + while (EnumDisplaySettings(NULL, modenum++, &mode))
|
| | 1090 | + {
|
| | 1091 | + modes[modenum - 1] = mode;
|
| | 1092 | + if (modenum >= modemax)
|
| | 1093 | + {
|
| | 1094 | + modemax += 128;
|
| | 1095 | + tmpmodes = (DEVMODE*)realloc(modes, modemax * sizeof(DEVMODE));
|
| | 1096 | + if (tmpmodes == NULL)
|
| | 1097 | + {
|
| | 1098 | + free(modes);
|
| | 1099 | + MessageBox(hWnd, _T("Out of memory!"), _T("Fatal error"), MB_OK | MB_ICONSTOP);
|
| | 1100 | + ExitProcess(ERROR_NOT_ENOUGH_MEMORY);
|
| | 1101 | + }
|
| | 1102 | + modes = tmpmodes;
|
| | 1103 | + }
|
| | 1104 | + }
|
| | 1105 | + DiscardDuplicateModes(&modes, &modenum);
|
| | 1106 | + qsort(modes, modenum-1, sizeof(DEVMODE), CompareMode);
|
| | 1107 | + for (i = 0; i < modenum-1; i++)
|
| | 1108 | + {
|
| | 1109 | + ptr = str;
|
| | 1110 | + _itot(modes[i].dmPelsWidth, ptr, 10);
|
| | 1111 | + _tcscat(ptr, _T("x"));
|
| | 1112 | + ptr = _tcschr(ptr, 0);
|
| | 1113 | + _itot(modes[i].dmPelsHeight, ptr, 10);
|
| | 1114 | + _tcscat(ptr, _T(", "));
|
| | 1115 | + ptr = _tcschr(ptr, 0);
|
| | 1116 | + _itot(modes[i].dmDisplayFrequency, ptr, 10);
|
| | 1117 | + _tcscat(ptr, _T("Hz"));
|
| | 1118 | + SendDlgItemMessage(hWnd, IDC_MODELIST, LB_ADDSTRING, 0, (LPARAM)str);
|
| | 1119 | + }
|
| | 1120 | + free(modes);
|
| | 1121 | + return TRUE;
|
| | 1122 | + case WM_CLOSE:
|
| | 1123 | + EndDialog(hWnd, 0);
|
| | 1124 | + return TRUE;
|
| | 1125 | + case WM_COMMAND:
|
| | 1126 | + switch (LOWORD(wParam))
|
| | 1127 | + {
|
| | 1128 | + case IDC_MODELIST:
|
| | 1129 | + if ((HIWORD(wParam) == LBN_SELCHANGE))
|
| | 1130 | + EnableWindow(GetDlgItem(hWnd, IDOK), TRUE);
|
| | 1131 | + break;
|
| | 1132 | + case IDOK:
|
| | 1133 | + SendDlgItemMessage(hWnd, IDC_MODELIST, LB_GETTEXT,
|
| | 1134 | + SendDlgItemMessage(hWnd, IDC_MODELIST, LB_GETCURSEL, 0, 0), (LPARAM)str);
|
| | 1135 | + ProcessResolutionString(str);
|
| | 1136 | + EndDialog(hWnd, 1);
|
| | 1137 | + return TRUE;
|
| | 1138 | + case IDCANCEL:
|
| | 1139 | + EndDialog(hWnd, 0);
|
| | 1140 | + return TRUE;
|
| | 1141 | + default:
|
| | 1142 | + break;
|
| | 1143 | + }
|
| | 1144 | + return TRUE;
|
| | 1145 | + default:
|
| | 1146 | + return DefWindowProc(hWnd, Msg, wParam, lParam);
|
| | 1147 | + }
|
| | 1148 | + return 0;
|
| | 1149 | +}
|
| | 1150 | +
|
| 857 | 1151 | LRESULT CALLBACK DisplayTabCallback(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
| 858 | 1152 | {
|
| 859 | 1153 | DRAWITEMSTRUCT* drawitem;
|
| — | — | @@ -1133,9 +1427,12 @@ |
| 1134 | 1428 | case IDC_FIXEDSCALEX:
|
| 1135 | 1429 | if (HIWORD(wParam) == EN_CHANGE)
|
| 1136 | 1430 | {
|
| 1137 | | - cfg->DisplayMultiplierX = GetFloat(hWnd, IDC_FIXEDSCALEX, &cfgmask->DisplayMultiplierX);
|
| 1138 | | - EnableWindow(GetDlgItem(hDialog, IDC_APPLY), TRUE);
|
| 1139 | | - *dirty = TRUE;
|
| | 1431 | + if (!EditInterlock)
|
| | 1432 | + {
|
| | 1433 | + cfg->DisplayMultiplierX = GetFloat(hWnd, IDC_FIXEDSCALEX, &cfgmask->DisplayMultiplierX);
|
| | 1434 | + EnableWindow(GetDlgItem(hDialog, IDC_APPLY), TRUE);
|
| | 1435 | + *dirty = TRUE;
|
| | 1436 | + }
|
| 1140 | 1437 | }
|
| 1141 | 1438 | if (HIWORD(wParam) == EN_KILLFOCUS)
|
| 1142 | 1439 | {
|
| — | — | @@ -1145,9 +1442,12 @@ |
| 1146 | 1443 | case IDC_FIXEDSCALEY:
|
| 1147 | 1444 | if (HIWORD(wParam) == EN_CHANGE)
|
| 1148 | 1445 | {
|
| 1149 | | - cfg->DisplayMultiplierY = GetFloat(hWnd, IDC_FIXEDSCALEY, &cfgmask->DisplayMultiplierY);
|
| 1150 | | - EnableWindow(GetDlgItem(hDialog, IDC_APPLY), TRUE);
|
| 1151 | | - *dirty = TRUE;
|
| | 1446 | + if (!EditInterlock)
|
| | 1447 | + {
|
| | 1448 | + cfg->DisplayMultiplierY = GetFloat(hWnd, IDC_FIXEDSCALEY, &cfgmask->DisplayMultiplierY);
|
| | 1449 | + EnableWindow(GetDlgItem(hDialog, IDC_APPLY), TRUE);
|
| | 1450 | + *dirty = TRUE;
|
| | 1451 | + }
|
| 1152 | 1452 | }
|
| 1153 | 1453 | if (HIWORD(wParam) == EN_KILLFOCUS)
|
| 1154 | 1454 | {
|
| — | — | @@ -1154,6 +1454,26 @@ |
| 1155 | 1455 | SetFloat3place(hWnd, IDC_FIXEDSCALEY, cfg->DisplayMultiplierY, cfgmask->DisplayMultiplierY);
|
| 1156 | 1456 | }
|
| 1157 | 1457 | break;
|
| | 1458 | + case IDC_CUSTOMMODE:
|
| | 1459 | + if (HIWORD(wParam) == EN_CHANGE)
|
| | 1460 | + {
|
| | 1461 | + if (!EditInterlock)
|
| | 1462 | + {
|
| | 1463 | + GetResolution(hWnd, IDC_CUSTOMMODE, cfg, cfgmask);
|
| | 1464 | + EnableWindow(GetDlgItem(hDialog, IDC_APPLY), TRUE);
|
| | 1465 | + *dirty = TRUE;
|
| | 1466 | + }
|
| | 1467 | + }
|
| | 1468 | + if (HIWORD(wParam) == EN_KILLFOCUS)
|
| | 1469 | + {
|
| | 1470 | + SetResolution(hWnd, IDC_CUSTOMMODE, cfg, cfgmask);
|
| | 1471 | + }
|
| | 1472 | + break;
|
| | 1473 | + case IDC_SETMODE:
|
| | 1474 | + {
|
| | 1475 | + if (DialogBox(hinstance, MAKEINTRESOURCE(IDD_MODELIST), hWnd, (DLGPROC)ModeListCallback))
|
| | 1476 | + SetResolution(hWnd, IDC_CUSTOMMODE, cfg, cfgmask);
|
| | 1477 | + }
|
| 1158 | 1478 | case IDC_SCALE:
|
| 1159 | 1479 | cfg->scalingfilter = GetCombo(hWnd, IDC_SCALE, &cfgmask->scalingfilter);
|
| 1160 | 1480 | EnableWindow(GetDlgItem(hDialog, IDC_APPLY), TRUE);
|
| — | — | @@ -1929,6 +2249,8 @@ |
| 1930 | 2250 | // custom scale
|
| 1931 | 2251 | SetFloat3place(hTabs[0], IDC_FIXEDSCALEX, cfg->DisplayMultiplierX, cfgmask->DisplayMultiplierX);
|
| 1932 | 2252 | SetFloat3place(hTabs[0], IDC_FIXEDSCALEY, cfg->DisplayMultiplierY, cfgmask->DisplayMultiplierY);
|
| | 2253 | + // custom resolution
|
| | 2254 | + SetResolution(hTabs[0], IDC_CUSTOMMODE, cfg, cfgmask);
|
| 1933 | 2255 | // fullscreen window mode
|
| 1934 | 2256 | _tcscpy(buffer, _T("Exclusive fullscreen"));
|
| 1935 | 2257 | SendDlgItemMessage(hTabs[0], IDC_FULLMODE, CB_ADDSTRING, 0, (LPARAM)buffer);
|
| — | — | @@ -2248,6 +2570,12 @@ |
| 2249 | 2571 | /*_tcscpy(buffer, _T("Disable OpenGL errors (OpenGL 4.6+)"));
|
| 2250 | 2572 | SendDlgItemMessage(hTabs[4], IDC_DEBUGLIST, LB_ADDSTRING, 0, (LPARAM)buffer);*/
|
| 2251 | 2573 |
|
| | 2574 | + // Hacks
|
| | 2575 | + _tcscpy(buffer, _T("Crop 640x480 to 640x400"));
|
| | 2576 | + SendDlgItemMessage(hTabs[5], IDC_HACKSLIST, LB_ADDSTRING, 0, (LPARAM)buffer);
|
| | 2577 | + _tcscpy(buffer, _T("Expand 512x448 to 640x480 when border is blank"));
|
| | 2578 | + SendDlgItemMessage(hTabs[5], IDC_HACKSLIST, LB_ADDSTRING, 0, (LPARAM)buffer);
|
| | 2579 | +
|
| 2252 | 2580 | EnableWindow(GetDlgItem(hWnd, IDC_APPLY), FALSE);
|
| 2253 | 2581 |
|
| 2254 | 2582 | // Check install path
|
| — | — | @@ -2651,6 +2979,7 @@ |
| 2652 | 2980 | }
|
| 2653 | 2981 | SetFloat3place(hTabs[0], IDC_FIXEDSCALEX, cfg->DisplayMultiplierX, cfgmask->DisplayMultiplierX);
|
| 2654 | 2982 | SetFloat3place(hTabs[0], IDC_FIXEDSCALEY, cfg->DisplayMultiplierY, cfgmask->DisplayMultiplierY);
|
| | 2983 | + SetResolution(hTabs[0], IDC_CUSTOMMODE, cfg, cfgmask);
|
| 2655 | 2984 | SetCombo(hTabs[1], IDC_POSTSCALE, cfg->postfilter, cfgmask->postfilter, tristate);
|
| 2656 | 2985 | SetPostScaleCombo(hTabs[1], IDC_POSTSCALESIZE, cfg->postsizex, cfg->postsizey,
|
| 2657 | 2986 | cfgmask->postsizex , cfgmask->postsizey, tristate);
|
| Index: dxglcfg/dxglcfg.rc |
| — | — | @@ -460,9 +460,9 @@ |
| 461 | 461 | CAPTION "Set display resolution"
|
| 462 | 462 | FONT 8, "Ms Shell Dlg"
|
| 463 | 463 | {
|
| 464 | | - LISTBOX IDC_MODELIST, 5, 5, 119, 85, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_SORT | LBS_NOTIFY, WS_EX_LEFT
|
| 465 | | - PUSHBUTTON "Cancel", IDCANCEL, 129, 24, 50, 14, 0, WS_EX_LEFT
|
| 466 | | - DEFPUSHBUTTON "OK", IDOK, 129, 7, 50, 14, 0, WS_EX_LEFT
|
| | 464 | + LISTBOX IDC_MODELIST, 5, 5, 119, 85, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_NOTIFY, WS_EX_LEFT
|
| | 465 | + PUSHBUTTON "Cancel", IDCANCEL, 129, 24, 50, 14, WS_TABSTOP, WS_EX_LEFT
|
| | 466 | + DEFPUSHBUTTON "OK", IDOK, 129, 7, 50, 14, WS_TABSTOP | WS_DISABLED, WS_EX_LEFT
|
| 467 | 467 | }
|
| 468 | 468 |
|
| 469 | 469 |
|