|
|
1.1 root 1: /*
2: Hatari
3:
4: This is normal 'C' code to handle our options dialog. We keep all our configuration details
5: in a variable 'ConfigureParams'. When we open our dialog we copy this and then when we 'OK'
6: or 'Cancel' the dialog we can compare and makes the necessary changes. As the 'ConfigureParams'
7: is always up to date this is where we load/save data to the registry.
8: */
9:
10: #include "main.h"
11: #include "configuration.h"
12: #include "audio.h"
13: #include "debug.h"
14: #include "dialog.h"
15: #include "file.h"
16: #include "floppy.h"
17: #include "reset.h"
18: #include "joy.h"
19: #include "keymap.h"
20: #include "m68000.h"
21: #include "memAlloc.h"
22: #include "memorySnapShot.h"
23: #include "misc.h"
24: #include "printer.h"
25: #include "rs232.h"
26: #include "screen.h"
27: #include "sound.h"
28: #include "tos.h"
29: #include "vdi.h"
30: #include "video.h"
31: #include "view.h"
32:
33:
34:
35: DLG_PARAMS ConfigureParams,DialogParams; /* List of configuration for system and dialog(so can choose 'Cancel') */
36: BOOL bOKDialog; /* Did user 'OK' dialog? */
37: int nLastOpenPage = 0; /* Last property page opened(so can re-open on this next time) */
38:
39:
40: //-----------------------------------------------------------------------
41: /*
42: Check if need to warn user that changes will take place after reset
43: Return TRUE if wants to reset
44: */
45: /*
46: BOOL Dialog_DoNeedReset(void)
47: {
48: // Did we change colour/mono monitor? If so, must reset
49: if (ConfigureParams.Screen.bUseHighRes!=DialogParams.Screen.bUseHighRes)
50: return(TRUE);
51: // Did change to GEM VDI display?
52: if (ConfigureParams.TOSGEM.bUseExtGEMResolutions!=DialogParams.TOSGEM.bUseExtGEMResolutions)
53: return(TRUE);
54: // Did change GEM resolution or colour depth?
55: if ( (ConfigureParams.TOSGEM.nGEMResolution!=DialogParams.TOSGEM.nGEMResolution)
56: || (ConfigureParams.TOSGEM.nGEMColours!=DialogParams.TOSGEM.nGEMColours) )
57: return(TRUE);
58:
59: return(FALSE);
60: }
61: */
62:
63: //-----------------------------------------------------------------------
64: /*
65: Copy details back to configuration and perform reset
66: */
67: /*
68: void Dialog_CopyDialogParamsToConfiguration(BOOL bForceReset)
69: {
70: BOOL NeedReset;
71:
72: // Do we need to warn user of that changes will only take effect after reset?
73: if (bForceReset)
74: NeedReset = bForceReset;
75: else
76: NeedReset = Dialog_DoNeedReset();
77:
78: // Do need to change DirectX resolution? Need if change display/overscan settings (if switch between Colour/Mono cause reset later)
79: if (bInFullScreen) {
80: if ( (DialogParams.Screen.ChosenDisplayMode!=ConfigureParams.Screen.ChosenDisplayMode)
81: || (DialogParams.Screen.Advanced.bAllowOverscan!=ConfigureParams.Screen.Advanced.bAllowOverscan) ) {
82: Screen_ReturnFromFullScreen();
83: ConfigureParams.Screen.ChosenDisplayMode = DialogParams.Screen.ChosenDisplayMode;
84: ConfigureParams.Screen.Advanced.bAllowOverscan = DialogParams.Screen.Advanced.bAllowOverscan;
85: Screen_EnterFullScreen();
86: }
87: }
88: // Did set new printer parameters?
89: if ( (DialogParams.Printer.bEnablePrinting!=ConfigureParams.Printer.bEnablePrinting)
90: || (DialogParams.Printer.bPrintToFile!=ConfigureParams.Printer.bPrintToFile)
91: || (stricmp(DialogParams.Printer.szPrintToFileName,ConfigureParams.Printer.szPrintToFileName)) )
92: Printer_CloseAllConnections();
93: // Did set new RS232 parameters?
94: if ( (DialogParams.RS232.bEnableRS232!=ConfigureParams.RS232.bEnableRS232)
95: || (DialogParams.RS232.nCOMPort!=ConfigureParams.RS232.nCOMPort) )
96: RS232_CloseCOMPort();
97: // Did stop sound? Or change playback Hz. If so, also stop sound recording
98: if ( (!DialogParams.Sound.bEnableSound) || (DialogParams.Sound.nPlaybackQuality!=ConfigureParams.Sound.nPlaybackQuality) ) {
99: if (Sound_AreWeRecording())
100: Sound_EndRecording(NULL);
101: }
102:
103: // Copy details to configuration, so can be saved out or set on reset
104: ConfigureParams = DialogParams;
105: // And write to configuration now, so don't loose
106: Configuration_UnInit();
107:
108: // Copy details to global, if we reset copy them all
109: Dialog_CopyDetailsFromConfiguration(NeedReset);
110: // Set keyboard remap file
111: Keymap_LoadRemapFile(ConfigureParams.Keyboard.szMappingFileName);
112: // Set new sound playback rate
113: DAudio_ReCreateDirectSoundBuffer();
114: // Resize window if need
115: if (!ConfigureParams.TOSGEM.bUseExtGEMResolutions)
116: View_ResizeWindowToFull();
117:
118: // Do we need to perform reset?
119: if (NeedReset) {
120: Reset_Cold();
121: Main_UnPauseEmulation();
122: View_ToggleWindowsMouse(MOUSE_ST);
123: }
124:
125: // Go into/return from full screen if flagged
126: if ( (!bInFullScreen) && (DialogParams.Screen.bFullScreen) )
127: Screen_EnterFullScreen();
128: else if ( bInFullScreen && (!DialogParams.Screen.bFullScreen) )
129: Screen_ReturnFromFullScreen();
130: }
131: */
132:
133: //-----------------------------------------------------------------------
134: /*
135: Default elements of configuration structure
136: */
137: /*
138: void Dialog_DefaultConfigurationDetails(void)
139: {
140: // Clear parameters
141: Memory_Clear(&ConfigureParams,sizeof(DLG_PARAMS));
142:
143: // Set defaults
144: Dialog_Configure_SetDefaults();
145: Dialog_Screen_SetDefaults();
146: Dialog_Joysticks_SetDefaults();
147: Dialog_Keyboard_SetDefaults();
148: Dialog_Sound_SetDefaults();
149: Dialog_Memory_SetDefaults();
150: Dialog_DiscImage_SetDefaults();
151: Dialog_HardDisc_SetDefaults();
152: Dialog_TOSGEM_SetDefaults();
153: Dialog_RS232_SetDefaults();
154: Dialog_Printer_SetDefaults();
155: Dialog_Favourites_SetDefaults();
156: }
157: */
158:
159: //-----------------------------------------------------------------------
160: /*
161: Copy details from configuration structure into global variables for system
162: */
163: /*
164: void Dialog_CopyDetailsFromConfiguration(BOOL bReset)
165: {
166: // Set new timer thread
167: Main_SetSpeedThreadTimer(ConfigureParams.Configure.nMinMaxSpeed);
168: // Set resolution change
169: if (bReset) {
170: bUseVDIRes = ConfigureParams.TOSGEM.bUseExtGEMResolutions;
171: bUseHighRes = ConfigureParams.Screen.bUseHighRes || (bUseVDIRes && (ConfigureParams.TOSGEM.nGEMColours==GEMCOLOUR_2));
172: VDI_SetResolution(VDIModeOptions[ConfigureParams.TOSGEM.nGEMResolution],ConfigureParams.TOSGEM.nGEMColours);
173: }
174: // Set playback frequency
175: DAudio_SetOutputAudioFreq(ConfigureParams.Sound.nPlaybackQuality);
176:
177: // Remove back-slashes, etc.. from names
178: File_CleanFileName(ConfigureParams.TOSGEM.szTOSImageFileName);
179: }
180: */
181:
182: //-----------------------------------------------------------------------
183: /*
184: Open Property sheet Options dialog
185: Return TRUE is use chose OK, or FALSE if cancel!
186: */
187: /*
188: BOOL Dialog_DoProperty(int StartingPage,BOOL bForceReset)
189: {
190: PROPSHEETPAGE psp[NUM_PROPERTY_PAGES];
191: PROPSHEETHEADER psh;
192: int i;
193:
194: // Copy details to DialogParams(this is so can restore if 'Cancel' dialog)
195: ConfigureParams.Screen.bFullScreen = bInFullScreen;
196: DialogParams = ConfigureParams;
197:
198: // Create property pages for dialog
199: for(i=0; i<NUM_PROPERTY_PAGES; i++) {
200: psp[i].dwSize = sizeof(PROPSHEETPAGE);
201: psp[i].dwFlags = PSP_USETITLE | PSP_HASHELP;
202: psp[i].hInstance = hInst;
203: psp[i].pszTemplate = MAKEINTRESOURCE(DialogPages[i].PageIDD);
204: psp[i].pszIcon = NULL;
205: psp[i].pfnDlgProc = DialogPages[i].pDlgProc;
206: psp[i].pszTitle = DialogPages[i].pTitle;
207: psp[i].lParam = 0;
208: psp[i].pfnCallback = NULL;
209: }
210:
211: // Set up property page
212: psh.dwSize = sizeof(PROPSHEETHEADER);
213: psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW | PSH_HASHELP | PSH_USECALLBACK;
214: psh.hwndParent = hWnd;
215: psh.hInstance = hInst;
216: psh.pszIcon = NULL;
217: psh.pszCaption = (LPSTR)"Hatari Options";
218: psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
219: psh.nStartPage = StartingPage;
220: psh.ppsp = (LPCPROPSHEETPAGE)&psp;
221: psh.pfnCallback = Dialog_PropertyCallBack; // Callback to store of window handle
222:
223: // Clear handles(used to access other pages of dialog from another)
224: Dialog_Configure_ClearHandle();
225: Dialog_Screen_ClearHandle();
226: Dialog_Sound_ClearHandle();
227:
228: bOKDialog = FALSE; // Reset OK flag
229: bSaveMemoryState = FALSE;
230: bRestoreMemoryState = FALSE;
231: PropertySheet(&psh);
232:
233: // Copy details to configuration, and ask user if wishes to reset
234: if (bOKDialog)
235: Dialog_CopyDialogParamsToConfiguration(bForceReset);
236: // Did want to save/restore memory save? If did, need to re-enter emulation mode so can save in 'safe-zone'
237: if (bSaveMemoryState || bRestoreMemoryState) {
238: // Back into emulation mode, when next VBL occurs state will be safed - otherwise registers are unknown
239: View_ToggleWindowsMouse(MOUSE_ST);
240: }
241:
242: return(bOKDialog);
243: }
244: */
245:
246: //-----------------------------------------------------------------------
247: /*
248: Simple call back to store off hWnd of Property sheet dialog so can choose 'OK' when dbl-click Favourites
249: */
250: /*
251: BOOL CALLBACK Dialog_PropertyCallBack(HWND hDlg,UINT wParam, LONG lParam)
252: {
253: // Just store, handle when Initialised
254: PropHWnd = hDlg;
255:
256: return(FALSE);
257: }
258: */
259:
260: //-----------------------------------------------------------------------
261: /*
262: Set status of dialog button using flag
263: */
264: /*
265: void Dialog_SetButton(HWND hDlg,int ButtonID,int Flag)
266: {
267: if (hDlg) {
268: if (Flag)
269: CheckDlgButton(hDlg,ButtonID,BST_CHECKED);
270: else
271: CheckDlgButton(hDlg,ButtonID,BST_UNCHECKED);
272: }
273: }
274: */
275:
276: //-----------------------------------------------------------------------
277: /*
278: Read status of dialog button
279: */
280: /*
281: BOOL Dialog_ReadButton(HWND hDlg,int ButtonID)
282: {
283: if (IsDlgButtonChecked(hDlg,ButtonID)==BST_CHECKED)
284: return(TRUE);
285: else
286: return(FALSE);
287: }
288:
289: //-----------------------------------------------------------------------
290: /*
291: Enable dialog item
292: */
293: /*
294: void Dialog_EnableItem(HWND hDlg,int ButtonID,int State)
295: {
296: EnableWindow(GetDlgItem(hDlg,ButtonID),State);
297: }
298: */
299:
300: //-----------------------------------------------------------------------
301: /*
302: Enable dialog items
303: */
304: /*
305: void Dialog_EnableItems(HWND hDlg,int *pButtonIDs,int State)
306: {
307: int i=0;
308:
309: // Enable each button in list
310: while(pButtonIDs[i]) {
311: Dialog_EnableItem(hDlg,pButtonIDs[i],State);
312: i++;
313: }
314: }
315: */
316:
317: //-----------------------------------------------------------------------
318: /*
319: Show dialog items, in range(ie controls all have consecutive IDs - dodgy very very handy!)
320: */
321: /*
322: void Dialog_ShowItemRange(HWND hDlg,int LowButtonID,int HighButtonID,int Show)
323: {
324: int i;
325:
326: for(i=LowButtonID; i<=HighButtonID; i++)
327: ShowWindow(GetDlgItem(hDlg,i),Show);
328: }
329: */
330:
331: //-----------------------------------------------------------------------
332: /*
333: Set text item in dialog
334: */
335: /*
336: void Dialog_SetText(HWND hDlg,int ButtonID,char *szString)
337: {
338: SendDlgItemMessage(hDlg,ButtonID,WM_SETTEXT,0,(LPARAM)szString);
339: }
340: */
341:
342: //-----------------------------------------------------------------------
343: /*
344: Read text item from dialog
345: */
346: /*
347: void Dialog_ReadText(HWND hDlg,int ButtonID,char *szString)
348: {
349: SendDlgItemMessage(hDlg,ButtonID,WM_GETTEXT,1024,(LPARAM)szString);
350: }
351: */
352:
353: //-----------------------------------------------------------------------
354: /*
355: Set Trackbar control range and select
356: */
357: /*
358: void Dialog_SetTrackBar(HWND hDlg, int nTrackBarID, int nMin, int nMax, int nSelected)
359: {
360: SendDlgItemMessage(hDlg,nTrackBarID,TBM_SETRANGE,TRUE,(LPARAM)MAKELONG(nMin,nMax));
361: SendDlgItemMessage(hDlg,nTrackBarID,TBM_SETPOS,TRUE,(LPARAM)nSelected);
362: }
363: */
364:
365: //-----------------------------------------------------------------------
366: /*
367: Read Trackbar control selection
368: */
369: /*
370: int Dialog_GetTrackBar(HWND hDlg, int nTrackBarID)
371: {
372: int nSelectedItem;
373:
374: // Read selected item, if error default to first item in list
375: nSelectedItem = SendDlgItemMessage(hDlg,nTrackBarID,TBM_GETPOS,0,(LONG)0);
376: if (nSelectedItem==CB_ERR)
377: nSelectedItem = 0;
378:
379: return(nSelectedItem);
380: }
381: */
382:
383: //-----------------------------------------------------------------------
384: /*
385: Add string items to a Combo Box
386: */
387: /*
388: void Dialog_SetComboBoxItems(HWND hDlg, int ComboBoxID, char *pComboBoxStrings[], int nSelectedItem)
389: {
390: int i=0;
391:
392: // Reset items
393: SendDlgItemMessage(hDlg,ComboBoxID,CB_RESETCONTENT,0,(LONG)0);
394: // Add items strings
395: while(pComboBoxStrings[i]) {
396: if (strlen(pComboBoxStrings[i])>0)
397: SendDlgItemMessage(hDlg,ComboBoxID,CB_ADDSTRING,0,(LONG)pComboBoxStrings[i]);
398: i++;
399: }
400:
401: // And select chosen item
402: SendDlgItemMessage(hDlg,ComboBoxID,CB_SETCURSEL,nSelectedItem,(LONG)0);
403: }
404: */
405:
406: //-----------------------------------------------------------------------
407: /*
408: Select string items in a Combo Box
409: */
410: /*
411: void Dialog_ComboBoxSelectString(HWND hDlg, int ComboBoxID, char *pszSelectedString)
412: {
413: // And select chosen item
414: SendDlgItemMessage(hDlg,ComboBoxID,CB_SELECTSTRING,0,(LONG)pszSelectedString);
415: }
416: */
417:
418: //-----------------------------------------------------------------------
419: /*
420: Read selected item index from a Combo Box
421: */
422: /*
423: int Dialog_GetSelectedComboBoxItem(HWND hDlg, int ComboBoxID)
424: {
425: int nSelectedItem;
426:
427: // Read selected item, if error default to first item in list
428: nSelectedItem = SendDlgItemMessage(hDlg,ComboBoxID,CB_GETCURSEL,0,(LONG)0);
429: if (nSelectedItem==CB_ERR)
430: nSelectedItem = 0;
431:
432: return(nSelectedItem);
433: }
434: */
435: //-----------------------------------------------------------------------
436: /*
437: Add string items to a List Box
438: */
439: /*
440: void Dialog_SetListBoxItems(HWND hDlg, int ListBoxID, char *pListBoxStrings[], int nSelectedItem)
441: {
442: int i=0;
443:
444: // Reset items
445: SendDlgItemMessage(hDlg,ListBoxID,LB_RESETCONTENT,0,(LONG)0);
446: // Add items strings
447: while(pListBoxStrings[i]) {
448: SendDlgItemMessage(hDlg,ListBoxID,LB_ADDSTRING,0,(LONG)pListBoxStrings[i]);
449: i++;
450: }
451:
452: // And select chosen item
453: SendDlgItemMessage(hDlg,ListBoxID,LB_SETCURSEL,nSelectedItem,(LONG)0);
454: }
455: */
456:
457: //-----------------------------------------------------------------------
458: /*
459: Read selected item index from a List Box
460: */
461: /*
462: int Dialog_GetSelectedListBoxItem(HWND hDlg, int ListBoxID)
463: {
464: int nSelectedItem;
465:
466: // Read selected item, if error default to first item in list
467: nSelectedItem = SendDlgItemMessage(hDlg,ListBoxID,LB_GETCURSEL,0,(LONG)0);
468: if (nSelectedItem==LB_ERR)
469: nSelectedItem = 0;
470:
471: return(nSelectedItem);
472: }
473: */
474:
475: //-----------------------------------------------------------------------
476: /*
477: Set Spin control range and select item
478: */
479: /*
480: int Dialog_SetSpinList(HWND hDlg, int nEditBoxID, int nSpinID, char *pSpinStrings[], int nItems, int nSelectedItem)
481: {
482: // Limit selection
483: nSelectedItem = Misc_LimitInt(nSelectedItem, 0,nItems-1);
484:
485: // Fill text with selected item
486: Dialog_SetText(hDlg,nEditBoxID,pSpinStrings[nSelectedItem]);
487: // Set range and selection of Spin control
488: if (nItems==1) {
489: Dialog_EnableItem(hDlg,nSpinID,FALSE);
490: }
491: else {
492: SendDlgItemMessage(hDlg,nSpinID,UDM_SETRANGE,0,(LPARAM)MAKELONG(nItems-1,0));
493: SendDlgItemMessage(hDlg,nSpinID,UDM_SETPOS,0,(LPARAM)nSelectedItem);
494: Dialog_EnableItem(hDlg,nSpinID,TRUE);
495: }
496:
497: return(nSelectedItem);
498: }
499: */
500:
501: //-----------------------------------------------------------------------
502: /*
503: Get Spin control item
504: */
505: /*
506: int Dialog_GetSpinList(HWND hDlg, int nSpinID)
507: {
508: return( LOWORD(SendDlgItemMessage(hDlg,nSpinID,UDM_GETPOS,0,(LPARAM)0)) );
509: }
510: */
511:
512: //-----------------------------------------------------------------------
513: /*
514: Update Spin control with new selection, called from WM_VSCROLL
515: */
516: /*
517: int Dialog_UpdateSpinList(HWND hDlg, int nEditBoxID, char *pSpinStrings[], int nNumSpinItems, int nNewSelectedItem)
518: {
519: // Is item within range?
520: if (nNewSelectedItem<0)
521: nNewSelectedItem = 0;
522: if (nNewSelectedItem>=nNumSpinItems)
523: nNewSelectedItem = nNumSpinItems-1;
524:
525: // Fill text with new selected item
526: Dialog_SetText(hDlg,nEditBoxID,pSpinStrings[nNewSelectedItem]);
527:
528: // Return new value
529: return(nNewSelectedItem);
530: }
531: */
532:
533: //-----------------------------------------------------------------------
534: /*
535: Set number of dialog radio buttons
536: */
537: /*
538: void Dialog_SetRadioButtons(HWND hDlg,int StartButtonID,int EndButtonID,int nSelectedItem)
539: {
540: CheckRadioButton(hDlg,StartButtonID,EndButtonID,StartButtonID+nSelectedItem); // Run ST speed or max?
541: }
542: */
543:
544: //-----------------------------------------------------------------------
545: /*
546: Read status of dialog radio buttons, return index of chosen option from '0'
547: */
548: /*
549: int Dialog_ReadRadioButtons(HWND hDlg,int StartButtonID,int EndButtonID)
550: {
551: int i;
552:
553: for(i=StartButtonID; i<=EndButtonID; i++) {
554: if (IsDlgButtonChecked(hDlg,i)==BST_CHECKED)
555: return(i-StartButtonID);
556: }
557:
558: return(0);
559: }
560: */
561:
562: //-----------------------------------------------------------------------
563: /*
564: Add 'Column' to List View
565: */
566: /*
567: void Dialog_AddListViewColumn(HWND hDlg, int ListViewID, int Order, char *pString, int Width)
568: {
569: LVCOLUMN LvColumn;
570:
571: // Build structure
572: LvColumn.mask = LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;
573: LvColumn.fmt = LVCFMT_LEFT;
574: LvColumn.cx = Width;
575: LvColumn.pszText = pString;
576: LvColumn.cchTextMax = 0;
577: LvColumn.iSubItem = 0;
578: LvColumn.iImage = 0;
579: LvColumn.iOrder = 0;
580:
581: // Add Column
582: SendDlgItemMessage(hDlg,ListViewID,LVM_INSERTCOLUMN,Order,(LONG)&LvColumn);
583: }
584: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.