|
|
1.1.1.2 root 1: /*==========================================================================
2: *
3: * Copyright (C) 1996 Brian King
4: *
1.1.1.4 root 5: * File: win32gui.c
1.1.1.2 root 6: * Content: Win32-specific gui features for UAE port.
7: *
8: ***************************************************************************/
9:
10: #include <stdio.h>
11: #include <stdlib.h>
12: #include <io.h>
13: #include <windows.h>
1.1.1.4 root 14: #include <winspool.h>
15: #include <winuser.h>
16: #ifdef _MSC_VER
1.1.1.2 root 17: #include <mmsystem.h>
1.1.1.4 root 18: #include <shlobj.h>
1.1.1.2 root 19: #include <commdlg.h>
20: #include <dlgs.h>
21: #include <process.h>
22: #include <prsht.h>
23: #include <richedit.h>
1.1.1.4 root 24: #include <shellapi.h>
25: #else
26: #include <shlobj.h>
27: #include <commdlg.h>
28: #include <richedit.h>
29: #endif
1.1.1.2 root 30:
31: #include "resource.h"
32: #include "sysconfig.h"
33: #include "sysdeps.h"
34: #include "gui.h"
35: #include "options.h"
1.1.1.4 root 36: #include "memory.h"
1.1.1.2 root 37: #include "custom.h"
38: #include "newcpu.h"
39: #include "disk.h"
40: #include "uae.h"
1.1.1.4 root 41: #include "threaddep/thread.h"
42: #include "filesys.h"
1.1.1.2 root 43: #include "autoconf.h"
44:
45: #include "picasso96.h"
46: #include "osdep/win32gui.h"
47: #include "osdep/win32.h"
1.1.1.4 root 48: #include "osdep/win32gfx.h"
49: #include "osdep/dxwrap.h"
1.1.1.2 root 50: #include "sounddep/sound.h"
1.1.1.4 root 51: #include "target.h"
52: #include "savestate.h"
1.1.1.2 root 53:
1.1.1.4 root 54: #define DISK_FORMAT_STRING "(*.ADF;*.ADZ;*.GZ;*.DMS;*.FDI)\0*.ADF;*.ADZ;*.GZ;*.DMS;*.FDI\0"
1.1.1.2 root 55:
56: static int allow_quit;
57: static int full_property_sheet;
58: static struct uae_prefs *pguiprefs;
59: static struct uae_prefs workprefs;
60:
1.1.1.4 root 61: extern HWND (WINAPI *pHtmlHelp)(HWND, LPCSTR, UINT, LPDWORD );
62: #undef HtmlHelp
63: #ifndef HH_DISPLAY_TOPIC
64: #define HH_DISPLAY_TOPIC 0
65: #endif
66: #define HtmlHelp(a,b,c,d) if( pHtmlHelp ) (*pHtmlHelp)(a,b,c,(LPDWORD)d); else \
67: { char szMessage[ MAX_PATH ]; WIN32GUI_LoadUIString( IDS_NOHELP, szMessage, MAX_PATH ); gui_message( szMessage ); }
68:
1.1.1.2 root 69: extern HWND hAmigaWnd;
1.1.1.4 root 70: extern char help_file[ MAX_PATH ];
1.1.1.2 root 71:
72: extern int mouseactive;
73: extern char *start_path;
1.1.1.4 root 74:
75: extern char configname[256];
76: char config_filename[ MAX_PATH ] = "";
1.1.1.2 root 77:
78: HANDLE win32uae_key = NULL;
1.1.1.4 root 79:
1.1.1.2 root 80: drive_specs blankdrive =
81: {"", "", 1, 32, 1, 2, 0, 0};
82:
83: #define Error(x) MessageBox( NULL, (x), "WinUAE Error", MB_OK )
84:
1.1.1.4 root 85: void WIN32GUI_LoadUIString( DWORD id, char *string, DWORD dwStringLen )
86: {
87: if( LoadString( hUIDLL ? hUIDLL : hInst, id, string, dwStringLen ) == 0 )
88: LoadString( hInst, id, string, dwStringLen );
89: }
90:
91: HWND hPropertySheet = NULL;
92:
93: /* C_PAGES must be last */
1.1.1.2 root 94: enum {
1.1.1.4 root 95: LOADSAVE_ID, MEMORY_ID, KICKSTART_ID, CPU_ID,
96: DISPLAY_ID, CHIPSET_ID, SOUND_ID, FLOPPY_ID, HARDDISK_ID,
97: PORTS_ID, MISC_ID, ABOUT_ID, C_PAGES
1.1.1.2 root 98: };
99:
1.1.1.4 root 100: static HWND pages[C_PAGES];
101:
1.1.1.2 root 102: #define MIN_CHIP_MEM 0
103: #define MAX_CHIP_MEM 4
104: #define MIN_FAST_MEM 0
105: #define MAX_FAST_MEM 4
106: #define MIN_SLOW_MEM 0
107: #define MAX_SLOW_MEM 2
108: #define MIN_Z3_MEM 0
1.1.1.4 root 109: #define MAX_Z3_MEM 10
1.1.1.2 root 110: #define MIN_P96_MEM 0
1.1.1.4 root 111: #define MAX_P96_MEM 6
1.1.1.2 root 112: #define MIN_M68K_PRIORITY 1
113: #define MAX_M68K_PRIORITY 16
1.1.1.4 root 114: #define MIN_CACHE_SIZE 0
115: #define MAX_CACHE_SIZE 8
1.1.1.2 root 116: #define MIN_REFRESH_RATE 1
117: #define MAX_REFRESH_RATE 10
1.1.1.4 root 118: #define MIN_SOUND_MEM 0
119: #define MAX_SOUND_MEM 6
120:
121: static char szNone[ MAX_PATH ] = "None";
122:
123: /* if drive is -1, show the full GUI, otherwise file-requester for DF[drive] */
124: void WIN32GUI_DisplayGUI( int drive )
125: {
126: HRESULT ddrval;
127: int flipflop = 0;
128:
129: if( ( !WIN32GFX_IsPicassoScreen() && currprefs.gfx_afullscreen && ( currprefs.gfx_width < 640 ) ) ||
1.1.1.7 ! root 130: ( WIN32GFX_IsPicassoScreen() && currprefs.gfx_pfullscreen && ( picasso96_state.Width < 640 ) ) )
! 131: flipflop = 1;
1.1.1.4 root 132:
133: WIN32GFX_ClearPalette();
134:
135: if( !WIN32GFX_IsFullScreen() )
136: setmouseactive (FALSE);
137: else
138: {
1.1.1.7 ! root 139: if( DirectDraw_GetLockableType() == primary_surface )
! 140: {
! 141: /* Blit our primary to our secondary, so we can then use the secondary to refresh from */
! 142: ddrval = DirectDraw_Blt( secondary_surface, NULL, primary_surface, NULL, DDBLT_WAIT, NULL );
! 143: }
1.1.1.4 root 144: }
145: manual_painting_needed = 1; /* So that WM_PAINT will refresh the display */
146: pause_sound(0);
147:
148: DirectDraw_FlipToGDISurface();
149:
150: if( drive == -1 )
151: {
1.1.1.7 ! root 152: if( flipflop )
! 153: ShowWindow( hAmigaWnd, SW_MINIMIZE );
1.1.1.4 root 154: GetSettings(0);
1.1.1.7 ! root 155: if( flipflop )
! 156: ShowWindow( hAmigaWnd, SW_RESTORE );
1.1.1.4 root 157: }
158: else
159: {
1.1.1.7 ! root 160: DiskSelection( hAmigaWnd, IDC_DF0+drive, 0, &changed_prefs );
1.1.1.4 root 161: }
162: resume_sound();
163: WIN32GFX_SetPalette();
164: manual_painting_needed = 0; /* So that WM_PAINT doesn't need to use custom refreshing */
165: if( !WIN32GFX_IsFullScreen() || !mouseactive)
166: SetCursor (NULL);
167:
168: // This is a hack to fix the fact that time is passing while the GUI was present,
169: // and we don't want our frames-per-second calculation in drawing.c to get skewed.
170: #ifdef HAVE_GETTIMEOFDAY
171: {
172: struct timeval tv;
173: gettimeofday(&tv,NULL);
174: msecs = (tv.tv_sec-seconds_base) * 1000 + tv.tv_usec / 1000;
175: }
176: #endif
177: }
178:
179: static void prefs_to_gui (struct uae_prefs *p)
180: {
181: workprefs = *p;
182: workprefs.mountinfo = dup_mountinfo (p->mountinfo);
183: /* Could also duplicate unknown lines, but no need - we never
184: modify those. */
185: }
186:
187: static void gui_to_prefs (void)
188: {
189: /* Always copy our prefs to changed_prefs, ... */
190: changed_prefs = workprefs;
1.1.1.2 root 191:
1.1.1.4 root 192: /* ... but use currprefs for the mountinfo. The filesystem code
193: keeps a private copy, and only looks at currprefs once per reset.
194: It never looks at changed_prefs. */
195: free_mountinfo (currprefs.mountinfo);
196: currprefs.mountinfo = dup_mountinfo (workprefs.mountinfo);
197: }
198:
199: #define TRACK_WRITE_LEN (6250*2)
1.1.1.2 root 200:
1.1.1.4 root 201: static void disk_checksum(uae_u8 *p, uae_u8 *c)
1.1.1.2 root 202: {
1.1.1.4 root 203: uae_u32 cs = 0;
204: int i;
205:
206: for (i = 0; i < 512; i+= 4) cs += (p[i] << 24) | (p[i+1] << 16) | (p[i+2] << 8) | (p[i+3] << 0);
207: cs = -cs;
208: c[0] = cs >> 24; c[1] = cs >> 16; c[2] = cs >> 8; c[3] = cs >> 0;
209: }
210:
211: static void disk_date (uae_u8 *p)
212: {
213: time_t t;
214: struct tm *today;
215: int year, days, minutes, ticks;
216: char tmp[10];
217:
218: time (&t);
219: today = localtime( &t );
220: strftime (tmp, sizeof(tmp), "%Y", today);
221: year = atol (tmp);
222: strftime (tmp, sizeof(tmp), "%j", today);
223: days = atol (tmp) - 1;
224: strftime (tmp, sizeof(tmp), "%H", today);
225: minutes = atol (tmp) * 60;
226: strftime (tmp, sizeof(tmp), "%M", today);
227: minutes += atol (tmp);
228: strftime (tmp, sizeof(tmp), "%S", today);
229: ticks = atol (tmp) * 50;
230:
231: while (year > 1978) {
232: if ( !(year % 100) ? !(year % 400) : !(year % 4) ) days++;
233: days += 365;
234: year--;
235: }
236:
237: p[0] = days >> 24; p[1] = days >> 16; p[2] = days >> 8; p[3] = days >> 0;
238: p[4] = minutes >> 24; p[5] = minutes >> 16; p[6] = minutes >> 8; p[7] = minutes >> 0;
239: p[8] = ticks >> 24; p[9] = ticks >> 16; p[10] = ticks >> 8; p[11] = ticks >> 0;
1.1.1.2 root 240: }
241:
1.1.1.4 root 242: static void CreateDiskFile (char *name, int type)
1.1.1.2 root 243: {
244: HANDLE adf;
1.1.1.4 root 245: int i, j, file_size = 880 * 1024, tracks;
1.1.1.2 root 246: char *chunk = NULL;
247: DWORD count;
1.1.1.4 root 248: uae_u8 tmp[3*4];
249: char *disk_name = "empty";
1.1.1.2 root 250:
251: SetCursor (LoadCursor (NULL, IDC_WAIT));
252: adf = CreateFile (name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
253: if (adf != INVALID_HANDLE_VALUE) {
1.1.1.4 root 254: if ((chunk = xmalloc (16384)) != NULL) {
255: memset(chunk,0,16384);
256: switch(type)
257: {
258: case 0:
259: for (i = 0; i < file_size; i += 11264) {
260: memset(chunk, 0, 11264);
261: if (i == 0) {
262: /* boot block */
263: strcpy (chunk, "DOS");
264: } else if (i == 880 * 512) {
265: /* root block */
266: chunk[0+3] = 2;
267: chunk[12+3] = 0x48;
268: chunk[312] = chunk[313] = chunk[314] = chunk[315] = 0xff;
269: chunk[316+2] = 881 >> 8; chunk[316+3] = 881 & 255;
270: chunk[432] = strlen (disk_name);
271: strcpy (chunk + 433, disk_name);
272: chunk[508 + 3] = 1;
273: disk_date (chunk + 420);
274: memcpy (chunk + 472, chunk + 420, 3 * 4);
275: memcpy (chunk + 484, chunk + 420, 3 * 4);
276: disk_checksum(chunk, chunk + 20);
277: /* bitmap block */
278: memset (chunk + 512 + 4, 0xff, 220);
279: chunk[512 + 112 + 2] = 0x3f;
280: disk_checksum(chunk + 512, chunk + 512);
281:
282: }
283: WriteFile (adf, chunk, 11264, &count, NULL);
284: }
285: break;
286: case 1:
287: tracks=2*80;
288: WriteFile(adf,"UAE-1ADF",8,&count,0);
289: tmp[0]=0;tmp[1]=0; /* flags (reserved) */
290: tmp[2]=0;tmp[3]=tracks; /* number of tracks */
291: WriteFile(adf,tmp,4,&count,0);
292: tmp[0]=0;tmp[1]=0; /* flags (reserved) */
293: tmp[2]=0;tmp[3]=1; /* track type */
294: tmp[4]=0;tmp[5]=0;tmp[6]=TRACK_WRITE_LEN>>8;tmp[7]=TRACK_WRITE_LEN;
295: tmp[8]=0;tmp[9]=(TRACK_WRITE_LEN*8)>>16;tmp[10]=(TRACK_WRITE_LEN*8)>>8;tmp[11]=(TRACK_WRITE_LEN*8);
296: for (i=0;i<tracks;i++) WriteFile(adf,tmp,sizeof(tmp),&count,0);
297: for (i=0;i<tracks;i++) WriteFile(adf,chunk,TRACK_WRITE_LEN,&count,NULL);
298: break;
1.1.1.2 root 299: }
300: }
301: CloseHandle (adf);
302: }
303: SetCursor (LoadCursor (NULL, IDC_ARROW));
304: }
305:
1.1.1.4 root 306: // Common routine for popping up a file-requester
307: // flag - 0 for floppy loading, 1 for floppy creation, 2 for loading hdf, 3 for saving hdf
308: // flag - 4 for loading .uae config-files, 5 for saving .uae config-files
309: // flag = 6 for loading .rom files, 7 for loading .key files
310: // flag = 8 for loading anything you want
311: // flag = 9 for saving snapshots
312: // flag = 10 for loading snapshots
313: void DiskSelection( HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs )
1.1.1.2 root 314: {
315: OPENFILENAME openFileName;
1.1.1.4 root 316: char regfloppypath[MAX_PATH] = "";
317: char regrompath[MAX_PATH] = "";
318: char reghdfpath[MAX_PATH] = "";
319: DWORD dwType = REG_SZ;
320: DWORD dwRFPsize = MAX_PATH;
321: DWORD dwRRPsize = MAX_PATH;
322: DWORD dwRHPsize = MAX_PATH;
323:
1.1.1.2 root 324: char full_path[MAX_PATH] = "";
325: char file_name[MAX_PATH] = "";
326: char init_path[MAX_PATH] = "";
327: BOOL result = FALSE;
328: char *amiga_path = NULL;
1.1.1.4 root 329: char description[ CFG_DESCRIPTION_LENGTH ] = "";
330: int i;
1.1.1.2 root 331:
1.1.1.4 root 332: char szTitle[ MAX_PATH ];
333: char szFormat[ MAX_PATH ];
334: char szFilter[ MAX_PATH ];
335:
336: if( hWinUAEKey )
337: {
1.1.1.7 ! root 338: RegQueryValueEx( hWinUAEKey, "FloppyPath", 0, &dwType, (LPBYTE)regfloppypath, &dwRFPsize );
! 339: RegQueryValueEx( hWinUAEKey, "KickstartPath", 0, &dwType, (LPBYTE)regrompath, &dwRRPsize );
! 340: RegQueryValueEx( hWinUAEKey, "hdfPath", 0, &dwType, (LPBYTE)reghdfpath, &dwRHPsize );
1.1.1.4 root 341: }
342:
343: strncpy( init_path, start_path, MAX_PATH );
344: switch( flag )
345: {
346: case 0:
347: case 1:
348: if( regfloppypath[0] )
349: strncpy( init_path, regfloppypath, MAX_PATH );
350: else
351: strncat( init_path, "\\..\\shared\\adf\\", MAX_PATH );
352: break;
353: case 2:
354: case 3:
355: if( reghdfpath[0] )
356: strncpy( init_path, reghdfpath, MAX_PATH );
357: else
358: strncat( init_path, "\\..\\shared\\hdf\\", MAX_PATH );
359: break;
360: case 6:
361: case 7:
362: if( regrompath[0] )
363: strncpy( init_path, regrompath, MAX_PATH );
364: else
365: strncat( init_path, "\\..\\shared\\rom\\", MAX_PATH );
366: break;
367: case 4:
368: case 5:
369: default:
370: strncat( init_path, "\\Configurations\\", MAX_PATH );
371: break;
1.1.1.2 root 372: }
1.1.1.4 root 373:
1.1.1.2 root 374: openFileName.lStructSize = sizeof (OPENFILENAME);
375: openFileName.hwndOwner = hDlg;
376: openFileName.hInstance = hInst;
1.1.1.4 root 377:
1.1.1.2 root 378: switch (flag) {
1.1.1.4 root 379: case 0:
380: WIN32GUI_LoadUIString( IDS_SELECTADF, szTitle, MAX_PATH );
381: WIN32GUI_LoadUIString( IDS_ADF, szFormat, MAX_PATH );
382: sprintf( szFilter, "%s ", szFormat );
383: memcpy( szFilter + strlen( szFilter ), DISK_FORMAT_STRING, sizeof( DISK_FORMAT_STRING ) + 1 );
384:
385: openFileName.lpstrTitle = szTitle;
1.1.1.2 root 386: openFileName.lpstrDefExt = "ADF";
1.1.1.4 root 387: openFileName.lpstrFilter = szFilter;
1.1.1.2 root 388: break;
1.1.1.4 root 389: case 1:
390: WIN32GUI_LoadUIString( IDS_CHOOSEBLANK, szTitle, MAX_PATH );
391: WIN32GUI_LoadUIString( IDS_ADF, szFormat, MAX_PATH );
392: sprintf( szFilter, "%s ", szFormat );
393: memcpy( szFilter + strlen( szFilter ), "(*.ADF)\0*.ADF\0", 15 );
394:
395: openFileName.lpstrTitle = szTitle;
1.1.1.2 root 396: openFileName.lpstrDefExt = "ADF";
1.1.1.4 root 397: openFileName.lpstrFilter = szFilter;
1.1.1.2 root 398: break;
1.1.1.4 root 399: case 2:
400: case 3:
401: WIN32GUI_LoadUIString( IDS_SELECTHDF, szTitle, MAX_PATH );
402: WIN32GUI_LoadUIString( IDS_HDF, szFormat, MAX_PATH );
403: sprintf( szFilter, "%s ", szFormat );
404: memcpy( szFilter + strlen( szFilter ), "(*.HDF)\0*.HDF\0", 15 );
405:
406: openFileName.lpstrTitle = szTitle;
1.1.1.2 root 407: openFileName.lpstrDefExt = "HDF";
1.1.1.4 root 408: openFileName.lpstrFilter = szFilter;
409: break;
410: case 4:
411: case 5:
412: WIN32GUI_LoadUIString( IDS_SELECTUAE, szTitle, MAX_PATH );
413: WIN32GUI_LoadUIString( IDS_UAE, szFormat, MAX_PATH );
414: sprintf( szFilter, "%s ", szFormat );
415: memcpy( szFilter + strlen( szFilter ), "(*.UAE)\0*.UAE\0", 15 );
416:
417: openFileName.lpstrTitle = szTitle;
418: openFileName.lpstrDefExt = "UAE";
419: openFileName.lpstrFilter = szFilter;
420: break;
421: case 6:
422: WIN32GUI_LoadUIString( IDS_SELECTROM, szTitle, MAX_PATH );
423: WIN32GUI_LoadUIString( IDS_ROM, szFormat, MAX_PATH );
424: sprintf( szFilter, "%s ", szFormat );
425: memcpy( szFilter + strlen( szFilter ), "(*.ROM)\0*.ROM\0", 15 );
426:
1.1.1.7 ! root 427: openFileName.lpstrTitle = szTitle;
! 428: openFileName.lpstrDefExt = "ROM";
! 429: openFileName.lpstrFilter = szFilter;
! 430: break;
1.1.1.4 root 431: case 7:
432: WIN32GUI_LoadUIString( IDS_SELECTKEY, szTitle, MAX_PATH );
433: WIN32GUI_LoadUIString( IDS_KEY, szFormat, MAX_PATH );
434: sprintf( szFilter, "%s ", szFormat );
435: memcpy( szFilter + strlen( szFilter ), "(*.KEY)\0*.KEY\0", 15 );
436:
437: openFileName.lpstrTitle = szTitle;
438: openFileName.lpstrDefExt = "KEY";
1.1.1.7 ! root 439: openFileName.lpstrFilter = szFilter;
! 440: break;
1.1.1.4 root 441: case 9:
442: case 10:
443: WIN32GUI_LoadUIString( IDS_SELECTUSS, szTitle, MAX_PATH );
444: WIN32GUI_LoadUIString( IDS_USS, szFormat, MAX_PATH );
445: sprintf( szFilter, "%s ", szFormat );
446: memcpy( szFilter + strlen( szFilter ), "(*.USS)\0*.USS\0", 15 );
447:
448: openFileName.lpstrTitle = szTitle;
449: openFileName.lpstrDefExt = "USS";
450: openFileName.lpstrFilter = szFilter;
451: break;
452: case 8:
453: default:
454: WIN32GUI_LoadUIString( IDS_SELECTINFO, szTitle, MAX_PATH );
455:
456: openFileName.lpstrTitle = szTitle;
457: openFileName.lpstrFilter = NULL;
458: openFileName.lpstrDefExt = NULL;
1.1.1.2 root 459: break;
460: }
1.1.1.4 root 461: openFileName.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
1.1.1.2 root 462: openFileName.lpstrCustomFilter = NULL;
463: openFileName.nMaxCustFilter = 0;
464: openFileName.nFilterIndex = 0;
465: openFileName.lpstrFile = full_path;
466: openFileName.nMaxFile = MAX_PATH;
467: openFileName.lpstrFileTitle = file_name;
468: openFileName.nMaxFileTitle = MAX_PATH;
1.1.1.4 root 469: openFileName.lpstrInitialDir = init_path;
1.1.1.2 root 470: openFileName.lpfnHook = NULL;
471: openFileName.lpTemplateName = NULL;
472: openFileName.lCustData = 0;
1.1.1.4 root 473: if (flag == 1 || flag == 3 || flag == 5 || flag == 9)
474: {
475: if( !(result = GetSaveFileName (&openFileName)) )
476: write_log ("GetSaveFileName() failed.\n");
477: }
1.1.1.2 root 478: else
1.1.1.4 root 479: {
480: if( !(result = GetOpenFileName (&openFileName)) )
481: write_log ("GetOpenFileName() failed.\n");
482: }
1.1.1.2 root 483:
1.1.1.4 root 484: if (result)
485: {
486: switch (wParam)
1.1.1.7 ! root 487: {
1.1.1.4 root 488: case IDC_PATH_NAME:
489: if( flag == 8 )
490: {
491: if( strstr( full_path, "Configurations\\" ) )
492: {
493: strcpy( full_path, init_path );
494: strcat( full_path, file_name );
495: }
496: }
1.1.1.2 root 497: SetDlgItemText (hDlg, wParam, full_path);
1.1.1.7 ! root 498: break;
1.1.1.4 root 499: case IDC_DF0:
1.1.1.2 root 500: SetDlgItemText (hDlg, IDC_DF0TEXT, full_path);
1.1.1.4 root 501: strcpy( prefs->df[0], full_path );
502: disk_insert( 0, full_path );
1.1.1.7 ! root 503: break;
1.1.1.4 root 504: case IDC_DF1:
1.1.1.2 root 505: SetDlgItemText (hDlg, IDC_DF1TEXT, full_path);
1.1.1.4 root 506: strcpy( prefs->df[1], full_path );
507: disk_insert( 1, full_path );
1.1.1.7 ! root 508: break;
1.1.1.4 root 509: case IDC_DF2:
1.1.1.2 root 510: SetDlgItemText (hDlg, IDC_DF2TEXT, full_path);
1.1.1.4 root 511: strcpy( prefs->df[2], full_path );
512: disk_insert( 2, full_path );
1.1.1.7 ! root 513: break;
1.1.1.4 root 514: case IDC_DF3:
1.1.1.2 root 515: SetDlgItemText (hDlg, IDC_DF3TEXT, full_path);
1.1.1.4 root 516: strcpy( prefs->df[3], full_path );
517: disk_insert( 3, full_path );
1.1.1.7 ! root 518: break;
1.1.1.4 root 519: case IDC_DOSAVESTATE:
520: case IDC_DOLOADSTATE:
521: strcpy( savestate_filename, full_path );
522: break;
523: case IDC_CREATE:
524: CreateDiskFile( full_path, 0 );
1.1.1.7 ! root 525: break;
1.1.1.4 root 526: case IDC_CREATE_RAW:
527: CreateDiskFile( full_path, 1 );
528: break;
529: case IDC_LOAD:
530: if( cfgfile_load( &workprefs, full_path ) == 0 )
531: {
532: char szMessage[ MAX_PATH ];
533: WIN32GUI_LoadUIString( IDS_COULDNOTLOADCONFIG, szMessage, MAX_PATH );
534: gui_message( szMessage );
535: }
536: else
537: {
538: cfgfile_get_description( full_path, description );
539: for( i = 0; i < C_PAGES; i++ )
540: {
541: if( pages[i] )
542: SendMessage( pages[i], WM_USER, 0, 0 );
543: }
544:
545: SetDlgItemText( hDlg, IDC_EDITDESCRIPTION, description );
546: SetDlgItemText( hDlg, IDC_EDITNAME, full_path );
547: }
1.1.1.7 ! root 548: break;
1.1.1.4 root 549: case IDC_SAVE:
550: SetDlgItemText( hDlg, IDC_EDITNAME, full_path );
1.1.1.7 ! root 551: break;
1.1.1.4 root 552: case IDC_ROMFILE:
553: SetDlgItemText( hDlg, IDC_ROMFILE, full_path );
554: strcpy( workprefs.romfile, full_path );
555: break;
556: case IDC_KEYFILE:
557: SetDlgItemText( hDlg, IDC_KEYFILE, full_path );
558: strcpy( workprefs.keyfile, full_path );
559: break;
1.1.1.7 ! root 560: }
! 561: if( flag == 0 || flag == 1 )
! 562: {
! 563: amiga_path = strstr( openFileName.lpstrFile, openFileName.lpstrFileTitle );
! 564: if( amiga_path && amiga_path != openFileName.lpstrFile )
! 565: {
! 566: *amiga_path = 0;
! 567: if( hWinUAEKey )
! 568: RegSetValueEx( hWinUAEKey, "FloppyPath", 0, REG_SZ, (CONST BYTE *)openFileName.lpstrFile, strlen( openFileName.lpstrFile ) );
! 569: }
! 570: }
! 571: else if( flag == 2 || flag == 3 )
! 572: {
! 573: amiga_path = strstr( openFileName.lpstrFile, openFileName.lpstrFileTitle );
! 574: if( amiga_path && amiga_path != openFileName.lpstrFile )
! 575: {
! 576: *amiga_path = 0;
! 577: if( hWinUAEKey )
! 578: RegSetValueEx( hWinUAEKey, "hdfPath", 0, REG_SZ, (CONST BYTE *)openFileName.lpstrFile, strlen( openFileName.lpstrFile ) );
! 579: }
! 580: }
! 581: else if( flag == 6 || flag == 7 )
! 582: {
! 583: amiga_path = strstr( openFileName.lpstrFile, openFileName.lpstrFileTitle );
! 584: if( amiga_path && amiga_path != openFileName.lpstrFile )
! 585: {
! 586: *amiga_path = 0;
! 587: if( hWinUAEKey )
! 588: RegSetValueEx( hWinUAEKey, "KickstartPath", 0, REG_SZ, (CONST BYTE *)openFileName.lpstrFile, strlen( openFileName.lpstrFile ) );
! 589: }
! 590: }
1.1.1.2 root 591: }
592: }
593:
1.1.1.4 root 594: static BOOL CreateHardFile (HWND hDlg, UINT hfsize)
1.1.1.2 root 595: {
596: HANDLE hf;
1.1.1.4 root 597: int i = 0;
598: BOOL result = FALSE;
1.1.1.2 root 599:
600: char init_path[MAX_PATH] = "";
601:
1.1.1.4 root 602: DiskSelection (hDlg, IDC_PATH_NAME, 3, &workprefs);
1.1.1.2 root 603: GetDlgItemText (hDlg, IDC_PATH_NAME, init_path, MAX_PATH);
1.1.1.4 root 604: if( *init_path && hfsize )
605: {
606: SetCursor( LoadCursor( NULL, IDC_WAIT ) );
607: if( ( hf = CreateFile (init_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) ) != INVALID_HANDLE_VALUE )
1.1.1.7 ! root 608: {
! 609: if( SetFilePointer( hf, hfsize, NULL, FILE_BEGIN ) == hfsize )
! 610: {
! 611: result = SetEndOfFile( hf );
! 612: }
! 613: else
! 614: {
! 615: write_log( "SetFilePointer() failure for %s to posn %d\n", init_path, hfsize );
! 616: }
! 617: CloseHandle( hf );
! 618: }
! 619: else
! 620: {
! 621: write_log( "CreateFile() failed to create %s\n", init_path );
! 622: }
! 623: SetCursor( LoadCursor( NULL, IDC_ARROW ) );
1.1.1.2 root 624: }
625: return result;
626: }
627:
628: static const char *memsize_names[] = {
1.1.1.4 root 629: /* 0 */ szNone,
630: /* 1 */ "256 K",
631: /* 2 */ "512 K",
632: /* 3 */ "1 MB",
633: /* 4 */ "2 MB",
634: /* 5 */ "4 MB",
635: /* 6 */ "8 MB",
636: /* 7 */ "16 MB",
637: /* 8 */ "32 MB",
638: /* 9 */ "64 MB",
639: /* 10*/ "128 MB",
640: /* 11*/ "256 MB",
641: /* 12*/ "512 MB",
642: /* 13*/ "1 GB",
643:
1.1.1.2 root 644: };
645:
646: static unsigned long memsizes[] = {
1.1.1.4 root 647: /* 0 */ 0,
648: /* 1 */ 0x00040000, /* 256-K */
649: /* 2 */ 0x00080000, /* 512-K */
650: /* 3 */ 0x00100000, /* 1-meg */
651: /* 4 */ 0x00200000, /* 2-meg */
652: /* 5 */ 0x00400000, /* 4-meg */
653: /* 6 */ 0x00800000, /* 8-meg */
654: /* 7 */ 0x01000000, /* 16-meg */
655: /* 8 */ 0x02000000, /* 32-meg */
656: /* 9 */ 0x04000000, /* 64-meg */
657: /* 10*/ 0x08000000, //128 Meg
658: /* 11*/ 0x10000000, //256 Meg
659: /* 12*/ 0x20000000, //512 Meg The correct size is set in mman.c
660: /* 13*/ 0x40000000, //1GB Meg
1.1.1.2 root 661: };
662:
1.1.1.4 root 663: static int msi_chip[] = { 2, 3, 4, 5, 6 };
1.1.1.2 root 664: static int msi_bogo[] = { 0, 2, 3 };
665: static int msi_fast[] = { 0, 3, 4, 5, 6 };
1.1.1.4 root 666: static int msi_z3fast[] = { 0, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13 };
667: static int msi_gfx[] = { 0, 3, 4, 5, 6,7,8};
1.1.1.2 root 668:
1.1.1.4 root 669: static UINT CalculateHardfileSize (HWND hDlg)
1.1.1.2 root 670: {
1.1.1.4 root 671: BOOL Translated = FALSE;
672: UINT bytes = 0;
673: bytes = GetDlgItemInt( hDlg, IDC_HFSIZE, &Translated, FALSE );
674: if( !Translated )
1.1.1.7 ! root 675: bytes = 0;
1.1.1.4 root 676: return bytes;
1.1.1.2 root 677: }
678:
679:
1.1.1.4 root 680: static const char *nth[] = {
681: "", "second ", "third ", "fourth ", "fifth ", "sixth ", "seventh ", "eighth ", "ninth ", "tenth "
1.1.1.2 root 682: };
683:
1.1.1.4 root 684: ConfigStructPtr AllocateConfigStruct( void )
1.1.1.2 root 685: {
1.1.1.4 root 686: return xmalloc( sizeof( ConfigStruct ) );
687: }
688:
689: void FreeConfigStruct( ConfigStructPtr cfgptr )
690: {
691: free( cfgptr );
692: }
1.1.1.2 root 693:
1.1.1.4 root 694: ConfigStructPtr GetFirstConfigEntry( HANDLE *file_handle, LPWIN32_FIND_DATA find_data )
695: {
696: ConfigStructPtr config = NULL;
697: DWORD num_bytes = 0;
698: char init_path[ MAX_PATH ] = "", *posn;
699: char description[ CFG_DESCRIPTION_LENGTH ] = "";
700:
701: if( start_path )
702: {
1.1.1.7 ! root 703: strncpy( init_path, start_path, MAX_PATH );
! 704: strncat( init_path, "\\Configurations\\*.UAE", MAX_PATH );
1.1.1.4 root 705: }
706:
707: if( ( *file_handle = FindFirstFile( init_path, find_data ) ) != INVALID_HANDLE_VALUE )
708: {
1.1.1.7 ! root 709: config = AllocateConfigStruct();
! 710: sprintf( init_path, "%s\\Configurations\\%s", start_path, find_data->cFileName );
! 711: if( cfgfile_get_description( init_path, description ) )
! 712: {
! 713: if( ( posn = strrchr( find_data->cFileName, '.' ) ) != NULL )
! 714: *posn = '\0';
! 715: strcpy( config->Name, find_data->cFileName );
! 716:
! 717: strcpy( config->Description, description );
! 718: }
! 719: else
! 720: {
! 721: FreeConfigStruct( config );
! 722: config = NULL;
! 723: }
1.1.1.2 root 724: }
1.1.1.4 root 725: else
726: {
1.1.1.7 ! root 727: // Either the directory has no .CFG files, or doesn't exist.
! 728:
! 729: // Create the directory, even if it already exists. No harm, and don't check return codes, because
! 730: // we may be doing this on a read-only media like CD-ROM.
! 731: sprintf( init_path, "%s\\Configurations", start_path );
! 732: CreateDirectory( init_path, NULL );
1.1.1.4 root 733: }
734: return config;
1.1.1.2 root 735: }
736:
1.1.1.4 root 737: ConfigStructPtr GetNextConfigEntry( HANDLE *file_handle, LPWIN32_FIND_DATA find_data )
738: {
739: ConfigStructPtr config = NULL;
740: char init_path[ MAX_PATH ] = "";
741: char desc[ CFG_DESCRIPTION_LENGTH ] = "";
742: char *posn;
743:
744: if( FindNextFile( *file_handle, find_data ) == 0 )
745: {
1.1.1.7 ! root 746: FindClose( *file_handle );
1.1.1.4 root 747: }
748: else
749: {
1.1.1.7 ! root 750: config = AllocateConfigStruct();
! 751: sprintf( init_path, "%s\\Configurations\\%s", start_path, find_data->cFileName );
! 752: if( cfgfile_get_description( init_path, desc ) )
! 753: {
! 754: if( ( posn = strrchr( find_data->cFileName, '.' ) ) != NULL )
! 755: *posn = '\0';
! 756: strcpy( config->Name, find_data->cFileName );
! 757:
! 758: strcpy( config->Description, desc );
! 759: }
! 760: else
! 761: {
! 762: FreeConfigStruct( config );
! 763: config = NULL;
! 764: }
1.1.1.4 root 765: }
766: return config;
767: }
768:
769: void HandleConfiguration( HWND hDlg, int flag )
770: {
771: char full_path[MAX_PATH] = "";
772: char file_name[MAX_PATH] = "";
773: char init_path[MAX_PATH] = "";
774: ConfigStructPtr cfgptr = NULL;
775: int i;
776:
777: if( ( cfgptr = AllocateConfigStruct() ) != NULL )
778: {
1.1.1.7 ! root 779: switch( flag )
! 780: {
! 781: case CONFIG_SAVE_FULL:
! 782: DiskSelection( hDlg, IDC_SAVE, 5, &workprefs );
! 783: GetDlgItemText( hDlg, IDC_EDITNAME, full_path, MAX_PATH );
! 784: GetDlgItemText( hDlg, IDC_EDITDESCRIPTION, workprefs.description, 256 );
! 785: cfgfile_save( &workprefs, full_path );
! 786: break;
! 787:
! 788: case CONFIG_LOAD_FULL:
! 789: DiskSelection( hDlg, IDC_LOAD, 4, &workprefs );
! 790: for( i = 0; i < C_PAGES; i++ )
! 791: {
! 792: if( pages[i] )
! 793: SendMessage( pages[i], WM_USER, 0, 0 );
! 794: }
1.1.1.4 root 795: EnableWindow( GetDlgItem( hDlg, IDC_VIEWINFO ), workprefs.info[0] );
1.1.1.7 ! root 796: break;
! 797:
! 798: case CONFIG_SAVE:
! 799: GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
! 800: if( cfgptr->Name[0] == '\0' )
! 801: {
1.1.1.4 root 802: char szMessage[ MAX_PATH ];
803: WIN32GUI_LoadUIString( IDS_MUSTENTERNAME, szMessage, MAX_PATH );
804: gui_message( szMessage );
1.1.1.7 ! root 805: }
! 806: else
! 807: {
! 808: if( !strchr( cfgptr->Name, '\\' ) && !strchr( cfgptr->Name, '/' ) )
! 809: {
! 810: if( start_path )
! 811: {
! 812: strncpy( init_path, start_path, MAX_PATH );
! 813: strncat( init_path, "\\Configurations\\", MAX_PATH );
! 814: }
! 815:
! 816: sprintf( full_path, "%s%s.UAE", init_path, cfgptr->Name );
! 817: }
! 818: else
! 819: {
! 820: strcpy( full_path, cfgptr->Name );
! 821: }
! 822: GetDlgItemText( hDlg, IDC_EDITDESCRIPTION, workprefs.description, 256 );
! 823: cfgfile_save( &workprefs, full_path );
! 824: }
! 825: break;
! 826:
! 827: case CONFIG_LOAD:
! 828: GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
! 829: if( cfgptr->Name[0] == '\0' )
! 830: {
1.1.1.4 root 831: char szMessage[ MAX_PATH ];
832: WIN32GUI_LoadUIString( IDS_MUSTSELECTCONFIG, szMessage, MAX_PATH );
833: gui_message( szMessage );
1.1.1.7 ! root 834: }
! 835: else
! 836: {
! 837: if( start_path )
! 838: {
! 839: strncpy( init_path, start_path, MAX_PATH );
! 840: strncat( init_path, "\\Configurations\\", MAX_PATH );
! 841: }
1.1.1.4 root 842:
1.1.1.7 ! root 843: sprintf( full_path, "%s%s.UAE", init_path, cfgptr->Name );
! 844: strcpy( config_filename, cfgptr->Name );
1.1.1.4 root 845:
1.1.1.7 ! root 846: if( cfgfile_load( &workprefs, full_path ) == 0 )
! 847: {
1.1.1.4 root 848: char szMessage[ MAX_PATH ];
849: WIN32GUI_LoadUIString( IDS_COULDNOTLOADCONFIG, szMessage, MAX_PATH );
1.1.1.7 ! root 850: gui_message( szMessage );
! 851: }
1.1.1.4 root 852:
1.1.1.7 ! root 853: for( i = 0; i < C_PAGES; i++ )
! 854: {
! 855: if( pages[i] )
1.1.1.4 root 856: SendMessage( pages[i], WM_USER, 0, 0 );
1.1.1.7 ! root 857: }
1.1.1.4 root 858: EnableWindow( GetDlgItem( hDlg, IDC_VIEWINFO ), workprefs.info[0] );
1.1.1.7 ! root 859: }
! 860: break;
1.1.1.4 root 861:
1.1.1.7 ! root 862: case CONFIG_DELETE:
! 863: GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
! 864: if( cfgptr->Name[0] == '\0' )
! 865: {
1.1.1.4 root 866: char szMessage[ MAX_PATH ];
867: WIN32GUI_LoadUIString( IDS_MUSTSELECTCONFIGFORDELETE, szMessage, MAX_PATH );
868: gui_message( szMessage );
1.1.1.7 ! root 869: }
! 870: else
! 871: {
1.1.1.4 root 872: char szMessage[ MAX_PATH ];
873: char szTitle[ MAX_PATH ];
874: WIN32GUI_LoadUIString( IDS_DELETECONFIGCONFIRMATION, szMessage, MAX_PATH );
875: WIN32GUI_LoadUIString( IDS_DELETECONFIGTITLE, szTitle, MAX_PATH );
1.1.1.7 ! root 876: if( MessageBox( hDlg, szMessage, szTitle,
! 877: MB_YESNO | MB_ICONWARNING | MB_APPLMODAL | MB_SETFOREGROUND ) == IDYES )
! 878: {
! 879: if( start_path )
! 880: {
! 881: strncpy( init_path, start_path, MAX_PATH );
! 882: strncat( init_path, "\\Configurations\\", MAX_PATH );
! 883: }
! 884:
! 885: sprintf( full_path, "%s%s.UAE", init_path, cfgptr->Name );
! 886: DeleteFile( full_path );
! 887: }
! 888: }
! 889: break;
! 890: }
! 891: FreeConfigStruct( cfgptr );
1.1.1.4 root 892: }
893: }
894:
895: static int clicked_entry = -1;
896:
897: #define LOADSAVE_COLUMNS 2
898: #define HARDDISK_COLUMNS 7
899: #define MAX_COLUMN_HEADING_WIDTH 20
900:
901: void InitializeListView( HWND hDlg )
902: {
903: HANDLE file_handle = NULL;
904: WIN32_FIND_DATA find_data;
905: BOOL rc = TRUE;
906: HWND list;
907: LV_ITEM lvstruct;
908: LV_COLUMN lvcolumn;
909: RECT rect;
910: int num_columns = ( hDlg == pages[ LOADSAVE_ID ] ) ? LOADSAVE_COLUMNS : HARDDISK_COLUMNS;
911: char column_heading[ HARDDISK_COLUMNS ][ MAX_COLUMN_HEADING_WIDTH ];
912: char sectors_str[6] = "";
913: char surfaces_str[6] = "";
914: char reserved_str[6] = "";
915: char blocksize_str[6] = "";
916: char readwrite_str[4] = "";
917: char volname_str[ MAX_PATH ] = "";
918: int width = 0, column_width[ HARDDISK_COLUMNS ];
919: int items = 0, result = 0, i, entry = 0, temp = 0;
920: ConfigStructPtr config = NULL;
921:
922: if( num_columns == LOADSAVE_COLUMNS )
923: {
924: WIN32GUI_LoadUIString( IDS_NAME, column_heading[0], MAX_COLUMN_HEADING_WIDTH );
925: WIN32GUI_LoadUIString( IDS_DESCRIPTION, column_heading[1], MAX_COLUMN_HEADING_WIDTH );
926:
1.1.1.7 ! root 927: list = GetDlgItem( hDlg, IDC_CONFIGLIST );
1.1.1.4 root 928: }
929: else
930: {
931: WIN32GUI_LoadUIString( IDS_VOLUME, column_heading[0], MAX_COLUMN_HEADING_WIDTH );
932: WIN32GUI_LoadUIString( IDS_PATH, column_heading[1], MAX_COLUMN_HEADING_WIDTH );
933: WIN32GUI_LoadUIString( IDS_RW, column_heading[2], MAX_COLUMN_HEADING_WIDTH );
934: WIN32GUI_LoadUIString( IDS_SECTORS, column_heading[3], MAX_COLUMN_HEADING_WIDTH );
935: WIN32GUI_LoadUIString( IDS_SURFACES, column_heading[4], MAX_COLUMN_HEADING_WIDTH );
936: WIN32GUI_LoadUIString( IDS_RESERVED, column_heading[5], MAX_COLUMN_HEADING_WIDTH );
937: WIN32GUI_LoadUIString( IDS_BLOCKSIZE, column_heading[6], MAX_COLUMN_HEADING_WIDTH );
938:
1.1.1.7 ! root 939: list = GetDlgItem( hDlg, IDC_VOLUMELIST );
1.1.1.4 root 940: }
941:
942: ListView_DeleteAllItems( list );
943:
944: for( i = 0; i < num_columns; i++ )
1.1.1.7 ! root 945: column_width[i] = ListView_GetStringWidth( list, column_heading[i] ) + 15;
1.1.1.4 root 946:
947: // If there are no columns, then insert some
948: lvcolumn.mask = LVCF_WIDTH;
949: if( ListView_GetColumn( list, 1, &lvcolumn ) == FALSE )
950: {
1.1.1.7 ! root 951: for( i = 0; i < num_columns; i++ )
! 952: {
! 953: lvcolumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
! 954: lvcolumn.iSubItem = i;
! 955: lvcolumn.fmt = LVCFMT_LEFT;
! 956: lvcolumn.pszText = column_heading[i];
! 957: lvcolumn.cx = column_width[i];
! 958: ListView_InsertColumn( list, i, &lvcolumn );
! 959: }
1.1.1.4 root 960: }
961: if( num_columns == LOADSAVE_COLUMNS )
962: {
1.1.1.7 ! root 963: if( ( config = GetFirstConfigEntry( &file_handle, &find_data ) ) != NULL )
! 964: {
! 965: while( config )
! 966: {
! 967: lvstruct.mask = LVIF_TEXT | LVIF_PARAM;
! 968: lvstruct.pszText = config->Name;
! 969: lvstruct.lParam = 0;
! 970: lvstruct.iItem = entry;
! 971: lvstruct.iSubItem = 0;
! 972: result = ListView_InsertItem( list, &lvstruct );
! 973: if( result != -1 )
! 974: {
! 975: width = ListView_GetStringWidth( list, lvstruct.pszText ) + 15;
! 976: if( width > column_width[ lvstruct.iSubItem ] )
! 977: column_width[ lvstruct.iSubItem ] = width;
! 978:
! 979: ListView_SetItemText( list, result, 1, config->Description );
! 980: width = ListView_GetStringWidth( list, config->Description ) + 15;
! 981: if( width > column_width[ 1 ] )
! 982: column_width[ 1 ] = width;
! 983:
! 984: entry++;
! 985: }
! 986: FreeConfigStruct( config );
! 987: config = GetNextConfigEntry( &file_handle, &find_data );
! 988: }
! 989: }
1.1.1.4 root 990: }
991: else
992: {
1.1.1.7 ! root 993: for( i = 0; i < nr_units( workprefs.mountinfo ); i++ )
! 994: {
1.1.1.4 root 995: int secspertrack, surfaces, reserved, blocksize, size;
996: int cylinders, readonly;
997: char *volname, *rootdir;
1.1.1.7 ! root 998: char *failure;
1.1.1.4 root 999:
1000: failure = get_filesys_unit (workprefs.mountinfo, i,
1.1.1.7 ! root 1001: &volname, &rootdir, &readonly,
1.1.1.4 root 1002: &secspertrack, &surfaces, &reserved,
1003: &cylinders, &size, &blocksize);
1004:
1.1.1.7 ! root 1005: if( is_hardfile( workprefs.mountinfo, i ) )
! 1006: {
! 1007: sprintf( sectors_str, "%d", secspertrack );
! 1008: sprintf( surfaces_str, "%d", surfaces );
! 1009: sprintf( reserved_str, "%d", reserved );
! 1010: sprintf( blocksize_str, "%d", blocksize );
! 1011: sprintf( volname_str, "DH%d", i );
! 1012: }
! 1013: else
! 1014: {
! 1015: strcpy( sectors_str, "n/a" );
! 1016: strcpy( surfaces_str, "n/a" );
! 1017: strcpy( reserved_str, "n/a" );
! 1018: strcpy( blocksize_str, "n/a" );
! 1019: strcpy( volname_str, volname );
! 1020: }
! 1021:
! 1022: sprintf( readwrite_str, "%s", readonly ? "no" : "yes" );
! 1023: lvstruct.mask = LVIF_TEXT | LVIF_PARAM;
! 1024: lvstruct.pszText = volname_str;
! 1025: lvstruct.lParam = 0;
! 1026: lvstruct.iItem = i;
! 1027: lvstruct.iSubItem = 0;
! 1028: result = ListView_InsertItem (list, &lvstruct);
! 1029: if (result != -1) {
! 1030: width = ListView_GetStringWidth( list, lvstruct.pszText ) + 15;
! 1031: if( width > column_width[ lvstruct.iSubItem ] )
! 1032: column_width[ lvstruct.iSubItem ] = width;
! 1033:
! 1034: ListView_SetItemText( list, result, 1, rootdir );
! 1035: width = ListView_GetStringWidth( list, rootdir ) + 15;
! 1036: if( width > column_width[ 1 ] )
! 1037: column_width[ 1 ] = width;
! 1038:
! 1039: ListView_SetItemText( list, result, 2, readwrite_str );
! 1040: width = ListView_GetStringWidth( list, readwrite_str ) + 15;
! 1041: if( width > column_width[ 2 ] )
! 1042: column_width[ 2 ] = width;
! 1043:
! 1044: ListView_SetItemText( list, result, 3, sectors_str );
! 1045: width = ListView_GetStringWidth( list, sectors_str ) + 15;
! 1046: if( width > column_width[ 3 ] )
! 1047: column_width[ 3 ] = width;
! 1048:
! 1049: ListView_SetItemText( list, result, 4, surfaces_str );
! 1050: width = ListView_GetStringWidth( list, surfaces_str ) + 15;
! 1051: if( width > column_width[ 4 ] )
! 1052: column_width[ 4 ] = width;
! 1053:
! 1054: ListView_SetItemText( list, result, 5, reserved_str );
! 1055: width = ListView_GetStringWidth( list, reserved_str ) + 15;
! 1056: if( width > column_width[ 5 ] )
! 1057: column_width[ 5 ] = width;
! 1058:
! 1059: ListView_SetItemText( list, result, 6, blocksize_str );
! 1060: width = ListView_GetStringWidth( list, blocksize_str ) + 15;
! 1061: if( width > column_width[ 6 ] )
! 1062: column_width[ 6 ] = width;
! 1063: }
! 1064: }
1.1.1.4 root 1065: }
1066: if( rc == FALSE )
1067: {
1.1.1.7 ! root 1068: FreeConfigStruct( config );
1.1.1.4 root 1069: }
1070:
1071: if( result != -1 )
1072: {
1.1.1.7 ! root 1073: if( GetWindowRect( list, &rect ) )
! 1074: {
! 1075: ScreenToClient( hDlg, (LPPOINT)&rect );
! 1076: ScreenToClient( hDlg, (LPPOINT)&rect.right );
! 1077: if( num_columns == 2 )
! 1078: {
! 1079: if( ( temp = rect.right - rect.left - column_width[ 0 ] - 4 ) > column_width[1] )
! 1080: column_width[1] = temp;
! 1081: }
! 1082: }
! 1083:
! 1084: // Adjust our column widths so that we can see the contents...
! 1085: for( i = 0; i < num_columns; i++ )
! 1086: {
! 1087: ListView_SetColumnWidth( list, i, column_width[i] );
! 1088: }
1.1.1.4 root 1089:
1090: #if 0
1.1.1.7 ! root 1091: // Turn on full-row-select option
! 1092: ListView_SetExtendedListViewStyle( list, LVS_EX_FULLROWSELECT );
1.1.1.4 root 1093: #endif
1094:
1.1.1.7 ! root 1095: // Redraw the items in the list...
! 1096: items = ListView_GetItemCount( list );
! 1097: ListView_RedrawItems( list, 0, items );
1.1.1.4 root 1098: }
1099: }
1.1.1.2 root 1100:
1101: static int listview_find_selected (HWND list)
1102: {
1103: int i, items;
1104: items = ListView_GetItemCount (list);
1105: for (i = 0; i < items; i++) {
1106: if (ListView_GetItemState (list, i, LVIS_SELECTED) == LVIS_SELECTED)
1107: return i;
1108: }
1109: return -1;
1110: }
1111:
1112: static int listview_entry_from_click (HWND list)
1113: {
1114: POINT point;
1115: DWORD pos = GetMessagePos ();
1116: int items, entry;
1117:
1118: point.x = LOWORD (pos);
1119: point.y = HIWORD (pos);
1120: ScreenToClient (list, &point);
1121: entry = ListView_GetTopIndex (list);
1122: items = entry + ListView_GetCountPerPage (list);
1123: if (items > ListView_GetItemCount (list))
1124: items = ListView_GetItemCount (list);
1125:
1126: while (entry <= items) {
1127: RECT rect;
1128: /* Get the bounding rectangle of an item. If the mouse
1129: * location is within the bounding rectangle of the item,
1130: * you know you have found the item that was being clicked. */
1131: ListView_GetItemRect (list, entry, &rect, LVIR_BOUNDS);
1132: if (PtInRect (&rect, point)) {
1133: UINT flag = LVIS_SELECTED | LVIS_FOCUSED;
1134: ListView_SetItemState (list, entry, flag, flag);
1135: return entry;
1136: }
1137: entry++;
1138: }
1139: return -1;
1140: }
1141:
1.1.1.4 root 1142: static int CALLBACK InfoSettingsProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1143: {
1144: static int recursive = 0;
1145:
1146: switch (msg)
1147: {
1148: case WM_INITDIALOG:
1149: recursive++;
1150: SetDlgItemText (hDlg, IDC_PATH_NAME, workprefs.info);
1151: recursive--;
1152: return TRUE;
1153:
1154: case WM_COMMAND:
1155: if (recursive)
1156: break;
1157: recursive++;
1158:
1159: switch( wParam )
1160: {
1161: case IDC_SELECTOR:
1162: DiskSelection (hDlg, IDC_PATH_NAME, 8, &workprefs );
1163: break;
1164: case IDOK:
1165: EndDialog (hDlg, 1);
1166: break;
1167: case IDCANCEL:
1168: EndDialog (hDlg, 0);
1169: break;
1170: }
1171:
1172: GetDlgItemText( hDlg, IDC_PATH_NAME, workprefs.info, sizeof workprefs.info );
1173: recursive--;
1174: break;
1175: }
1176: return FALSE;
1177: }
1178:
1.1.1.2 root 1179: static BOOL CALLBACK LoadSaveDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1180: {
1181: char name_buf[MAX_PATH] = "", desc_buf[128] = "";
1.1.1.4 root 1182: char *posn = NULL;
1.1.1.2 root 1183: HWND list;
1184: int dblclick = 0;
1185: NM_LISTVIEW *nmlistview;
1186: int items = 0, entry = 0;
1.1.1.4 root 1187: LPHELPINFO lpHelpInfo;
1188:
1.1.1.2 root 1189: switch (msg) {
1.1.1.4 root 1190: case WM_INITDIALOG:
1.1.1.2 root 1191: pages[LOADSAVE_ID] = hDlg;
1.1.1.4 root 1192: InitializeListView(hDlg);
1193: if( !full_property_sheet )
1194: {
1195: EnableWindow( GetDlgItem( hDlg, IDC_SAVE ), FALSE );
1.1.1.2 root 1196: }
1.1.1.4 root 1197: EnableWindow( GetDlgItem( hDlg, IDC_VIEWINFO ), workprefs.info[0] );
1198: #if 0
1199: if( !config_filename[0] && configname[0] )
1200: {
1201: if( posn = strrchr( configname, '\\' ) )
1202: strcpy( configname, ++posn );
1203: if( posn = strrchr( configname, '.' ) )
1204: *posn = '\0';
1205: strcpy( config_filename, configname );
1206: }
1207: #endif
1208: SetDlgItemText( hDlg, IDC_EDITNAME, config_filename );
1209: SetDlgItemText( hDlg, IDC_EDITDESCRIPTION, workprefs.description );
1.1.1.2 root 1210: return TRUE;
1.1.1.4 root 1211:
1212: case WM_USER:
1.1.1.2 root 1213: break;
1.1.1.4 root 1214:
1215: case WM_HELP:
1.1.1.7 ! root 1216: lpHelpInfo = (LPHELPINFO)lParam;
! 1217: break;
1.1.1.4 root 1218:
1219: case WM_COMMAND:
1.1.1.7 ! root 1220: switch (wParam)
! 1221: {
1.1.1.4 root 1222: case IDC_SAVE:
1223: HandleConfiguration( hDlg, CONFIG_SAVE_FULL );
1224: InitializeListView( hDlg );
1225: break;
1226: case IDC_QUICKSAVE:
1227: HandleConfiguration( hDlg, CONFIG_SAVE );
1228: InitializeListView( hDlg );
1229: break;
1230: case IDC_QUICKLOAD:
1231: HandleConfiguration( hDlg, CONFIG_LOAD );
1232: break;
1233: case IDC_LOAD:
1234: HandleConfiguration( hDlg, CONFIG_LOAD_FULL );
1235: break;
1236: case IDC_DELETE:
1237: HandleConfiguration( hDlg, CONFIG_DELETE );
1238: InitializeListView( hDlg );
1239: break;
1240: case IDC_VIEWINFO:
1241: if( workprefs.info[0] )
1242: {
1243: if( strstr( workprefs.info, "Configurations\\" ) )
1244: sprintf( name_buf, "%s\\%s", start_path, workprefs.info );
1245: else
1246: strcpy( name_buf, workprefs.info );
1247: ShellExecute( NULL, NULL, name_buf, NULL, NULL, SW_SHOWNORMAL );
1248: }
1.1.1.2 root 1249: break;
1.1.1.4 root 1250: case IDC_SETINFO:
1251: if( DialogBox( hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDD_SETINFO), hDlg, InfoSettingsProc ) )
1252: {
1253: EnableWindow( GetDlgItem( hDlg, IDC_VIEWINFO ), workprefs.info[0] );
1254: }
1.1.1.2 root 1255: break;
1256: }
1257: break;
1.1.1.4 root 1258:
1259: case WM_NOTIFY:
1260: if (((LPNMHDR) lParam)->idFrom == IDC_CONFIGLIST)
1261: {
1262: nmlistview = (NM_LISTVIEW *) lParam;
1263: list = nmlistview->hdr.hwndFrom;
1264:
1265: switch (nmlistview->hdr.code)
1266: {
1267: case NM_DBLCLK:
1268: dblclick = 1;
1269: /* fall-through */
1270: case NM_CLICK:
1271: entry = listview_entry_from_click (list);
1272: /* Copy the item's name and description to the gadgets at the bottom... */
1273: if (entry >= 0)
1.1.1.7 ! root 1274: {
1.1.1.4 root 1275: ListView_GetItemText (list, entry, 0, name_buf, MAX_PATH);
1276: ListView_GetItemText (list, entry, 1, desc_buf, 128);
1277: SetDlgItemText (hDlg, IDC_EDITNAME, name_buf);
1278: SetDlgItemText (hDlg, IDC_EDITDESCRIPTION, desc_buf);
1279: ListView_RedrawItems (list, 0, items);
1280:
1281: if( dblclick )
1.1.1.7 ! root 1282: {
! 1283: HandleConfiguration( hDlg, CONFIG_LOAD );
! 1284: /* Copy stuff from workprefs and config_xxx settings */
! 1285: gui_to_prefs ();
! 1286: PropSheet_PressButton( hPropertySheet, PSBTN_OK );
1.1.1.4 root 1287: }
1.1.1.2 root 1288: }
1.1.1.4 root 1289: break;
1.1.1.2 root 1290: }
1291: }
1.1.1.4 root 1292: else
1293: {
1294: switch (((NMHDR *) lParam)->code)
1295: {
1.1.1.7 ! root 1296: case PSN_HELP:
! 1297: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "configurations.htm" );
1.1.1.4 root 1298: break;
1299: case PSN_APPLY:
1.1.1.7 ! root 1300: /* Copy stuff from workprefs and config_xxx settings */
! 1301: gui_to_prefs ();
1.1.1.4 root 1302: break;
1303:
1.1.1.7 ! root 1304: case PSN_RESET:
1.1.1.4 root 1305: if (allow_quit)
1.1.1.7 ! root 1306: {
1.1.1.4 root 1307: quit_program = 1;
1308: regs.spcflags |= SPCFLAG_BRK;
1309: }
1310: break;
1.1.1.2 root 1311: }
1312: }
1.1.1.4 root 1313: break;
1.1.1.2 root 1314: }
1.1.1.4 root 1315:
1.1.1.2 root 1316: return FALSE;
1317: }
1318:
1.1.1.4 root 1319: #define MAX_CONTRIBUTORS_LENGTH 2048
1320:
1.1.1.2 root 1321: static int CALLBACK ContributorsProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1322: {
1323: CHARFORMAT CharFormat;
1.1.1.4 root 1324: char szContributors1[ MAX_CONTRIBUTORS_LENGTH ];
1325: char szContributors2[ MAX_CONTRIBUTORS_LENGTH ];
1326: char szContributors[ MAX_CONTRIBUTORS_LENGTH*2 ];
1.1.1.2 root 1327:
1328: switch (msg) {
1329: case WM_COMMAND:
1330: if (wParam == ID_OK) {
1331: EndDialog (hDlg, 1);
1332: return TRUE;
1333: }
1334: break;
1335: case WM_INITDIALOG:
1336: CharFormat.cbSize = sizeof (CharFormat);
1337:
1.1.1.4 root 1338: WIN32GUI_LoadUIString( IDS_CONTRIBUTORS1, szContributors1, MAX_CONTRIBUTORS_LENGTH );
1339: WIN32GUI_LoadUIString( IDS_CONTRIBUTORS2, szContributors2, MAX_CONTRIBUTORS_LENGTH );
1340: sprintf( szContributors, "%s%s", szContributors1, szContributors2 );
1.1.1.2 root 1341:
1.1.1.4 root 1342: SetDlgItemText (hDlg, IDC_CONTRIBUTORS, szContributors );
1.1.1.2 root 1343: SendDlgItemMessage (hDlg, IDC_CONTRIBUTORS, EM_GETCHARFORMAT, 0, (LPARAM) & CharFormat);
1344: CharFormat.dwMask |= CFM_SIZE | CFM_FACE;
1345: CharFormat.yHeight = 10 * 20; /* height in twips, where a twip is 1/20th of a point - for a pt.size of 18 */
1346:
1347: strcpy (CharFormat.szFaceName, "Times New Roman");
1348: SendDlgItemMessage (hDlg, IDC_CONTRIBUTORS, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) & CharFormat);
1349: /* SendDlgItemMessage(hDlg, IDC_CONTRIBUTORS, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) ); */
1350:
1351: return TRUE;
1352: }
1353: return FALSE;
1354: }
1355:
1356: static void DisplayContributors (HWND hDlg)
1357: {
1.1.1.4 root 1358: DialogBox( hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDD_CONTRIBUTORS), hDlg, ContributorsProc);
1.1.1.2 root 1359: }
1360:
1.1.1.4 root 1361: #define NUM_URLS 7
1362: typedef struct url_info
1.1.1.2 root 1363: {
1.1.1.4 root 1364: int id;
1365: BOOL state;
1366: char *display;
1367: char *url;
1368: } urlinfo;
1369:
1370: static urlinfo urls[NUM_URLS] =
1371: {
1372: {IDC_CLOANTOHOME, FALSE, "Cloanto's Amiga Forever", "http://www.cloanto.com/amiga/forever/"},
1373: {IDC_AMIGAHOME, FALSE, "Amiga Inc.", "http://www.amiga.com"},
1374: {IDC_PICASSOHOME, FALSE, "Picasso96 Home Page", "http://www.picasso96.cogito.de/"},
1375: {IDC_UAEHOME, FALSE, "UAE Home Page", "http://www.freiburg.linux.de/~uae/"},
1376: {IDC_WINUAEHOME, FALSE, "WinUAE Home Page", "http://www.CodePoet.com/UAE/"},
1377: {IDC_AIABHOME, FALSE, "AIAB", "http://aiab.emuunlim.com/"},
1378: {IDC_THEROOTS, FALSE, "Back To The Roots", "http://back2roots.emuunlim.com/"}
1379: };
1.1.1.2 root 1380:
1.1.1.4 root 1381: static void SetupRichText( HWND hDlg, urlinfo *url )
1.1.1.3 root 1382: {
1383: CHARFORMAT CharFormat;
1384: CharFormat.cbSize = sizeof (CharFormat);
1385:
1.1.1.4 root 1386: SetDlgItemText( hDlg, url->id, url->display );
1387: SendDlgItemMessage( hDlg, url->id, EM_GETCHARFORMAT, 0, (LPARAM)&CharFormat );
1388: CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
1389: CharFormat.dwEffects = url->state ? CFE_UNDERLINE : 0;
1390: CharFormat.yHeight = 10 * 20; /* height in twips, where a twip is 1/20th of a point - for a pt.size of 18 */
1.1.1.3 root 1391:
1.1.1.4 root 1392: CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
1393: strcpy( CharFormat.szFaceName, "Tahoma" );
1394: SendDlgItemMessage( hDlg, url->id, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&CharFormat );
1395: SendDlgItemMessage( hDlg, url->id, EM_SETBKGNDCOLOR, 0, GetSysColor( COLOR_3DFACE ) );
1396: }
1397:
1398: static void url_handler(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
1399: {
1400: static int last_rectangle = -1;
1401: int i;
1402: BOOL found = FALSE;
1403: HCURSOR m_hCursor = NULL;
1404: POINT point;
1405: point.x = LOWORD (lParam);
1406: point.y = HIWORD (lParam);
1407:
1408: for (i = 0; i < NUM_URLS; i++)
1409: {
1410: RECT rect;
1411: GetWindowRect( GetDlgItem( hDlg, urls[i].id), &rect );
1412: ScreenToClient( hDlg, (POINT *) &rect );
1413: ScreenToClient( hDlg, (POINT *) &(rect.right) );
1414: if( PtInRect( &rect, point ) )
1.1.1.7 ! root 1415: {
! 1416: if( msg == WM_LBUTTONDOWN )
! 1417: {
1.1.1.4 root 1418: ShellExecute (NULL, NULL, urls[i].url , NULL, NULL, SW_SHOWNORMAL);
1.1.1.7 ! root 1419: SetCursor( LoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW) ) );
! 1420: }
! 1421: else
! 1422: {
! 1423: if( ( i != last_rectangle ) )
! 1424: {
1.1.1.4 root 1425: // try and load the system hand (Win2000+)
1426: m_hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND) );
1427: if (!m_hCursor)
1428: {
1429: // retry with our fallback hand
1430: m_hCursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_MYHAND) );
1431: }
1.1.1.7 ! root 1432: SetCursor( m_hCursor );
! 1433: urls[i].state = TRUE;
! 1434: SetupRichText( hDlg, &urls[i] );
1.1.1.4 root 1435:
1436: if( last_rectangle != -1 )
1437: {
1438: urls[last_rectangle].state = FALSE;
1439: SetupRichText( hDlg, &urls[last_rectangle] );
1440: }
1.1.1.7 ! root 1441: }
! 1442: }
1.1.1.4 root 1443: last_rectangle = i;
1.1.1.7 ! root 1444: found = TRUE;
1.1.1.4 root 1445: break;
1446: }
1447: }
1448:
1449: if( !found && last_rectangle >= 0 )
1450: {
1.1.1.7 ! root 1451: SetCursor( LoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW) ) );
! 1452: urls[last_rectangle].state = FALSE;
! 1453: SetupRichText( hDlg, &urls[last_rectangle] );
1.1.1.4 root 1454: last_rectangle = -1;
1455: }
1.1.1.3 root 1456: }
1457:
1.1.1.2 root 1458: static void init_aboutdlg (HWND hDlg)
1459: {
1460: CHARFORMAT CharFormat;
1.1.1.4 root 1461: int i;
1462:
1.1.1.2 root 1463: CharFormat.cbSize = sizeof (CharFormat);
1464:
1.1.1.4 root 1465: SetDlgItemText (hDlg, IDC_RICHEDIT1, "UAE/Win32");
1.1.1.2 root 1466: SendDlgItemMessage (hDlg, IDC_RICHEDIT1, EM_GETCHARFORMAT, 0, (LPARAM) & CharFormat);
1467: CharFormat.dwMask |= CFM_BOLD | CFM_SIZE | CFM_FACE;
1468: CharFormat.dwEffects = CFE_BOLD;
1469: CharFormat.yHeight = 18 * 20; /* height in twips, where a twip is 1/20th of a point - for a pt.size of 18 */
1470:
1471: strcpy (CharFormat.szFaceName, "Times New Roman");
1472: SendDlgItemMessage (hDlg, IDC_RICHEDIT1, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) & CharFormat);
1473: SendDlgItemMessage (hDlg, IDC_RICHEDIT1, EM_SETBKGNDCOLOR, 0, GetSysColor (COLOR_3DFACE));
1474:
1.1.1.4 root 1475: SetDlgItemText (hDlg, IDC_RICHEDIT2, VersionStr );
1.1.1.2 root 1476: SendDlgItemMessage (hDlg, IDC_RICHEDIT2, EM_GETCHARFORMAT, 0, (LPARAM) & CharFormat);
1477: CharFormat.dwMask |= CFM_SIZE | CFM_FACE;
1478: CharFormat.yHeight = 10 * 20;
1479: strcpy (CharFormat.szFaceName, "Times New Roman");
1480: SendDlgItemMessage (hDlg, IDC_RICHEDIT2, EM_SETCHARFORMAT, SCF_ALL, (LPARAM) & CharFormat);
1481: SendDlgItemMessage (hDlg, IDC_RICHEDIT2, EM_SETBKGNDCOLOR, 0, GetSysColor (COLOR_3DFACE));
1482:
1.1.1.4 root 1483: for( i = 0; i < NUM_URLS; i++ )
1484: {
1.1.1.7 ! root 1485: SetupRichText( hDlg, &urls[i] );
1.1.1.4 root 1486: }
1.1.1.2 root 1487: }
1488:
1489: static BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1490: {
1.1.1.4 root 1491: switch( msg )
1492: {
1493: case WM_INITDIALOG:
1494: pages[ABOUT_ID] = hDlg;
1495: init_aboutdlg (hDlg);
1496: break;
1497:
1498: case WM_COMMAND:
1499: if (wParam == IDC_CONTRIBUTORS)
1500: {
1501: DisplayContributors (hDlg);
1502: }
1503: break;
1504: case WM_SETCURSOR:
1505: return TRUE;
1506: break;
1507: case WM_LBUTTONDOWN:
1508: case WM_MOUSEMOVE:
1509: url_handler( hDlg, msg, wParam, lParam );
1510: break;
1511: case WM_NOTIFY:
1512: switch (((NMHDR *) lParam)->code)
1513: {
1514: case PSN_APPLY:
1515: /* Copy stuff from workprefs and config_xxx settings */
1516: gui_to_prefs ();
1517: break;
1518:
1519: case PSN_RESET:
1520: if (allow_quit)
1521: {
1522: quit_program = 1;
1523: regs.spcflags |= SPCFLAG_BRK;
1524: }
1525: break;
1.1.1.2 root 1526: }
1527: break;
1528: }
1.1.1.4 root 1529:
1.1.1.2 root 1530: return FALSE;
1531: }
1532:
1533: static struct win32_displaymode *GetDisplayMode (int logical_number)
1534: {
1535: struct win32_displaymode *dm = win32_displaymode_list;
1536: while (logical_number > 0 && dm != 0)
1537: dm = dm->next, logical_number--;
1538: return dm;
1539: }
1540:
1.1.1.4 root 1541: static void enable_for_displaydlg (HWND hDlg)
1.1.1.2 root 1542: {
1.1.1.4 root 1543: if (! full_property_sheet)
1544: {
1.1.1.2 root 1545: /* Disable certain controls which are only to be set once at start-up... */
1.1.1.7 ! root 1546: EnableWindow (GetDlgItem (hDlg, IDC_TEST16BIT), FALSE);
1.1.1.2 root 1547: EnableWindow (GetDlgItem (hDlg, IDC_LORES), FALSE);
1548: EnableWindow (GetDlgItem (hDlg, IDC_XCENTER), FALSE);
1549: EnableWindow (GetDlgItem (hDlg, IDC_YCENTER), FALSE);
1550: EnableWindow (GetDlgItem (hDlg, IDC_ASPECT), FALSE);
1.1.1.4 root 1551: EnableWindow (GetDlgItem (hDlg, IDC_LM_NORMAL), FALSE);
1552: EnableWindow (GetDlgItem (hDlg, IDC_LM_DOUBLED), FALSE);
1553: EnableWindow (GetDlgItem (hDlg, IDC_LM_SCANLINES), FALSE);
1.1.1.2 root 1554: EnableWindow (GetDlgItem (hDlg, IDC_RESOLUTION), FALSE);
1555: EnableWindow (GetDlgItem (hDlg, IDC_XSIZE), FALSE);
1556: EnableWindow (GetDlgItem (hDlg, IDC_YSIZE), FALSE);
1.1.1.4 root 1557: }
1558: else
1559: {
1.1.1.7 ! root 1560: EnableWindow( GetDlgItem( hDlg, IDC_PFULLSCREEN ), ! workprefs.address_space_24);
! 1561: EnableWindow( GetDlgItem( hDlg, IDC_XSIZE ), workprefs.gfx_afullscreen ? FALSE:TRUE );
! 1562: EnableWindow( GetDlgItem( hDlg, IDC_YSIZE ), workprefs.gfx_afullscreen ? FALSE:TRUE );
! 1563: EnableWindow( GetDlgItem( hDlg, IDC_RESOLUTION ), workprefs.gfx_afullscreen ? TRUE:FALSE );
1.1.1.4 root 1564: }
1565: }
1566:
1567: static void enable_for_chipsetdlg (HWND hDlg)
1568: {
1569: }
1570:
1571: static void LoadNthString( DWORD value, char *nth, DWORD dwNthMax )
1572: {
1573: switch( value )
1574: {
1575: case 1:
1576: WIN32GUI_LoadUIString( IDS_SECOND, nth, dwNthMax );
1577: break;
1578:
1579: case 2:
1580: WIN32GUI_LoadUIString( IDS_THIRD, nth, dwNthMax );
1581: break;
1582:
1583: case 3:
1584: WIN32GUI_LoadUIString( IDS_FOURTH, nth, dwNthMax );
1585: break;
1586:
1587: case 4:
1588: WIN32GUI_LoadUIString( IDS_FIFTH, nth, dwNthMax );
1589: break;
1590:
1591: case 5:
1592: WIN32GUI_LoadUIString( IDS_SIXTH, nth, dwNthMax );
1593: break;
1594:
1595: case 6:
1596: WIN32GUI_LoadUIString( IDS_SEVENTH, nth, dwNthMax );
1597: break;
1598:
1599: case 7:
1600: WIN32GUI_LoadUIString( IDS_EIGHTH, nth, dwNthMax );
1601: break;
1602:
1603: case 8:
1604: WIN32GUI_LoadUIString( IDS_NINTH, nth, dwNthMax );
1605: break;
1606:
1607: case 9:
1608: WIN32GUI_LoadUIString( IDS_TENTH, nth, dwNthMax );
1609: break;
1610:
1611: default:
1612: strcpy( nth, "" );
1.1.1.2 root 1613: }
1614: }
1615:
1.1.1.4 root 1616: #define MAX_FRAMERATE_LENGTH 40
1617: #define MAX_NTH_LENGTH 20
1618:
1619: static void values_to_displaydlg (HWND hDlg)
1.1.1.2 root 1620: {
1.1.1.4 root 1621: char buffer[ MAX_FRAMERATE_LENGTH + MAX_NTH_LENGTH ];
1622: char Nth[ MAX_NTH_LENGTH ];
1623: LPSTR blah[1] = { Nth };
1624: LPTSTR string = NULL;
1625: int d,d2,index;
1626:
1627: switch( workprefs.color_mode )
1628: {
1629: case 2:
1.1.1.7 ! root 1630: d = 16;
! 1631: break;
1.1.1.4 root 1632: case 5:
1.1.1.7 ! root 1633: d = 32;
! 1634: break;
1.1.1.4 root 1635: default:
1.1.1.7 ! root 1636: d = 8;
! 1637: break;
1.1.1.4 root 1638: }
1639:
1640: if( workprefs.gfx_afullscreen )
1641: {
1.1.1.7 ! root 1642: d2 = d;
! 1643: if( ( index = WIN32GFX_AdjustScreenmode( &workprefs.gfx_width, &workprefs.gfx_height, &d2 ) ) >= 0 )
! 1644: {
! 1645: switch( d2 )
! 1646: {
! 1647: case 15:
! 1648: workprefs.color_mode = 1;
! 1649: d = 2;
! 1650: break;
! 1651: case 16:
! 1652: workprefs.color_mode = 2;
! 1653: d = 2;
! 1654: break;
! 1655: case 32:
! 1656: workprefs.color_mode = 5;
! 1657: d = 4;
! 1658: break;
! 1659: default:
! 1660: workprefs.color_mode = 0;
! 1661: d = 1;
! 1662: break;
! 1663: }
! 1664: }
1.1.1.4 root 1665: }
1666: else
1667: {
1.1.1.7 ! root 1668: d = d/8;
1.1.1.4 root 1669: }
1670:
1671: if ((index = picasso_display_mode_index (workprefs.gfx_width, workprefs.gfx_height, d)) >= 0)
1.1.1.7 ! root 1672: SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_SETCURSEL, index, 0 );
1.1.1.4 root 1673:
1674: SetDlgItemInt( hDlg, IDC_XSIZE, workprefs.gfx_width, FALSE );
1675: SetDlgItemInt( hDlg, IDC_YSIZE, workprefs.gfx_height, FALSE );
1.1.1.2 root 1676:
1.1.1.4 root 1677: SendDlgItemMessage (hDlg, IDC_FRAMERATE, TBM_SETPOS, TRUE, workprefs.gfx_framerate);
1.1.1.2 root 1678:
1.1.1.4 root 1679: WIN32GUI_LoadUIString( IDS_FRAMERATE, buffer, MAX_FRAMERATE_LENGTH );
1680: LoadNthString( workprefs.gfx_framerate - 1, Nth, MAX_NTH_LENGTH );
1681: if( FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER,
1.1.1.7 ! root 1682: buffer, 0, 0, (LPTSTR)&string, MAX_FRAMERATE_LENGTH + MAX_NTH_LENGTH, (va_list *)blah ) == 0 )
1.1.1.4 root 1683: {
1684: DWORD dwLastError = GetLastError();
1.1.1.7 ! root 1685: sprintf (buffer, "Every %s Frame", nth[workprefs.gfx_framerate - 1]);
1.1.1.4 root 1686: SetDlgItemText( hDlg, IDC_RATETEXT, buffer );
1687: }
1688: else
1689: {
1690: SetDlgItemText( hDlg, IDC_RATETEXT, string );
1691: LocalFree( string );
1692: }
1.1.1.2 root 1693:
1.1.1.4 root 1694: CheckRadioButton( hDlg, IDC_LM_NORMAL, IDC_LM_SCANLINES, IDC_LM_NORMAL+workprefs.gfx_linedbl );
1.1.1.2 root 1695: CheckDlgButton (hDlg, IDC_AFULLSCREEN, workprefs.gfx_afullscreen);
1.1.1.4 root 1696: CheckDlgButton (hDlg, IDC_PFULLSCREEN, workprefs.gfx_pfullscreen);
1.1.1.2 root 1697: CheckDlgButton (hDlg, IDC_ASPECT, workprefs.gfx_correct_aspect);
1698: CheckDlgButton (hDlg, IDC_LORES, workprefs.gfx_lores);
1699:
1.1.1.4 root 1700: CheckDlgButton (hDlg, IDC_XCENTER, workprefs.gfx_xcenter);
1701: CheckDlgButton (hDlg, IDC_YCENTER, workprefs.gfx_ycenter);
1.1.1.2 root 1702: }
1703:
1704: static void init_resolution_combo (HWND hDlg)
1705: {
1.1.1.4 root 1706: int i;
1.1.1.2 root 1707:
1.1.1.4 root 1708: for( i = 0; i < picasso_nr_resolutions (); i++ )
1709: {
1.1.1.7 ! root 1710: SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)DisplayModes[i].name );
1.1.1.2 root 1711: }
1712: }
1713:
1.1.1.4 root 1714: static void values_from_displaydlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1.1.1.2 root 1715: {
1.1.1.4 root 1716: BOOL success = FALSE;
1717:
1718: workprefs.gfx_pfullscreen = IsDlgButtonChecked (hDlg, IDC_PFULLSCREEN);
1719: workprefs.gfx_afullscreen = IsDlgButtonChecked (hDlg, IDC_AFULLSCREEN);
1720: EnableWindow( GetDlgItem( hDlg, IDC_RESOLUTION ), workprefs.gfx_afullscreen ? TRUE:FALSE );
1721:
1722: workprefs.gfx_lores = IsDlgButtonChecked (hDlg, IDC_LORES);
1.1.1.2 root 1723: workprefs.gfx_correct_aspect = IsDlgButtonChecked (hDlg, IDC_ASPECT);
1.1.1.4 root 1724: workprefs.gfx_linedbl = ( IsDlgButtonChecked( hDlg, IDC_LM_SCANLINES ) ? 2 :
1.1.1.7 ! root 1725: IsDlgButtonChecked( hDlg, IDC_LM_DOUBLED ) ? 1 : 0 );
1.1.1.2 root 1726:
1.1.1.4 root 1727: workprefs.gfx_framerate = SendDlgItemMessage (hDlg, IDC_FRAMERATE, TBM_GETPOS, 0, 0);
1.1.1.2 root 1728:
1729: {
1.1.1.4 root 1730: char buffer[ MAX_FRAMERATE_LENGTH ];
1731: char Nth[ MAX_NTH_LENGTH ];
1732: LPSTR blah[1] = { Nth };
1733: LPTSTR string = NULL;
1734:
1735: WIN32GUI_LoadUIString( IDS_FRAMERATE, buffer, MAX_FRAMERATE_LENGTH );
1736: LoadNthString( workprefs.gfx_framerate - 1, Nth, MAX_NTH_LENGTH );
1737: if( FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_ALLOCATE_BUFFER,
1738: buffer, 0, 0, (LPTSTR)&string, MAX_FRAMERATE_LENGTH + MAX_NTH_LENGTH, (va_list *)blah ) == 0 )
1739: {
1740: DWORD dwLastError = GetLastError();
1741: sprintf (buffer, "Every %s Frame", nth[workprefs.gfx_framerate - 1]);
1742: SetDlgItemText( hDlg, IDC_RATETEXT, buffer );
1743: }
1744: else
1745: {
1746: SetDlgItemText( hDlg, IDC_RATETEXT, string );
1747: LocalFree( string );
1748: }
1749: workprefs.gfx_width = GetDlgItemInt( hDlg, IDC_XSIZE, &success, FALSE );
1.1.1.7 ! root 1750: if( !success )
! 1751: workprefs.gfx_width = 800;
1.1.1.4 root 1752: workprefs.gfx_height = GetDlgItemInt( hDlg, IDC_YSIZE, &success, FALSE );
1.1.1.7 ! root 1753: if( !success )
! 1754: workprefs.gfx_height = 600;
1.1.1.2 root 1755: }
1.1.1.4 root 1756: workprefs.gfx_xcenter = (IsDlgButtonChecked (hDlg, IDC_XCENTER) ? 2 : 0 ); /* Smart centering */
1757: workprefs.gfx_ycenter = (IsDlgButtonChecked (hDlg, IDC_YCENTER) ? 2 : 0 ); /* Smart centering */
1.1.1.2 root 1758:
1.1.1.4 root 1759: if (msg == WM_COMMAND && LOWORD (wParam) == IDC_RESOLUTION && HIWORD (wParam) == CBN_SELCHANGE)
1760: {
1761: LONG posn;
1762: posn = SendDlgItemMessage (hDlg, IDC_RESOLUTION, CB_GETCURSEL, 0, 0);
1763: if (posn == CB_ERR)
1.1.1.7 ! root 1764: return;
! 1765: workprefs.gfx_width = DisplayModes[posn].res.width;
! 1766: workprefs.gfx_height = DisplayModes[posn].res.height;
! 1767: switch( DisplayModes[posn].depth )
! 1768: {
! 1769: case 2:
! 1770: workprefs.color_mode = 2;
! 1771: break;
! 1772: case 3:
! 1773: case 4:
! 1774: workprefs.color_mode = 5;
! 1775: break;
! 1776: default:
! 1777: workprefs.color_mode = 0;
! 1778: break;
! 1779: }
! 1780: /* Set the Int boxes */
! 1781: SetDlgItemInt( hDlg, IDC_XSIZE, workprefs.gfx_width, FALSE );
! 1782: SetDlgItemInt( hDlg, IDC_YSIZE, workprefs.gfx_height, FALSE );
1.1.1.2 root 1783: }
1784: }
1785:
1.1.1.4 root 1786: static BOOL CALLBACK DisplayDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1.1.1.2 root 1787: {
1788: static int recursive = 0;
1.1.1.4 root 1789: HKEY hPixelFormatKey;
1790: RGBFTYPE colortype = RGBFB_NONE;
1791: DWORD dwType = REG_DWORD;
1792: DWORD dwDisplayInfoSize = sizeof( colortype );
1793:
1794: switch (msg)
1795: {
1796: case WM_INITDIALOG:
1797: pages[DISPLAY_ID] = hDlg;
1.1.1.2 root 1798: SendDlgItemMessage (hDlg, IDC_FRAMERATE, TBM_SETPAGESIZE, 0, 1);
1799: SendDlgItemMessage (hDlg, IDC_FRAMERATE, TBM_SETRANGE, TRUE, MAKELONG (MIN_REFRESH_RATE, MAX_REFRESH_RATE));
1.1.1.4 root 1800: init_resolution_combo( hDlg );
1.1.1.2 root 1801:
1.1.1.4 root 1802: case WM_USER:
1.1.1.2 root 1803: recursive++;
1.1.1.4 root 1804: values_to_displaydlg (hDlg);
1805: enable_for_displaydlg (hDlg);
1.1.1.2 root 1806: recursive--;
1.1.1.7 ! root 1807: break;
1.1.1.2 root 1808:
1.1.1.4 root 1809: case WM_HSCROLL:
1810: case WM_COMMAND:
1.1.1.2 root 1811: if (recursive > 0)
1812: break;
1813: recursive++;
1.1.1.4 root 1814: if( ( wParam == IDC_TEST16BIT ) && DirectDraw_Start() )
1815: {
1816: if( RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\CodePoet Computing\\WinUAE", 0, KEY_ALL_ACCESS, &hPixelFormatKey ) == ERROR_SUCCESS )
1817: {
1818: char szMessage[ 4096 ];
1819: char szTitle[ MAX_PATH ];
1820: WIN32GUI_LoadUIString( IDS_GFXCARDCHECK, szMessage, 4096 );
1821: WIN32GUI_LoadUIString( IDS_GFXCARDTITLE, szTitle, MAX_PATH );
1822:
1823: if( MessageBox( NULL, szMessage, szTitle,
1824: MB_YESNO | MB_ICONWARNING | MB_TASKMODAL | MB_SETFOREGROUND ) == IDYES )
1825: {
1826: colortype = WIN32GFX_FigurePixelFormats(0);
1827: RegSetValueEx( hPixelFormatKey, "DisplayInfo", 0, REG_DWORD, (CONST BYTE *)&colortype, sizeof( colortype ) );
1828: }
1829: RegCloseKey( hPixelFormatKey );
1830: }
1831: else
1832: {
1833: write_log( "WinUAE is missing HKEY_LOCAL_MACHINE Registry keys! These can only be created by a valid Setup program.\n" );
1834: }
1835: DirectDraw_Release();
1836: }
1837: else
1838: {
1839: values_from_displaydlg (hDlg, msg, wParam, lParam);
1840: enable_for_displaydlg( hDlg );
1841: }
1.1.1.2 root 1842: recursive--;
1843: break;
1844:
1.1.1.4 root 1845: case WM_NOTIFY:
1846: switch (((NMHDR *) lParam)->code)
1847: {
1848: case PSN_HELP:
1849: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "display.htm" );
1.1.1.2 root 1850: break;
1851:
1.1.1.4 root 1852: case PSN_APPLY:
1853: /* Copy stuff from workprefs and config_xxx settings */
1854: gui_to_prefs ();
1855: break;
1856:
1857: case PSN_RESET:
1858: if (allow_quit)
1859: {
1.1.1.2 root 1860: quit_program = 1;
1861: regs.spcflags |= SPCFLAG_BRK;
1862: }
1863: break;
1864: }
1.1.1.7 ! root 1865: break;
1.1.1.2 root 1866: }
1867: return FALSE;
1868: }
1869:
1.1.1.4 root 1870: static void values_to_chipsetdlg (HWND hDlg)
1.1.1.2 root 1871: {
1.1.1.4 root 1872: char buffer[ MAX_FRAMERATE_LENGTH + MAX_NTH_LENGTH ];
1873: char Nth[ MAX_NTH_LENGTH ];
1874: LPSTR blah[1] = { Nth };
1875: LPTSTR string = NULL;
1876: int d,d2,index;
1877:
1878: switch( workprefs.chipset_mask )
1879: {
1880: case 0:
1881: CheckRadioButton( hDlg, IDC_OCS, IDC_AGA, IDC_OCS+0 );
1882: break;
1883: case CSMASK_ECS_AGNUS:
1884: CheckRadioButton( hDlg, IDC_OCS, IDC_AGA, IDC_OCS+1 );
1885: break;
1886: case CSMASK_ECS_DENISE:
1887: CheckRadioButton( hDlg, IDC_OCS, IDC_AGA, IDC_OCS+2 );
1888: break;
1889: case CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE:
1890: CheckRadioButton( hDlg, IDC_OCS, IDC_AGA, IDC_OCS+3 );
1891: break;
1892: case CSMASK_AGA:
1893: case CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE | CSMASK_AGA:
1894: CheckRadioButton( hDlg, IDC_OCS, IDC_AGA, IDC_OCS+4 );
1895: break;
1896: }
1897:
1898: CheckDlgButton (hDlg, IDC_BLITIMM, workprefs.immediate_blits);
1899: CheckDlgButton (hDlg, IDC_NTSC, workprefs.ntscmode);
1900:
1901: CheckRadioButton (hDlg, IDC_COLLISION0, IDC_COLLISION3, IDC_COLLISION0 + workprefs.collision_level);
1902: CheckDlgButton (hDlg, IDC_FASTCOPPER, workprefs.fast_copper );
1.1.1.2 root 1903: }
1904:
1.1.1.4 root 1905: static void values_from_chipsetdlg (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1.1.1.2 root 1906: {
1.1.1.4 root 1907: BOOL success = FALSE;
1.1.1.2 root 1908:
1.1.1.4 root 1909: workprefs.fast_copper = IsDlgButtonChecked (hDlg, IDC_FASTCOPPER);
1910: workprefs.immediate_blits = IsDlgButtonChecked (hDlg, IDC_BLITIMM);
1911: workprefs.collision_level = (IsDlgButtonChecked (hDlg, IDC_COLLISION0) ? 0
1912: : IsDlgButtonChecked (hDlg, IDC_COLLISION1) ? 1
1913: : IsDlgButtonChecked (hDlg, IDC_COLLISION2) ? 2 : 3);
1914: workprefs.chipset_mask = (IsDlgButtonChecked( hDlg, IDC_OCS ) ? 0
1915: : IsDlgButtonChecked( hDlg, IDC_ECS_AGNUS ) ? CSMASK_ECS_AGNUS
1916: : IsDlgButtonChecked( hDlg, IDC_ECS_DENISE ) ? CSMASK_ECS_DENISE
1917: : IsDlgButtonChecked( hDlg, IDC_ECS ) ? CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE
1918: : CSMASK_AGA | CSMASK_ECS_AGNUS | CSMASK_ECS_DENISE);
1919: workprefs.ntscmode = (IsDlgButtonChecked (hDlg, IDC_NTSC) ? 1 : 0);
1.1.1.2 root 1920: }
1921:
1.1.1.4 root 1922: static BOOL CALLBACK ChipsetDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1.1.1.2 root 1923: {
1924: static int recursive = 0;
1.1.1.4 root 1925: HKEY hPixelFormatKey;
1926: RGBFTYPE colortype = RGBFB_NONE;
1927: DWORD dwType = REG_DWORD;
1928: DWORD dwDisplayInfoSize = sizeof( colortype );
1929:
1.1.1.2 root 1930: switch (msg) {
1.1.1.4 root 1931: case WM_INITDIALOG:
1932: pages[CHIPSET_ID] = hDlg;
1.1.1.2 root 1933:
1.1.1.4 root 1934: case WM_USER:
1.1.1.2 root 1935: recursive++;
1.1.1.4 root 1936: values_to_chipsetdlg (hDlg);
1937: enable_for_chipsetdlg (hDlg);
1.1.1.2 root 1938: recursive--;
1.1.1.7 ! root 1939: break;
1.1.1.2 root 1940:
1941: case WM_HSCROLL:
1942: case WM_COMMAND:
1943: if (recursive > 0)
1944: break;
1945: recursive++;
1.1.1.4 root 1946: values_from_chipsetdlg (hDlg, msg, wParam, lParam);
1947: enable_for_chipsetdlg( hDlg );
1.1.1.2 root 1948: recursive--;
1949: break;
1950:
1951: case WM_NOTIFY:
1952: switch (((NMHDR *) lParam)->code) {
1.1.1.4 root 1953: case PSN_HELP:
1954: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "chipset.htm" );
1955: break;
1956:
1957: case PSN_APPLY:
1958: /* Copy stuff from workprefs and config_xxx settings */
1959: gui_to_prefs ();
1.1.1.2 root 1960: break;
1961:
1962: case PSN_RESET:
1963: if (allow_quit) {
1964: quit_program = 1;
1965: regs.spcflags |= SPCFLAG_BRK;
1966: }
1967: break;
1968: }
1.1.1.4 root 1969: break;
1.1.1.2 root 1970: }
1971: return FALSE;
1972: }
1973:
1.1.1.4 root 1974: static void enable_for_memorydlg (HWND hDlg)
1.1.1.2 root 1975: {
1976: EnableWindow (GetDlgItem (hDlg, IDC_Z3TEXT), ! workprefs.address_space_24);
1977: EnableWindow (GetDlgItem (hDlg, IDC_Z3FASTRAM), ! workprefs.address_space_24);
1978: EnableWindow (GetDlgItem (hDlg, IDC_Z3FASTMEM), ! workprefs.address_space_24);
1979: EnableWindow (GetDlgItem (hDlg, IDC_FASTMEM), workprefs.chipmem_size <= 0x200000);
1980: EnableWindow (GetDlgItem (hDlg, IDC_FASTRAM), workprefs.chipmem_size <= 0x200000);
1981: EnableWindow (GetDlgItem (hDlg, IDC_FASTTEXT), workprefs.chipmem_size <= 0x200000);
1.1.1.4 root 1982: EnableWindow (GetDlgItem (hDlg, IDC_GFXCARDTEXT), ! workprefs.address_space_24);
1983: EnableWindow (GetDlgItem (hDlg, IDC_P96RAM), ! workprefs.address_space_24);
1984: EnableWindow (GetDlgItem (hDlg, IDC_P96MEM), ! workprefs.address_space_24);
1.1.1.2 root 1985: }
1986:
1.1.1.4 root 1987: static void values_to_memorydlg (HWND hDlg)
1.1.1.2 root 1988: {
1989: uae_u32 mem_size = 0;
1990:
1991: switch (workprefs.chipmem_size) {
1992: case 0x00080000: mem_size = 0; break;
1993: case 0x00100000: mem_size = 1; break;
1994: case 0x00200000: mem_size = 2; break;
1995: case 0x00400000: mem_size = 3; break;
1996: case 0x00800000: mem_size = 4; break;
1997: }
1998: SendDlgItemMessage (hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, mem_size);
1999: SetDlgItemText (hDlg, IDC_CHIPRAM, memsize_names[msi_chip[mem_size]]);
2000:
1.1.1.4 root 2001: mem_size = 0;
1.1.1.2 root 2002: switch (workprefs.fastmem_size) {
2003: case 0x00000000: mem_size = 0; break;
2004: case 0x00100000: mem_size = 1; break;
2005: case 0x00200000: mem_size = 2; break;
2006: case 0x00400000: mem_size = 3; break;
2007: case 0x00800000: mem_size = 4; break;
2008: case 0x01000000: mem_size = 5; break;
2009: }
2010: SendDlgItemMessage (hDlg, IDC_FASTMEM, TBM_SETPOS, TRUE, mem_size);
2011: SetDlgItemText (hDlg, IDC_FASTRAM, memsize_names[msi_fast[mem_size]]);
2012:
1.1.1.4 root 2013: mem_size = 0;
1.1.1.2 root 2014: switch (workprefs.bogomem_size) {
2015: case 0x00000000: mem_size = 0; break;
2016: case 0x00080000: mem_size = 1; break;
2017: case 0x00100000: mem_size = 2; break;
2018: }
2019: SendDlgItemMessage (hDlg, IDC_SLOWMEM, TBM_SETPOS, TRUE, mem_size);
2020: SetDlgItemText (hDlg, IDC_SLOWRAM, memsize_names[msi_bogo[mem_size]]);
2021:
1.1.1.4 root 2022: mem_size = 0;
1.1.1.2 root 2023: switch (workprefs.z3fastmem_size) {
1.1.1.4 root 2024: case 0x00000000: mem_size = 0; break; /* 0-megs */
2025: case 0x00100000: mem_size = 1; break; /* 1-megs */
2026: case 0x00200000: mem_size = 2; break; /* 2-megs */
2027: case 0x00400000: mem_size = 3; break; /* 4-megs */
2028: case 0x00800000: mem_size = 4; break; /* 8-megs */
2029: case 0x01000000: mem_size = 5; break; /* 16-megs */
2030: case 0x02000000: mem_size = 6; break; /* 32-megs */
2031: case 0x04000000: mem_size = 7; break; /* 64-megs */
2032: case 0x08000000: mem_size = 8; break; /* 128-megs */
2033: case 0x10000000: mem_size = 9; break; /* 256-megs */
2034: case 0x20000000: mem_size = 10; break; /* 512-megs */
2035: case 0x40000000: mem_size = 11; break; /* 1 GB-megs */
2036:
2037: }
2038: SendDlgItemMessage (hDlg, IDC_Z3FASTMEM, TBM_SETPOS, TRUE, mem_size);
2039: SetDlgItemText (hDlg, IDC_Z3FASTRAM, memsize_names[msi_z3fast[mem_size]]);
2040:
2041: mem_size = 0;
2042: switch (workprefs.gfxmem_size) {
1.1.1.2 root 2043: case 0x00000000: mem_size = 0; break;
2044: case 0x00100000: mem_size = 1; break;
2045: case 0x00200000: mem_size = 2; break;
2046: case 0x00400000: mem_size = 3; break;
2047: case 0x00800000: mem_size = 4; break;
1.1.1.4 root 2048: case 0x01000000: mem_size = 5; break;
2049: case 0x02000000: mem_size = 6; break;
1.1.1.2 root 2050: }
1.1.1.4 root 2051: SendDlgItemMessage (hDlg, IDC_P96MEM, TBM_SETPOS, TRUE, mem_size);
2052: SetDlgItemText (hDlg, IDC_P96RAM, memsize_names[msi_gfx[mem_size]]);
1.1.1.2 root 2053: }
2054:
1.1.1.4 root 2055: static void fix_values_memorydlg (void)
1.1.1.2 root 2056: {
2057: if (workprefs.chipmem_size > 0x200000)
2058: workprefs.fastmem_size = 0;
2059: }
2060:
1.1.1.4 root 2061: static BOOL CALLBACK MemoryDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1.1.1.2 root 2062: {
1.1.1.4 root 2063: static int recursive = 0;
2064: unsigned int max_z3_mem = MAX_Z3_MEM;
2065: MEMORYSTATUS memstats;
2066:
2067: switch (msg)
2068: {
2069: case WM_INITDIALOG:
2070: pages[MEMORY_ID] = hDlg;
2071:
2072: memstats.dwLength = sizeof( memstats );
2073: GlobalMemoryStatus( &memstats );
2074: while( ( memstats.dwAvailPageFile + memstats.dwAvailPhys - 32000000) < (DWORD)( 1 << (max_z3_mem + 19) ) )
2075: max_z3_mem--;
2076:
1.1.1.2 root 2077: SendDlgItemMessage (hDlg, IDC_CHIPMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_CHIP_MEM, MAX_CHIP_MEM));
2078: SendDlgItemMessage (hDlg, IDC_FASTMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_FAST_MEM, MAX_FAST_MEM));
2079: SendDlgItemMessage (hDlg, IDC_SLOWMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_SLOW_MEM, MAX_SLOW_MEM));
1.1.1.4 root 2080: SendDlgItemMessage (hDlg, IDC_Z3FASTMEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_Z3_MEM, max_z3_mem));
2081: SendDlgItemMessage (hDlg, IDC_P96MEM, TBM_SETRANGE, TRUE, MAKELONG (MIN_P96_MEM, MAX_P96_MEM));
1.1.1.2 root 2082:
1.1.1.4 root 2083: case WM_USER:
2084: recursive++;
2085: fix_values_memorydlg ();
2086: values_to_memorydlg (hDlg);
2087: enable_for_memorydlg (hDlg);
2088: recursive--;
1.1.1.7 ! root 2089: break;
1.1.1.2 root 2090:
2091: case WM_HSCROLL:
2092: workprefs.chipmem_size = memsizes[msi_chip[SendMessage (GetDlgItem (hDlg, IDC_CHIPMEM), TBM_GETPOS, 0, 0)]];
2093: workprefs.bogomem_size = memsizes[msi_bogo[SendMessage (GetDlgItem (hDlg, IDC_SLOWMEM), TBM_GETPOS, 0, 0)]];
2094: workprefs.fastmem_size = memsizes[msi_fast[SendMessage (GetDlgItem (hDlg, IDC_FASTMEM), TBM_GETPOS, 0, 0)]];
2095: workprefs.z3fastmem_size = memsizes[msi_z3fast[SendMessage (GetDlgItem (hDlg, IDC_Z3FASTMEM), TBM_GETPOS, 0, 0)]];
1.1.1.4 root 2096: workprefs.gfxmem_size = memsizes[msi_gfx[SendMessage (GetDlgItem (hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0)]];
2097: fix_values_memorydlg();
2098: values_to_memorydlg(hDlg);
2099: enable_for_memorydlg(hDlg);
1.1.1.7 ! root 2100: break;
1.1.1.4 root 2101:
2102: case WM_COMMAND:
2103: if (recursive > 0)
2104: break;
2105: recursive++;
2106: values_to_memorydlg (hDlg);
2107: recursive--;
1.1.1.2 root 2108: break;
2109:
2110: case WM_NOTIFY:
1.1.1.4 root 2111: switch (((NMHDR *) lParam)->code)
1.1.1.7 ! root 2112: {
1.1.1.4 root 2113: case PSN_HELP:
2114: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "ram.htm" );
1.1.1.7 ! root 2115: break;
1.1.1.4 root 2116:
2117: case PSN_APPLY:
2118: /* Copy stuff from workprefs and config_xxx settings */
2119: gui_to_prefs ();
1.1.1.2 root 2120: break;
1.1.1.4 root 2121:
2122: case PSN_RESET:
2123: if (allow_quit)
2124: {
1.1.1.2 root 2125: quit_program = 1;
2126: regs.spcflags |= SPCFLAG_BRK;
2127: }
2128: break;
2129: }
2130: }
2131: return FALSE;
2132: }
2133:
1.1.1.4 root 2134: static void values_to_kickstartdlg (HWND hDlg)
2135: {
2136: SetDlgItemText( hDlg, IDC_ROMFILE, workprefs.romfile );
2137: SetDlgItemText( hDlg, IDC_KEYFILE, workprefs.keyfile );
2138: // Disable Expansion ROM settings for now (CD32 related)
2139: ShowWindow( GetDlgItem( hDlg, IDC_ROMFILE2TEXT ), SW_HIDE );
2140: ShowWindow( GetDlgItem( hDlg, IDC_ROMFILE2 ), SW_HIDE );
2141: ShowWindow( GetDlgItem( hDlg, IDC_ROMCHOOSER2 ), SW_HIDE );
2142: }
2143:
2144: static BOOL CALLBACK KickstartDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
2145: {
2146: switch( msg )
2147: {
2148: case WM_INITDIALOG:
2149: pages[KICKSTART_ID] = hDlg;
2150:
2151: case WM_USER:
2152: values_to_kickstartdlg (hDlg);
2153: return TRUE;
2154:
2155: case WM_COMMAND:
2156: switch( wParam )
2157: {
2158: case IDC_KICKCHOOSER:
2159: DiskSelection( hDlg, IDC_ROMFILE, 6, &workprefs );
2160: break;
1.1.1.7 ! root 2161:
1.1.1.4 root 2162: case IDC_KEYCHOOSER:
2163: DiskSelection( hDlg, IDC_KEYFILE, 7, &workprefs );
2164: break;
1.1.1.7 ! root 2165:
1.1.1.4 root 2166: default:
2167: if( SendMessage( GetDlgItem( hDlg, IDC_ROMFILE ), EM_GETMODIFY, 0, 0 ) )
2168: {
2169: GetDlgItemText( hDlg, IDC_ROMFILE, workprefs.romfile, CFG_ROM_LENGTH);
2170: SendMessage( GetDlgItem( hDlg, IDC_ROMFILE ), EM_SETMODIFY, 0, 0 );
2171: }
2172: if( SendMessage( GetDlgItem( hDlg, IDC_KEYFILE ), EM_GETMODIFY, 0, 0 ) )
2173: {
2174: GetDlgItemText( hDlg, IDC_KEYFILE, workprefs.keyfile, CFG_KEY_LENGTH);
2175: SendMessage( GetDlgItem( hDlg, IDC_ROMFILE ), EM_SETMODIFY, 0, 0 );
2176: }
2177: break;
2178: }
1.1.1.7 ! root 2179: break;
1.1.1.4 root 2180:
2181: case WM_NOTIFY:
2182: switch( ((NMHDR *) lParam)->code )
2183: {
2184: case PSN_HELP:
2185: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "rom.htm" );
2186: break;
2187:
2188: case PSN_APPLY:
2189: /* Copy stuff from workprefs and config_xxx settings */
2190: gui_to_prefs ();
2191: break;
1.1.1.7 ! root 2192:
1.1.1.4 root 2193: case PSN_RESET:
2194: if (allow_quit)
2195: {
2196: quit_program = 1;
2197: regs.spcflags |= SPCFLAG_BRK;
2198: }
2199: break;
2200: }
1.1.1.7 ! root 2201: break;
1.1.1.4 root 2202: }
2203: return FALSE;
2204: }
1.1.1.2 root 2205:
1.1.1.4 root 2206: static void enable_for_miscdlg (HWND hDlg)
1.1.1.2 root 2207: {
1.1.1.4 root 2208: if( !full_property_sheet )
2209: {
1.1.1.7 ! root 2210: EnableWindow( GetDlgItem( hDlg, IDC_JULIAN), FALSE);
! 2211: EnableWindow( GetDlgItem( hDlg, IDC_SOCKETS), FALSE);
! 2212: EnableWindow( GetDlgItem( hDlg, IDC_SHOWGUI ), FALSE );
! 2213: EnableWindow( GetDlgItem( hDlg, IDC_AUTOCONFIG ), FALSE );
! 2214: EnableWindow( GetDlgItem( hDlg, IDC_CREATELOGFILE ), FALSE );
! 2215: EnableWindow( GetDlgItem( hDlg, IDC_ILLEGAL ), FALSE );
! 2216: EnableWindow( GetDlgItem( hDlg, IDC_NOSPEED ), FALSE );
! 2217: EnableWindow( GetDlgItem( hDlg, IDC_NOSOUND ), FALSE );
1.1.1.4 root 2218: EnableWindow( GetDlgItem( hDlg, IDC_NOOVERLAY ), FALSE );
1.1.1.7 ! root 2219: ShowWindow( GetDlgItem( hDlg, IDC_RESETAMIGA ), SW_SHOW );
! 2220: ShowWindow( GetDlgItem( hDlg, IDC_QUITEMU ), SW_SHOW );
1.1.1.2 root 2221: }
1.1.1.4 root 2222: // Turn off cd.device and c2p h/w (Akiko) check-boxes for now
2223: ShowWindow( GetDlgItem( hDlg, IDC_AKIKOC2P ), SW_HIDE );
2224: ShowWindow( GetDlgItem( hDlg, IDC_CDDEVICE ), SW_HIDE );
1.1.1.2 root 2225: }
2226:
1.1.1.4 root 2227: static void values_to_miscdlg (HWND hDlg)
1.1.1.2 root 2228: {
1.1.1.4 root 2229: CheckDlgButton( hDlg, IDC_SOCKETS, workprefs.socket_emu );
2230: CheckDlgButton( hDlg, IDC_ILLEGAL, workprefs.illegal_mem);
1.1.1.2 root 2231: }
2232:
1.1.1.4 root 2233: static BOOL CALLBACK MiscDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
1.1.1.2 root 2234: {
1.1.1.4 root 2235: switch (msg)
2236: {
2237: case WM_INITDIALOG:
2238: pages[MISC_ID] = hDlg;
1.1.1.2 root 2239:
1.1.1.4 root 2240: case WM_USER:
2241: values_to_miscdlg (hDlg);
2242: enable_for_miscdlg (hDlg);
1.1.1.2 root 2243: return TRUE;
2244:
1.1.1.4 root 2245: case WM_COMMAND:
2246: switch( wParam )
2247: {
2248: case IDC_DOSAVESTATE:
2249: DiskSelection( hDlg, wParam, 9, &workprefs );
2250: if( strlen( savestate_filename ) )
2251: {
2252: savestate_state = STATE_DOSAVE;
2253: }
2254: break;
2255: case IDC_DOLOADSTATE:
2256: DiskSelection( hDlg, wParam, 10, &workprefs );
2257: if( strlen( savestate_filename ) )
2258: {
2259: savestate_state = STATE_DORESTORE;
2260: }
2261: break;
2262: case IDC_RESETAMIGA:
2263: uae_reset();
2264: break;
2265: case IDC_QUITEMU:
2266: uae_quit();
2267: PropSheet_PressButton( hPropertySheet, PSBTN_CANCEL );
2268: break;
2269: case IDC_SOCKETS:
2270: workprefs.socket_emu = IsDlgButtonChecked( hDlg, IDC_SOCKETS );
2271: break;
2272: case IDC_ILLEGAL:
2273: workprefs.illegal_mem = IsDlgButtonChecked (hDlg, IDC_ILLEGAL);
2274: break;
2275: }
1.1.1.2 root 2276: break;
2277:
1.1.1.4 root 2278: case WM_NOTIFY:
2279: switch (((NMHDR *) lParam)->code)
2280: {
2281: case PSN_HELP:
2282: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "misc.htm" );
1.1.1.2 root 2283: break;
2284:
1.1.1.4 root 2285: case PSN_APPLY:
2286: /* Copy stuff from workprefs and config_xxx settings */
2287: gui_to_prefs ();
2288: break;
2289:
2290: case PSN_RESET:
2291: if (allow_quit)
2292: {
1.1.1.2 root 2293: quit_program = 1;
2294: regs.spcflags |= SPCFLAG_BRK;
2295: }
2296: break;
2297: }
1.1.1.7 ! root 2298: break;
1.1.1.2 root 2299: }
2300: return FALSE;
2301: }
2302:
1.1.1.4 root 2303: static int cpu_ids[] = { IDC_CPU0, IDC_CPU0, IDC_CPU1, IDC_CPU1, IDC_CPU2, IDC_CPU4, IDC_CPU3, IDC_CPU5, IDC_CPU6, IDC_CPU6 };
2304: static int trust_ids[] = { IDC_TRUST0, IDC_TRUST1, IDC_TRUST1, IDC_TRUST2 };
1.1.1.2 root 2305:
2306: static void enable_for_cpudlg (HWND hDlg)
2307: {
1.1.1.4 root 2308: /* The "compatible" checkbox is only available when CPU type is 68000 */
2309: EnableWindow (GetDlgItem (hDlg, IDC_COMPATIBLE), workprefs.cpu_level == 0);
2310:
2311: /* These four items only get enabled when adjustable CPU style is enabled */
1.1.1.2 root 2312: EnableWindow (GetDlgItem (hDlg, IDC_SPEED), workprefs.m68k_speed > 0);
2313: EnableWindow (GetDlgItem (hDlg, IDC_CS_CPU_TEXT), workprefs.m68k_speed > 0);
2314: EnableWindow (GetDlgItem (hDlg, IDC_CS_CHIPSET_TEXT), workprefs.m68k_speed > 0);
1.1.1.4 root 2315: EnableWindow (GetDlgItem (hDlg, IDC_CPUTEXT), workprefs.m68k_speed > 0 );
2316:
1.1.1.2 root 2317: }
2318:
2319: static void values_to_cpudlg (HWND hDlg)
2320: {
1.1.1.4 root 2321: SendDlgItemMessage (hDlg, IDC_SPEED, TBM_SETPOS, TRUE, workprefs.m68k_speed <= 0 ? 1 : workprefs.m68k_speed / CYCLE_UNIT );
2322: SetDlgItemInt( hDlg, IDC_CPUTEXT, workprefs.m68k_speed <= 0 ? 1 : workprefs.m68k_speed / CYCLE_UNIT, FALSE );
1.1.1.2 root 2323: CheckDlgButton (hDlg, IDC_COMPATIBLE, workprefs.cpu_compatible);
1.1.1.4 root 2324: CheckRadioButton (hDlg, IDC_CPU0, IDC_CPU6, cpu_ids[workprefs.cpu_level * 2 + !workprefs.address_space_24]);
1.1.1.2 root 2325:
2326: if (workprefs.m68k_speed == -1)
1.1.1.4 root 2327: CheckRadioButton( hDlg, IDC_CS_HOST, IDC_CS_ADJUSTABLE, IDC_CS_HOST );
1.1.1.2 root 2328: else if (workprefs.m68k_speed == 0)
1.1.1.4 root 2329: CheckRadioButton( hDlg, IDC_CS_HOST, IDC_CS_ADJUSTABLE, IDC_CS_68000 );
1.1.1.2 root 2330: else
1.1.1.4 root 2331: CheckRadioButton( hDlg, IDC_CS_HOST, IDC_CS_ADJUSTABLE, IDC_CS_ADJUSTABLE );
1.1.1.2 root 2332: }
2333:
2334: static void values_from_cpudlg (HWND hDlg)
2335: {
2336: int newcpu;
1.1.1.4 root 2337: int newtrust;
2338:
1.1.1.2 root 2339: workprefs.cpu_compatible = IsDlgButtonChecked (hDlg, IDC_COMPATIBLE);
1.1.1.4 root 2340: workprefs.m68k_speed = IsDlgButtonChecked (hDlg, IDC_CS_HOST) ? -1
2341: : IsDlgButtonChecked (hDlg, IDC_CS_68000) ? 0
2342: : SendMessage (GetDlgItem (hDlg, IDC_SPEED), TBM_GETPOS, 0, 0) * CYCLE_UNIT;
2343:
1.1.1.2 root 2344: newcpu = (IsDlgButtonChecked (hDlg, IDC_CPU0) ? 0
1.1.1.4 root 2345: : IsDlgButtonChecked (hDlg, IDC_CPU1) ? 1
2346: : IsDlgButtonChecked (hDlg, IDC_CPU2) ? 2
2347: : IsDlgButtonChecked (hDlg, IDC_CPU3) ? 3
2348: : IsDlgButtonChecked (hDlg, IDC_CPU4) ? 4
2349: : IsDlgButtonChecked (hDlg, IDC_CPU5) ? 5 : 6);
2350: /* When switching away from 68000, disable 24 bit addressing. */
2351: switch( newcpu )
2352: {
2353: case 0: // 68000
2354: case 1: // 68010
2355: case 2: // 68EC020
2356: case 3: // 68EC020+FPU
1.1.1.2 root 2357: workprefs.address_space_24 = 1;
1.1.1.4 root 2358: workprefs.cpu_level = newcpu;
2359: break;
2360:
2361: case 4: // 68020
2362: case 5: // 68020+FPU
2363: case 6: // 68040
2364: workprefs.address_space_24 = 0;
2365: workprefs.cpu_level = newcpu - 2;
2366: break;
1.1.1.2 root 2367: }
1.1.1.4 root 2368: if (newcpu > 0)
2369: workprefs.cpu_compatible = 0;
2370:
2371: if( pages[ KICKSTART_ID ] )
2372: SendMessage( pages[ KICKSTART_ID ], WM_USER, 0, 0 );
2373: if( pages[ DISPLAY_ID ] )
2374: SendMessage( pages[ DISPLAY_ID ], WM_USER, 0, 0 );
2375: if( pages[ MEMORY_ID ] )
1.1.1.7 ! root 2376: SendMessage( pages[ MEMORY_ID ], WM_USER, 0, 0 );
1.1.1.2 root 2377: }
2378:
2379: static BOOL CALLBACK CPUDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
2380: {
2381: static int recursive = 0;
1.1.1.4 root 2382:
1.1.1.2 root 2383: switch (msg) {
1.1.1.4 root 2384: case WM_INITDIALOG:
1.1.1.2 root 2385: pages[CPU_ID] = hDlg;
2386: SendDlgItemMessage (hDlg, IDC_SPEED, TBM_SETRANGE, TRUE, MAKELONG (MIN_M68K_PRIORITY, MAX_M68K_PRIORITY));
2387: SendDlgItemMessage (hDlg, IDC_SPEED, TBM_SETPAGESIZE, 0, 1);
2388:
1.1.1.4 root 2389: case WM_USER:
1.1.1.2 root 2390: recursive++;
2391: values_to_cpudlg (hDlg);
2392: enable_for_cpudlg (hDlg);
2393: recursive--;
2394: return TRUE;
2395:
1.1.1.4 root 2396: case WM_COMMAND:
1.1.1.2 root 2397: if (recursive > 0)
2398: break;
2399: recursive++;
2400: values_from_cpudlg (hDlg);
2401: values_to_cpudlg (hDlg);
2402: enable_for_cpudlg (hDlg);
2403: recursive--;
2404: break;
2405:
1.1.1.4 root 2406: case WM_HSCROLL:
2407: recursive++;
2408: values_from_cpudlg( hDlg );
2409: values_to_cpudlg( hDlg );
2410: enable_for_cpudlg( hDlg );
2411: recursive--;
2412: break;
2413:
2414: case WM_NOTIFY:
1.1.1.2 root 2415: switch (((NMHDR *) lParam)->code) {
1.1.1.4 root 2416: case PSN_HELP:
2417: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "cpu.htm" );
2418: break;
2419: case PSN_APPLY:
2420: /* Copy stuff from workprefs and config_xxx settings */
2421: gui_to_prefs ();
1.1.1.2 root 2422: break;
2423:
1.1.1.4 root 2424: case PSN_RESET:
1.1.1.2 root 2425: if (allow_quit) {
2426: quit_program = 1;
2427: regs.spcflags |= SPCFLAG_BRK;
2428: }
2429: break;
2430: }
2431: }
2432: return FALSE;
2433: }
2434:
1.1.1.4 root 2435: static BOOL sound_frequency_supported[ 4 ] = { 0, 0, 0, 0 };
2436:
2437: static void fill_sound_frequency_supported( void )
1.1.1.2 root 2438: {
1.1.1.4 root 2439: WAVEFORMATEX wavfmt;
2440: HWAVEOUT hWaveOut = NULL;
2441: int i = 0;
2442: MMRESULT result;
2443:
2444: wavfmt.cbSize = 0;
2445: wavfmt.wFormatTag = WAVE_FORMAT_PCM;
2446: wavfmt.nChannels = 2;
2447: wavfmt.nSamplesPerSec = 11025;
2448: wavfmt.wBitsPerSample = 16;
2449: wavfmt.nBlockAlign = 4;
2450: wavfmt.nAvgBytesPerSec = wavfmt.nBlockAlign * wavfmt.nSamplesPerSec;
2451:
2452: for( i = 0; i < 4; i++ )
2453: {
2454: if( i == 3 )
2455: wavfmt.nSamplesPerSec = 48000;
2456: else
2457: wavfmt.nSamplesPerSec = 11025 * (i+1);
2458: wavfmt.nAvgBytesPerSec = wavfmt.nBlockAlign * wavfmt.nSamplesPerSec;
2459: result = waveOutOpen( &hWaveOut, WAVE_MAPPER, &wavfmt, 0, 0, WAVE_FORMAT_QUERY );
2460: if( result == MMSYSERR_NOERROR )
2461: {
2462: sound_frequency_supported[i] = 1;
2463: }
2464: else
2465: {
2466: write_log( "WAVEOUT: Unsupported format of %d Hz\n", wavfmt.nSamplesPerSec );
2467: }
2468: }
2469: }
1.1.1.2 root 2470:
1.1.1.4 root 2471: static void enable_for_sounddlg (HWND hDlg)
2472: {
2473: EnableWindow( GetDlgItem( hDlg, IDC_FREQUENCY ), workprefs.produce_sound );
2474: EnableWindow( GetDlgItem( hDlg, IDC_11KHZ ), workprefs.produce_sound && sound_frequency_supported[0] );
2475: EnableWindow( GetDlgItem( hDlg, IDC_22KHZ ), workprefs.produce_sound && sound_frequency_supported[1] );
2476: EnableWindow( GetDlgItem( hDlg, IDC_44KHZ ), workprefs.produce_sound && sound_frequency_supported[2] );
2477: EnableWindow( GetDlgItem( hDlg, IDC_48KHZ ), workprefs.produce_sound && sound_frequency_supported[3] );
2478:
2479: EnableWindow( GetDlgItem( hDlg, IDC_SOUNDSIZE ), workprefs.produce_sound );
2480: EnableWindow( GetDlgItem( hDlg, IDC_8BIT ), workprefs.produce_sound );
2481: EnableWindow( GetDlgItem( hDlg, IDC_16BIT ), workprefs.produce_sound );
2482:
2483: EnableWindow( GetDlgItem( hDlg, IDC_STEREOMODE ), workprefs.produce_sound );
2484: EnableWindow( GetDlgItem( hDlg, IDC_STEREOMODE0 ), workprefs.produce_sound );
2485: EnableWindow( GetDlgItem( hDlg, IDC_STEREOMODE1 ), workprefs.produce_sound );
2486: EnableWindow( GetDlgItem( hDlg, IDC_STEREOMODE2 ), workprefs.produce_sound );
2487:
2488: EnableWindow( GetDlgItem( hDlg, IDC_SOUNDINTERPOLATION ), workprefs.produce_sound );
2489: EnableWindow( GetDlgItem( hDlg, IDC_INTERPOLATION0 ), workprefs.produce_sound );
2490: EnableWindow( GetDlgItem( hDlg, IDC_INTERPOLATION1 ), workprefs.produce_sound );
2491:
2492: EnableWindow( GetDlgItem( hDlg, IDC_SOUNDBUFFERMEM ), workprefs.produce_sound );
2493: EnableWindow( GetDlgItem( hDlg, IDC_SOUNDBUFFERRAM ), workprefs.produce_sound );
2494: EnableWindow( GetDlgItem( hDlg, IDC_SOUNDBUFFERTEXT ), workprefs.produce_sound );
2495:
2496: EnableWindow( GetDlgItem( hDlg, IDC_AUDIOSYNC ), workprefs.produce_sound );
2497: }
2498:
2499: static int exact_log2 (int v)
2500: {
2501: int l = 0;
2502: while ((v >>= 1) != 0)
2503: l++;
2504: return l;
1.1.1.2 root 2505: }
2506:
2507: static void values_to_sounddlg (HWND hDlg)
2508: {
2509: int which_button;
2510:
1.1.1.4 root 2511: if( (workprefs.sound_freq <= 11025) && sound_frequency_supported[0] )
1.1.1.2 root 2512: which_button = IDC_11KHZ;
1.1.1.4 root 2513: else if( (workprefs.sound_freq <= 22050) && sound_frequency_supported[1] )
1.1.1.2 root 2514: which_button = IDC_22KHZ;
1.1.1.4 root 2515: else if( (workprefs.sound_freq <= 44100) && sound_frequency_supported[2] )
1.1.1.2 root 2516: which_button = IDC_44KHZ;
1.1.1.4 root 2517: else if( sound_frequency_supported[3] )
1.1.1.2 root 2518: which_button = IDC_48KHZ;
1.1.1.4 root 2519: else
2520: which_button = IDC_22KHZ; /* default */
1.1.1.2 root 2521: CheckRadioButton (hDlg, IDC_11KHZ, IDC_48KHZ, which_button);
2522:
2523: CheckRadioButton (hDlg, IDC_8BIT, IDC_16BIT, workprefs.sound_bits == 16 ? IDC_16BIT : IDC_8BIT);
2524:
2525: switch (workprefs.produce_sound) {
2526: case 0: which_button = IDC_SOUND0; break;
2527: case 1: which_button = IDC_SOUND1; break;
2528: case 2: which_button = IDC_SOUND2; break;
2529: case 3: which_button = IDC_SOUND3; break;
2530: }
2531:
1.1.1.4 root 2532: CheckRadioButton( hDlg, IDC_SOUND0, IDC_SOUND3, which_button );
2533:
2534: switch (workprefs.stereo)
2535: {
2536: case 0:
2537: // mono
2538: which_button = IDC_STEREOMODE0;
2539: break;
2540: case 1:
2541: default:
2542: // stereo, but which type?
2543: if( workprefs.mixed_stereo )
2544: which_button = IDC_STEREOMODE2;
2545: else
2546: which_button = IDC_STEREOMODE1;
2547: break;
2548: }
2549: CheckRadioButton( hDlg, IDC_STEREOMODE0, IDC_STEREOMODE2, which_button );
1.1.1.2 root 2550:
1.1.1.4 root 2551: CheckRadioButton( hDlg, IDC_INTERPOLATION0, IDC_INTERPOLATION1, IDC_INTERPOLATION0 + workprefs.sound_interpol );
2552: SendDlgItemMessage( hDlg, IDC_SOUNDBUFFERRAM, TBM_SETPOS, TRUE, exact_log2 (currprefs.sound_maxbsiz / 256));
2553: SetDlgItemInt( hDlg, IDC_SOUNDBUFFERMEM, workprefs.sound_maxbsiz, FALSE );
1.1.1.2 root 2554: }
2555:
2556: static void values_from_sounddlg (HWND hDlg)
2557: {
2558: workprefs.sound_bits = IsDlgButtonChecked (hDlg, IDC_8BIT) ? 8 : 16;
2559: workprefs.sound_freq = (IsDlgButtonChecked (hDlg, IDC_11KHZ) ? 11025
2560: : IsDlgButtonChecked (hDlg, IDC_22KHZ) ? 22050
2561: : IsDlgButtonChecked (hDlg, IDC_44KHZ) ? 44100 : 48000);
2562: workprefs.produce_sound = (IsDlgButtonChecked (hDlg, IDC_SOUND0) ? 0
2563: : IsDlgButtonChecked (hDlg, IDC_SOUND1) ? 1
2564: : IsDlgButtonChecked (hDlg, IDC_SOUND2) ? 2 : 3);
1.1.1.4 root 2565: workprefs.mixed_stereo = 0;
2566: workprefs.stereo = IsDlgButtonChecked (hDlg, IDC_STEREOMODE0) ? 0 :
2567: IsDlgButtonChecked( hDlg, IDC_STEREOMODE1 ) ? 1 : (workprefs.mixed_stereo = 1);
2568:
2569: workprefs.sound_interpol = IsDlgButtonChecked( hDlg, IDC_INTERPOLATION0 ) ? 0 : 1;
2570: workprefs.sound_maxbsiz = GetDlgItemInt( hDlg, IDC_SOUNDBUFFERMEM, NULL, FALSE );
1.1.1.2 root 2571: }
2572:
2573: static BOOL CALLBACK SoundDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
2574: {
2575: static int recursive = 0;
1.1.1.4 root 2576:
1.1.1.2 root 2577: switch (msg) {
1.1.1.4 root 2578: case WM_INITDIALOG:
2579: fill_sound_frequency_supported();
2580: SendDlgItemMessage (hDlg, IDC_SOUNDBUFFERRAM, TBM_SETRANGE, TRUE, MAKELONG (MIN_SOUND_MEM, MAX_SOUND_MEM));
2581: SendDlgItemMessage (hDlg, IDC_SOUNDBUFFERRAM, TBM_SETPAGESIZE, 0, 1);
2582:
1.1.1.2 root 2583: pages[SOUND_ID] = hDlg;
2584:
1.1.1.4 root 2585: case WM_USER:
1.1.1.2 root 2586: recursive++;
2587: values_to_sounddlg (hDlg);
2588: enable_for_sounddlg (hDlg);
2589: recursive--;
2590: return TRUE;
2591:
1.1.1.4 root 2592: case WM_COMMAND:
1.1.1.2 root 2593: if (recursive > 0)
2594: break;
2595: recursive++;
2596: values_from_sounddlg (hDlg);
2597: enable_for_sounddlg (hDlg);
2598: recursive--;
2599: break;
2600:
1.1.1.4 root 2601: case WM_HSCROLL:
2602: workprefs.sound_maxbsiz = 512 << SendMessage( GetDlgItem( hDlg, IDC_SOUNDBUFFERRAM ), TBM_GETPOS, 0, 0 );
2603: SetDlgItemInt( hDlg, IDC_SOUNDBUFFERMEM, workprefs.sound_maxbsiz, FALSE );
2604: break;
2605:
2606: case WM_NOTIFY:
1.1.1.2 root 2607: switch (((NMHDR *) lParam)->code) {
1.1.1.4 root 2608: case PSN_HELP:
2609: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "sound.htm" );
1.1.1.2 root 2610: break;
1.1.1.4 root 2611: case PSN_APPLY:
2612: /* Copy stuff from workprefs and config_xxx settings */
2613: gui_to_prefs ();
2614: break;
2615: case PSN_RESET:
1.1.1.2 root 2616: if (allow_quit) {
2617: quit_program = 1;
2618: regs.spcflags |= SPCFLAG_BRK;
2619: }
2620: break;
2621: }
2622: break;
2623: }
2624: return FALSE;
2625: }
2626:
2627: struct fsvdlg_vals
2628: {
2629: char volume[4096];
2630: char rootdir[4096];
2631: int rw;
2632: };
2633:
2634: static struct fsvdlg_vals empty_fsvdlg = { "", "", 1 };
2635: static struct fsvdlg_vals current_fsvdlg;
2636:
2637: struct hfdlg_vals
2638: {
2639: char volumename[4096];
2640: char filename[4096];
1.1.1.4 root 2641: int sectors;
2642: int reserved;
2643: int surfaces;
2644: int cylinders;
2645: int blocksize;
1.1.1.2 root 2646: int rw;
2647: };
2648:
1.1.1.4 root 2649: static struct hfdlg_vals empty_hfdlg = { "", "", 32, 2, 1, 0, 512, 1 };
1.1.1.2 root 2650: static struct hfdlg_vals current_hfdlg;
2651:
2652: static int CALLBACK VolumeSettingsProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
2653: {
2654: static int recursive = 0;
2655: BROWSEINFO browse_info;
2656: char directory_path[MAX_PATH] = "";
2657: LPITEMIDLIST browse;
1.1.1.4 root 2658: char szTitle[ MAX_PATH ];
2659:
2660: WIN32GUI_LoadUIString( IDS_SELECTFILESYSROOT, szTitle, MAX_PATH );
1.1.1.2 root 2661:
2662: browse_info.hwndOwner = hDlg;
2663: browse_info.pidlRoot = NULL;
2664: browse_info.pszDisplayName = directory_path;
1.1.1.4 root 2665: browse_info.lpszTitle = "";
1.1.1.2 root 2666: browse_info.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS;
2667: browse_info.lpfn = NULL;
2668: browse_info.iImage = 0;
2669:
2670: switch (msg) {
2671: case WM_INITDIALOG:
2672: recursive++;
2673: SetDlgItemText (hDlg, IDC_VOLUME_NAME, current_fsvdlg.volume);
2674: SetDlgItemText (hDlg, IDC_PATH_NAME, current_fsvdlg.rootdir);
2675: CheckDlgButton (hDlg, IDC_RW, current_fsvdlg.rw);
2676: recursive--;
2677: return TRUE;
2678:
2679: case WM_COMMAND:
2680: if (recursive)
2681: break;
2682: recursive++;
2683: if (HIWORD (wParam) == BN_CLICKED) {
2684: switch (LOWORD (wParam)) {
2685: case IDC_SELECTOR:
2686: if ((browse = SHBrowseForFolder (&browse_info)) != NULL) {
2687: SHGetPathFromIDList (browse, directory_path);
2688: SetDlgItemText (hDlg, IDC_PATH_NAME, directory_path);
2689: }
2690: break;
2691: case IDOK:
1.1.1.4 root 2692: if( strlen( current_fsvdlg.rootdir ) == 0 )
2693: {
2694: char szMessage[ MAX_PATH ];
2695: char szTitle[ MAX_PATH ];
2696: WIN32GUI_LoadUIString( IDS_MUSTSELECTPATH, szMessage, MAX_PATH );
2697: WIN32GUI_LoadUIString( IDS_SETTINGSERROR, szTitle, MAX_PATH );
2698:
2699: MessageBox( hDlg, szMessage, szTitle,
1.1.1.2 root 2700: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
2701: break;
2702: }
1.1.1.4 root 2703: if( strlen( current_fsvdlg.volume ) == 0 )
2704: {
2705: char szMessage[ MAX_PATH ];
2706: char szTitle[ MAX_PATH ];
2707: WIN32GUI_LoadUIString( IDS_MUSTSELECTNAME, szMessage, MAX_PATH );
2708: WIN32GUI_LoadUIString( IDS_SETTINGSERROR, szTitle, MAX_PATH );
2709:
2710: MessageBox( hDlg, szMessage, szTitle,
1.1.1.2 root 2711: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
2712: break;
2713: }
2714: EndDialog (hDlg, 1);
2715:
2716: break;
2717: case IDCANCEL:
2718: EndDialog (hDlg, 0);
2719: break;
2720: }
2721: }
2722: GetDlgItemText (hDlg, IDC_PATH_NAME, current_fsvdlg.rootdir, sizeof current_fsvdlg.rootdir);
2723: GetDlgItemText (hDlg, IDC_VOLUME_NAME, current_fsvdlg.volume, sizeof current_fsvdlg.volume);
2724: current_fsvdlg.rw = IsDlgButtonChecked (hDlg, IDC_RW);
2725: recursive--;
2726: break;
2727: }
2728: return FALSE;
2729: }
2730:
2731: static int CALLBACK HardfileSettingsProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
2732: {
2733: static int recursive = 0;
1.1.1.4 root 2734: UINT setting;
1.1.1.2 root 2735:
2736: switch (msg) {
1.1.1.4 root 2737: case WM_INITDIALOG:
1.1.1.2 root 2738: recursive++;
2739: SetDlgItemText (hDlg, IDC_PATH_NAME, current_hfdlg.filename);
1.1.1.4 root 2740: SetDlgItemInt( hDlg, IDC_SECTORS, current_hfdlg.sectors, FALSE);
2741: SetDlgItemInt( hDlg, IDC_HEADS, current_hfdlg.surfaces, FALSE);
2742: SetDlgItemInt( hDlg, IDC_RESERVED, current_hfdlg.reserved, FALSE);
2743: SetDlgItemInt( hDlg, IDC_BLOCKSIZE, current_hfdlg.blocksize, FALSE);
1.1.1.2 root 2744: CheckDlgButton (hDlg, IDC_RW, current_hfdlg.rw);
2745: recursive--;
2746: return TRUE;
2747:
1.1.1.4 root 2748: case WM_COMMAND:
1.1.1.2 root 2749: if (recursive)
2750: break;
2751: recursive++;
2752:
2753: if (HIWORD (wParam) == BN_CLICKED) {
2754: switch (LOWORD (wParam)) {
1.1.1.4 root 2755: case IDC_CREATEHF:
1.1.1.2 root 2756: setting = CalculateHardfileSize (hDlg);
1.1.1.4 root 2757: if( !CreateHardFile(hDlg, setting) )
2758: {
2759: char szMessage[ MAX_PATH ];
2760: char szTitle[ MAX_PATH ];
2761: WIN32GUI_LoadUIString( IDS_FAILEDHARDFILECREATION, szMessage, MAX_PATH );
2762: WIN32GUI_LoadUIString( IDS_CREATIONERROR, szTitle, MAX_PATH );
2763:
2764: MessageBox( hDlg, szMessage, szTitle,
2765: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
2766: }
1.1.1.2 root 2767: break;
1.1.1.4 root 2768: case IDC_SELECTOR:
2769: DiskSelection (hDlg, IDC_PATH_NAME, 2, &workprefs );
1.1.1.2 root 2770: break;
1.1.1.4 root 2771: case IDOK:
2772: if( strlen( current_hfdlg.filename ) == 0 )
2773: {
2774: char szMessage[ MAX_PATH ];
2775: char szTitle[ MAX_PATH ];
2776: WIN32GUI_LoadUIString( IDS_MUSTSELECTFILE, szMessage, MAX_PATH );
2777: WIN32GUI_LoadUIString( IDS_SETTINGSERROR, szTitle, MAX_PATH );
2778:
2779: MessageBox( hDlg, szMessage, szTitle,
1.1.1.2 root 2780: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
2781: break;
2782: }
2783: EndDialog (hDlg, 1);
2784: break;
1.1.1.4 root 2785: case IDCANCEL:
1.1.1.2 root 2786: EndDialog (hDlg, 0);
2787: break;
2788: }
2789: }
2790:
2791: GetDlgItemText (hDlg, IDC_PATH_NAME, current_hfdlg.filename, sizeof current_hfdlg.filename);
1.1.1.4 root 2792: current_hfdlg.sectors = GetDlgItemInt( hDlg, IDC_SECTORS, FALSE, FALSE );
2793: current_hfdlg.reserved = GetDlgItemInt( hDlg, IDC_RESERVED, FALSE, FALSE );
2794: current_hfdlg.surfaces = GetDlgItemInt( hDlg, IDC_HEADS, FALSE, FALSE );
2795: current_hfdlg.blocksize = GetDlgItemInt( hDlg, IDC_BLOCKSIZE, FALSE, FALSE );
1.1.1.2 root 2796: current_hfdlg.rw = IsDlgButtonChecked (hDlg, IDC_RW);
2797: recursive--;
2798:
2799: break;
2800: }
2801: return FALSE;
2802: }
2803:
2804: static void new_filesys (HWND hDlg)
2805: {
2806: const char *result;
2807:
1.1.1.4 root 2808: result = add_filesys_unit (workprefs.mountinfo, current_fsvdlg.volume,
2809: current_fsvdlg.rootdir, ! current_fsvdlg.rw, 0, 0, 0, 0);
1.1.1.2 root 2810: if (result)
2811: MessageBox (hDlg, result, "Bad directory",
2812: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
2813: }
2814:
2815: static void new_hardfile (HWND hDlg)
2816: {
2817: const char *result;
2818:
1.1.1.4 root 2819: result = add_filesys_unit (workprefs.mountinfo, 0, current_hfdlg.filename,
2820: ! current_hfdlg.rw, current_hfdlg.sectors, current_hfdlg.surfaces,
2821: current_hfdlg.reserved, current_hfdlg.blocksize);
1.1.1.2 root 2822: if (result)
2823: MessageBox (hDlg, result, "Bad hardfile",
2824: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
2825: }
2826:
2827: static void harddisk_remove (HWND hDlg)
2828: {
2829: int entry = listview_find_selected (GetDlgItem (hDlg, IDC_VOLUMELIST));
2830: if (entry < 0)
2831: return;
1.1.1.4 root 2832: kill_filesys_unit (workprefs.mountinfo, entry);
1.1.1.2 root 2833: }
2834:
2835: static void harddisk_move (HWND hDlg, int up)
2836: {
2837: int entry = listview_find_selected (GetDlgItem (hDlg, IDC_VOLUMELIST));
2838: if (entry < 0)
2839: return;
1.1.1.4 root 2840: move_filesys_unit (workprefs.mountinfo, entry, up ? entry - 1 : entry + 1);
1.1.1.2 root 2841: }
2842:
2843: static void harddisk_edit (HWND hDlg)
2844: {
2845: int entry = listview_find_selected (GetDlgItem (hDlg, IDC_VOLUMELIST));
1.1.1.4 root 2846: char *volname, *rootdir;
2847: int secspertrack, surfaces, cylinders, reserved, size, blocksize, readonly;
2848: const char *failure;
2849:
1.1.1.2 root 2850: if (entry < 0)
2851: return;
1.1.1.4 root 2852:
2853: failure = get_filesys_unit (workprefs.mountinfo, entry, &volname, &rootdir, &readonly,
2854: &secspertrack, &surfaces, &reserved, &cylinders, &size,
2855: &blocksize);
2856:
2857: if( is_hardfile( workprefs.mountinfo, entry ) )
2858: {
2859: current_hfdlg.sectors = secspertrack;
2860: current_hfdlg.surfaces = surfaces;
2861: current_hfdlg.reserved = reserved;
2862: current_hfdlg.cylinders = cylinders;
2863: current_hfdlg.blocksize = blocksize;
1.1.1.2 root 2864:
2865: strncpy (current_hfdlg.filename, rootdir, (sizeof current_hfdlg.filename) - 1);
2866: current_hfdlg.filename[(sizeof current_hfdlg.filename) - 1] = '\0';
1.1.1.4 root 2867: current_hfdlg.rw = !readonly;
2868: if (DialogBox( hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDD_HARDFILE), hDlg, HardfileSettingsProc))
1.1.1.7 ! root 2869: {
1.1.1.2 root 2870: const char *result;
1.1.1.4 root 2871: result = set_filesys_unit (workprefs.mountinfo, entry, 0, current_hfdlg.filename,
2872: ! current_hfdlg.rw, current_hfdlg.sectors, current_hfdlg.surfaces,
2873: current_hfdlg.reserved, current_hfdlg.blocksize);
1.1.1.2 root 2874: if (result)
2875: MessageBox (hDlg, result, "Bad hardfile",
1.1.1.4 root 2876: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
1.1.1.2 root 2877: }
1.1.1.4 root 2878: }
2879: else /* Filesystem */
2880: {
1.1.1.2 root 2881: strncpy (current_fsvdlg.rootdir, rootdir, (sizeof current_fsvdlg.rootdir) - 1);
2882: current_fsvdlg.rootdir[(sizeof current_fsvdlg.rootdir) - 1] = '\0';
1.1.1.4 root 2883: strncpy (current_fsvdlg.volume, volname, (sizeof current_fsvdlg.volume) - 1);
1.1.1.2 root 2884: current_fsvdlg.volume[(sizeof current_fsvdlg.volume) - 1] = '\0';
1.1.1.4 root 2885: current_fsvdlg.rw = !readonly;
2886: if (DialogBox( hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDD_FILESYS), hDlg, VolumeSettingsProc)) {
1.1.1.2 root 2887: const char *result;
1.1.1.4 root 2888: result = set_filesys_unit (workprefs.mountinfo, entry, current_fsvdlg.volume,
2889: current_fsvdlg.rootdir, ! current_fsvdlg.rw, 0, 0, 0, 0);
1.1.1.2 root 2890: if (result)
2891: MessageBox (hDlg, result, "Bad hardfile",
1.1.1.4 root 2892: MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND);
1.1.1.2 root 2893: }
2894: }
2895: }
2896:
1.1.1.4 root 2897: static HWND cachedlist = NULL;
2898:
1.1.1.2 root 2899: static void harddiskdlg_button (HWND hDlg, int button)
2900: {
2901: switch (button) {
2902: case IDC_NEW_FS:
2903: current_fsvdlg = empty_fsvdlg;
1.1.1.4 root 2904: if (DialogBox( hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDD_FILESYS), hDlg, VolumeSettingsProc))
1.1.1.2 root 2905: new_filesys (hDlg);
2906: break;
2907:
2908: case IDC_NEW_HF:
2909: current_hfdlg = empty_hfdlg;
1.1.1.4 root 2910: if (DialogBox( hUIDLL ? hUIDLL : hInst, MAKEINTRESOURCE (IDD_HARDFILE), hDlg, HardfileSettingsProc))
1.1.1.2 root 2911: new_hardfile (hDlg);
2912: break;
2913:
2914: case IDC_EDIT:
2915: harddisk_edit (hDlg);
2916: break;
2917:
2918: case IDC_REMOVE:
2919: harddisk_remove (hDlg);
2920: break;
2921:
2922: case IDC_UP:
2923: harddisk_move (hDlg, 1);
1.1.1.4 root 2924: clicked_entry--;
1.1.1.2 root 2925: break;
2926:
2927: case IDC_DOWN:
2928: harddisk_move (hDlg, 0);
1.1.1.4 root 2929: clicked_entry++;
1.1.1.2 root 2930: break;
1.1.1.4 root 2931:
2932: case IDC_MAPDRIVES:
1.1.1.7 ! root 2933: break;
1.1.1.2 root 2934: }
2935: }
2936:
2937: static void harddiskdlg_volume_notify (HWND hDlg, NM_LISTVIEW *nmlistview)
2938: {
2939: HWND list = nmlistview->hdr.hwndFrom;
2940: int dblclick = 0;
2941: int entry = 0;
2942:
2943: switch (nmlistview->hdr.code) {
2944: case NM_DBLCLK:
2945: dblclick = 1;
2946: /* fall through */
2947: case NM_CLICK:
2948: entry = listview_entry_from_click (list);
1.1.1.4 root 2949: if (entry >= 0)
2950: {
2951: if(dblclick)
2952: harddisk_edit (hDlg);
2953: InitializeListView( hDlg );
2954: clicked_entry = entry;
2955: cachedlist = list;
2956: // Hilite the current selected item
2957: ListView_SetItemState( cachedlist, clicked_entry, LVIS_SELECTED, LVIS_SELECTED );
1.1.1.2 root 2958: }
2959: break;
2960: }
2961: }
2962:
2963: static BOOL CALLBACK HarddiskDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
2964: {
1.1.1.4 root 2965: static HICON hMoveUp = NULL, hMoveDown = NULL;
1.1.1.2 root 2966:
2967: switch (msg) {
1.1.1.4 root 2968: case WM_INITDIALOG:
2969: clicked_entry = 0;
1.1.1.2 root 2970: pages[HARDDISK_ID] = hDlg;
1.1.1.4 root 2971: if( !hMoveUp )
2972: hMoveUp = (HICON)LoadImage( hInst, MAKEINTRESOURCE( IDI_MOVE_UP ), IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS );
2973: if( !hMoveDown )
2974: hMoveDown = (HICON)LoadImage( hInst, MAKEINTRESOURCE( IDI_MOVE_DOWN ), IMAGE_ICON, 16, 16, LR_LOADMAP3DCOLORS );
2975: SendMessage( GetDlgItem( hDlg, IDC_UP ), BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hMoveUp );
2976: SendMessage( GetDlgItem( hDlg, IDC_DOWN ), BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hMoveDown );
2977:
2978: case WM_USER:
1.1.1.7 ! root 2979: InitializeListView( hDlg );
1.1.1.2 root 2980: break;
1.1.1.4 root 2981:
2982: case WM_COMMAND:
1.1.1.2 root 2983: if (HIWORD (wParam) == BN_CLICKED)
1.1.1.4 root 2984: {
1.1.1.2 root 2985: harddiskdlg_button (hDlg, LOWORD (wParam));
1.1.1.4 root 2986: InitializeListView( hDlg );
1.1.1.2 root 2987:
1.1.1.4 root 2988: if( clicked_entry < 0 )
2989: clicked_entry = 0;
2990: if( clicked_entry >= ListView_GetItemCount( cachedlist ) )
2991: clicked_entry = ListView_GetItemCount( cachedlist ) - 1;
2992:
2993: if( cachedlist && clicked_entry >= 0 )
2994: {
1.1.1.7 ! root 2995: // Hilite the current selected item
1.1.1.4 root 2996: ListView_SetItemState( cachedlist, clicked_entry, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
2997: }
2998: }
2999: break;
3000:
3001: case WM_NOTIFY:
1.1.1.2 root 3002: if (((LPNMHDR) lParam)->idFrom == IDC_VOLUMELIST)
3003: harddiskdlg_volume_notify (hDlg, (NM_LISTVIEW *) lParam);
3004: else {
3005: switch (((NMHDR *) lParam)->code) {
1.1.1.4 root 3006: case PSN_HELP:
3007: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "hard-drives.htm" );
1.1.1.7 ! root 3008: break;
1.1.1.4 root 3009: case PSN_APPLY:
3010: /* Copy stuff from workprefs and config_xxx settings */
3011: gui_to_prefs ();
1.1.1.2 root 3012: break;
1.1.1.4 root 3013: case PSN_RESET:
1.1.1.2 root 3014: if (allow_quit) {
3015: quit_program = 1;
3016: regs.spcflags |= SPCFLAG_BRK;
3017: }
3018: break;
3019: }
3020: }
3021: return TRUE;
1.1.1.4 root 3022: default:
1.1.1.2 root 3023: return FALSE;
3024: }
1.1.1.4 root 3025:
1.1.1.2 root 3026: return FALSE;
3027: }
3028:
1.1.1.4 root 3029: static void EnableFloppyButtons( HWND hDlg, int floppies )
3030: {
3031: switch( floppies )
3032: {
1.1.1.7 ! root 3033: case 1:
1.1.1.4 root 3034: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE1 ), TRUE );
3035: EnableWindow( GetDlgItem( hDlg, IDC_DF1TEXT ), FALSE );
3036: EnableWindow( GetDlgItem( hDlg, IDC_DF1 ), FALSE );
3037: EnableWindow( GetDlgItem( hDlg, IDC_EJECT1 ), FALSE );
3038:
3039: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE2 ), FALSE );
3040: EnableWindow( GetDlgItem( hDlg, IDC_DF2TEXT ), FALSE );
3041: EnableWindow( GetDlgItem( hDlg, IDC_DF2 ), FALSE );
3042: EnableWindow( GetDlgItem( hDlg, IDC_EJECT2 ), FALSE );
3043:
3044: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE3 ), FALSE );
3045: EnableWindow( GetDlgItem( hDlg, IDC_DF3TEXT ), FALSE );
3046: EnableWindow( GetDlgItem( hDlg, IDC_DF3 ), FALSE );
3047: EnableWindow( GetDlgItem( hDlg, IDC_EJECT3 ), FALSE );
3048:
3049: CheckDlgButton( hDlg, IDC_DISABLE1, BST_CHECKED );
3050: CheckDlgButton( hDlg, IDC_DISABLE2, BST_CHECKED );
3051: CheckDlgButton( hDlg, IDC_DISABLE3, BST_CHECKED );
3052: break;
3053: case 2:
3054: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE1 ), TRUE );
3055: EnableWindow( GetDlgItem( hDlg, IDC_DF1TEXT ), TRUE );
3056: EnableWindow( GetDlgItem( hDlg, IDC_DF1 ), TRUE );
3057: EnableWindow( GetDlgItem( hDlg, IDC_EJECT1 ), TRUE );
3058:
3059: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE2 ), TRUE );
3060: EnableWindow( GetDlgItem( hDlg, IDC_DF2TEXT ), FALSE );
3061: EnableWindow( GetDlgItem( hDlg, IDC_DF2 ), FALSE );
3062: EnableWindow( GetDlgItem( hDlg, IDC_EJECT2 ), FALSE );
3063:
3064: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE3 ), FALSE );
3065: EnableWindow( GetDlgItem( hDlg, IDC_DF3TEXT ), FALSE );
3066: EnableWindow( GetDlgItem( hDlg, IDC_DF3 ), FALSE );
3067: EnableWindow( GetDlgItem( hDlg, IDC_EJECT3 ), FALSE );
3068:
3069: CheckDlgButton( hDlg, IDC_DISABLE2, BST_CHECKED );
3070: CheckDlgButton( hDlg, IDC_DISABLE3, BST_CHECKED );
3071: break;
3072: case 3:
3073: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE2 ), TRUE );
3074: EnableWindow( GetDlgItem( hDlg, IDC_DF2TEXT ), TRUE );
3075: EnableWindow( GetDlgItem( hDlg, IDC_DF2 ), TRUE );
3076: EnableWindow( GetDlgItem( hDlg, IDC_EJECT2 ), TRUE );
3077:
3078: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE3 ), TRUE );
3079: EnableWindow( GetDlgItem( hDlg, IDC_DF3TEXT ), FALSE );
3080: EnableWindow( GetDlgItem( hDlg, IDC_DF3 ), FALSE );
3081: EnableWindow( GetDlgItem( hDlg, IDC_EJECT3 ), FALSE );
3082:
3083: CheckDlgButton( hDlg, IDC_DISABLE3, BST_CHECKED );
3084: break;
3085: case 4:
3086: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE3 ), TRUE );
3087: EnableWindow( GetDlgItem( hDlg, IDC_DF3TEXT ), TRUE );
3088: EnableWindow( GetDlgItem( hDlg, IDC_DF3 ), TRUE );
3089: EnableWindow( GetDlgItem( hDlg, IDC_EJECT3 ), TRUE );
3090: break;
3091: }
3092: }
3093:
1.1.1.2 root 3094: static BOOL CALLBACK FloppyDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
3095: {
3096: static int recursive = 0;
3097:
1.1.1.4 root 3098: switch (msg)
3099: {
3100: case WM_INITDIALOG:
1.1.1.2 root 3101: pages[FLOPPY_ID] = hDlg;
1.1.1.4 root 3102: EnableFloppyButtons( hDlg, workprefs.nr_floppies );
3103:
3104: case WM_USER:
1.1.1.2 root 3105: recursive++;
3106: SetDlgItemText (hDlg, IDC_DF0TEXT, workprefs.df[0]);
3107: SetDlgItemText (hDlg, IDC_DF1TEXT, workprefs.df[1]);
3108: SetDlgItemText (hDlg, IDC_DF2TEXT, workprefs.df[2]);
3109: SetDlgItemText (hDlg, IDC_DF3TEXT, workprefs.df[3]);
3110: recursive--;
3111: break;
1.1.1.4 root 3112:
3113: case WM_COMMAND:
1.1.1.2 root 3114: if (recursive > 0)
3115: break;
3116: recursive++;
1.1.1.4 root 3117: switch (wParam)
3118: {
3119: case IDC_DISABLE1:
3120: if( IsDlgButtonChecked( hDlg, IDC_DISABLE1 ) == BST_CHECKED )
3121: {
3122: EnableFloppyButtons( hDlg, 1 );
3123: workprefs.nr_floppies = 1;
3124: }
3125: else
3126: {
3127: EnableFloppyButtons( hDlg, 2 );
3128: workprefs.nr_floppies = 2;
3129: }
3130: break;
3131: case IDC_DISABLE2:
3132: if( IsDlgButtonChecked( hDlg, IDC_DISABLE2 ) == BST_CHECKED )
3133: {
3134: EnableWindow( GetDlgItem( hDlg, IDC_DISABLE3 ), FALSE );
3135: CheckDlgButton( hDlg, IDC_DISABLE3, BST_CHECKED );
3136: EnableFloppyButtons( hDlg, 2 );
3137: workprefs.nr_floppies = 2;
3138: }
3139: else
3140: {
3141: EnableFloppyButtons( hDlg, 3 );
3142: workprefs.nr_floppies = 3;
3143: }
3144: break;
3145: case IDC_DISABLE3:
3146: if( IsDlgButtonChecked( hDlg, IDC_DISABLE3 ) == BST_CHECKED )
3147: {
3148: EnableFloppyButtons( hDlg, 3 );
3149: workprefs.nr_floppies = 3;
3150: }
3151: else
3152: {
3153: EnableFloppyButtons( hDlg, 4 );
3154: workprefs.nr_floppies = 4;
3155: }
3156: break;
3157: case IDC_DF0:
3158: DiskSelection (hDlg, wParam, 0, &workprefs );
1.1.1.2 root 3159: break;
1.1.1.4 root 3160: case IDC_DF1:
3161: DiskSelection (hDlg, wParam, 0, &workprefs );
1.1.1.2 root 3162: break;
1.1.1.4 root 3163: case IDC_DF2:
3164: DiskSelection (hDlg, wParam, 0, &workprefs );
1.1.1.2 root 3165: break;
1.1.1.4 root 3166: case IDC_DF3:
3167: DiskSelection (hDlg, wParam, 0, &workprefs );
1.1.1.2 root 3168: break;
1.1.1.4 root 3169: case IDC_EJECT0:
3170: disk_eject(0);
1.1.1.2 root 3171: SetDlgItemText (hDlg, IDC_DF0TEXT, "");
1.1.1.4 root 3172: workprefs.df[0][0] = 0;
1.1.1.2 root 3173: break;
1.1.1.4 root 3174: case IDC_EJECT1:
3175: disk_eject(1);
1.1.1.2 root 3176: SetDlgItemText (hDlg, IDC_DF1TEXT, "");
1.1.1.4 root 3177: workprefs.df[1][0] = 0;
1.1.1.2 root 3178: break;
1.1.1.4 root 3179: case IDC_EJECT2:
3180: disk_eject(2);
1.1.1.2 root 3181: SetDlgItemText (hDlg, IDC_DF2TEXT, "");
1.1.1.4 root 3182: workprefs.df[2][0] = 0;
1.1.1.2 root 3183: break;
1.1.1.4 root 3184: case IDC_EJECT3:
3185: disk_eject(3);
1.1.1.2 root 3186: SetDlgItemText (hDlg, IDC_DF3TEXT, "");
1.1.1.4 root 3187: workprefs.df[3][0] = 0;
1.1.1.2 root 3188: break;
1.1.1.4 root 3189: case IDC_CREATE:
3190: DiskSelection (hDlg, wParam, 1, &workprefs );
1.1.1.2 root 3191: break;
1.1.1.4 root 3192: case IDC_CREATE_RAW:
3193: DiskSelection( hDlg, wParam, 1, &workprefs );
3194: break;
3195: }
3196: if( SendMessage( GetDlgItem( hDlg, IDC_DF0TEXT ), EM_GETMODIFY, 0, 0 ) )
3197: {
3198: GetDlgItemText (hDlg, IDC_DF0TEXT, workprefs.df[0], 255);
3199: SendMessage( GetDlgItem( hDlg, IDC_DF0TEXT ), EM_SETMODIFY, 0, 0 );
3200: }
3201:
3202: if( SendMessage( GetDlgItem( hDlg, IDC_DF1TEXT ), EM_GETMODIFY, 0, 0 ) )
3203: {
3204: GetDlgItemText (hDlg, IDC_DF1TEXT, workprefs.df[1], 255);
3205: SendMessage( GetDlgItem( hDlg, IDC_DF1TEXT ), EM_SETMODIFY, 0, 0 );
3206: }
3207:
3208: if( SendMessage( GetDlgItem( hDlg, IDC_DF2TEXT ), EM_GETMODIFY, 0, 0 ) )
3209: {
3210: GetDlgItemText (hDlg, IDC_DF2TEXT, workprefs.df[2], 255);
3211: SendMessage( GetDlgItem( hDlg, IDC_DF2TEXT ), EM_SETMODIFY, 0, 0 );
3212: }
3213:
3214: if( SendMessage( GetDlgItem( hDlg, IDC_DF3TEXT ), EM_GETMODIFY, 0, 0 ) )
3215: {
3216: GetDlgItemText (hDlg, IDC_DF3TEXT, workprefs.df[3], 255);
3217: SendMessage( GetDlgItem( hDlg, IDC_DF3TEXT ), EM_SETMODIFY, 0, 0 );
1.1.1.2 root 3218: }
3219: recursive--;
3220: break;
3221:
1.1.1.4 root 3222: case WM_NOTIFY:
3223: switch (((NMHDR *) lParam)->code)
3224: {
3225: case PSN_HELP:
3226: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "floppies.htm" );
3227: break;
3228: case PSN_APPLY:
3229: /* Copy stuff from workprefs and config_xxx settings */
3230: gui_to_prefs ();
1.1.1.2 root 3231: break;
1.1.1.4 root 3232: case PSN_RESET:
1.1.1.2 root 3233: if (allow_quit) {
3234: quit_program = 1;
3235: regs.spcflags |= SPCFLAG_BRK;
3236: }
3237: break;
3238: }
3239: return TRUE;
1.1.1.4 root 3240: default:
1.1.1.2 root 3241: return FALSE;
3242: }
3243:
3244: return FALSE;
3245: }
3246:
1.1.1.4 root 3247: PRINTER_INFO_1 *pInfo = NULL;
3248: DWORD dwEnumeratedPrinters = 0;
3249:
3250: static int joy0idc[] = {
3251: IDC_PORT0_JOY0, IDC_PORT0_JOY1, IDC_PORT0_MOUSE, IDC_PORT0_KBDA, IDC_PORT0_KBDB, IDC_PORT0_KBDC
3252: };
3253:
3254: static int joy1idc[] = {
3255: IDC_PORT1_JOY0, IDC_PORT1_JOY1, IDC_PORT1_MOUSE, IDC_PORT1_KBDA, IDC_PORT1_KBDB, IDC_PORT1_KBDC
3256: };
3257:
3258: static BOOL bNoMidiIn = FALSE;
3259:
3260: static void enable_for_portsdlg( HWND hDlg )
3261: {
3262: int i;
3263: if (! full_property_sheet)
3264: {
1.1.1.7 ! root 3265: /* Disable certain controls which are only to be set once at start-up... */
! 3266: EnableWindow( GetDlgItem( hDlg, IDC_SERIAL ), FALSE );
! 3267: EnableWindow( GetDlgItem( hDlg, IDC_PARALLEL ), FALSE );
! 3268: EnableWindow( GetDlgItem( hDlg, IDC_MIDIOUTLIST ), FALSE );
1.1.1.4 root 3269: EnableWindow( GetDlgItem( hDlg, IDC_MIDIINLIST ), FALSE );
1.1.1.7 ! root 3270: EnableWindow( GetDlgItem( hDlg, IDC_SHARED ), FALSE );
1.1.1.4 root 3271: }
3272: for( i = 0; i < 6; i++ )
3273: {
1.1.1.7 ! root 3274: EnableWindow( GetDlgItem( hDlg, joy0idc[i] ), TRUE );
! 3275: EnableWindow( GetDlgItem( hDlg, joy1idc[i] ), TRUE );
1.1.1.4 root 3276: }
3277: }
3278:
3279: static void UpdatePortRadioButtons( HWND hDlg )
3280: {
3281: int which_button1, which_button2;
3282:
3283: enable_for_portsdlg( hDlg );
3284: which_button1 = joy0idc[workprefs.jport0];
3285: if (CheckRadioButton (hDlg, IDC_PORT0_JOY0, IDC_PORT0_KBDC, which_button1) == 0)
3286: which_button1 = 0;
3287: else
3288: {
1.1.1.7 ! root 3289: EnableWindow( GetDlgItem( hDlg, joy1idc[workprefs.jport0] ), FALSE );
1.1.1.4 root 3290: }
3291: which_button2 = joy1idc[workprefs.jport1];
3292: if( workprefs.jport1 == workprefs.jport0 )
3293: {
1.1.1.7 ! root 3294: if( which_button2 == IDC_PORT1_KBDC )
! 3295: which_button2 = IDC_PORT1_KBDB;
! 3296: else
! 3297: which_button2++;
1.1.1.4 root 3298: }
3299: if (CheckRadioButton (hDlg, IDC_PORT1_JOY0, IDC_PORT1_KBDC, which_button2) == 0)
3300: which_button2 = 0;
3301: else
3302: {
1.1.1.7 ! root 3303: EnableWindow( GetDlgItem( hDlg, joy0idc[ workprefs.jport1 ] ), FALSE );
1.1.1.4 root 3304: }
3305: }
3306:
1.1.1.2 root 3307: static void values_from_portsdlg (HWND hDlg)
3308: {
3309: int item;
1.1.1.4 root 3310: /* 0 - joystick 0
3311: * 1 - joystick 1
3312: * 2 - mouse
3313: * 3 - numpad
3314: * 4 - cursor keys
3315: * 5 - elsewhere
3316: */
1.1.1.2 root 3317: if (IsDlgButtonChecked (hDlg, IDC_PORT0_JOY0)) {
1.1.1.4 root 3318: workprefs.jport0 = 0;
1.1.1.2 root 3319: }
3320: if (IsDlgButtonChecked (hDlg, IDC_PORT0_JOY1)) {
1.1.1.4 root 3321: workprefs.jport0 = 1;
1.1.1.2 root 3322: }
3323: if (IsDlgButtonChecked (hDlg, IDC_PORT0_MOUSE))
1.1.1.4 root 3324: workprefs.jport0 = 2;
1.1.1.2 root 3325: if (IsDlgButtonChecked (hDlg, IDC_PORT0_KBDA))
1.1.1.4 root 3326: workprefs.jport0 = 3;
1.1.1.2 root 3327: if (IsDlgButtonChecked (hDlg, IDC_PORT0_KBDB))
1.1.1.4 root 3328: workprefs.jport0 = 4;
1.1.1.2 root 3329: if (IsDlgButtonChecked (hDlg, IDC_PORT0_KBDC))
1.1.1.4 root 3330: workprefs.jport0 = 5;
1.1.1.2 root 3331:
3332: if (IsDlgButtonChecked (hDlg, IDC_PORT1_JOY0)) {
1.1.1.4 root 3333: workprefs.jport1 = 0;
1.1.1.2 root 3334: }
3335: if (IsDlgButtonChecked (hDlg, IDC_PORT1_JOY1)) {
1.1.1.4 root 3336: workprefs.jport1 = 1;
1.1.1.2 root 3337: }
3338: if (IsDlgButtonChecked (hDlg, IDC_PORT1_MOUSE))
1.1.1.4 root 3339: workprefs.jport1 = 2;
1.1.1.2 root 3340: if (IsDlgButtonChecked (hDlg, IDC_PORT1_KBDA))
1.1.1.4 root 3341: workprefs.jport1 = 3;
1.1.1.2 root 3342: if (IsDlgButtonChecked (hDlg, IDC_PORT1_KBDB))
1.1.1.4 root 3343: workprefs.jport1 = 4;
1.1.1.2 root 3344: if (IsDlgButtonChecked (hDlg, IDC_PORT1_KBDC))
1.1.1.4 root 3345: workprefs.jport1 = 5;
1.1.1.2 root 3346:
1.1.1.4 root 3347: item = SendDlgItemMessage( hDlg, IDC_PRINTERLIST, CB_GETCURSEL, 0, 0L );
3348: if( item != CB_ERR )
3349: {
3350: if( item )
3351: strcpy( workprefs.prtname, pInfo[item-1].pName );
3352: else
3353: strcpy( workprefs.prtname, "" );
3354: }
1.1.1.2 root 3355:
3356: item = SendDlgItemMessage (hDlg, IDC_SERIAL, CB_GETCURSEL, 0, 0L);
1.1.1.4 root 3357: switch( item )
3358: {
3359: case 1:
3360: case 2:
3361: case 3:
3362: case 4:
3363: case 5:
3364: case 6:
3365: case 7:
3366: case 8:
3367: workprefs.use_serial = 1;
3368: sprintf( workprefs.sername, "COM%d", item );
3369: EnableWindow( GetDlgItem( hDlg, IDC_MIDIOUTLIST ), TRUE );
3370: EnableWindow( GetDlgItem( hDlg, IDC_MIDIINLIST ), TRUE );
3371: break;
3372:
3373: default:
3374: workprefs.use_serial = 0;
3375: strcpy( workprefs.sername, "none" );
3376: EnableWindow( GetDlgItem( hDlg, IDC_MIDIOUTLIST ), FALSE );
3377: EnableWindow( GetDlgItem( hDlg, IDC_MIDIINLIST ), FALSE );
1.1.1.2 root 3378: break;
3379: }
1.1.1.4 root 3380: if( IsDlgButtonChecked( hDlg, IDC_SHARED ) )
1.1.1.7 ! root 3381: workprefs.serial_demand = 1;
1.1.1.4 root 3382: else
1.1.1.7 ! root 3383: workprefs.serial_demand = 0;
1.1.1.2 root 3384: }
3385:
3386: static void values_to_portsdlg (HWND hDlg)
3387: {
1.1.1.4 root 3388: LONG item_height, result = 0;
1.1.1.2 root 3389: RECT rect;
3390:
1.1.1.4 root 3391: if( *workprefs.prtname )
3392: {
3393: result = SendDlgItemMessage( hDlg, IDC_PRINTERLIST, CB_FINDSTRINGEXACT, -1, (LPARAM)workprefs.prtname );
3394: if( result < 0 )
3395: {
3396: // Warn the user that their printer-port selection is not valid on this machine
3397: char szMessage[ MAX_PATH ];
3398: WIN32GUI_LoadUIString( IDS_INVALIDPRTPORT, szMessage, MAX_PATH );
3399: gui_message( szMessage );
3400:
3401: // Disable the invalid parallel-port selection
3402: strcpy( workprefs.prtname, "none" );
3403:
3404: result = 0;
3405: }
3406: }
3407: SendDlgItemMessage( hDlg, IDC_PRINTERLIST, CB_SETCURSEL, result, 0 );
3408:
3409: CheckDlgButton( hDlg, IDC_SHARED, workprefs.serial_demand );
3410:
3411: if( strcasecmp( workprefs.sername, szNone ) == 0 )
3412: {
1.1.1.2 root 3413: SendDlgItemMessage (hDlg, IDC_SERIAL, CB_SETCURSEL, 0, 0L);
1.1.1.7 ! root 3414: workprefs.use_serial = 0;
1.1.1.4 root 3415: }
3416: else
3417: {
1.1.1.5 root 3418: int t = (workprefs.sername[0] == '\0' ? 0 : workprefs.sername[3] - '0');
3419: result = SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, t, 0L );
1.1.1.4 root 3420: if( result < 0 )
3421: {
1.1.1.5 root 3422: if (t > 0) {
3423: // Warn the user that their COM-port selection is not valid on this machine
3424: char szMessage[ MAX_PATH ];
3425: WIN32GUI_LoadUIString( IDS_INVALIDCOMPORT, szMessage, MAX_PATH );
3426: gui_message( szMessage );
3427:
3428: // Select "none" as the COM-port
3429: SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 0L, 0L );
3430: }
1.1.1.4 root 3431: // Disable the chosen serial-port selection
3432: strcpy( workprefs.sername, "none" );
3433: workprefs.use_serial = 0;
3434: }
3435: else
3436: {
3437: workprefs.use_serial = 1;
1.1.1.2 root 3438: }
3439: }
3440:
1.1.1.4 root 3441: if( workprefs.use_serial )
3442: {
3443: EnableWindow( GetDlgItem( hDlg, IDC_MIDIOUTLIST ), TRUE );
3444: if( !bNoMidiIn )
3445: EnableWindow( GetDlgItem( hDlg, IDC_MIDIINLIST ), TRUE );
3446: }
3447: else
3448: {
3449: EnableWindow( GetDlgItem( hDlg, IDC_MIDIOUTLIST ), FALSE );
3450: EnableWindow( GetDlgItem( hDlg, IDC_MIDIINLIST ), FALSE );
3451: }
1.1.1.2 root 3452: /* Retrieve the height, in pixels, of a list item. */
3453: item_height = SendDlgItemMessage (hDlg, IDC_SERIAL, CB_GETITEMHEIGHT, 0, 0L);
3454: if (item_height != CB_ERR) {
3455: /* Get actual box position and size. */
3456: GetWindowRect (GetDlgItem (hDlg, IDC_SERIAL), &rect);
3457: rect.bottom = (rect.top + item_height * 5
1.1.1.4 root 3458: + SendDlgItemMessage (hDlg, IDC_SERIAL, CB_GETITEMHEIGHT, (WPARAM) - 1, 0L)
3459: + item_height);
1.1.1.2 root 3460: SetWindowPos (GetDlgItem (hDlg, IDC_SERIAL), 0, 0, 0, rect.right - rect.left,
1.1.1.4 root 3461: rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER);
3462: }
3463: }
3464:
3465: #define MAX_PRINTERS 10
3466:
3467: static void init_portsdlg( HWND hDlg )
3468: {
3469: int port, numdevs;
3470: char comport[5];
3471: COMMCONFIG cc;
3472: DWORD size = sizeof(COMMCONFIG);
3473:
3474: MIDIOUTCAPS midiOutCaps;
3475: MIDIINCAPS midiInCaps;
3476:
3477: DWORD cbNeeded = 0;
3478:
3479: SendDlgItemMessage (hDlg, IDC_SERIAL, CB_RESETCONTENT, 0, 0L);
3480: SendDlgItemMessage (hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)szNone );
3481: for( port = 0; port < 8; port++ )
3482: {
1.1.1.7 ! root 3483: sprintf( comport, "COM%d", port );
! 3484: if( GetDefaultCommConfig( comport, &cc, &size ) )
! 3485: {
! 3486: SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)comport );
! 3487: }
1.1.1.4 root 3488: }
3489:
3490: SendDlgItemMessage (hDlg, IDC_PRINTERLIST, CB_RESETCONTENT, 0, 0L);
3491: SendDlgItemMessage (hDlg, IDC_PRINTERLIST, CB_ADDSTRING, 0, (LPARAM)szNone );
3492: if( !pInfo )
3493: {
3494: if( !EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 1, (LPBYTE)pInfo, 0, &cbNeeded, &dwEnumeratedPrinters ) )
3495: {
3496: if( cbNeeded )
3497: {
3498: pInfo = calloc( 1, cbNeeded );
3499: if( EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 1, (LPBYTE)pInfo, cbNeeded, &cbNeeded, &dwEnumeratedPrinters ) )
3500: {
3501: for( port = 0; port < dwEnumeratedPrinters; port++ )
3502: {
3503: SendDlgItemMessage( hDlg, IDC_PRINTERLIST, CB_ADDSTRING, 0, (LPARAM)pInfo[port].pName );
3504: }
3505: }
3506: }
3507: else
3508: {
3509: EnableWindow( GetDlgItem( hDlg, IDC_PRINTERLIST ), FALSE );
3510: }
3511: }
3512: }
3513:
3514: if( ( numdevs = midiOutGetNumDevs() ) == 0 )
3515: {
3516: EnableWindow( GetDlgItem( hDlg, IDC_MIDIOUTLIST ), FALSE );
3517: }
3518: else
3519: {
3520: char szMidiOut[ MAX_PATH ];
3521: WIN32GUI_LoadUIString( IDS_DEFAULTMIDIOUT, szMidiOut, MAX_PATH );
1.1.1.7 ! root 3522: SendDlgItemMessage( hDlg, IDC_MIDIOUTLIST, CB_RESETCONTENT, 0, 0L );
! 3523: SendDlgItemMessage( hDlg, IDC_MIDIOUTLIST, CB_ADDSTRING, 0, (LPARAM)szMidiOut );
1.1.1.4 root 3524:
1.1.1.7 ! root 3525: for( port = 0; port < numdevs; port++ )
! 3526: {
! 3527: if( midiOutGetDevCaps( port, &midiOutCaps, sizeof( midiOutCaps ) ) == MMSYSERR_NOERROR )
! 3528: {
! 3529: SendDlgItemMessage( hDlg, IDC_MIDIOUTLIST, CB_ADDSTRING, 0, (LPARAM)midiOutCaps.szPname );
! 3530: }
! 3531: }
1.1.1.4 root 3532: }
3533:
3534: if( ( numdevs = midiInGetNumDevs() ) == 0 )
3535: {
3536: EnableWindow( GetDlgItem( hDlg, IDC_MIDIINLIST ), FALSE );
3537: bNoMidiIn = TRUE;
3538: }
3539: else
3540: {
1.1.1.7 ! root 3541: SendDlgItemMessage( hDlg, IDC_MIDIINLIST, CB_RESETCONTENT, 0, 0L );
1.1.1.4 root 3542:
1.1.1.7 ! root 3543: for( port = 0; port < numdevs; port++ )
! 3544: {
! 3545: if( midiInGetDevCaps( port, &midiInCaps, sizeof( midiInCaps ) ) == MMSYSERR_NOERROR )
! 3546: {
! 3547: SendDlgItemMessage( hDlg, IDC_MIDIINLIST, CB_ADDSTRING, 0, (LPARAM)midiInCaps.szPname );
! 3548: }
! 3549: }
1.1.1.2 root 3550: }
3551: }
3552:
3553: /* Handle messages for the Joystick Settings page of our property-sheet */
3554: static BOOL CALLBACK PortsDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
3555: {
3556: static int recursive = 0;
1.1.1.4 root 3557: int temp;
1.1.1.2 root 3558:
1.1.1.4 root 3559: switch (msg)
3560: {
3561: case WM_INITDIALOG:
1.1.1.2 root 3562: pages[PORTS_ID] = hDlg;
1.1.1.4 root 3563: init_portsdlg( hDlg );
3564:
3565: case WM_USER:
1.1.1.2 root 3566: recursive++;
1.1.1.4 root 3567: enable_for_portsdlg( hDlg );
1.1.1.2 root 3568: values_to_portsdlg (hDlg);
1.1.1.4 root 3569: UpdatePortRadioButtons( hDlg );
1.1.1.2 root 3570: recursive--;
3571: return TRUE;
3572:
1.1.1.4 root 3573: case WM_COMMAND:
3574: if( wParam == IDC_SWAP )
3575: {
3576: temp = workprefs.jport0;
3577: workprefs.jport0 = workprefs.jport1;
3578: workprefs.jport1 = temp;
3579: UpdatePortRadioButtons( hDlg );
3580: }
3581: else
3582: {
3583: if (recursive > 0)
3584: break;
3585: recursive++;
3586: values_from_portsdlg (hDlg);
3587: UpdatePortRadioButtons( hDlg );
3588: recursive--;
3589: }
1.1.1.2 root 3590: break;
3591:
1.1.1.4 root 3592: case WM_NOTIFY:
3593: switch (((NMHDR *) lParam)->code)
3594: {
3595: case PSN_HELP:
3596: HtmlHelp( NULL, help_file, HH_DISPLAY_TOPIC, "ports.htm" );
3597: break;
3598: case PSN_APPLY:
3599: /* Copy stuff from workprefs and config_xxx settings */
3600: gui_to_prefs ();
1.1.1.2 root 3601: break;
1.1.1.4 root 3602: case PSN_RESET:
1.1.1.2 root 3603: if (allow_quit) {
3604: quit_program = 1;
3605: regs.spcflags |= SPCFLAG_BRK;
3606: }
3607: break;
3608: }
3609: return FALSE;
3610: }
3611: return FALSE;
3612: }
3613:
3614: static void CALLBACK InitPropertySheet (HWND hDlg, UINT msg, LPARAM lParam)
3615: {
3616: int i;
1.1.1.4 root 3617: hPropertySheet = hDlg;
1.1.1.2 root 3618:
1.1.1.4 root 3619: switch (msg)
3620: {
3621: case PSCB_INITIALIZED:
1.1.1.7 ! root 3622: if (! full_property_sheet) {
1.1.1.4 root 3623: /* This shouldn't be necessary. */
3624: PropSheet_RemovePage( hDlg, 0, NULL ); /* Remove LoadSave */
3625: } else {
3626: for (i = 0; i < C_PAGES; i++)
3627: pages[i] = NULL;
1.1.1.7 ! root 3628: }
! 3629: break;
1.1.1.2 root 3630: }
3631: }
3632:
3633: static void init_page (PROPSHEETPAGE *ppage, int id, int tmpl, int icon, int title,
1.1.1.7 ! root 3634: BOOL (CALLBACK FAR *func) (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam))
1.1.1.2 root 3635: {
3636: ppage[id].dwSize = sizeof (PROPSHEETPAGE);
1.1.1.4 root 3637: ppage[id].dwFlags = PSP_USETITLE | PSP_USEICONID | ((id != ABOUT_ID ) ? PSP_HASHELP : 0);
3638: ppage[id].pszTemplate = MAKEINTRESOURCE (tmpl);
3639: ppage[id].hInstance = hUIDLL ? hUIDLL : hInst;
3640: ppage[id].pszIcon = MAKEINTRESOURCE (icon);
3641:
3642: if( hUIDLL )
3643: {
3644: LPTSTR lpstrTitle = calloc( 1, MAX_PATH );
3645: LoadString( hUIDLL, title, lpstrTitle, MAX_PATH );
3646: ppage[id].pszTitle = lpstrTitle;
3647: }
3648: else
3649: {
3650: ppage[id].pszTitle = MAKEINTRESOURCE (title);
3651: }
3652: ppage[id].pfnDlgProc = func;
1.1.1.2 root 3653: ppage[id].lParam = 0;
3654: ppage[id].pfnCallback = NULL;
3655: ppage[id].pcRefParent = NULL;
3656: }
3657:
3658: int GetSettings (int all_options)
3659: {
1.1.1.4 root 3660: static int init_called = 0;
1.1.1.2 root 3661: int psresult;
1.1.1.4 root 3662: static PROPSHEETPAGE ppage[C_PAGES];
1.1.1.2 root 3663: PROPSHEETHEADER pHeader;
3664:
3665: full_property_sheet = all_options;
1.1.1.4 root 3666: allow_quit = all_options;
1.1.1.2 root 3667: pguiprefs = all_options ? &currprefs : &changed_prefs;
1.1.1.4 root 3668: default_prefs( &workprefs );
3669:
3670: WIN32GUI_LoadUIString( IDS_NONE, szNone, MAX_PATH );
3671:
3672: prefs_to_gui (&changed_prefs);
3673:
3674: if( !init_called )
3675: {
3676: init_page (ppage, LOADSAVE_ID, IDD_LOADSAVE, IDI_LOADSAVE, IDS_LOADSAVE, LoadSaveDlgProc);
3677: init_page (ppage, MEMORY_ID, IDD_MEMORY, IDI_MEMORY, IDS_MEMORY, MemoryDlgProc);
3678: init_page (ppage, KICKSTART_ID, IDD_KICKSTART, IDI_MEMORY, IDS_KICKSTART, KickstartDlgProc);
3679: init_page (ppage, CPU_ID, IDD_CPU, IDI_CPU, IDS_CPU, CPUDlgProc);
3680: init_page (ppage, DISPLAY_ID, IDD_DISPLAY, IDI_DISPLAY, IDS_DISPLAY, DisplayDlgProc);
3681: init_page (ppage, CHIPSET_ID, IDD_CHIPSET, IDI_DISPLAY, IDS_CHIPSET, ChipsetDlgProc);
3682: init_page (ppage, SOUND_ID, IDD_SOUND, IDI_SOUND, IDS_SOUND, SoundDlgProc);
3683: init_page (ppage, FLOPPY_ID, IDD_FLOPPY, IDI_FLOPPY, IDS_FLOPPY, FloppyDlgProc);
3684: init_page (ppage, HARDDISK_ID, IDD_HARDDISK, IDI_HARDDISK, IDS_HARDDISK, HarddiskDlgProc);
3685: init_page (ppage, PORTS_ID, IDD_PORTS, IDI_PORTS, IDS_PORTS, PortsDlgProc);
3686: init_page (ppage, MISC_ID, IDD_MISC, IDI_MISC, IDS_MISC, MiscDlgProc);
3687: init_page (ppage, ABOUT_ID, IDD_ABOUT, IDI_ABOUT, IDS_ABOUT, AboutDlgProc);
3688:
3689: init_called = 1;
3690: }
1.1.1.2 root 3691:
3692: pHeader.dwSize = sizeof (PROPSHEETHEADER);
1.1.1.4 root 3693: pHeader.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK | PSH_NOAPPLYNOW | PSH_HASHELP;
1.1.1.2 root 3694: if (! all_options && workprefs.gfx_afullscreen && workprefs.gfx_width < 640)
3695: pHeader.hwndParent = NULL;
3696: else
3697: pHeader.hwndParent = hAmigaWnd;
3698: pHeader.hInstance = hInst;
1.1.1.4 root 3699: pHeader.pszIcon = MAKEINTRESOURCE (IDI_APPICON);
3700: pHeader.pszCaption = "UAE/Win32";
1.1.1.2 root 3701: pHeader.nPages = C_PAGES;
1.1.1.4 root 3702: pHeader.nStartPage = 0;
3703: pHeader.ppsp = ppage;
1.1.1.2 root 3704: pHeader.pfnCallback = (PFNPROPSHEETCALLBACK) InitPropertySheet;
3705:
3706:
1.1.1.4 root 3707: psresult = PropertySheet (&pHeader);
1.1.1.2 root 3708:
1.1.1.4 root 3709: if (quit_program)
1.1.1.7 ! root 3710: psresult = -2;
1.1.1.2 root 3711:
1.1.1.4 root 3712: return psresult;
1.1.1.2 root 3713: }
3714:
3715: int gui_init (void)
3716: {
1.1.1.4 root 3717: return( GetSettings(1) );
1.1.1.2 root 3718: }
3719:
3720: int gui_update (void)
3721: {
3722: return 1;
3723: }
3724:
3725: void gui_exit (void)
3726: {
1.1.1.4 root 3727: #if 0
3728: free_prefs( &workprefs, 1 );
3729: #endif
3730: closeprinter(); // Bernd Roesch
1.1.1.2 root 3731: }
3732:
3733: extern HWND hStatusWnd;
1.1.1.4 root 3734: struct gui_info gui_data;
3735:
3736: void check_prefs_changed_gui( void )
3737: {
3738: }
1.1.1.2 root 3739:
3740: void gui_led (int led, int on)
3741: {
3742: WORD type;
1.1.1.4 root 3743: static char drive_text[5*6];
3744: char *ptr;
3745: extern int screen_is_picasso;
3746:
3747: if( hStatusWnd )
3748: {
1.1.1.7 ! root 3749: if( on )
! 3750: type = SBT_POPOUT;
! 3751: else
! 3752: type = 0;
1.1.1.4 root 3753:
3754: ptr = drive_text + led*6;
1.1.1.7 ! root 3755: if( led > 0 )
! 3756: {
! 3757: sprintf( ptr , "%02d", gui_data.drive_track[led-1]);
! 3758: }
! 3759: else
! 3760: {
1.1.1.4 root 3761: strcpy( ptr, "Power");
1.1.1.7 ! root 3762: }
! 3763: PostMessage (hStatusWnd, SB_SETTEXT, (WPARAM) ((led+2) | type), (LPARAM) ptr);
1.1.1.4 root 3764: }
3765: }
1.1.1.2 root 3766:
1.1.1.4 root 3767: void gui_fps( int fps )
3768: {
3769: static char fps_text[10];
1.1.1.2 root 3770:
1.1.1.4 root 3771: if( hStatusWnd )
3772: {
1.1.1.7 ! root 3773: sprintf( fps_text, "FPS: %2u", fps+1 );
! 3774: PostMessage( hStatusWnd, SB_SETTEXT, (WPARAM)( 1 ), (LPARAM)fps_text );
1.1.1.4 root 3775: }
3776: }
1.1.1.2 root 3777:
1.1.1.4 root 3778: void gui_filename (int num, const char *name)
3779: {
3780: }
3781:
3782: void gui_message(const char *format,...)
3783: {
3784: char msg[2048];
3785: char szTitle[ MAX_PATH ];
3786: va_list parms;
3787: int flipflop = 0;
3788: int fullscreen = 0;
3789: int reactivate_mouse = 0;
3790: HWND window = NULL;
3791:
3792: if( DirectDraw_GetCooperativeLevel( &window, &fullscreen ) && fullscreen )
1.1.1.7 ! root 3793: flipflop = 1;
1.1.1.4 root 3794:
3795: pause_sound(0);
3796: if( flipflop )
1.1.1.7 ! root 3797: ShowWindow( window, SW_MINIMIZE );
1.1.1.4 root 3798:
3799: va_start (parms, format);
3800: vsprintf( msg, format, parms );
3801: va_end (parms);
3802: write_log( msg );
1.1.1.2 root 3803:
1.1.1.4 root 3804: WIN32GUI_LoadUIString( IDS_ERRORTITLE, szTitle, MAX_PATH );
3805: if( mouseactive )
3806: {
3807: setmouseactive( 0 );
3808: reactivate_mouse = 1;
3809: }
1.1.1.2 root 3810:
1.1.1.4 root 3811: MessageBox( NULL, msg, szTitle, MB_OK | MB_ICONWARNING | MB_TASKMODAL | MB_SETFOREGROUND );
1.1.1.2 root 3812:
1.1.1.4 root 3813: if( reactivate_mouse )
3814: setmouseactive( 1 );
1.1.1.2 root 3815:
1.1.1.4 root 3816: if( flipflop )
1.1.1.7 ! root 3817: ShowWindow( window, SW_RESTORE );
1.1.1.4 root 3818:
3819: resume_sound();
1.1.1.2 root 3820: }
1.1.1.6 root 3821:
3822: void gui_lock (void)
3823: {
3824: }
3825:
3826: void gui_unlock (void)
3827: {
3828: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.