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