1 /***************************************************************************
2 cfg.c - description
3 -------------------
4 begin : Sun Mar 08 2009
5 copyright : (C) 1999-2009 by Pete Bernert
6 web : www.pbernert.com
7 ***************************************************************************/
8
9 /***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. See also the license.txt file for *
15 * additional informations. *
16 * *
17 ***************************************************************************/
18
19 #define _IN_CFG
20
21 /////////////////////////////////////////////////////////////////////////////
22 // Windows config handling
23
24 #include "stdafx.h"
25 #include "resource.h"
26 #include "externals.h"
27 #include "cfg.h"
28 #include <stdio.h>
29
30 char szKeyDefaults[7]={VK_DELETE,VK_INSERT,VK_HOME,VK_END,VK_PRIOR,VK_NEXT,0x00};
31
32 /////////////////////////////////////////////////////////////////////////////
33 // CCfgDlg dialog
34
35 BOOL OnInitCfgDialog(HWND hW);
36 void OnCfgOK(HWND hW);
37 void OnCfgCancel(HWND hW);
38 void OnCfgDef1(HWND hW);
39 void OnCfgDef2(HWND hW);
40 void OnBugFixes(HWND hW);
41 void OnKeyConfig(HWND hW);
42 void GetSettings(HWND hW);
43 void OnClipboard(HWND hW);
44 char * GetConfigInfos(HWND hWE);
45
CfgDlgProc(HWND hW,UINT uMsg,WPARAM wParam,LPARAM lParam)46 BOOL CALLBACK CfgDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
47 {
48 switch(uMsg)
49 {
50 case WM_INITDIALOG:
51 return OnInitCfgDialog(hW);
52
53 case WM_COMMAND:
54 {
55 switch(LOWORD(wParam))
56 {
57 case IDC_DEF1: OnCfgDef1(hW); return TRUE;
58 case IDC_DEF2: OnCfgDef2(hW); return TRUE;
59 case IDC_SELFIX: OnBugFixes(hW); return TRUE;
60 case IDC_KEYCONFIG: OnKeyConfig(hW); return TRUE;
61 case IDCANCEL: OnCfgCancel(hW); return TRUE;
62 case IDOK: OnCfgOK(hW); return TRUE;
63 case IDC_CLIPBOARD: OnClipboard(hW); return TRUE;
64 }
65 }
66 }
67 return FALSE;
68 }
69
70 /////////////////////////////////////////////////////////////////////////////
71 // CCfgDlg message handlers
72
73 ////////////////////////////////////////////////////////////////////////
74 // init dlg
75 ////////////////////////////////////////////////////////////////////////
76
ComboBoxAddRes(HWND hWC,char * cs)77 void ComboBoxAddRes(HWND hWC,char * cs) // ADD COMBOBOX RESOURCES
78 {
79 int i=ComboBox_FindString(hWC,-1,cs);
80 if(i!=CB_ERR) return;
81 ComboBox_AddString(hWC,cs);
82 }
83
84
OnInitCfgDialog(HWND hW)85 BOOL OnInitCfgDialog(HWND hW) // INIT CONFIG DIALOG
86 {
87 HWND hWC;char cs[256];int i;DEVMODE dv;
88
89 ReadConfig(); // read registry stuff
90
91 //----------------------------------------------------// fill combo with available resolutions
92
93 hWC=GetDlgItem(hW,IDC_RESOLUTION);
94
95 memset(&dv,0,sizeof(DEVMODE));
96 dv.dmSize=sizeof(DEVMODE);
97 i=0;
98
99 while(EnumDisplaySettings(NULL,i,&dv)) // add all resolutions from the driver
100 {
101 wsprintf(cs,"%4d x %4d",dv.dmPelsWidth,dv.dmPelsHeight);
102 ComboBoxAddRes(hWC,cs);
103 i++;
104 }
105
106 ComboBoxAddRes(hWC," 640 x 480"); // and also add some common ones
107 ComboBoxAddRes(hWC," 800 x 600");
108 ComboBoxAddRes(hWC,"1024 x 768");
109 ComboBoxAddRes(hWC,"1152 x 864");
110 ComboBoxAddRes(hWC,"1280 x 1024");
111 ComboBoxAddRes(hWC,"1600 x 1200");
112
113 wsprintf(cs,"%4d x %4d",iResX,iResY); // search curr resolution in combo
114 i=ComboBox_FindString(hWC,-1,cs);
115 if(i==CB_ERR) i=0;
116 ComboBox_SetCurSel(hWC,i); // and select this one
117
118 //----------------------------------------------------// window size
119
120 SetDlgItemInt(hW,IDC_WINX,LOWORD(iWinSize),FALSE);
121 SetDlgItemInt(hW,IDC_WINY,HIWORD(iWinSize),FALSE);
122
123 //----------------------------------------------------// color depth
124
125 hWC=GetDlgItem(hW,IDC_COLORDEPTH);
126 ComboBox_AddString(hWC,"16 Bit");
127 ComboBox_AddString(hWC,"32 Bit");
128 wsprintf(cs,"%d Bit",iColDepth);
129 i=ComboBox_FindString(hWC,-1,cs);
130 if(i==CB_ERR) i=0;
131 ComboBox_SetCurSel(hWC,i);
132
133 //----------------------------------------------------// vsync
134
135 hWC=GetDlgItem(hW,IDC_VSYNC);
136 ComboBox_AddString(hWC,"Driver");
137 ComboBox_AddString(hWC,"Off");
138 ComboBox_AddString(hWC,"On");
139 ComboBox_SetCurSel(hWC,iForceVSync+1);
140
141 //----------------------------------------------------// vram size
142
143 hWC=GetDlgItem(hW,IDC_VRAMSIZE);
144 ComboBox_AddString(hWC,"0 (Autodetect)");
145 ComboBox_AddString(hWC,"2");
146 ComboBox_AddString(hWC,"4");
147 ComboBox_AddString(hWC,"8");
148 ComboBox_AddString(hWC,"16");
149 ComboBox_AddString(hWC,"32");
150 ComboBox_AddString(hWC,"64");
151 ComboBox_AddString(hWC,"128 (or more)");
152
153 if(!iVRamSize) ComboBox_SetCurSel(hWC,0);
154 else {wsprintf(cs,"%d",iVRamSize);ComboBox_SetText(hWC,cs);}
155
156 //----------------------------------------------------// texture quality
157
158 hWC=GetDlgItem(hW,IDC_TEXQUALITY);
159 ComboBox_AddString(hWC,"don't care - Use driver's default textures");
160 ComboBox_AddString(hWC,"R4 G4 B4 A4 - Fast, but less colorful");
161 ComboBox_AddString(hWC,"R5 G5 B5 A1 - Nice colors, bad transparency");
162 ComboBox_AddString(hWC,"R8 G8 B8 A8 - Best colors, more ram needed");
163 ComboBox_AddString(hWC,"B8 G8 R8 A8 - Slightly faster with some cards");
164 ComboBox_SetCurSel(hWC,iTexQuality);
165
166 //----------------------------------------------------// all kind of on/off options
167
168 if(bDrawDither) CheckDlgButton(hW,IDC_DRAWDITHER,TRUE);
169 if(bUseLines) CheckDlgButton(hW,IDC_USELINES,TRUE);
170 if(bUseFrameLimit) CheckDlgButton(hW,IDC_USELIMIT,TRUE);
171 if(bUseFrameSkip) CheckDlgButton(hW,IDC_USESKIP,TRUE);
172 if(bAdvancedBlend) CheckDlgButton(hW,IDC_ADVBLEND,TRUE);
173 if(bOpaquePass) CheckDlgButton(hW,IDC_OPAQUE,TRUE);
174 // if(bUseAntiAlias) CheckDlgButton(hW,IDC_USEANTIALIAS,TRUE);
175 if(bWindowMode) CheckDlgButton(hW,IDC_DISPMODE2,TRUE);
176 else CheckDlgButton(hW,IDC_DISPMODE1,TRUE);
177 if(iUseMask) CheckDlgButton(hW,IDC_USEMASK,TRUE);
178 if(bUseFastMdec) CheckDlgButton(hW,IDC_FASTMDEC,TRUE);
179 if(bUse15bitMdec) CheckDlgButton(hW,IDC_FASTMDEC2,TRUE);
180 if(bUseFixes) CheckDlgButton(hW,IDC_GAMEFIX,TRUE);
181 if(bGteAccuracy) CheckDlgButton(hW,IDC_GTEACCURACY,TRUE);
182 if(iUseScanLines) CheckDlgButton(hW,IDC_USESCANLINES,TRUE);
183 if(iShowFPS) CheckDlgButton(hW,IDC_SHOWFPS,TRUE);
184 if(bKeepRatio) CheckDlgButton(hW,IDC_ARATIO,TRUE);
185 if(bForceRatio43) CheckDlgButton(hW,IDC_ARATIO43,TRUE);
186 if(iBlurBuffer) CheckDlgButton(hW,IDC_BLUR,TRUE);
187 if(iNoScreenSaver) CheckDlgButton(hW,IDC_SSAVE,TRUE);
188
189 //----------------------------------------------------// texture filter
190
191 hWC=GetDlgItem(hW,IDC_FILTERTYPE);
192 ComboBox_AddString(hWC,"0: None");
193 ComboBox_AddString(hWC,"1: Standard - Glitches will happen");
194 ComboBox_AddString(hWC,"2: Extended - Removes black borders");
195 ComboBox_AddString(hWC,"3: Standard w/o Sprites - unfiltered 2D");
196 ComboBox_AddString(hWC,"4: Extended w/o Sprites - unfiltered 2D");
197 ComboBox_AddString(hWC,"5: Standard + smoothed Sprites");
198 ComboBox_AddString(hWC,"6: Extended + smoothed Sprites");
199 ComboBox_SetCurSel(hWC,iFilterType);
200
201 //----------------------------------------------------// hires texture mode
202
203 hWC=GetDlgItem(hW,IDC_HIRESTEX);
204 ComboBox_AddString(hWC,"0: None (standard)");
205 ComboBox_AddString(hWC,"1: 2xSaI (much vram needed)");
206 ComboBox_AddString(hWC,"2: Stretched (filtering needed)");
207 ComboBox_SetCurSel(hWC,iHiResTextures);
208
209 //----------------------------------------------------// offscreen drawing
210
211 hWC=GetDlgItem(hW,IDC_OFFSCREEN);
212 ComboBox_AddString(hWC,"0: None - Fastest, most glitches");
213 ComboBox_AddString(hWC,"1: Minimum - Missing screens");
214 ComboBox_AddString(hWC,"2: Standard - OK for most games");
215 ComboBox_AddString(hWC,"3: Enhanced - Shows more stuff");
216 ComboBox_AddString(hWC,"4: Extended - Can cause garbage");
217 ComboBox_SetCurSel(hWC,iOffscreenDrawing);
218
219 //----------------------------------------------------// texture quality
220
221 hWC=GetDlgItem(hW,IDC_FRAMETEX);
222 ComboBox_AddString(hWC,"0: Emulated vram - effects need FVP");
223 ComboBox_AddString(hWC,"1: Black - Fast but no special effects");
224 ComboBox_AddString(hWC,"2: Gfx card buffer - Can be slow");
225 ComboBox_AddString(hWC,"3: Gfx card buffer & software - slow");
226 ComboBox_SetCurSel(hWC,iFrameTexType);
227
228 //----------------------------------------------------// framebuffer read mode
229
230 hWC=GetDlgItem(hW,IDC_FRAMEREAD);
231 ComboBox_AddString(hWC,"0: Emulated vram - OK for most games");
232 ComboBox_AddString(hWC,"1: Gfx card buffer reads");
233 ComboBox_AddString(hWC,"2: Gfx card buffer moves");
234 ComboBox_AddString(hWC,"3: Gfx card buffer reads & moves");
235 ComboBox_AddString(hWC,"4: Full software drawing (FVP)");
236 ComboBox_SetCurSel(hWC,iFrameReadType);
237
238 //----------------------------------------------------// framerate stuff
239
240 if(iFrameLimit==2)
241 CheckDlgButton(hW,IDC_FRAMEAUTO,TRUE);
242 else CheckDlgButton(hW,IDC_FRAMEMANUELL,TRUE);
243
244 sprintf(cs,"%.2f",fFrameRate);
245 SetDlgItemText(hW,IDC_FRAMELIMIT,cs);
246 SetDlgItemInt(hW,IDC_SCANBLEND,iScanBlend,TRUE);
247
248 return TRUE;
249 }
250
251 ////////////////////////////////////////////////////////////////////////
252 // on ok: take vals
253 ////////////////////////////////////////////////////////////////////////
254
GetSettings(HWND hW)255 void GetSettings(HWND hW)
256 {
257 HWND hWC;char cs[256];int i,j;char * p;
258
259 hWC=GetDlgItem(hW,IDC_VRAMSIZE); // get vram size
260 ComboBox_GetText(hWC,cs,255);
261 iVRamSize=atoi(cs);
262 if(iVRamSize<0) iVRamSize=0;
263 if(iVRamSize>1024) iVRamSize=1024;
264
265 hWC=GetDlgItem(hW,IDC_RESOLUTION); // get resolution
266 i=ComboBox_GetCurSel(hWC);
267 ComboBox_GetLBText(hWC,i,cs);
268 iResX=atol(cs);
269 p=strchr(cs,'x');
270 if(p) iResY=atol(p+1);
271 else iResY=480;
272
273 hWC=GetDlgItem(hW,IDC_COLORDEPTH); // get color depth
274 i=ComboBox_GetCurSel(hWC);
275 ComboBox_GetLBText(hWC,i,cs);
276 iColDepth=atol(cs);
277
278 hWC=GetDlgItem(hW,IDC_VSYNC); // get vsync
279 iForceVSync=ComboBox_GetCurSel(hWC)-1;
280
281 i=GetDlgItemInt(hW,IDC_WINX,NULL,FALSE); // get win size
282 if(i<100) i=100; if(i>16384) i=16384;
283 j=GetDlgItemInt(hW,IDC_WINY,NULL,FALSE);
284 if(j<100) j=100; if(j>16384) j=16384;
285 iWinSize=MAKELONG(i,j);
286
287 hWC=GetDlgItem(hW,IDC_TEXQUALITY); // texture quality
288 iTexQuality=ComboBox_GetCurSel(hWC);
289
290 hWC=GetDlgItem(hW,IDC_FILTERTYPE); // all kind of options
291 iFilterType=ComboBox_GetCurSel(hWC);
292
293 if(IsDlgButtonChecked(hW,IDC_DRAWDITHER))
294 bDrawDither=TRUE; else bDrawDither=FALSE;
295
296 if(IsDlgButtonChecked(hW,IDC_USELINES))
297 bUseLines=TRUE; else bUseLines=FALSE;
298
299 if(IsDlgButtonChecked(hW,IDC_DISPMODE2))
300 bWindowMode=TRUE; else bWindowMode=FALSE;
301
302 if(IsDlgButtonChecked(hW,IDC_ADVBLEND))
303 bAdvancedBlend=TRUE; else bAdvancedBlend=FALSE;
304
305 iOffscreenDrawing=ComboBox_GetCurSel(GetDlgItem(hW,IDC_OFFSCREEN));
306
307 iFrameTexType=ComboBox_GetCurSel(GetDlgItem(hW,IDC_FRAMETEX));
308 iFrameReadType=ComboBox_GetCurSel(GetDlgItem(hW,IDC_FRAMEREAD));
309
310 if(IsDlgButtonChecked(hW,IDC_USELIMIT))
311 bUseFrameLimit=TRUE; else bUseFrameLimit=FALSE;
312
313 if(IsDlgButtonChecked(hW,IDC_USESKIP))
314 bUseFrameSkip=TRUE; else bUseFrameSkip=FALSE;
315
316 if(IsDlgButtonChecked(hW,IDC_OPAQUE))
317 bOpaquePass=TRUE; else bOpaquePass=FALSE;
318
319 // if(IsDlgButtonChecked(hW,IDC_USEANTIALIAS))
320 // bUseAntiAlias=TRUE; else bUseAntiAlias=FALSE;
321
322 if(IsDlgButtonChecked(hW,IDC_FASTMDEC))
323 bUseFastMdec=TRUE; else bUseFastMdec=FALSE;
324
325 if(IsDlgButtonChecked(hW,IDC_FASTMDEC2))
326 bUse15bitMdec=TRUE; else bUse15bitMdec=FALSE;
327
328 if(IsDlgButtonChecked(hW,IDC_GAMEFIX))
329 bUseFixes=TRUE; else bUseFixes=FALSE;
330
331 if(IsDlgButtonChecked(hW,IDC_GTEACCURACY))
332 bGteAccuracy=TRUE; else bGteAccuracy=FALSE;
333
334 if(IsDlgButtonChecked(hW,IDC_USESCANLINES))
335 iUseScanLines=1; else iUseScanLines=0;
336
337 if(IsDlgButtonChecked(hW,IDC_SHOWFPS))
338 iShowFPS=1; else iShowFPS=0;
339
340 if(IsDlgButtonChecked(hW,IDC_ARATIO))
341 bKeepRatio=TRUE; else bKeepRatio=FALSE;
342
343 if(IsDlgButtonChecked(hW,IDC_ARATIO43))
344 bForceRatio43=TRUE; else bForceRatio43=FALSE;
345
346 if(IsDlgButtonChecked(hW,IDC_BLUR))
347 iBlurBuffer=1; else iBlurBuffer=0;
348
349 if(IsDlgButtonChecked(hW,IDC_SSAVE))
350 iNoScreenSaver=1; else iNoScreenSaver=0;
351
352 hWC=GetDlgItem(hW,IDC_HIRESTEX);
353 iHiResTextures=ComboBox_GetCurSel(hWC);
354
355 if(IsDlgButtonChecked(hW,IDC_USEMASK))
356 {iUseMask=1;iZBufferDepth=16;}
357 else {iUseMask=0;iZBufferDepth=0; }
358
359 iScanBlend=GetDlgItemInt(hW,IDC_SCANBLEND,NULL,TRUE);
360 if(iScanBlend>255) iScanBlend=0;
361 if(iScanBlend<-1) iScanBlend=-1;
362
363 if(IsDlgButtonChecked(hW,IDC_FRAMEAUTO)) // frame rate settings
364 iFrameLimit=2;
365 else iFrameLimit=1;
366
367 GetDlgItemText(hW,IDC_FRAMELIMIT,cs,255);
368 fFrameRate=(float)atof(cs);
369 if(fFrameRate<10.0f) fFrameRate=10.0f;
370 if(fFrameRate>1000.0f) fFrameRate=1000.0f;
371 }
372
373 ////////////////////////////////////////////////////////////////////////
374 // OK button
375 ////////////////////////////////////////////////////////////////////////
376
OnCfgOK(HWND hW)377 void OnCfgOK(HWND hW)
378 {
379 GetSettings(hW); // get dialog settings
380
381 WriteConfig(); // write registry
382
383 EndDialog(hW,TRUE); // close dialog
384 }
385
386 ////////////////////////////////////////////////////////////////////////
387 // Clipboard button
388 ////////////////////////////////////////////////////////////////////////
389
OnClipboard(HWND hW)390 void OnClipboard(HWND hW)
391 {
392 HWND hWE=GetDlgItem(hW,IDC_CLPEDIT);
393 char * pB;
394
395 GetSettings(hW); // get dialog setings
396 pB=GetConfigInfos(hWE); // get text infos
397
398 if(pB) // some text got?
399 {
400 SetDlgItemText(hW,IDC_CLPEDIT,pB); // -> set text in invisible edit
401 SendMessage(hWE,EM_SETSEL,0,-1); // -> sel all in edit
402 SendMessage(hWE,WM_COPY,0,0); // -> copy sel to clipboard
403 free(pB); // -> free helper text buffer
404
405 MessageBox(hW,"Configuration info successfully copied to the clipboard\nJust use the PASTE function in another program to retrieve the data!","Copy Info",MB_ICONINFORMATION|MB_OK);
406 }
407 }
408
409 ////////////////////////////////////////////////////////////////////////
410 // Cancel button (just closes window)
411 ////////////////////////////////////////////////////////////////////////
412
OnCfgCancel(HWND hW)413 void OnCfgCancel(HWND hW)
414 {
415 EndDialog(hW,FALSE);
416 }
417
418 ////////////////////////////////////////////////////////////////////////
419 // Bug fixes
420 ////////////////////////////////////////////////////////////////////////
421
BugFixesDlgProc(HWND hW,UINT uMsg,WPARAM wParam,LPARAM lParam)422 BOOL CALLBACK BugFixesDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
423 {
424 switch(uMsg)
425 {
426 case WM_INITDIALOG: // init dialog:
427 {
428 int i;
429
430 for(i=0;i<32;i++) // -> loop all 32 checkboxes
431 {
432 if(dwCfgFixes&(1<<i)) // --> if fix is active: check box
433 CheckDlgButton(hW,IDC_FIX1+i,TRUE);
434 }
435 }
436
437 case WM_COMMAND:
438 {
439 switch(LOWORD(wParam))
440 {
441 case IDCANCEL: EndDialog(hW,FALSE);return TRUE; // cancel: close window
442
443 case IDOK: // ok: take settings and close
444 {
445 int i;
446 dwCfgFixes=0;
447 for(i=0;i<32;i++)
448 {
449 if(IsDlgButtonChecked(hW,IDC_FIX1+i))
450 dwCfgFixes|=(1<<i);
451 }
452 EndDialog(hW,TRUE);
453 return TRUE;
454 }
455 }
456 }
457 }
458 return FALSE;
459 }
460
OnBugFixes(HWND hW)461 void OnBugFixes(HWND hW) // bug fix button:
462 {
463 DialogBox(hInst,MAKEINTRESOURCE(IDD_FIXES), // show fix window
464 hW,(DLGPROC)BugFixesDlgProc);
465 }
466
467 ////////////////////////////////////////////////////////////////////////
468 // default 1: fast
469 ////////////////////////////////////////////////////////////////////////
470
OnCfgDef1(HWND hW)471 void OnCfgDef1(HWND hW)
472 {
473 HWND hWC;
474
475 hWC=GetDlgItem(hW,IDC_RESOLUTION);
476 ComboBox_SetCurSel(hWC,0);
477 hWC=GetDlgItem(hW,IDC_COLORDEPTH);
478 ComboBox_SetCurSel(hWC,0);
479 hWC=GetDlgItem(hW,IDC_VSYNC);
480 ComboBox_SetCurSel(hWC,1);
481 hWC=GetDlgItem(hW,IDC_TEXQUALITY);
482 ComboBox_SetCurSel(hWC,0);
483 hWC=GetDlgItem(hW,IDC_FILTERTYPE);
484 ComboBox_SetCurSel(hWC,0);
485 hWC=GetDlgItem(hW,IDC_OFFSCREEN);
486 ComboBox_SetCurSel(hWC,1);
487 hWC=GetDlgItem(hW,IDC_VRAMSIZE);
488 ComboBox_SetCurSel(hWC,0);
489
490 CheckDlgButton(hW,IDC_TEXLINEAR,FALSE);
491 CheckDlgButton(hW,IDC_DRAWDITHER,FALSE);
492 CheckDlgButton(hW,IDC_USELINES,FALSE);
493 CheckDlgButton(hW,IDC_USELIMIT,FALSE);
494 CheckDlgButton(hW,IDC_USESKIP,FALSE);
495 CheckDlgButton(hW,IDC_ADVBLEND,FALSE);
496 CheckDlgButton(hW,IDC_OPAQUE,TRUE);
497 // CheckDlgButton(hW,IDC_USEANTIALIAS,FALSE);
498 CheckDlgButton(hW,IDC_DISPMODE2,FALSE);
499 CheckDlgButton(hW,IDC_DISPMODE1,TRUE);
500 CheckDlgButton(hW,IDC_FRAMEAUTO,TRUE);
501 CheckDlgButton(hW,IDC_FRAMEMANUELL,FALSE);
502 CheckDlgButton(hW,IDC_SHOWFPS,FALSE);
503
504 ComboBox_SetCurSel(GetDlgItem(hW,IDC_SUBCACHE),2);
505 ComboBox_SetCurSel(GetDlgItem(hW,IDC_FRAMETEX),1);
506 ComboBox_SetCurSel(GetDlgItem(hW,IDC_FRAMEREAD),0);
507
508 CheckDlgButton(hW,IDC_USEMASK,FALSE);
509 CheckDlgButton(hW,IDC_FASTMDEC,TRUE);
510 CheckDlgButton(hW,IDC_FASTMDEC2,TRUE);
511 CheckDlgButton(hW,IDC_USESCANLINES,FALSE);
512
513 SetDlgItemInt(hW,IDC_FRAMELIMIT,200,FALSE);
514 SetDlgItemInt(hW,IDC_WINX,640,FALSE);
515 SetDlgItemInt(hW,IDC_WINY,480,FALSE);
516
517 CheckDlgButton(hW,IDC_ARATIO,FALSE);
518 CheckDlgButton(hW,IDC_BLUR,FALSE);
519
520 SetDlgItemInt(hW,IDC_SCANBLEND,0,TRUE);
521 ComboBox_SetCurSel(GetDlgItem(hW,IDC_HIRESTEX),0);
522 CheckDlgButton(hW,IDC_SSAVE,FALSE);
523 }
524
525 ////////////////////////////////////////////////////////////////////////
526 // default 2: nice
527 ////////////////////////////////////////////////////////////////////////
528
OnCfgDef2(HWND hW)529 void OnCfgDef2(HWND hW)
530 {
531 HWND hWC;
532
533 hWC=GetDlgItem(hW,IDC_RESOLUTION);
534 ComboBox_SetCurSel(hWC,1);
535 hWC=GetDlgItem(hW,IDC_COLORDEPTH);
536 ComboBox_SetCurSel(hWC,1);
537 hWC=GetDlgItem(hW,IDC_VSYNC);
538 ComboBox_SetCurSel(hWC,2);
539 hWC=GetDlgItem(hW,IDC_TEXQUALITY);
540 ComboBox_SetCurSel(hWC,3);
541 hWC=GetDlgItem(hW,IDC_FILTERTYPE);
542 ComboBox_SetCurSel(hWC,0);
543 hWC=GetDlgItem(hW,IDC_OFFSCREEN);
544 ComboBox_SetCurSel(hWC,3);
545 hWC=GetDlgItem(hW,IDC_VRAMSIZE);
546 ComboBox_SetCurSel(hWC,0);
547
548 CheckDlgButton(hW,IDC_TEXLINEAR,FALSE);
549 CheckDlgButton(hW,IDC_DRAWDITHER,FALSE);
550 CheckDlgButton(hW,IDC_USELINES,FALSE);
551 CheckDlgButton(hW,IDC_USELIMIT,TRUE);
552 CheckDlgButton(hW,IDC_USESKIP,FALSE);
553 CheckDlgButton(hW,IDC_ADVBLEND,TRUE);
554 CheckDlgButton(hW,IDC_OPAQUE,TRUE);
555 // CheckDlgButton(hW,IDC_USEANTIALIAS,FALSE);
556 CheckDlgButton(hW,IDC_DISPMODE2,FALSE);
557 CheckDlgButton(hW,IDC_DISPMODE1,TRUE);
558 CheckDlgButton(hW,IDC_FRAMEAUTO,TRUE);
559 CheckDlgButton(hW,IDC_FRAMEMANUELL,FALSE);
560 CheckDlgButton(hW,IDC_SHOWFPS,FALSE);
561
562 ComboBox_SetCurSel(GetDlgItem(hW,IDC_SUBCACHE),2);
563 ComboBox_SetCurSel(GetDlgItem(hW,IDC_FRAMETEX),2);
564 ComboBox_SetCurSel(GetDlgItem(hW,IDC_FRAMEREAD),0);
565
566 CheckDlgButton(hW,IDC_USEMASK,TRUE);
567 CheckDlgButton(hW,IDC_FASTMDEC,FALSE);
568 CheckDlgButton(hW,IDC_FASTMDEC2,FALSE);
569 CheckDlgButton(hW,IDC_USESCANLINES,FALSE);
570
571 SetDlgItemInt(hW,IDC_FRAMELIMIT,200,FALSE);
572 SetDlgItemInt(hW,IDC_WINX,640,FALSE);
573 SetDlgItemInt(hW,IDC_WINY,480,FALSE);
574 CheckDlgButton(hW,IDC_ARATIO,FALSE);
575 CheckDlgButton(hW,IDC_BLUR,FALSE);
576 SetDlgItemInt(hW,IDC_SCANBLEND,0,TRUE);
577 ComboBox_SetCurSel(GetDlgItem(hW,IDC_HIRESTEX),0);
578 CheckDlgButton(hW,IDC_SSAVE,FALSE);
579 }
580
581 ////////////////////////////////////////////////////////////////////////
582 // read registry
583 ////////////////////////////////////////////////////////////////////////
584
ReadConfig(void)585 void ReadConfig(void) // read all config vals
586 {
587 HKEY myKey;
588 DWORD temp;
589 DWORD type;
590 DWORD size;
591
592 // pre-init all relevant globals
593
594 iResX=800;iResY=600;
595 iColDepth=32;
596 bChangeRes=FALSE;
597 bWindowMode=FALSE;
598 bFullVRam=FALSE;
599 iFilterType=0;
600 bAdvancedBlend=FALSE;
601 bDrawDither=FALSE;
602 bUseLines=FALSE;
603 bUseFrameLimit=TRUE;
604 bUseFrameSkip=FALSE;
605 iFrameLimit=2;
606 fFrameRate=200.0f;
607 iOffscreenDrawing=1;
608 bOpaquePass=TRUE;
609 bUseAntiAlias=FALSE;
610 iTexQuality=0;
611 iWinSize=MAKELONG(400,300);
612 iUseMask=0;
613 iZBufferDepth=0;
614 bUseFastMdec=FALSE;
615 bUse15bitMdec=FALSE;
616 dwCfgFixes=0;
617 bUseFixes=FALSE;
618 bGteAccuracy=FALSE;
619 iUseScanLines=0;
620 iFrameTexType=0;
621 iFrameReadType=0;
622 iShowFPS=0;
623 bKeepRatio=FALSE;
624 bForceRatio43=FALSE;
625 iScanBlend=0;
626 iVRamSize=0;
627 iTexGarbageCollection=1;
628 iBlurBuffer=0;
629 iHiResTextures=0;
630 iNoScreenSaver=1;
631 iForceVSync=-1;
632
633 lstrcpy(szGPUKeys,szKeyDefaults);
634
635 // registry key: still "psemu pro/pete tnt" for compatibility reasons
636
637 if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Vision Thing\\PSEmu Pro\\GPU\\PeteTNT",0,KEY_ALL_ACCESS,&myKey)==ERROR_SUCCESS)
638 {
639 size = 4;
640 if(RegQueryValueEx(myKey,"ResX",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
641 iResX=(int)temp;
642 size = 4;
643 if(RegQueryValueEx(myKey,"ResY",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
644 iResY=(int)temp;
645 size = 4;
646 if(RegQueryValueEx(myKey,"WinSize",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
647 iWinSize=(int)temp;
648 size = 4;
649 if(RegQueryValueEx(myKey,"FilterType",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
650 iFilterType=(int)temp;
651 size = 4;
652 if(RegQueryValueEx(myKey,"DrawDither",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
653 bDrawDither=(BOOL)temp;
654 size = 4;
655 if(RegQueryValueEx(myKey,"UseLines",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
656 bUseLines=(BOOL)temp;
657 size = 4;
658 if(RegQueryValueEx(myKey,"WindowMode",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
659 bWindowMode=(BOOL)temp;
660 size = 4;
661 if(RegQueryValueEx(myKey,"ColDepth",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
662 iColDepth=(int)temp;
663 size = 4;
664 if(RegQueryValueEx(myKey,"ForceVSync",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
665 iForceVSync=(int)temp;
666 size = 4;
667 if(RegQueryValueEx(myKey,"UseFrameLimit",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
668 bUseFrameLimit=(BOOL)temp;
669 size = 4;
670 if(RegQueryValueEx(myKey,"UseFrameSkip",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
671 bUseFrameSkip=(BOOL)temp;
672 size = 4;
673 if(RegQueryValueEx(myKey,"FrameLimit",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
674 iFrameLimit=(int)temp;
675 if(!iFrameLimit) {bUseFrameLimit=TRUE;bUseFrameSkip=FALSE;iFrameLimit=2;}
676
677 // try to get the float framerate... if none: take int framerate
678 fFrameRate=0.0f;
679 size = 4;
680 if(RegQueryValueEx(myKey,"FrameRateFloat",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
681 fFrameRate=*((float *)(&temp));
682 if(fFrameRate==0.0f)
683 {
684 fFrameRate=200.0f;
685 size = 4;
686 if(RegQueryValueEx(myKey,"FrameRate",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
687 fFrameRate=(float)temp;
688 }
689
690 size = 4;
691 if(RegQueryValueEx(myKey,"UseMultiPass",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
692 bAdvancedBlend=(int)temp;
693 size = 4;
694 iOffscreenDrawing=-1;
695 if(RegQueryValueEx(myKey,"OffscreenDrawingEx",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
696 iOffscreenDrawing=temp;
697 if(iOffscreenDrawing==-1 &&
698 RegQueryValueEx(myKey,"OffscreenDrawing",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
699 iOffscreenDrawing=temp*2;
700 size = 4;
701 if(RegQueryValueEx(myKey,"OpaquePass",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
702 bOpaquePass=(BOOL)temp;
703 size = 4;
704 if(RegQueryValueEx(myKey,"VRamSize",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
705 iVRamSize=(int)temp;
706 // size = 4;
707 // if(RegQueryValueEx(myKey,"UseAntiAlias",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
708 // bUseAntiAlias=(BOOL)temp;
709 size = 4;
710 if(RegQueryValueEx(myKey,"TexQuality",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
711 iTexQuality=(int)temp;
712 size = 4;
713 if(RegQueryValueEx(myKey,"CfgFixes",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
714 dwCfgFixes=(int)temp;
715 size = 4;
716 if(RegQueryValueEx(myKey,"UseFixes",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
717 bUseFixes=(BOOL)temp;
718 size = 4;
719 if(RegQueryValueEx(myKey,"GteAccuracy",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
720 bGteAccuracy=(BOOL)temp;
721 size = 4;
722 if(RegQueryValueEx(myKey,"UseMask",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
723 iUseMask=(int)temp;
724 size = 4;
725 if(RegQueryValueEx(myKey,"FastMdec",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
726 bUseFastMdec=(BOOL)temp;
727 size = 4;
728 if(RegQueryValueEx(myKey,"15BitMdec",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
729 bUse15bitMdec=(BOOL)temp;
730 size = 4;
731 if(RegQueryValueEx(myKey,"UseScanLines",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
732 iUseScanLines=(int)temp;
733 size = 4;
734 if(RegQueryValueEx(myKey,"ShowFPS",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
735 iShowFPS=(int)temp;
736 size = 4;
737 if(RegQueryValueEx(myKey,"KeepRatio",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
738 bKeepRatio=(BOOL)temp;
739 size = 4;
740 if(RegQueryValueEx(myKey,"ForceRatio43",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
741 bForceRatio43=(BOOL)temp;
742 size = 4;
743 if(RegQueryValueEx(myKey,"ScanBlend",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
744 iScanBlend=(int)temp;
745 size = 4;
746 if(RegQueryValueEx(myKey,"FrameTexType",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
747 iFrameTexType=(int)temp;
748 size = 4;
749 if(RegQueryValueEx(myKey,"FrameReadType",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
750 iFrameReadType=(int)temp;
751 size = 4;
752 if(RegQueryValueEx(myKey,"FullscreenBlur",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
753 iBlurBuffer=(int)temp;
754 size = 4;
755 if(RegQueryValueEx(myKey,"HiResTextures",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
756 iHiResTextures=(int)temp;
757 size = 4;
758 if(RegQueryValueEx(myKey,"NoScreenSaver",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
759 iNoScreenSaver=(int)temp;
760
761 size=7;
762 RegQueryValueEx(myKey,"GPUKeys",0,&type,(LPBYTE)&szGPUKeys,&size);
763
764 RegCloseKey(myKey);
765 }
766 if(!iColDepth) iColDepth=32; // adjust color info
767 if(iUseMask) iZBufferDepth=16; // set zbuffer depth
768 else iZBufferDepth=0;
769 if(bUseFixes) dwActFixes=dwCfgFixes; // init game fix global
770 if(iFrameReadType==4) bFullVRam=TRUE; // set fullvram render flag (soft gpu)
771 }
772
773 ////////////////////////////////////////////////////////////////////////
774 // read registry: window size (called on fullscreen/window resize)
775 ////////////////////////////////////////////////////////////////////////
776
ReadWinSizeConfig(void)777 void ReadWinSizeConfig(void)
778 {
779 HKEY myKey;
780 DWORD temp;
781 DWORD type;
782 DWORD size;
783
784 iResX=800;iResY=600;
785 iWinSize=MAKELONG(400,300);
786 iBlurBuffer=0;
787
788 // registry key: still "psemu pro/pete tnt" for compatibility reasons
789
790 if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Vision Thing\\PSEmu Pro\\GPU\\PeteTNT",0,KEY_ALL_ACCESS,&myKey)==ERROR_SUCCESS)
791 {
792 size = 4;
793 if(RegQueryValueEx(myKey,"ResX",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
794 iResX=(int)temp;
795 size = 4;
796 if(RegQueryValueEx(myKey,"ResY",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
797 iResY=(int)temp;
798 size = 4;
799 if(RegQueryValueEx(myKey,"WinSize",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
800 iWinSize=(int)temp;
801 size = 4;
802 if(RegQueryValueEx(myKey,"FullscreenBlur",0,&type,(LPBYTE)&temp,&size)==ERROR_SUCCESS)
803 iBlurBuffer=(int)temp;
804 RegCloseKey(myKey);
805 }
806 }
807
808 ////////////////////////////////////////////////////////////////////////
809 // write registry
810 ////////////////////////////////////////////////////////////////////////
811
WriteConfig(void)812 void WriteConfig(void)
813 {
814 HKEY myKey;
815 DWORD myDisp;
816 DWORD temp;
817
818 // registry key: still "psemu pro/pete tnt" for compatibility reasons
819
820 RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Vision Thing\\PSEmu Pro\\GPU\\PeteTNT",0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&myKey,&myDisp);
821 temp=iResX;
822 RegSetValueEx(myKey,"ResX",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
823 temp=iResY;
824 RegSetValueEx(myKey,"ResY",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
825 temp=iWinSize;
826 RegSetValueEx(myKey,"WinSize",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
827 temp=iFilterType;
828 RegSetValueEx(myKey,"FilterType",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
829 temp=bDrawDither;
830 RegSetValueEx(myKey,"DrawDither",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
831 temp=bUseLines;
832 RegSetValueEx(myKey,"UseLines",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
833 temp=bWindowMode;
834 RegSetValueEx(myKey,"WindowMode",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
835 temp=iColDepth;
836 RegSetValueEx(myKey,"ColDepth",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
837 temp=iForceVSync;
838 RegSetValueEx(myKey,"ForceVSync",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
839 temp=bUseFrameLimit;
840 RegSetValueEx(myKey,"UseFrameLimit",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
841 temp=bUseFrameSkip;
842 RegSetValueEx(myKey,"UseFrameSkip",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
843 temp=iFrameLimit;
844 RegSetValueEx(myKey,"FrameLimit",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
845 temp=(DWORD)fFrameRate;
846 RegSetValueEx(myKey,"FrameRate",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
847 temp=*((DWORD *)&fFrameRate);
848 RegSetValueEx(myKey,"FrameRateFloat",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
849 temp=bAdvancedBlend;
850 RegSetValueEx(myKey,"UseMultiPass",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
851 temp=iOffscreenDrawing/2;
852 RegSetValueEx(myKey,"OffscreenDrawing",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
853 temp=iOffscreenDrawing;
854 RegSetValueEx(myKey,"OffscreenDrawingEx",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
855 temp=bOpaquePass;
856 RegSetValueEx(myKey,"OpaquePass",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
857 temp=iVRamSize;
858 RegSetValueEx(myKey,"VRamSize",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
859 // temp=bUseAntiAlias;
860 // RegSetValueEx(myKey,"UseAntiAlias",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
861 temp=iTexQuality;
862 RegSetValueEx(myKey,"TexQuality",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
863 temp=dwCfgFixes;
864 RegSetValueEx(myKey,"CfgFixes",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
865 temp=bUseFixes;
866 RegSetValueEx(myKey,"UseFixes",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
867 temp=bGteAccuracy;
868 RegSetValueEx(myKey,"GteAccuracy",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
869 temp=iUseMask;
870 RegSetValueEx(myKey,"UseMask",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
871 temp=bUseFastMdec;
872 RegSetValueEx(myKey,"FastMdec",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
873 temp=bUse15bitMdec;
874 RegSetValueEx(myKey,"15BitMdec",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
875 temp=iUseScanLines;
876 RegSetValueEx(myKey,"UseScanLines",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
877 temp=iShowFPS;
878 RegSetValueEx(myKey,"ShowFPS",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
879 temp=iFrameTexType;
880 RegSetValueEx(myKey,"FrameTexType",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
881 temp=iFrameReadType;
882 RegSetValueEx(myKey,"FrameReadType",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
883 temp=bKeepRatio;
884 RegSetValueEx(myKey,"KeepRatio",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
885 temp=bForceRatio43;
886 RegSetValueEx(myKey,"ForceRatio43",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
887 temp=iBlurBuffer;
888 RegSetValueEx(myKey,"FullscreenBlur",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
889 temp=iHiResTextures;
890 RegSetValueEx(myKey,"HiResTextures",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
891 temp=iNoScreenSaver;
892 RegSetValueEx(myKey,"NoScreenSaver",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
893 temp=iScanBlend;
894 RegSetValueEx(myKey,"ScanBlend",0,REG_DWORD,(LPBYTE) &temp,sizeof(temp));
895 RegSetValueEx(myKey,"GPUKeys",0,REG_BINARY,(LPBYTE)szGPUKeys,7);
896
897 RegCloseKey(myKey);
898 }
899
900 ////////////////////////////////////////////////////////////////////////
901 ////////////////////////////////////////////////////////////////////////
902 ////////////////////////////////////////////////////////////////////////
903 // Key definition window
904
905 typedef struct
906 {
907 char szName[10];
908 char cCode;
909 }
910 KEYSETS;
911
912 // sepcial keys:
913
914 KEYSETS tMKeys[]=
915 {
916 {"SPACE", 0x20},
917 {"PRIOR", 0x21},
918 {"NEXT", 0x22},
919 {"END", 0x23},
920 {"HOME", 0x24},
921 {"LEFT", 0x25},
922 {"UP", 0x26},
923 {"RIGHT", 0x27},
924 {"DOWN", 0x28},
925 {"SELECT", 0x29},
926 {"PRINT", 0x2A},
927 {"EXECUTE", 0x2B},
928 {"SNAPSHOT", 0x2C},
929 {"INSERT", 0x2D},
930 {"DELETE", 0x2E},
931 {"HELP", 0x2F},
932 {"NUMPAD0", 0x60},
933 {"NUMPAD1", 0x61},
934 {"NUMPAD2", 0x62},
935 {"NUMPAD3", 0x63},
936 {"NUMPAD4", 0x64},
937 {"NUMPAD5", 0x65},
938 {"NUMPAD6", 0x66},
939 {"NUMPAD7", 0x67},
940 {"NUMPAD8", 0x68},
941 {"NUMPAD9", 0x69},
942 {"MULTIPLY", 0x6A},
943 {"ADD", 0x6B},
944 {"SEPARATOR", 0x6C},
945 {"SUBTRACT", 0x6D},
946 {"DECIMAL", 0x6E},
947 {"DIVIDE", 0x6F},
948 {"", 0x00}
949 };
950
951 // select key entry in combo box
952
SetGPUKey(HWND hWC,char szKey)953 void SetGPUKey(HWND hWC,char szKey)
954 {
955 int i,iCnt=ComboBox_GetCount(hWC);
956 for(i=0;i<iCnt;i++)
957 {
958 if(ComboBox_GetItemData(hWC,i)==szKey) break;
959 }
960 if(i!=iCnt) ComboBox_SetCurSel(hWC,i);
961 }
962
963 // key window proc
964
KeyDlgProc(HWND hW,UINT uMsg,WPARAM wParam,LPARAM lParam)965 BOOL CALLBACK KeyDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
966 {
967 switch(uMsg)
968 {
969 case WM_INITDIALOG: // init dialog
970 {
971 int i,j,k;char szB[2];HWND hWC;
972 for(i=IDC_KEY1;i<=IDC_KEY6;i++)
973 {
974 hWC=GetDlgItem(hW,i);
975
976 for(j=0;tMKeys[j].cCode!=0;j++) // fill special keys in combo
977 {
978 k=ComboBox_AddString(hWC,tMKeys[j].szName);
979 ComboBox_SetItemData(hWC,k,tMKeys[j].cCode);
980 }
981 for(j=0x30;j<=0x39;j++) // fill numbers in combo
982 {
983 wsprintf(szB,"%c",j);
984 k=ComboBox_AddString(hWC,szB);
985 ComboBox_SetItemData(hWC,k,j);
986 }
987 for(j=0x41;j<=0x5a;j++) // fill alphas in combo
988 {
989 wsprintf(szB,"%c",j);
990 k=ComboBox_AddString(hWC,szB);
991 ComboBox_SetItemData(hWC,k,j);
992 }
993 SetGPUKey(GetDlgItem(hW,i),szGPUKeys[i-IDC_KEY1]);
994 }
995 }return TRUE;
996
997 case WM_COMMAND:
998 {
999 switch(LOWORD(wParam))
1000 {
1001 case IDC_DEFAULT: // default button:
1002 {
1003 int i; // -> set defaults
1004 for(i=IDC_KEY1;i<=IDC_KEY6;i++)
1005 SetGPUKey(GetDlgItem(hW,i),szKeyDefaults[i-IDC_KEY1]);
1006 }break;
1007
1008 case IDCANCEL: // cancel: just close window
1009 EndDialog(hW,FALSE); return TRUE;
1010
1011 case IDOK: // ok: take key bindings
1012 {
1013 HWND hWC;int i;
1014 for(i=IDC_KEY1;i<=IDC_KEY6;i++)
1015 {
1016 hWC=GetDlgItem(hW,i);
1017 szGPUKeys[i-IDC_KEY1]=ComboBox_GetItemData(hWC,ComboBox_GetCurSel(hWC));
1018 if(szGPUKeys[i-IDC_KEY1]<0x20) szGPUKeys[i-IDC_KEY1]=0x20;
1019 }
1020 EndDialog(hW,TRUE);
1021 return TRUE;
1022 }
1023 }
1024 }
1025 }
1026 return FALSE;
1027 }
1028
OnKeyConfig(HWND hW)1029 void OnKeyConfig(HWND hW) // call key dialog
1030 {
1031 DialogBox(hInst,MAKEINTRESOURCE(IDD_KEYS),
1032 hW,(DLGPROC)KeyDlgProc);
1033 }
1034
1035 /////////////////////////////////////////////////////////////////////////////
1036 // AboutDlg dialog (Windows)
1037
AboutDlgProc(HWND hW,UINT uMsg,WPARAM wParam,LPARAM lParam)1038 BOOL CALLBACK AboutDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam)
1039 {
1040 switch(uMsg)
1041 {
1042 case WM_COMMAND:
1043 {
1044 switch(LOWORD(wParam))
1045 {
1046 case IDOK: EndDialog(hW,TRUE);return TRUE;
1047 }
1048 }
1049 }
1050 return FALSE;
1051 }
1052