Annotation of uae/src/od-win32/win32gui.c, revision 1.1

1.1     ! root        1: /*==========================================================================
        !             2:  *
        !             3:  *  Copyright (C) 1996 Brian King
        !             4:  *
        !             5:  *  File:       wingui.c
        !             6:  *  Content:    Win32-specific gui features for UAE port.
        !             7:  *
        !             8: -U 4 -c 4 -F 8 -n i3 -w 2 -m system3.1:d:\amiga\hd0 -m work:d:\amiga\hd1
        !             9:  ***************************************************************************/
        !            10: #ifdef __GNUC__
        !            11: #define NONAMELESSUNION
        !            12: #define __int64 long long
        !            13: #include "machdep/winstuff.h"
        !            14: #else
        !            15: #include <stdio.h>
        !            16: #include <stdlib.h>
        !            17: #include <io.h>
        !            18: #include <windows.h>
        !            19: #include <windowsx.h>
        !            20: #include <mmsystem.h>
        !            21: #include <commctrl.h>
        !            22: #include <commdlg.h>
        !            23: #include <dlgs.h>
        !            24: #include <winuser.h>
        !            25: #include <ddraw.h>
        !            26: #include <process.h>
        !            27: #include <shlobj.h>
        !            28: #include <prsht.h>
        !            29: #include <richedit.h>
        !            30: #endif
        !            31: #include "config.h"
        !            32: #include "resource.h"
        !            33: #include "sysconfig.h"
        !            34: #include "sysdeps.h"
        !            35: #include "gui.h"
        !            36: #include "options.h"
        !            37: #include "memory.h"
        !            38: #ifdef __GNUC__
        !            39: #include "machdep/memory.h"
        !            40: #endif
        !            41: #include "custom.h"
        !            42: #include "readcpu.h"
        !            43: #include "newcpu.h"
        !            44: #include "disk.h"
        !            45: #include "uae.h"
        !            46: #include "autoconf.h"
        !            47: 
        !            48: #include "picasso96.h"
        !            49: #include "osdep/win32.h"
        !            50: #include "osdep/win32gui.h"
        !            51: 
        !            52: extern LONG GetDisplayModeLogicalNumber( int w, int h );
        !            53: extern LONG GetDisplayModeNumber( LONG logical );
        !            54: 
        !            55: extern HANDLE hEmuThread;
        !            56: extern BOOL viewing_child;
        !            57: extern BOOL                    allow_quit_from_property_sheet;
        !            58: extern BOOL                    viewing_child;
        !            59: extern HDC hBackDC;
        !            60: extern HBITMAP hBackBM;
        !            61: extern HINSTANCE hInst;
        !            62: extern HWND hMainWnd, hAmigaWnd;
        !            63: extern uae_u32 fastmem_size, chipmem_size, bogomem_size, gfxmem_size, z3fastmem_size; // BDK
        !            64: extern int new_fullscreen_flag;
        !            65: extern int mouseactive;
        !            66: extern char *start_path;
        !            67: HANDLE win32uae_key = NULL;
        !            68: 
        !            69: #define Error(x) MessageBox( NULL, (x), "WinUAE Error", MB_OK )
        !            70: 
        !            71: #ifdef __GNUC__
        !            72: #define DUN DUMMYUNIONNAME ## .
        !            73: #define DUN2 DUMMYUNIONNAME2 ## .
        !            74: #define DUN3 DUMMYUNIONNAME3 ## .
        !            75: #else
        !            76: #define DUN
        !            77: #define DUN2
        !            78: #define DUN3
        !            79: #endif
        !            80: BOOL GetSettings(void)
        !            81: {
        !            82:     BOOL rc = TRUE;
        !            83:     PROPSHEETPAGE pages[C_PAGES];
        !            84:     PROPSHEETHEADER pHeader;
        !            85: 
        !            86:     pages[ LOADSAVE_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !            87:     pages[ LOADSAVE_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !            88:     pages[ LOADSAVE_ID ].hInstance   = hInst;
        !            89:     pages[ LOADSAVE_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_LOADSAVE);
        !            90:     pages[ LOADSAVE_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_LOADSAVE);
        !            91:     pages[ LOADSAVE_ID ].pszTitle    = MAKEINTRESOURCE(IDS_LOADSAVE);
        !            92:     pages[ LOADSAVE_ID ].pfnDlgProc  = (LPFNPSPCALLBACK) LoadSaveDlgProc;
        !            93:     pages[ LOADSAVE_ID ].lParam      = 0;
        !            94:     pages[ LOADSAVE_ID ].pfnCallback = NULL;
        !            95:     pages[ LOADSAVE_ID ].pcRefParent = NULL;
        !            96: 
        !            97:     pages[ STARTUP_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !            98:     pages[ STARTUP_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !            99:     pages[ STARTUP_ID ].hInstance   = hInst;
        !           100:     pages[ STARTUP_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_STARTUP);
        !           101:     pages[ STARTUP_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_STARTUP);
        !           102:     pages[ STARTUP_ID ].pszTitle    = MAKEINTRESOURCE(IDS_STARTUP);
        !           103:     pages[ STARTUP_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)StartupDlgProc;
        !           104:     pages[ STARTUP_ID ].lParam      = 0;
        !           105:     pages[ STARTUP_ID ].pfnCallback = NULL;
        !           106:     pages[ STARTUP_ID ].pcRefParent = NULL;
        !           107: 
        !           108:     pages[ SOUND_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !           109:     pages[ SOUND_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !           110:     pages[ SOUND_ID ].hInstance   = hInst;
        !           111:     pages[ SOUND_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_SOUND);
        !           112:     pages[ SOUND_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_SOUND);
        !           113:     pages[ SOUND_ID ].pszTitle    = MAKEINTRESOURCE(IDS_SOUND);
        !           114:     pages[ SOUND_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)SoundDlgProc;
        !           115:     pages[ SOUND_ID ].lParam      = 0;
        !           116:     pages[ SOUND_ID ].pfnCallback = NULL;
        !           117:     pages[ SOUND_ID ].pcRefParent = NULL;
        !           118: 
        !           119:     pages[ DISPLAY_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !           120:     pages[ DISPLAY_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !           121:     pages[ DISPLAY_ID ].hInstance   = hInst;
        !           122:     pages[ DISPLAY_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_DISPLAY);
        !           123:     pages[ DISPLAY_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_DISPLAY);
        !           124:     pages[ DISPLAY_ID ].pszTitle    = MAKEINTRESOURCE(IDS_DISPLAY);
        !           125:     pages[ DISPLAY_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)DisplayDlgProc;
        !           126:     pages[ DISPLAY_ID ].lParam      = 0;
        !           127:     pages[ DISPLAY_ID ].pfnCallback = NULL;
        !           128:     pages[ DISPLAY_ID ].pcRefParent = NULL;
        !           129: 
        !           130:     pages[ HARDDISK_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !           131:     pages[ HARDDISK_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !           132:     pages[ HARDDISK_ID ].hInstance   = hInst;
        !           133:     pages[ HARDDISK_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_HARDDISK);
        !           134:     pages[ HARDDISK_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_HARDDRIVE);
        !           135:     pages[ HARDDISK_ID ].pszTitle    = MAKEINTRESOURCE(IDS_HARDDRIVES);
        !           136:     pages[ HARDDISK_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)HarddiskDlgProc;
        !           137:     pages[ HARDDISK_ID ].lParam      = 0;
        !           138:     pages[ HARDDISK_ID ].pfnCallback = NULL;
        !           139:     pages[ HARDDISK_ID ].pcRefParent = NULL;
        !           140: 
        !           141:     pages[ FLOPPY_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !           142:     pages[ FLOPPY_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !           143:     pages[ FLOPPY_ID ].hInstance   = hInst;
        !           144:     pages[ FLOPPY_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_FLOPPIES);
        !           145:     pages[ FLOPPY_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_FLOPPYDRIVE);
        !           146:     pages[ FLOPPY_ID ].pszTitle    = MAKEINTRESOURCE(IDS_FLOPPIES);
        !           147:     pages[ FLOPPY_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)FloppiesDlgProc;
        !           148:     pages[ FLOPPY_ID ].lParam      = 0;
        !           149:     pages[ FLOPPY_ID ].pfnCallback = NULL;
        !           150:     pages[ FLOPPY_ID ].pcRefParent = NULL;
        !           151: 
        !           152:     pages[ PORTS_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !           153:     pages[ PORTS_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !           154:     pages[ PORTS_ID ].hInstance   = hInst;
        !           155:     pages[ PORTS_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_PORTS);
        !           156:     pages[ PORTS_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_PORTS);
        !           157:     pages[ PORTS_ID ].pszTitle    = MAKEINTRESOURCE(IDS_PORTS);
        !           158:     pages[ PORTS_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)PortsDlgProc;
        !           159:     pages[ PORTS_ID ].lParam      = 0;
        !           160:     pages[ PORTS_ID ].pfnCallback = NULL;
        !           161:     pages[ PORTS_ID ].pcRefParent = NULL;
        !           162: 
        !           163:     pages[ ADVANCED_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !           164:     pages[ ADVANCED_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !           165:     pages[ ADVANCED_ID ].hInstance   = hInst;
        !           166:     pages[ ADVANCED_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_ADVANCED);
        !           167:     pages[ ADVANCED_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_ADVANCED);
        !           168:     pages[ ADVANCED_ID ].pszTitle    = MAKEINTRESOURCE(IDS_ADVANCED);
        !           169:     pages[ ADVANCED_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)AdvancedDlgProc;
        !           170:     pages[ ADVANCED_ID ].lParam      = 0;
        !           171:     pages[ ADVANCED_ID ].pfnCallback = NULL;
        !           172:     pages[ ADVANCED_ID ].pcRefParent = NULL;
        !           173: 
        !           174:     pages[ ABOUT_ID ].dwSize      = sizeof(PROPSHEETPAGE);
        !           175:     pages[ ABOUT_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
        !           176:     pages[ ABOUT_ID ].hInstance   = hInst;
        !           177:     pages[ ABOUT_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_ABOUTME);
        !           178:     pages[ ABOUT_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_UAEINFO);
        !           179:     pages[ ABOUT_ID ].pszTitle    = MAKEINTRESOURCE(IDS_ABOUTME);
        !           180:     pages[ ABOUT_ID ].pfnDlgProc  = (LPFNPSPCALLBACK) AboutDlgProc;
        !           181:     pages[ ABOUT_ID ].lParam      = 0;
        !           182:     pages[ ABOUT_ID ].pfnCallback = NULL;
        !           183:     pages[ ABOUT_ID ].pcRefParent = NULL;
        !           184: 
        !           185:     pHeader.dwSize     = sizeof(PROPSHEETHEADER);
        !           186:     pHeader.dwFlags    = PSH_PROPSHEETPAGE | PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK | PSH_NOAPPLYNOW;
        !           187:     pHeader.hwndParent = hAmigaWnd;
        !           188:     pHeader.hInstance  = hInst;
        !           189:     pHeader.DUN pszIcon    = MAKEINTRESOURCE(IDI_UAEICON);
        !           190:     pHeader.pszCaption = "WinUAE";
        !           191:     pHeader.nPages     = C_PAGES;
        !           192:     pHeader.DUN2 nStartPage = 0;
        !           193:     pHeader.DUN3 ppsp       = (LPCPROPSHEETPAGE)pages;
        !           194:     pHeader.pfnCallback= (PFNPROPSHEETCALLBACK)InitPropertySheet;
        !           195:     if(PropertySheet(&pHeader)==-1 || quit_program)
        !           196:         rc = FALSE;
        !           197:     return rc;
        !           198: }
        !           199: 
        !           200: void SetupVolumes( void )
        !           201: {
        !           202:     int loop;
        !           203:     for( loop = 0; loop < 4; loop++ )
        !           204:     {
        !           205:         if( *drives[loop].name && *drives[loop].path )
        !           206:             add_filesys_unit( drives[loop].name, drives[loop].path, !drives[loop].rw, 0, 0, 0 );
        !           207:     }
        !           208: }
        !           209: 
        !           210: HWND pages[C_PAGES];
        !           211: 
        !           212: void CALLBACK InitPropertySheet( HWND hDlg, UINT msg, LPARAM lParam )
        !           213: {
        !           214:     int i;
        !           215:     static BOOL first_time = TRUE;
        !           216: 
        !           217:     if( __argc != 1 )
        !           218:     {
        !           219:         first_time = FALSE;
        !           220:     }
        !           221: 
        !           222:     if( !first_time )
        !           223:     {
        !           224:         // Remove the configurations page
        !           225:         PropSheet_RemovePage( hDlg, 0, NULL );
        !           226: 
        !           227:         // Remove the startup property-sheet page
        !           228:         PropSheet_RemovePage(hDlg,0,NULL);
        !           229: 
        !           230:         // Remove the sound property-sheet page
        !           231:         PropSheet_RemovePage(hDlg,0,NULL);
        !           232: 
        !           233:                // Remove the harddrives property-sheet page
        !           234:                PropSheet_RemovePage(hDlg,2,NULL);
        !           235: 
        !           236:         // Remove the advanced property-sheet page
        !           237:         PropSheet_RemovePage(hDlg,3,NULL);
        !           238: 
        !           239:         allow_quit_from_property_sheet = FALSE;
        !           240:     }
        !           241: 
        !           242:     switch(msg)
        !           243:     {
        !           244:         case PSCB_INITIALIZED:
        !           245:             if( first_time )
        !           246:             {
        !           247:                 first_time = FALSE;
        !           248:                 for( i=0;i<C_PAGES;pages[i++]=NULL);
        !           249:             }
        !           250:         break;
        !           251:    }
        !           252: }
        !           253: 
        !           254: void CalculateFPS( DWORD setting, char *buffer )
        !           255: {
        !           256:     char nth[10];
        !           257:     switch( setting )
        !           258:     {
        !           259:     case 1:
        !           260:         strcpy( nth, "" );
        !           261:         break;
        !           262:     case 2:
        !           263:         strcpy( nth, "second " );
        !           264:         break;
        !           265:     case 3:
        !           266:         strcpy( nth, "third " );
        !           267:         break;
        !           268:     case 4:
        !           269:         strcpy( nth, "fourth " );
        !           270:         break;
        !           271:     case 5:
        !           272:         strcpy( nth, "fifth " );
        !           273:         break;
        !           274:     case 6:
        !           275:         strcpy( nth, "sixth " );
        !           276:         break;
        !           277:     case 7:
        !           278:         strcpy( nth, "seventh " );
        !           279:         break;
        !           280:     case 8:
        !           281:         strcpy( nth, "eighth " );
        !           282:         break;
        !           283:     case 9:
        !           284:         strcpy( nth, "ninth " );
        !           285:         break;
        !           286:     default:
        !           287:         strcpy( nth, "tenth " );
        !           288:         break;
        !           289:     }
        !           290:      
        !           291:     sprintf( buffer, "Every %sFrame", nth );
        !           292: }
        !           293: 
        !           294: void CalculateSpeed( DWORD setting, char *buffer )
        !           295: {
        !           296:     sprintf( buffer, "%d", setting );
        !           297:     currprefs.m68k_speed = setting;
        !           298: }
        !           299: 
        !           300: void CalculateRealMem(DWORD setting, int *size, char *buffer, int memtype)
        !           301: {
        !           302:     if( memtype == 0 )
        !           303:     {
        !           304:         switch(setting)
        !           305:         {
        !           306:         case 0:
        !           307:             if( buffer )
        !           308:                 strcpy(buffer,"512 K");
        !           309:             if( size )
        !           310:                 *size = 0x00080000;
        !           311:             break;
        !           312:         case 1:
        !           313:             if( buffer )
        !           314:                 strcpy(buffer,"1 Meg");
        !           315:             if( size )
        !           316:                 *size = 0x00100000;
        !           317:             break;
        !           318:         case 2:
        !           319:             if( buffer )
        !           320:                 strcpy(buffer,"2 Megs");
        !           321:             if( size )
        !           322:                 *size = 0x00200000;
        !           323:             break;
        !           324:         case 3:
        !           325:             if( buffer )
        !           326:                 strcpy(buffer,"4 Megs");
        !           327:             if( size )
        !           328:                 *size = 0x00400000;
        !           329:             break;
        !           330:         default:
        !           331:             if( buffer )
        !           332:                 strcpy(buffer,"8 Megs");
        !           333:             if( size )
        !           334:                 *size = 0x00800000;
        !           335:             break;
        !           336:         }
        !           337:     }
        !           338:     else
        !           339:     {
        !           340:         switch(setting)
        !           341:         {
        !           342:         case 0:
        !           343:             if( buffer )
        !           344:                 strcpy(buffer,"None");
        !           345:             if( size )
        !           346:                 *size = 0x00000000;
        !           347:             break;
        !           348:         case 1:
        !           349:             if( buffer )
        !           350:                 strcpy(buffer,"1 Meg");
        !           351:             if( size )
        !           352:                 *size = 0x00100000;
        !           353:             break;
        !           354:         case 2:
        !           355:             if( buffer )
        !           356:                 strcpy(buffer,"2 Megs");
        !           357:             if( size )
        !           358:                 *size = 0x00200000;
        !           359:             break;
        !           360:         case 3:
        !           361:             if( buffer )
        !           362:                 strcpy(buffer,"4 Megs");
        !           363:             if( size )
        !           364:                 *size = 0x00400000;
        !           365:             break;
        !           366:         case 4:
        !           367:             if( buffer )
        !           368:                 strcpy(buffer,"8 Megs");
        !           369:             if( size )
        !           370:                 *size = 0x00800000;
        !           371:             break;
        !           372:         case 5:
        !           373:             if( memtype == 3 )
        !           374:             {
        !           375:                 if( buffer )
        !           376:                     strcpy( buffer, "16 Megs" );
        !           377:                 if( size )
        !           378:                     *size = 0x01000000;
        !           379:             }
        !           380:             break;
        !           381:         case 6:
        !           382:             if( memtype == 3 )
        !           383:             {
        !           384:                 if( buffer )
        !           385:                     strcpy( buffer, "32 Megs" );
        !           386:                 if( size )
        !           387:                     *size = 0x02000000;
        !           388:             }
        !           389:             break;
        !           390:         }
        !           391:     }
        !           392: }
        !           393: 
        !           394: void UpdateRadioButtons( HWND hDlg, HWND lParam )
        !           395: {
        !           396:     int which_button;
        !           397: 
        !           398:     if( GetDlgItem( hDlg, IDC_FREQUENCY ) == lParam )
        !           399:     {
        !           400:         switch( currprefs.sound_freq )
        !           401:         {
        !           402:         case 11025:
        !           403:             which_button = IDC_11KHZ;
        !           404:             break;
        !           405:         case 44100:
        !           406:             which_button = IDC_44KHZ;
        !           407:             break;
        !           408:         case 48000:
        !           409:             which_button = IDC_48KHZ;
        !           410:             break;
        !           411:         default:
        !           412:             which_button = IDC_22KHZ;
        !           413:             break;
        !           414:         }
        !           415:         CheckRadioButton( hDlg, IDC_11KHZ, IDC_48KHZ, which_button );
        !           416:     }
        !           417:     else if( GetDlgItem( hDlg, IDC_SOUNDSIZE ) == lParam )
        !           418:     {
        !           419:         switch( currprefs.sound_bits )
        !           420:         {
        !           421:         case 16:
        !           422:             which_button = IDC_16BIT;
        !           423:             break;
        !           424:         default:
        !           425:             which_button = IDC_8BIT;
        !           426:             break;
        !           427:         }
        !           428:         CheckRadioButton( hDlg, IDC_8BIT, IDC_16BIT, which_button );
        !           429:     }
        !           430:     else if( GetDlgItem( hDlg, IDC_SOUND ) == lParam )
        !           431:     {
        !           432:         switch( currprefs.produce_sound )
        !           433:         {
        !           434:         case -1:
        !           435:             which_button = IDC_SOUND0;
        !           436:             break;
        !           437:         case 1:
        !           438:             which_button = IDC_SOUND2;
        !           439:             break;
        !           440:         case 2:
        !           441:             which_button = IDC_SOUND3;
        !           442:             break;
        !           443:         case 3:
        !           444:             which_button = IDC_SOUND4;
        !           445:             break;
        !           446:         default:
        !           447:             which_button = IDC_SOUND1;
        !           448:             break;
        !           449:         }
        !           450:         if( CheckRadioButton( hDlg, IDC_SOUND0, IDC_SOUND4, which_button ) == 0 )
        !           451:             which_button = 0;
        !           452:     }
        !           453:     else if( GetDlgItem( hDlg, IDC_PORT0 ) == lParam )
        !           454:     {
        !           455:         switch( currprefs.fake_joystick & 0x00FF )
        !           456:         {
        !           457:         case 0:
        !           458:             which_button = IDC_PORT0_JOY0;
        !           459:             break;
        !           460:         case 1:
        !           461:             which_button = IDC_PORT0_JOY1;
        !           462:             break;
        !           463:         case 2:
        !           464:             which_button = IDC_PORT0_MOUSE;
        !           465:             break;
        !           466:         case 3:
        !           467:             which_button = IDC_PORT0_KBDA;
        !           468:             break;
        !           469:         case 4:
        !           470:             which_button = IDC_PORT0_KBDB;
        !           471:             break;
        !           472:         default:
        !           473:             which_button = IDC_PORT0_KBDC;
        !           474:             break;
        !           475:         }
        !           476:         if( CheckRadioButton( hDlg, IDC_PORT0_JOY0, IDC_PORT0_KBDC, which_button ) == 0 )
        !           477:             which_button = 0;
        !           478:     }
        !           479:     else if( GetDlgItem( hDlg, IDC_PORT1 ) == lParam )
        !           480:     {
        !           481:         switch( ( currprefs.fake_joystick & 0xFF00 ) >> 8 )
        !           482:         {
        !           483:         case 0:
        !           484:             which_button = IDC_PORT1_JOY0;
        !           485:             break;
        !           486:         case 1:
        !           487:             which_button = IDC_PORT1_JOY1;
        !           488:             break;
        !           489:         case 2:
        !           490:             which_button = IDC_PORT1_MOUSE;
        !           491:             break;
        !           492:         case 3:
        !           493:             which_button = IDC_PORT1_KBDA;
        !           494:             break;
        !           495:         case 4:
        !           496:             which_button = IDC_PORT1_KBDB;
        !           497:             break;
        !           498:         default:
        !           499:             which_button = IDC_PORT1_KBDC;
        !           500:             break;
        !           501:         }
        !           502:         if( CheckRadioButton( hDlg, IDC_PORT1_JOY0, IDC_PORT1_KBDC, which_button ) == 0 )
        !           503:             which_button = 0;
        !           504:     }
        !           505: }
        !           506: 
        !           507: void UpdateScroller(HWND hDlg, HWND lParam)
        !           508: {
        !           509:     char buffer[32];
        !           510:     DWORD dwPos = SendMessage( (HWND)lParam, TBM_GETPOS, 0 ,0 ), dwPos2;
        !           511: 
        !           512:     if( GetDlgItem( hDlg, IDC_CHIPMEM ) == lParam )
        !           513:     {
        !           514:         CalculateRealMem( dwPos, NULL, buffer, 0 );
        !           515:         SetDlgItemText( hDlg, IDC_CHIPRAM, buffer );
        !           516: 
        !           517:         dwPos2 = SendDlgItemMessage( hDlg, IDC_FASTMEM, TBM_GETPOS, 0, 0 );
        !           518:         if( ( dwPos > 2 ) &&
        !           519:             ( dwPos2 > 0 ) )
        !           520:         {
        !           521:             SendDlgItemMessage( hDlg, IDC_FASTMEM, TBM_SETPOS, TRUE, 0 );
        !           522:             UpdateScroller( hDlg, GetDlgItem( hDlg, IDC_FASTMEM ) );
        !           523:         }
        !           524:     }
        !           525:     else if( GetDlgItem( hDlg, IDC_FASTMEM ) == lParam )
        !           526:     {
        !           527:         CalculateRealMem( dwPos, NULL, buffer, 1 );
        !           528:         SetDlgItemText( hDlg, IDC_FASTRAM, buffer );
        !           529: 
        !           530:         dwPos2 = SendDlgItemMessage( hDlg, IDC_CHIPMEM, TBM_GETPOS, 0, 0 );
        !           531:         if( ( dwPos > 0 ) &&
        !           532:             ( dwPos2 > 2 ) )
        !           533:         {
        !           534:             SendDlgItemMessage( hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, 2 );
        !           535:             UpdateScroller( hDlg, GetDlgItem( hDlg, IDC_CHIPMEM ) );
        !           536:         }
        !           537:     }
        !           538:     else if( GetDlgItem( hDlg, IDC_FRAMERATE ) == lParam )
        !           539:     {
        !           540:         CalculateFPS( dwPos, buffer );
        !           541:         SetDlgItemText(hDlg,IDC_RATETEXT,buffer);
        !           542:     }
        !           543:     else if( GetDlgItem( hDlg, IDC_SPEED ) == lParam )
        !           544:     {
        !           545:         CalculateSpeed( dwPos, buffer );
        !           546:         SetDlgItemText( hDlg, IDC_SPEEDBOX, buffer );
        !           547:     }
        !           548:     else if( GetDlgItem( hDlg, IDC_P96MEM ) == lParam )
        !           549:     {
        !           550:         CalculateRealMem( dwPos, NULL, buffer, 2 );
        !           551:         SetDlgItemText( hDlg, IDC_P96RAM, buffer );
        !           552:     }
        !           553:     else if( GetDlgItem( hDlg, IDC_Z3FASTMEM ) == lParam )
        !           554:     {
        !           555:         CalculateRealMem( dwPos, NULL, buffer, 3 );
        !           556:         SetDlgItemText( hDlg, IDC_Z3FASTRAM, buffer );
        !           557:     }
        !           558: }
        !           559: 
        !           560: ConfigStructPtr AllocateConfigStruct( void )
        !           561: {
        !           562:     ConfigStructPtr ptr = NULL;
        !           563:     if( ptr = malloc( sizeof( ConfigStruct ) ) )
        !           564:     {
        !           565:         ptr->Size = sizeof( ConfigStruct );
        !           566:         ptr->VersionMajor = CONFIG_VERSION_MAJOR;
        !           567:         ptr->VersionMinor = CONFIG_VERSION_MINOR;
        !           568:     }
        !           569:     return ptr;
        !           570: }
        !           571: 
        !           572: void FreeConfigStruct( ConfigStructPtr cfgptr )
        !           573: {
        !           574:     free( cfgptr );
        !           575: }
        !           576: 
        !           577: // Get a ptr to a ConfigStruct based on entry-number
        !           578: // Return NULL if invalid entry-number
        !           579: ConfigStructPtr GetFirstConfigEntry( HANDLE *file_handle, LPWIN32_FIND_DATA find_data )
        !           580: {
        !           581:     HANDLE cfg_file;
        !           582:     ConfigStructPtr config = NULL;
        !           583:     DWORD num_bytes = 0;
        !           584:     char init_path[MAX_PATH] = "", *posn;
        !           585: 
        !           586:     if( start_path )
        !           587:     {
        !           588:         strncpy( init_path, start_path, MAX_PATH );
        !           589:         strncat( init_path, "\\Configurations\\*.CFG", MAX_PATH );
        !           590:     }
        !           591: 
        !           592:     if( ( *file_handle = FindFirstFile( init_path, find_data ) ) != INVALID_HANDLE_VALUE )
        !           593:     {
        !           594:         config = AllocateConfigStruct();
        !           595:         sprintf( init_path, "%s\\Configurations\\%s", start_path, find_data->cFileName );
        !           596:         cfg_file = CreateFile( init_path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
        !           597:         ReadFile( cfg_file, config, config->Size, &num_bytes, NULL );
        !           598:         if( num_bytes == config->Size )
        !           599:         {
        !           600:             if( posn = strrchr( find_data->cFileName, '.' ) )
        !           601:                 *posn = '\0';
        !           602:             strcpy( config->Name, find_data->cFileName );
        !           603:         }
        !           604:         else
        !           605:         {
        !           606:             FreeConfigStruct( config );
        !           607:             config = NULL;
        !           608:         }
        !           609:         CloseHandle( cfg_file );
        !           610:     }
        !           611:     else
        !           612:     {
        !           613: 
        !           614:     }
        !           615:     return config;
        !           616: }
        !           617: 
        !           618: ConfigStructPtr GetNextConfigEntry( HANDLE *file_handle, LPWIN32_FIND_DATA find_data )
        !           619: {
        !           620:     HANDLE cfg_file;
        !           621:     ConfigStructPtr config = NULL;
        !           622:     DWORD num_bytes = 0;
        !           623:     char init_path[MAX_PATH] = "", *posn;
        !           624: 
        !           625:     if( FindNextFile( *file_handle, find_data ) == 0 )
        !           626:     {
        !           627:         FindClose( *file_handle );
        !           628:     }
        !           629:     else
        !           630:     {
        !           631:         config = AllocateConfigStruct();
        !           632:         sprintf( init_path, "%s\\Configurations\\%s", start_path, find_data->cFileName );
        !           633:         cfg_file = CreateFile( init_path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
        !           634:         ReadFile( cfg_file, config, config->Size, &num_bytes, NULL );
        !           635:         if( posn = strrchr( find_data->cFileName, '.' ) )
        !           636:             *posn = '\0';
        !           637:         strcpy( config->Name, find_data->cFileName );
        !           638:         CloseHandle( cfg_file );
        !           639:     }
        !           640:     return config;
        !           641: }
        !           642: 
        !           643: // This function basically sets up the defaults in our ConfigStruct... it follows the same
        !           644: // procedure as each DlgProc() does for a WM_INITDIALOG msg...
        !           645: void GetDefaultsForPage( ConfigStructPtr cfgptr, int page )
        !           646: {
        !           647:     int i;
        !           648: 
        !           649:     switch( page )
        !           650:     {
        !           651:     case ADVANCED_ID:
        !           652:         cfgptr->NoAutoConfig         = !currprefs.automount_uaedev;
        !           653:         cfgptr->CopperHack           = currprefs.copper_pos;
        !           654:         //cfgptr->DebuggerEnabled      = use_debugger;
        !           655:         cfgptr->InvalidAddresses     = currprefs.illegal_mem;
        !           656:         cfgptr->M68KSpeed = currprefs.m68k_speed;
        !           657:         cfgptr->AddressingIs24Bit    = address_space_24;
        !           658:         break;
        !           659:     case STARTUP_ID:
        !           660:         cfgptr->ChipMem              = chipmem_size;
        !           661:         cfgptr->FastMem              = fastmem_size;
        !           662:         cfgptr->P96Mem               = gfxmem_size;
        !           663:         cfgptr->Z3Mem                = z3fastmem_size;
        !           664:         strncpy( cfgptr->KickstartName, romfile, CFG_ROM_LENGTH );
        !           665:         strncpy( cfgptr->KeyFileName, keyfile, CFG_KEY_LENGTH );
        !           666:         break;
        !           667:     case DISPLAY_ID:
        !           668:         cfgptr->FrameRate     = currprefs.framerate;
        !           669:         cfgptr->LineDouble    = currprefs.gfx_linedbl;
        !           670:         cfgptr->FullScreen    = amiga_fullscreen;
        !           671:         cfgptr->CorrectAspect = currprefs.gfx_correct_aspect;
        !           672:         cfgptr->CenterY       = currprefs.gfx_ycenter;
        !           673:         cfgptr->CenterX       = currprefs.gfx_xcenter;
        !           674:         cfgptr->Blit32        = currprefs.blits_32bit_enabled;
        !           675:         cfgptr->BlitImmediate = currprefs.immediate_blits;
        !           676:         cfgptr->Lores         = currprefs.gfx_lores;
        !           677:         cfgptr->CustomSize    = customsize;
        !           678:         cfgptr->ScreenWidth   = currprefs.gfx_width;
        !           679:         cfgptr->ScreenHeight  = currprefs.gfx_height;
        !           680:         break;
        !           681:     case HARDDISK_ID:
        !           682:         for( i = 0; i < NUM_DRIVES; i++ )
        !           683:         {
        !           684:             memcpy( &(cfgptr->drives[i]), &drives[i], sizeof( drive_specs ) );
        !           685:         }
        !           686:         cfgptr->HardFileBootPri = hf_bootpri;
        !           687:         break;
        !           688:     case FLOPPY_ID:
        !           689:         for( i = 0; i < NUM_DRIVES; i++ )
        !           690:         {
        !           691:             memcpy( cfgptr->df[i], currprefs.df[i], 256 );
        !           692:         }
        !           693:         break;
        !           694:     case SOUND_ID:
        !           695:         cfgptr->SoundSupport = currprefs.produce_sound;
        !           696:         cfgptr->SoundBits    = currprefs.sound_bits;
        !           697:         cfgptr->SoundFreq    = currprefs.sound_freq;
        !           698:         cfgptr->SoundStereo  = currprefs.stereo;
        !           699:         break;
        !           700:     case PORTS_ID:
        !           701:         cfgptr->FakeJoystick = currprefs.fake_joystick;
        !           702:         cfgptr->SerialPort   = currprefs.use_serial;
        !           703:         strncpy( cfgptr->SerialName,  sername, CFG_SER_LENGTH );
        !           704:         strncpy( cfgptr->PrinterName, prtname, CFG_PAR_LENGTH );
        !           705:         break;
        !           706:     case LOADSAVE_ID:
        !           707:     case ABOUT_ID:
        !           708:     default:
        !           709:         break;
        !           710:     }
        !           711: }
        !           712: 
        !           713: // flag = 0 - save
        !           714: //      = 1 - load
        !           715: //      = 2 - delete
        !           716: //      = 3 - import
        !           717: void ConfigurationFile( HWND hDlg, ConfigStructPtr cfgptr, int flag )
        !           718: {
        !           719:     HANDLE file_handle;
        !           720:     DWORD byte_count;
        !           721:     OPENFILENAME openFileName;
        !           722:     char full_path[MAX_PATH] = "";
        !           723:     char file_name[MAX_PATH] = "";
        !           724:     char init_path[MAX_PATH] = "";
        !           725: 
        !           726:     if( start_path )
        !           727:     {
        !           728:         strncpy( init_path, start_path, MAX_PATH );
        !           729:         strncat( init_path, "\\Configurations\\", MAX_PATH );
        !           730:         strcpy( full_path, cfgptr->Name );
        !           731:     }
        !           732: 
        !           733:     if( flag == 3 )
        !           734:     {
        !           735:         openFileName.lStructSize       = sizeof(OPENFILENAME);
        !           736:         openFileName.hwndOwner         = hDlg;
        !           737:         openFileName.hInstance         = hInst;
        !           738:         openFileName.lpstrFilter       = "WinUAE Configuration Files (*.ACF)\0*.ACF\0\0";
        !           739:         openFileName.lpstrTitle        = "Choose the configuration file to import...";
        !           740:         openFileName.Flags             = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
        !           741:         openFileName.lpstrDefExt       = "ACF";
        !           742:         openFileName.lpstrCustomFilter = NULL;
        !           743:         openFileName.nMaxCustFilter    = 0;
        !           744:         openFileName.nFilterIndex      = 0;
        !           745:         openFileName.lpstrFile         = full_path;
        !           746:         openFileName.nMaxFile          = MAX_PATH;
        !           747:         openFileName.lpstrFileTitle    = file_name;
        !           748:         openFileName.nMaxFileTitle     = MAX_PATH;
        !           749:         if( start_path )
        !           750:             openFileName.lpstrInitialDir   = init_path;
        !           751:         else
        !           752:             openFileName.lpstrInitialDir   = NULL;
        !           753:         openFileName.lpfnHook          = NULL;
        !           754:         openFileName.lpTemplateName    = NULL;
        !           755:         openFileName.lCustData         = 0;
        !           756: 
        !           757:         if( GetOpenFileName( &openFileName ) )
        !           758:         {
        !           759:             // Do the import stuff here...
        !           760:         }
        !           761:     }
        !           762:     if( flag == 1 )
        !           763:     {
        !           764:         SetCursor( LoadCursor( NULL, IDC_WAIT ) );
        !           765: 
        !           766:         // full_path is our path to load the file from...
        !           767:         sprintf( full_path, "%s%s.CFG", init_path, cfgptr->Name );
        !           768:         if( ( file_handle = CreateFile( full_path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) == INVALID_HANDLE_VALUE )
        !           769:         {
        !           770:             // handle error
        !           771:         }
        !           772:         else
        !           773:         {
        !           774:             if( ReadFile( file_handle, cfgptr, cfgptr->Size, &byte_count, NULL ) == FALSE )
        !           775:             {
        !           776:                 // handle error
        !           777:             }
        !           778:             CloseHandle( file_handle );
        !           779:         }
        !           780:         SetCursor( LoadCursor( NULL, IDC_ARROW ) );
        !           781:     }
        !           782:     else if( flag == 0 )
        !           783:     {
        !           784:         SetCursor( LoadCursor( NULL, IDC_WAIT ) );
        !           785: 
        !           786:         // full_path is our path to save the file into...
        !           787:         sprintf( full_path, "%s%s.CFG", init_path, cfgptr->Name );
        !           788:         if( ( file_handle = CreateFile( full_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ) ) == INVALID_HANDLE_VALUE )
        !           789:         {
        !           790:             // handle error
        !           791:         }
        !           792:         else
        !           793:         {
        !           794:             if( WriteFile( file_handle, cfgptr, cfgptr->Size, &byte_count, NULL ) == FALSE )
        !           795:             {
        !           796:                 // handle error
        !           797:             }
        !           798:             CloseHandle( file_handle );
        !           799:         }
        !           800:         SetCursor( LoadCursor( NULL, IDC_ARROW ) );
        !           801:     }
        !           802:     else
        !           803:     {
        !           804:         // full_path is our file to delete...
        !           805:         sprintf( full_path, "%s%s.CFG", init_path, cfgptr->Name );
        !           806:         DeleteFile( full_path );
        !           807:     }
        !           808: }
        !           809: 
        !           810: // the flag is a 1 if we're transferring from a cfgptr to the dialog stuff, or a 0 if the other way...
        !           811: void TransferConfiguration( HWND hDlg, int flag )
        !           812: {
        !           813:     int i;
        !           814:     ConfigStructPtr cfgptr;
        !           815: 
        !           816:     if( cfgptr = AllocateConfigStruct() )
        !           817:     {
        !           818:         switch( flag )
        !           819:         {
        !           820:         case 0: // we're doing a save...
        !           821:             GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
        !           822:             if( cfgptr->Name[0] == '\0' )
        !           823:             {
        !           824:                 MessageBox( hDlg, "You must enter a name for your configuration...", "Save Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
        !           825:             }
        !           826:             else
        !           827:             {
        !           828:                 GetDlgItemText( hDlg, IDC_EDITDESCRIPTION, cfgptr->Description, CFG_DESCRIPTION_LENGTH );
        !           829: 
        !           830:                 // The for() loop below handles the other pages that were never viewed...
        !           831:                 for( i = 0; i < C_PAGES; i++ )
        !           832:                 {
        !           833:                     if( pages[i] == NULL )
        !           834:                         GetDefaultsForPage( cfgptr, i );
        !           835:                     else
        !           836:                         SendMessage( pages[i], PSM_QUERYSIBLINGS, 0, (LPARAM)cfgptr );
        !           837:                 }
        !           838:                 ConfigurationFile( hDlg, cfgptr, flag );
        !           839:             }
        !           840:             break;
        !           841: 
        !           842:         case 1: // we're doing a load...
        !           843:             GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
        !           844:             if( cfgptr->Name[0] == '\0' )
        !           845:             {
        !           846:                 MessageBox( hDlg, "You must select a configuration...", "Load Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
        !           847:             }
        !           848:             else
        !           849:             {
        !           850:                 ConfigurationFile( hDlg, cfgptr, flag );
        !           851: 
        !           852:                 // Do a sanity-test on the loaded config file:
        !           853:                 // - check its Size member
        !           854:                 // - check its VersionMajor
        !           855:                 // - check its VersionMinor
        !           856:                 if( ( cfgptr->Size != sizeof( ConfigStruct ) ) ||
        !           857:                     ( cfgptr->VersionMajor != CONFIG_VERSION_MAJOR ) ||
        !           858:                     ( cfgptr->VersionMinor != CONFIG_VERSION_MINOR ) )
        !           859:                 {
        !           860:                     // Dire error situation...
        !           861:                     MessageBox( hDlg, "This configuration is of the wrong version... automatic conversion is not yet available, sorry!", "Config-File Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
        !           862:                 }
        !           863:                 else
        !           864:                 {
        !           865:                     // Insert stuff here to take the cfgptr contents and put them into the right configuration variables (currprefs, etc).
        !           866: 
        !           867:                     // Basically ripped from GetDefaultsForPage() function above... and reversed direction
        !           868:                     currprefs.automount_uaedev    = !cfgptr->NoAutoConfig;
        !           869:                     currprefs.fake_joystick       = cfgptr->FakeJoystick;
        !           870:                     currprefs.illegal_mem         = cfgptr->InvalidAddresses;
        !           871:                     currprefs.use_serial          = cfgptr->SerialPort;
        !           872:                     currprefs.gfx_correct_aspect  = cfgptr->CorrectAspect;
        !           873:                     currprefs.gfx_ycenter         = cfgptr->CenterY;
        !           874:                     currprefs.gfx_xcenter         = cfgptr->CenterX;
        !           875:                     currprefs.copper_pos          = cfgptr->CopperHack;
        !           876:                     currprefs.blits_32bit_enabled = cfgptr->Blit32;
        !           877:                     currprefs.immediate_blits     = cfgptr->BlitImmediate;
        !           878:                     currprefs.gfx_lores           = cfgptr->Lores;
        !           879:                     currprefs.framerate           = cfgptr->FrameRate;
        !           880:                     currprefs.gfx_linedbl         = cfgptr->LineDouble;
        !           881:                     currprefs.gfx_width           = cfgptr->ScreenWidth;
        !           882:                     currprefs.gfx_height          = cfgptr->ScreenHeight;
        !           883:                     currprefs.produce_sound       = (int)(cfgptr->SoundSupport);
        !           884:                     currprefs.sound_bits          = cfgptr->SoundBits;
        !           885:                     currprefs.sound_freq          = cfgptr->SoundFreq;
        !           886:                     currprefs.stereo              = cfgptr->SoundStereo;
        !           887: 
        !           888:                     //use_debugger           = cfgptr->DebuggerEnabled;
        !           889:                     amiga_fullscreen       = cfgptr->FullScreen;
        !           890:                     chipmem_size           = cfgptr->ChipMem;
        !           891:                     fastmem_size           = cfgptr->FastMem;
        !           892:                     gfxmem_size            = cfgptr->P96Mem;
        !           893:                     z3fastmem_size         = cfgptr->Z3Mem;
        !           894:                     currprefs.m68k_speed   = cfgptr->M68KSpeed;
        !           895:                     hf_bootpri             = cfgptr->HardFileBootPri;
        !           896:                     customsize             = cfgptr->CustomSize;
        !           897:                     address_space_24       = cfgptr->AddressingIs24Bit;
        !           898: 
        !           899:                     strncpy( sername, cfgptr->SerialName, CFG_SER_LENGTH );
        !           900:                     strncpy( prtname, cfgptr->PrinterName, CFG_PAR_LENGTH );
        !           901:                     strncpy( romfile, cfgptr->KickstartName, CFG_ROM_LENGTH );
        !           902:                     strncpy( keyfile, cfgptr->KeyFileName, CFG_KEY_LENGTH );
        !           903: 
        !           904:                     for( i = 0; i < NUM_DRIVES; i++ )
        !           905:                     {
        !           906:                         memcpy( &drives[i], &(cfgptr->drives[i]), sizeof( drive_specs ) );
        !           907:                     }
        !           908: 
        !           909:                     for( i = 0; i < NUM_DRIVES; i++ )
        !           910:                     {
        !           911:                         memcpy( currprefs.df[i], cfgptr->df[i], 256 );
        !           912:                     }
        !           913: 
        !           914:                     // Now, re-init the pages to have the right visual state...  not done when a page is viewed
        !           915:                     // Only needs to be sent to those pages which have been viewed so far.
        !           916:                     for( i = 0; i < C_PAGES; i++ )
        !           917:                     {
        !           918:                         if( pages[i] != NULL )
        !           919:                             SendMessage( pages[i], WM_USER, 0, 0 );
        !           920:                     }
        !           921:                 }
        !           922:             }
        !           923:             break;
        !           924: 
        !           925:         case 2: // we're doing a delete...
        !           926:             GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
        !           927:             if( cfgptr->Name[0] == '\0' )
        !           928:             {
        !           929:                 MessageBox( hDlg, "You must select a configuration to delete...", "Delete Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
        !           930:             }
        !           931:             else
        !           932:             {
        !           933:                 ConfigurationFile( hDlg, cfgptr, flag );
        !           934:             }
        !           935:             break;
        !           936: 
        !           937:         case 3: // we're doing an import...
        !           938:         default:
        !           939:             ConfigurationFile( hDlg, cfgptr, flag );
        !           940:             break;
        !           941:         }
        !           942:         FreeConfigStruct( cfgptr );
        !           943:     }
        !           944: }
        !           945: 
        !           946: void InitializeListView( HWND hDlg )
        !           947: {
        !           948: #define NUM_COLUMNS 2
        !           949:     HANDLE file_handle = NULL;
        !           950:     WIN32_FIND_DATA find_data;
        !           951:     BOOL rc = TRUE;
        !           952:     HWND list;
        !           953:     LV_ITEM lvstruct;
        !           954:     LV_COLUMN lvcolumn;
        !           955:     RECT rect;
        !           956:     char *column_heading[ NUM_COLUMNS ] = { "Name", "Description" };
        !           957:     int width = 0, column_width[ NUM_COLUMNS ] = { 0, 0 };
        !           958:     int items = 0, result = 0, i, entry = 0, temp = 0;
        !           959:     ConfigStructPtr config = NULL;
        !           960: 
        !           961:     list = GetDlgItem( hDlg, IDC_CONFIGLIST );
        !           962:     ListView_DeleteAllItems( list );
        !           963: 
        !           964:     for( i = 0; i < NUM_COLUMNS; i++ )
        !           965:         column_width[i] = ListView_GetStringWidth( list, column_heading[i] ) + 15;
        !           966: 
        !           967:     // If there are no columns, then insert some
        !           968:     lvcolumn.mask = LVCF_WIDTH;
        !           969:     if( ListView_GetColumn( list, 1, &lvcolumn ) == FALSE )
        !           970:     {
        !           971:         for( i = 0; i < NUM_COLUMNS; i++ )
        !           972:         {
        !           973:             lvcolumn.mask     = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
        !           974:             lvcolumn.iSubItem = i;
        !           975:             lvcolumn.fmt      = LVCFMT_CENTER;
        !           976:             lvcolumn.pszText  = column_heading[i];
        !           977:             lvcolumn.cx       = column_width[i];
        !           978:             ListView_InsertColumn( list, i, &lvcolumn );
        !           979:         }
        !           980:     }
        !           981:     if( config = GetFirstConfigEntry( &file_handle, &find_data ) )
        !           982:     {
        !           983:         do
        !           984:         {
        !           985:             lvstruct.mask     = LVIF_TEXT | LVIF_PARAM;
        !           986:             lvstruct.pszText  = config->Name;
        !           987:             lvstruct.lParam   = 0;
        !           988:             lvstruct.iItem    = entry;
        !           989:             lvstruct.iSubItem = 0;
        !           990:             result = ListView_InsertItem( list, &lvstruct );
        !           991:             if( result != -1 )
        !           992:             {
        !           993:                 width = ListView_GetStringWidth( list, lvstruct.pszText ) + 15;
        !           994:                 if( width > column_width[ lvstruct.iSubItem ] )
        !           995:                     column_width[ lvstruct.iSubItem ] = width;
        !           996: 
        !           997:                 ListView_SetItemText( list, result, 1, config->Description );
        !           998:                 width = ListView_GetStringWidth( list, config->Description ) + 15;
        !           999:                 if( width > column_width[ 1 ] )
        !          1000:                     column_width[ 1 ] = width;
        !          1001: 
        !          1002:                 entry++;
        !          1003:             }
        !          1004:             FreeConfigStruct( config );
        !          1005:         }
        !          1006:         while( config = GetNextConfigEntry( &file_handle, &find_data ) );
        !          1007:     }
        !          1008:     if( rc == FALSE )
        !          1009:     {
        !          1010:         FreeConfigStruct( config );
        !          1011:     }
        !          1012: 
        !          1013:     if( result != -1 )
        !          1014:     {
        !          1015:         if( GetWindowRect( list, &rect ) )
        !          1016:         {
        !          1017:             ScreenToClient( hDlg, (LPPOINT)&rect );
        !          1018:             ScreenToClient( hDlg, (LPPOINT)&rect.right );
        !          1019:             if( ( temp = rect.right - rect.left - column_width[ 0 ] - 4 ) > column_width[1] )
        !          1020:                 column_width[1] = temp;
        !          1021:         }
        !          1022: 
        !          1023:         // Adjust our column widths so that we can see the contents...
        !          1024:         for( i = 0; i < NUM_COLUMNS; i++ )
        !          1025:         {
        !          1026:             ListView_SetColumnWidth( list, i, column_width[i] );
        !          1027:         }
        !          1028: 
        !          1029:         // Redraw the items in the list...
        !          1030:         items = ListView_GetItemCount( list );
        !          1031:         ListView_RedrawItems( list, 0, items );
        !          1032:     }
        !          1033: }
        !          1034: 
        !          1035: BOOL CALLBACK LoadSaveDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          1036: {
        !          1037: #define NUM_COLUMNS 2
        !          1038:     char name_buf[ MAX_PATH ] = "", desc_buf[ 128 ] = "";
        !          1039:     int found = 0;
        !          1040:     BOOL rc = TRUE;
        !          1041:     RECT rect;
        !          1042:     DWORD pos;
        !          1043:     POINT point;
        !          1044:     HWND list;
        !          1045:     UINT flag, dblclick = 0;
        !          1046:     NM_LISTVIEW *nmlistview;
        !          1047:     int items = 0, result = 0, entry = 0;
        !          1048:     ConfigStructPtr config = NULL;
        !          1049: 
        !          1050:     switch(msg)
        !          1051:     {
        !          1052:         case WM_INITDIALOG:
        !          1053:             InitializeListView( hDlg );
        !          1054:             if( hEmuThread )
        !          1055:             {
        !          1056:                 EnableWindow( GetDlgItem( hDlg, IDC_SAVE ), FALSE );
        !          1057:                 EnableWindow( GetDlgItem( hDlg, IDC_IMPORT ), FALSE );
        !          1058:             }
        !          1059:             return(TRUE);
        !          1060:             break;
        !          1061: 
        !          1062:         case WM_COMMAND:
        !          1063:             switch( wParam )
        !          1064:             {
        !          1065:             case IDC_SAVE:
        !          1066:                 TransferConfiguration( hDlg, 0 );
        !          1067:                 InitializeListView( hDlg );
        !          1068:                 break;
        !          1069:             case IDC_LOAD:
        !          1070:                 TransferConfiguration( hDlg, 1 );
        !          1071:                 break;
        !          1072:             case IDC_DELETE:
        !          1073:                 TransferConfiguration( hDlg, 2 );
        !          1074:                 InitializeListView( hDlg );
        !          1075:                 break;
        !          1076:             case IDC_IMPORT:
        !          1077:                 TransferConfiguration( hDlg, 3 );
        !          1078:                 break;
        !          1079:             }
        !          1080:             break;
        !          1081:         case WM_NOTIFY:
        !          1082:             if( ((LPNMHDR)lParam)->idFrom == IDC_CONFIGLIST )
        !          1083:             {
        !          1084:                 nmlistview = (NM_LISTVIEW *)lParam;
        !          1085:                 list = nmlistview->hdr.hwndFrom;
        !          1086: 
        !          1087:                 switch( nmlistview->hdr.code )
        !          1088:                 {
        !          1089:                 case NM_DBLCLK:
        !          1090:                     dblclick = 1;
        !          1091:                     // fall-through
        !          1092:                 case NM_CLICK:
        !          1093:                     pos = GetMessagePos();
        !          1094:                     point.x = LOWORD( pos );
        !          1095:                     point.y = HIWORD( pos );
        !          1096:                     ScreenToClient( list, &point );
        !          1097:                     entry = ListView_GetTopIndex( list );
        !          1098:                     items = entry + ListView_GetCountPerPage( list );
        !          1099:                     if( items > ListView_GetItemCount( list ) )
        !          1100:                         items = ListView_GetItemCount( list );
        !          1101: 
        !          1102:                     while( entry <= items )
        !          1103:                     {
        !          1104:                         // Get the bounding rectangle of an item. If the mouse
        !          1105:                         // location is within the bounding rectangle of the item,
        !          1106:                         // you know you have found the item that was being clicked.
        !          1107:                         ListView_GetItemRect( list, entry, &rect, LVIR_BOUNDS);
        !          1108:                         if( PtInRect( &rect, point ) )
        !          1109:                         {
        !          1110:                             flag = LVIS_SELECTED | LVIS_FOCUSED;
        !          1111:                             ListView_SetItemState( list, entry, flag, flag);
        !          1112:                             found = 1;
        !          1113:                             break;
        !          1114:                         }
        !          1115: 
        !          1116:                         // Get the next item in listview control.
        !          1117:                         entry++;
        !          1118:                     }
        !          1119: 
        !          1120:                     // Copy the item's name and description to the gadgets at the bottom...
        !          1121:                     if( entry >= 0 && found)
        !          1122:                     {
        !          1123:                         ListView_GetItemText( list, entry, 0, name_buf, MAX_PATH );
        !          1124:                         ListView_GetItemText( list, entry, 1, desc_buf, 128 );
        !          1125:                         SetDlgItemText( hDlg, IDC_EDITNAME, name_buf );
        !          1126:                         SetDlgItemText( hDlg, IDC_EDITDESCRIPTION, desc_buf );
        !          1127:                         ListView_RedrawItems( list, 0, items );
        !          1128: 
        !          1129:                         if( dblclick )
        !          1130:                         {
        !          1131:                             // do the config-loading
        !          1132:                             TransferConfiguration( hDlg, 1 );
        !          1133: 
        !          1134:                             // start the emulation...
        !          1135:                         }
        !          1136:                     }
        !          1137:                     break;
        !          1138:                 }
        !          1139:             }
        !          1140:             else
        !          1141:             {
        !          1142:                 switch(((NMHDR *)lParam)->code)
        !          1143:                 {
        !          1144:                     case PSN_RESET:
        !          1145:                         if(allow_quit_from_property_sheet)
        !          1146:                         {
        !          1147:                             quit_program = 1;
        !          1148:                             regs.spcflags |= SPCFLAG_BRK;
        !          1149:                         }
        !          1150:                         break;
        !          1151:                 }
        !          1152:             }
        !          1153:             break;
        !          1154:     }
        !          1155: 
        !          1156:     return(FALSE);
        !          1157: }
        !          1158: 
        !          1159: int CALLBACK ContributorsProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
        !          1160: {
        !          1161:     CHARFORMAT CharFormat;
        !          1162: 
        !          1163:     switch( msg )
        !          1164:     {
        !          1165:     case WM_COMMAND:
        !          1166:         if( wParam == IDC_GREATWORK )
        !          1167:         {
        !          1168:             EndDialog( hDlg, 1 );
        !          1169:             return TRUE;
        !          1170:         }
        !          1171:         break;
        !          1172:     case WM_INITDIALOG:
        !          1173:         CharFormat.cbSize = sizeof( CharFormat );
        !          1174: 
        !          1175:         SetDlgItemText( hDlg, IDC_CONTRIBUTORS, 
        !          1176:             "Bernd Schmidt - The Grand-Master\n"
        !          1177:             "Mathias Ortmann - WinUAE Main Guy\n"
        !          1178:             "Brian King - Picasso96 Support, Integrated GUI for WinUAE, AHI (Working on it)\n"
        !          1179:             "Gustavo Goedert/Peter Remmers/Michael Sontheimer/Tomi Hakala/Tim Gunn/Nemo Pohle - DOS Port Stuff\n"
        !          1180:             "Samuel Devulder/Olaf Barthel - Amiga Port\n"
        !          1181:             "Krister Bergman - XFree86 and OS/2 Port\n"
        !          1182:             "A. Blanchard/Ernesto Corvi - MacOS Port\n"
        !          1183:             "Christian Bauer - BeOS Port\n"
        !          1184:             "Ian Stephenson - NextStep Port\n"
        !          1185:             "Peter Teichmann - Acorn/RiscOS Port\n"
        !          1186:             "Stefan Reinauer - ZorroII/III AutoConfig, Serial Support\n"
        !          1187:             "Christian Schmitt/Chris Hames - Serial Support\n"
        !          1188:             "Herman ten Brugge - 68020/68881 Emulation Code\n"
        !          1189:             "Tauno Taipaleenmaki - Various UAE-Control/UAE-Library Support\n"
        !          1190:             "Brett Eden/Tim Gunn/Paolo Besser/Nemo Pohle - Various Docs and Web-Sites\n"
        !          1191:             "Special thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)"
        !          1192:             );
        !          1193:         SendDlgItemMessage(hDlg, IDC_CONTRIBUTORS, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1194:         CharFormat.dwMask |= CFM_SIZE | CFM_FACE;
        !          1195:         CharFormat.yHeight = 10*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
        !          1196:         strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1197:         SendDlgItemMessage(hDlg, IDC_CONTRIBUTORS, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1198:         //SendDlgItemMessage(hDlg, IDC_CONTRIBUTORS, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1199: 
        !          1200:         return TRUE;
        !          1201:         break;
        !          1202:     }
        !          1203:     return FALSE;
        !          1204: }
        !          1205: 
        !          1206: void DisplayContributors( HWND hDlg )
        !          1207: {
        !          1208:     DialogBox( hInst, MAKEINTRESOURCE( IDD_CONTRIBUTORS ), hDlg, ContributorsProc );
        !          1209: }
        !          1210: 
        !          1211: BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          1212: {
        !          1213:     POINT point;
        !          1214:     RECT rect;
        !          1215:     CHARFORMAT CharFormat;
        !          1216:     switch(msg)
        !          1217:     {
        !          1218:         case WM_INITDIALOG:
        !          1219:             CharFormat.cbSize = sizeof( CharFormat );
        !          1220: 
        !          1221:             SetDlgItemText( hDlg, IDC_RICHEDIT1, "UAE for Win32/DirectX" );
        !          1222:             SendDlgItemMessage(hDlg, IDC_RICHEDIT1, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1223:             CharFormat.dwMask |= CFM_BOLD | CFM_SIZE | CFM_FACE;
        !          1224:             CharFormat.dwEffects = CFE_BOLD;
        !          1225:             CharFormat.yHeight = 18*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
        !          1226:             strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1227:             SendDlgItemMessage(hDlg, IDC_RICHEDIT1, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1228:             SendDlgItemMessage(hDlg, IDC_RICHEDIT1, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1229: 
        !          1230:             SetDlgItemText( hDlg, IDC_RICHEDIT2, PROGNAME );
        !          1231:             SendDlgItemMessage(hDlg, IDC_RICHEDIT2, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1232:             CharFormat.dwMask |= CFM_SIZE | CFM_FACE;
        !          1233:             CharFormat.yHeight = 10*20;
        !          1234:             strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1235:             SendDlgItemMessage(hDlg, IDC_RICHEDIT2, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1236:             SendDlgItemMessage(hDlg, IDC_RICHEDIT2, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1237: 
        !          1238:             SetDlgItemText( hDlg, IDC_AMIGAHOME, "Amiga" );
        !          1239:             SendDlgItemMessage(hDlg, IDC_AMIGAHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1240:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
        !          1241:             CharFormat.dwEffects = CFE_UNDERLINE;
        !          1242:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
        !          1243:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
        !          1244:             strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1245:             SendDlgItemMessage(hDlg, IDC_AMIGAHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1246:             SendDlgItemMessage(hDlg, IDC_AMIGAHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1247: 
        !          1248:             SetDlgItemText( hDlg, IDC_CLOANTOHOME, "Cloanto" );
        !          1249:             SendDlgItemMessage(hDlg, IDC_CLOANTOHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1250:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
        !          1251:             CharFormat.dwEffects = CFE_UNDERLINE;
        !          1252:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
        !          1253:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
        !          1254:             strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1255:             SendDlgItemMessage(hDlg, IDC_CLOANTOHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1256:             SendDlgItemMessage(hDlg, IDC_CLOANTOHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1257: 
        !          1258:             SetDlgItemText( hDlg, IDC_WINUAEHOME, "WinUAE" );
        !          1259:             SendDlgItemMessage(hDlg, IDC_WINUAEHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1260:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
        !          1261:             CharFormat.dwEffects = CFE_UNDERLINE;
        !          1262:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
        !          1263:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
        !          1264:             strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1265:             SendDlgItemMessage(hDlg, IDC_WINUAEHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1266:             SendDlgItemMessage(hDlg, IDC_WINUAEHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1267: 
        !          1268:             SetDlgItemText( hDlg, IDC_UAEHOME, "UAE" );
        !          1269:             SendDlgItemMessage(hDlg, IDC_UAEHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1270:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
        !          1271:             CharFormat.dwEffects = CFE_UNDERLINE;
        !          1272:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
        !          1273:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
        !          1274:             strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1275:             SendDlgItemMessage(hDlg, IDC_UAEHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1276:             SendDlgItemMessage(hDlg, IDC_UAEHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1277: 
        !          1278:             SetDlgItemText( hDlg, IDC_PICASSOHOME, "Picasso96" );
        !          1279:             SendDlgItemMessage(hDlg, IDC_PICASSOHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
        !          1280:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
        !          1281:             CharFormat.dwEffects = CFE_UNDERLINE;
        !          1282:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
        !          1283:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
        !          1284:             strcpy( CharFormat.szFaceName, "Times New Roman" );
        !          1285:             SendDlgItemMessage(hDlg, IDC_PICASSOHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
        !          1286:             SendDlgItemMessage(hDlg, IDC_PICASSOHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
        !          1287:             break;
        !          1288: 
        !          1289:         case WM_COMMAND:
        !          1290:             if( wParam == IDC_CONTRIBUTORS )
        !          1291:             {
        !          1292:                 DisplayContributors( hDlg );
        !          1293:             }
        !          1294:             break;
        !          1295:         case WM_LBUTTONDOWN:
        !          1296:             point.x = LOWORD( lParam );
        !          1297:             point.y = HIWORD( lParam );
        !          1298:             GetWindowRect( GetDlgItem( hDlg, IDC_CLOANTOHOME ), &rect );
        !          1299:             ScreenToClient( hDlg, (POINT *)&rect );
        !          1300:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
        !          1301:             if( PtInRect( &rect, point ) )
        !          1302:             {
        !          1303:                 ShellExecute( NULL, NULL, "http://www.cloanto.com/amiga/forever", NULL, NULL, SW_SHOWNORMAL );
        !          1304:                 break;
        !          1305:             }
        !          1306:             
        !          1307:             GetWindowRect( GetDlgItem( hDlg, IDC_AMIGAHOME ), &rect );
        !          1308:             ScreenToClient( hDlg, (POINT *)&rect );
        !          1309:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
        !          1310:             if( PtInRect( &rect, point ) )
        !          1311:             {
        !          1312:                 ShellExecute( NULL, NULL, "http://www.amiga.de", NULL, NULL, SW_SHOWNORMAL );
        !          1313:                 break;
        !          1314:             }
        !          1315: 
        !          1316:             GetWindowRect( GetDlgItem( hDlg, IDC_PICASSOHOME ), &rect );
        !          1317:             ScreenToClient( hDlg, (POINT *)&rect );
        !          1318:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
        !          1319:             if( PtInRect( &rect, point ) )
        !          1320:             {
        !          1321:                 ShellExecute( NULL, NULL, "http://www.villagetronic.com/amiga/support/ftp96.html", NULL, NULL, SW_SHOWNORMAL );
        !          1322:                 break;
        !          1323:             }
        !          1324:             
        !          1325:             GetWindowRect( GetDlgItem( hDlg, IDC_UAEHOME ), &rect );
        !          1326:             ScreenToClient( hDlg, (POINT *)&rect );
        !          1327:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
        !          1328:             if( PtInRect( &rect, point ) )
        !          1329:             {
        !          1330:                 ShellExecute( NULL, NULL, "http://www.freiburg.linux.de/~uae/", NULL, NULL, SW_SHOWNORMAL );
        !          1331:                 break;
        !          1332:             }
        !          1333: 
        !          1334:             GetWindowRect( GetDlgItem( hDlg, IDC_WINUAEHOME ), &rect );
        !          1335:             ScreenToClient( hDlg, (POINT *)&rect );
        !          1336:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
        !          1337:             if( PtInRect( &rect, point ) )
        !          1338:             {
        !          1339:                 ShellExecute( NULL, NULL, "http://www.informatik.tu-muenchen.de/~ortmann/uae/", NULL, NULL, SW_SHOWNORMAL );
        !          1340:                 break;
        !          1341:             }
        !          1342: 
        !          1343:             break;
        !          1344:         case WM_NOTIFY:
        !          1345:             switch(((NMHDR *)lParam)->code)
        !          1346:             {
        !          1347:             case PSN_RESET:
        !          1348:                 if(allow_quit_from_property_sheet)
        !          1349:                 {
        !          1350:                     quit_program = 1;
        !          1351:                     regs.spcflags |= SPCFLAG_BRK;
        !          1352:                 }
        !          1353:                 break;
        !          1354:             }
        !          1355:             break;
        !          1356:     }
        !          1357: 
        !          1358:     return(FALSE);
        !          1359: }
        !          1360: 
        !          1361: // Handle messages for the Display Settings page of our property-sheet
        !          1362: BOOL CALLBACK DisplayDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          1363: {
        !          1364:     int i, item_height;
        !          1365:     RECT rect;
        !          1366:     LONG posn;
        !          1367:     ConfigStructPtr cfgptr;
        !          1368: 
        !          1369:     switch(msg)
        !          1370:     {
        !          1371:         case PSM_QUERYSIBLINGS:
        !          1372:             cfgptr = (ConfigStructPtr)lParam;
        !          1373:             cfgptr->FrameRate     = SendDlgItemMessage(hDlg,IDC_FRAMERATE,TBM_GETPOS,0,0);
        !          1374:             cfgptr->LineDouble    = IsDlgButtonChecked(hDlg, IDC_LINEDBL);
        !          1375:             cfgptr->FullScreen    = IsDlgButtonChecked( hDlg, IDC_FULLSCREEN );
        !          1376:             cfgptr->CorrectAspect = IsDlgButtonChecked(hDlg, IDC_ASPECT);
        !          1377:             cfgptr->CenterY       = IsDlgButtonChecked(hDlg, IDC_YCENTER);
        !          1378:             cfgptr->CenterX       = IsDlgButtonChecked(hDlg, IDC_XCENTER);
        !          1379:             cfgptr->Blit32        = IsDlgButtonChecked(hDlg, IDC_BLIT32);
        !          1380:             cfgptr->BlitImmediate = IsDlgButtonChecked(hDlg, IDC_BLITIMM);
        !          1381:             cfgptr->Lores         = IsDlgButtonChecked(hDlg, IDC_LORES);
        !          1382:             cfgptr->CustomSize    = 0;
        !          1383:             if( IsDlgButtonChecked( hDlg, IDC_CUSTOMSIZE ) && !cfgptr->FullScreen )
        !          1384:             {
        !          1385:                 cfgptr->ScreenWidth  = SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_GETPOS, 0, 0 );
        !          1386:                 cfgptr->ScreenHeight = SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_GETPOS, 0, 0 );
        !          1387:                 cfgptr->CustomSize = 1;
        !          1388:             }
        !          1389:             else if( ( posn = SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_GETCURSEL, 0, 0 ) ) != CB_ERR )
        !          1390:             {
        !          1391:                 posn = GetDisplayModeNumber( posn );
        !          1392:                 cfgptr->ScreenWidth  = DisplayModes[posn].res.width;
        !          1393:                 cfgptr->ScreenHeight = DisplayModes[posn].res.height;
        !          1394:             }
        !          1395:             else
        !          1396:             {
        !          1397:                 cfgptr->ScreenWidth  = currprefs.gfx_width;
        !          1398:                 cfgptr->ScreenHeight = currprefs.gfx_height;
        !          1399:             }
        !          1400:             break;
        !          1401: 
        !          1402:         case WM_INITDIALOG:
        !          1403:             pages[ DISPLAY_ID ] = hDlg;
        !          1404:         case WM_USER:
        !          1405:             SendDlgItemMessage(hDlg, IDC_FRAMERATE, TBM_SETRANGE,TRUE,MAKELONG(MIN_REFRESH_RATE,MAX_REFRESH_RATE));
        !          1406:             SendDlgItemMessage(hDlg,IDC_FRAMERATE,TBM_SETPOS,TRUE,currprefs.framerate);
        !          1407:             SendDlgItemMessage( hDlg, IDC_FRAMERATE, TBM_SETPAGESIZE, 0, 1 );
        !          1408:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_FRAMERATE) );
        !          1409:             CheckDlgButton(hDlg, IDC_LINEDBL, currprefs.gfx_linedbl);
        !          1410:             CheckDlgButton( hDlg, IDC_FULLSCREEN, amiga_fullscreen );
        !          1411:             CheckDlgButton( hDlg, IDC_CUSTOMSIZE, customsize );
        !          1412: 
        !          1413:             if( pages[ STARTUP_ID ] && wParam == 1 )
        !          1414:             {
        !          1415:                 if( SendDlgItemMessage( pages[ STARTUP_ID ], IDC_P96MEM, TBM_GETPOS, 0, 0 ) > 0 )
        !          1416:                 {
        !          1417:                     CheckDlgButton( hDlg, IDC_FULLSCREEN, TRUE );
        !          1418:                     EnableWindow( GetDlgItem( hDlg, IDC_FULLSCREEN ), FALSE );
        !          1419:                 }
        !          1420:                 else
        !          1421:                 {
        !          1422:                     EnableWindow( GetDlgItem( hDlg, IDC_FULLSCREEN ), TRUE );
        !          1423:                 }
        !          1424:             }
        !          1425:             else
        !          1426:             {
        !          1427:                 if( gfxmem_size )
        !          1428:                 {
        !          1429:                     CheckDlgButton( hDlg, IDC_FULLSCREEN, TRUE );
        !          1430:                     EnableWindow( GetDlgItem( hDlg, IDC_FULLSCREEN ), FALSE );
        !          1431:                 }
        !          1432:             }
        !          1433: 
        !          1434:             SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_RESETCONTENT,0,0);
        !          1435:             for(i=0;i<mode_count;i++)
        !          1436:             {
        !          1437:                 if( DisplayModes[i].depth == 2 &&
        !          1438:                     DisplayModes[i].res.width <= 800 &&
        !          1439:                     DisplayModes[i].res.height <= 600 )
        !          1440:                     SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)DisplayModes[i].name);
        !          1441:             }
        !          1442: 
        !          1443:             SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_SETRANGE, 0, MAKELONG( 800, 320 ) );
        !          1444:             SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_SETPOS, TRUE, currprefs.gfx_width );
        !          1445:             SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_SETRANGE, 0, MAKELONG( 600, 200 ) );
        !          1446:             SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_SETPOS, TRUE, currprefs.gfx_height );
        !          1447: 
        !          1448:             CheckDlgButton( hDlg, IDC_CUSTOMSIZE, customsize );
        !          1449: 
        !          1450:             if( !amiga_fullscreen )
        !          1451:             {
        !          1452:                 EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), TRUE );
        !          1453:                 EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), TRUE );
        !          1454:                 EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), TRUE );
        !          1455:                 SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_SETCURSEL, GetDisplayModeLogicalNumber( 800, 600 ), 0 );
        !          1456:             }
        !          1457:             else
        !          1458:             {
        !          1459:                 EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), FALSE );
        !          1460:                 EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), FALSE );
        !          1461:                 EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), FALSE );
        !          1462:                 SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_SETCURSEL, GetDisplayModeLogicalNumber( currprefs.gfx_width, currprefs.gfx_height ), 0 );
        !          1463:             }
        !          1464: 
        !          1465:             // Retrieve the height, in pixels, of a list item.
        !          1466:             item_height = SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_GETITEMHEIGHT,0,0);
        !          1467:             if( item_height != CB_ERR )
        !          1468:             {
        !          1469:                 // Get actual box position and size
        !          1470:                 GetWindowRect( GetDlgItem(hDlg,IDC_RESOLUTION), &rect);
        !          1471:                 rect.bottom = rect.top + item_height*mode_count + SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_GETITEMHEIGHT,(WPARAM)-1,0) + item_height;
        !          1472:                 SetWindowPos( GetDlgItem(hDlg,IDC_RESOLUTION), 0, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE|SWP_NOZORDER);
        !          1473:             }
        !          1474: 
        !          1475:             CheckDlgButton(hDlg, IDC_ASPECT, currprefs.gfx_correct_aspect);
        !          1476:             CheckDlgButton(hDlg, IDC_YCENTER, currprefs.gfx_ycenter);
        !          1477:             CheckDlgButton(hDlg, IDC_XCENTER, currprefs.gfx_xcenter);
        !          1478:             CheckDlgButton(hDlg, IDC_BLIT32, currprefs.blits_32bit_enabled);
        !          1479:             CheckDlgButton(hDlg, IDC_BLITIMM, currprefs.immediate_blits);
        !          1480:             CheckDlgButton(hDlg, IDC_LORES, currprefs.gfx_lores);
        !          1481:             if(hEmuThread)
        !          1482:             {   // Disable certain controls which are only to be set once at start-up...
        !          1483:                 EnableWindow(GetDlgItem(hDlg, IDC_LORES), FALSE);
        !          1484:                 EnableWindow(GetDlgItem(hDlg, IDC_XCENTER), FALSE);
        !          1485:                 EnableWindow(GetDlgItem(hDlg, IDC_YCENTER), FALSE);
        !          1486:                 EnableWindow(GetDlgItem(hDlg, IDC_ASPECT), FALSE);
        !          1487:                 EnableWindow(GetDlgItem(hDlg, IDC_LINEDBL), FALSE);
        !          1488:                 EnableWindow(GetDlgItem(hDlg, IDC_RESOLUTION), FALSE);
        !          1489:                 EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), FALSE );
        !          1490:                 EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), FALSE );
        !          1491:                 EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), FALSE );
        !          1492:                 EnableWindow( GetDlgItem( hDlg, IDC_XSIZE ), FALSE );
        !          1493:                 EnableWindow( GetDlgItem( hDlg, IDC_YSIZE ), FALSE );
        !          1494:             }
        !          1495:             break;
        !          1496:         case WM_HSCROLL:
        !          1497:             UpdateScroller( hDlg, (HWND)lParam );
        !          1498:             break;
        !          1499:         case WM_COMMAND:
        !          1500:             if( LOWORD(wParam) == IDC_FULLSCREEN )
        !          1501:             {
        !          1502:                 if( hEmuThread == NULL )
        !          1503:                 {
        !          1504:                     EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
        !          1505:                     EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
        !          1506:                     EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
        !          1507:                     EnableWindow( GetDlgItem( hDlg, IDC_XSIZE ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
        !          1508:                     EnableWindow( GetDlgItem( hDlg, IDC_YSIZE ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
        !          1509:                 }
        !          1510:             }
        !          1511:             break;
        !          1512: 
        !          1513:         case WM_NOTIFY:
        !          1514:             switch(((NMHDR *)lParam)->code)
        !          1515:             {
        !          1516:                 case PSN_APPLY:
        !          1517:                     if( amiga_fullscreen != IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) )
        !          1518:                     {
        !          1519:                         if( hEmuThread )
        !          1520:                             new_fullscreen_flag = 1;
        !          1521:                         else
        !          1522:                             amiga_fullscreen = IsDlgButtonChecked( hDlg, IDC_FULLSCREEN );
        !          1523:                     }
        !          1524: 
        !          1525:                     customsize = IsDlgButtonChecked( hDlg, IDC_CUSTOMSIZE );
        !          1526:                     if( customsize && !amiga_fullscreen )
        !          1527:                     {
        !          1528:                         currprefs.gfx_width  = SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_GETPOS, 0, 0 );
        !          1529:                         currprefs.gfx_height = SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_GETPOS, 0, 0 );
        !          1530:                     }
        !          1531:                     else if( ( posn = SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_GETCURSEL, 0, 0 ) ) != CB_ERR )
        !          1532:                     {
        !          1533:                         posn = GetDisplayModeNumber( posn );
        !          1534:                         currprefs.gfx_width           = DisplayModes[posn].res.width;
        !          1535:                         currprefs.gfx_height          = DisplayModes[posn].res.height;
        !          1536:                     }
        !          1537:                     currprefs.gfx_ycenter         = IsDlgButtonChecked(hDlg, IDC_YCENTER);
        !          1538:                     currprefs.gfx_xcenter         = IsDlgButtonChecked(hDlg, IDC_XCENTER);
        !          1539:                     currprefs.blits_32bit_enabled = IsDlgButtonChecked(hDlg, IDC_BLIT32);
        !          1540:                     currprefs.immediate_blits     = IsDlgButtonChecked(hDlg, IDC_BLITIMM);
        !          1541:                     currprefs.gfx_lores           = IsDlgButtonChecked(hDlg, IDC_LORES);
        !          1542:                     currprefs.framerate           = SendDlgItemMessage(hDlg,IDC_FRAMERATE,TBM_GETPOS,0,0);
        !          1543:                     currprefs.gfx_correct_aspect  = IsDlgButtonChecked(hDlg, IDC_ASPECT);
        !          1544:                     currprefs.gfx_linedbl         = IsDlgButtonChecked(hDlg, IDC_LINEDBL);
        !          1545:                     break;
        !          1546: 
        !          1547:                 case PSN_RESET:
        !          1548:                     if(allow_quit_from_property_sheet)
        !          1549:                     {
        !          1550:                         quit_program = 1;
        !          1551:                         regs.spcflags |= SPCFLAG_BRK;
        !          1552:                     }
        !          1553:                     break;
        !          1554:             }
        !          1555:     }
        !          1556:     return(FALSE);
        !          1557: }
        !          1558: 
        !          1559: BOOL CALLBACK StartupDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          1560: {
        !          1561:     ConfigStructPtr cfgptr;
        !          1562:     LONG mem_size;
        !          1563: 
        !          1564:     switch(msg)
        !          1565:     {
        !          1566:         case PSM_QUERYSIBLINGS:
        !          1567:             cfgptr = (ConfigStructPtr)lParam;
        !          1568: 
        !          1569:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_CHIPMEM),TBM_GETPOS,0,0), &cfgptr->ChipMem, NULL, 0 );
        !          1570:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_FASTMEM),TBM_GETPOS,0,0), &cfgptr->FastMem, NULL, 1 );
        !          1571: #if CPU_LEVEL > 1
        !          1572:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0 ), &cfgptr->P96Mem, NULL, 2 );
        !          1573:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_Z3FASTMEM), TBM_GETPOS, 0, 0 ), &cfgptr->Z3Mem, NULL, 3 );
        !          1574: #endif
        !          1575:             GetDlgItemText( hDlg, IDC_ROMFILE, cfgptr->KickstartName, CFG_ROM_LENGTH );
        !          1576:             GetDlgItemText( hDlg, IDC_KEYFILE, cfgptr->KeyFileName, CFG_KEY_LENGTH );
        !          1577:             break;
        !          1578: 
        !          1579:         case WM_INITDIALOG:
        !          1580:             pages[ STARTUP_ID ] = hDlg;
        !          1581:         case WM_USER:
        !          1582:             SetDlgItemText( hDlg, IDC_ROMFILE, romfile );
        !          1583:             SetDlgItemText( hDlg, IDC_KEYFILE, keyfile );
        !          1584:             SendDlgItemMessage(hDlg, IDC_CHIPMEM, TBM_SETRANGE,TRUE,MAKELONG(MIN_CHIP_MEM,MAX_CHIP_MEM));
        !          1585:             SendDlgItemMessage(hDlg, IDC_FASTMEM, TBM_SETRANGE,TRUE,MAKELONG(MIN_FAST_MEM,MAX_FAST_MEM));
        !          1586: #if CPU_LEVEL > 1
        !          1587:             SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETRANGE,TRUE,MAKELONG(MIN_P96_MEM,MAX_P96_MEM));
        !          1588:             SendDlgItemMessage(hDlg, IDC_Z3FASTMEM, TBM_SETRANGE, TRUE,MAKELONG(MIN_Z3_MEM, MAX_Z3_MEM ));
        !          1589: #else
        !          1590:             EnableWindow( GetDlgItem( hDlg, IDC_P96MEM ), FALSE );
        !          1591:             EnableWindow( GetDlgItem( hDlg, IDC_Z3FASTMEM ), FALSE );
        !          1592: #endif
        !          1593:             switch( chipmem_size )
        !          1594:             {
        !          1595:             case 0x00080000:
        !          1596:                 mem_size = 0;
        !          1597:                 break;
        !          1598:             case 0x00100000:
        !          1599:                 mem_size = 1;
        !          1600:                 break;
        !          1601:             case 0x00200000:
        !          1602:                 mem_size = 2;
        !          1603:                 break;
        !          1604:             case 0x00400000:
        !          1605:                 mem_size = 3;
        !          1606:                 break;
        !          1607:             case 0x00800000:
        !          1608:                 mem_size = 4;
        !          1609:                 break;
        !          1610:             }
        !          1611:             SendDlgItemMessage(hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, mem_size );
        !          1612: 
        !          1613:             switch( fastmem_size )
        !          1614:             {
        !          1615:             case 0x00000000:
        !          1616:                 mem_size = 0;
        !          1617:                 break;
        !          1618:             case 0x00100000:
        !          1619:                 mem_size = 1;
        !          1620:                 break;
        !          1621:             case 0x00200000:
        !          1622:                 mem_size = 2;
        !          1623:                 break;
        !          1624:             case 0x00400000:
        !          1625:                 mem_size = 3;
        !          1626:                 break;
        !          1627:             case 0x00800000:
        !          1628:                 mem_size = 4;
        !          1629:                 break;
        !          1630:             case 0x01000000:
        !          1631:                 mem_size = 5;
        !          1632:                 break;
        !          1633:             }
        !          1634:             SendDlgItemMessage(hDlg, IDC_FASTMEM, TBM_SETPOS, TRUE, mem_size );
        !          1635: 
        !          1636:             switch( gfxmem_size )
        !          1637:             {
        !          1638:             case 0x00000000:
        !          1639:                 mem_size = 0;
        !          1640:                 break;
        !          1641:             case 0x00100000:
        !          1642:                 mem_size = 1;
        !          1643:                 break;
        !          1644:             case 0x00200000:
        !          1645:                 mem_size = 2;
        !          1646:                 break;
        !          1647:             case 0x00400000:
        !          1648:                 mem_size = 3;
        !          1649:                 break;
        !          1650:             case 0x00800000:
        !          1651:                 mem_size = 4;
        !          1652:                 break;
        !          1653:             }
        !          1654:             SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETPOS, TRUE, mem_size );
        !          1655: #if CPU_LEVEL > 1
        !          1656:             switch( z3fastmem_size )
        !          1657:             {
        !          1658:             case 0x00000000:
        !          1659:                 mem_size = 0;
        !          1660:                 break;
        !          1661:             case 0x00100000:
        !          1662:                 mem_size = 1;
        !          1663:                 break;
        !          1664:             case 0x00200000:
        !          1665:                 mem_size = 2;
        !          1666:                 break;
        !          1667:             case 0x00400000:
        !          1668:                 mem_size = 3;
        !          1669:                 break;
        !          1670:             case 0x00800000:
        !          1671:                 mem_size = 4;
        !          1672:                 break;
        !          1673:             case 0x01000000:
        !          1674:                 mem_size = 5;
        !          1675:                 break;
        !          1676:             case 0x02000000:
        !          1677:                 mem_size = 6;
        !          1678:                 break;
        !          1679:             }
        !          1680:             SendDlgItemMessage(hDlg, IDC_Z3FASTMEM, TBM_SETPOS, TRUE, mem_size );
        !          1681:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_P96MEM));
        !          1682:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_Z3FASTMEM));
        !          1683: #endif
        !          1684:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_CHIPMEM));
        !          1685:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_FASTMEM));
        !          1686: 
        !          1687:             return(TRUE);
        !          1688: 
        !          1689:     case WM_COMMAND:
        !          1690:         switch( wParam )
        !          1691:         {
        !          1692:         case IDC_KICKCHOOSER:
        !          1693:             KickStuffSelection( hDlg, 1 );
        !          1694:             break;
        !          1695:         case IDC_KEYCHOOSER:
        !          1696:             KickStuffSelection( hDlg, 0 );
        !          1697:             break;
        !          1698:         }
        !          1699:         break;
        !          1700: 
        !          1701:     case WM_HSCROLL:
        !          1702:         UpdateScroller(hDlg, (HWND)lParam);
        !          1703: #if CPU_LEVEL > 1
        !          1704:         if( ( GetDlgItem( hDlg, IDC_P96MEM) == lParam ) && pages[ DISPLAY_ID ] )
        !          1705:         {
        !          1706:             SendMessage( pages[ DISPLAY_ID ], WM_USER, 1, 0 );
        !          1707:         }
        !          1708: #endif
        !          1709:         break;
        !          1710: 
        !          1711:     case WM_NOTIFY:
        !          1712:         switch(((NMHDR *)lParam)->code)
        !          1713:         {
        !          1714:             case PSN_APPLY:
        !          1715:                 // OK or Apply has been pressed
        !          1716:                 GetDlgItemText( hDlg, IDC_ROMFILE, romfile, CFG_ROM_LENGTH );
        !          1717:                 GetDlgItemText( hDlg, IDC_KEYFILE, keyfile, CFG_KEY_LENGTH );
        !          1718:                 break;
        !          1719:             case PSN_RESET:
        !          1720:                 if(allow_quit_from_property_sheet)
        !          1721:                 {
        !          1722:                     quit_program = 1;
        !          1723:                     regs.spcflags |= SPCFLAG_BRK;
        !          1724:                 }
        !          1725:                 break;
        !          1726:         }
        !          1727:     }
        !          1728:     return(FALSE);
        !          1729: }
        !          1730: 
        !          1731: BOOL CALLBACK AdvancedDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          1732: {
        !          1733:     ConfigStructPtr cfgptr;
        !          1734:     DWORD dwPos;
        !          1735: 
        !          1736:     switch(msg)
        !          1737:     {
        !          1738:         case PSM_QUERYSIBLINGS:
        !          1739:             cfgptr = (ConfigStructPtr)lParam;
        !          1740: 
        !          1741:             cfgptr->NoAutoConfig         = IsDlgButtonChecked( hDlg, IDC_NOAUTOCONFIG );
        !          1742:             cfgptr->CopperHack           = (int)(short)(SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_GETPOS, 0, 0 ));
        !          1743:             cfgptr->DebugLogging         = IsDlgButtonChecked( hDlg, IDC_LOGGING );
        !          1744:             cfgptr->InvalidAddresses     = IsDlgButtonChecked( hDlg, IDC_ILLEGAL);
        !          1745: //            cfgptr->DebuggerEnabled      = IsDlgButtonChecked( hDlg, IDC_DEBUGGER );
        !          1746: #if CPU_LEVEL > 1
        !          1747:             cfgptr->AddressingIs24Bit    = IsDlgButtonChecked( hDlg, IDC_24BIT );
        !          1748: #endif
        !          1749:             cfgptr->M68KSpeed = (char)SendDlgItemMessage(hDlg, IDC_SPEED,TBM_GETPOS,0,0);
        !          1750:             break;
        !          1751: 
        !          1752:         case WM_INITDIALOG:
        !          1753:             pages[ ADVANCED_ID ] = hDlg;
        !          1754:         case WM_USER:
        !          1755: #if CPU_LEVEL > 1
        !          1756:             CheckDlgButton( hDlg, IDC_24BIT, address_space_24 );
        !          1757: #else
        !          1758:             CheckDlgButton( hDlg, IDC_24BIT, TRUE );
        !          1759:             EnableWindow( GetDlgItem( hDlg, IDC_24BIT ), FALSE );
        !          1760: #endif
        !          1761:             //CheckDlgButton( hDlg, IDC_DEBUGGER, use_debugger );
        !          1762:             CheckDlgButton( hDlg, IDC_ILLEGAL, currprefs.illegal_mem );
        !          1763:             CheckDlgButton( hDlg, IDC_NOAUTOCONFIG, !currprefs.automount_uaedev );
        !          1764:             SendDlgItemMessage(hDlg, IDC_SPEED, TBM_SETRANGE, TRUE, MAKELONG(MIN_M68K_PRIORITY,MAX_M68K_PRIORITY));
        !          1765:             SendDlgItemMessage(hDlg, IDC_SPEED, TBM_SETPOS, TRUE, currprefs.m68k_speed );
        !          1766:             SendDlgItemMessage( hDlg, IDC_SPEED, TBM_SETPAGESIZE, 0, 1 );
        !          1767:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_SPEED));
        !          1768:             SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_SETRANGE, 0, MAKELONG( 224, -1 ) );
        !          1769:             SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_SETPOS, TRUE, currprefs.copper_pos );
        !          1770: 
        !          1771:             return(TRUE);
        !          1772: 
        !          1773:     case WM_HSCROLL:
        !          1774:         UpdateScroller(hDlg, (HWND)lParam);
        !          1775:         break;
        !          1776: 
        !          1777:     case WM_NOTIFY:
        !          1778:         switch(((NMHDR *)lParam)->code)
        !          1779:         {
        !          1780:             case PSN_APPLY:
        !          1781:                 // OK or Apply has been pressed
        !          1782:                 currprefs.illegal_mem      = IsDlgButtonChecked( hDlg, IDC_ILLEGAL);
        !          1783:                 currprefs.automount_uaedev = !IsDlgButtonChecked( hDlg, IDC_NOAUTOCONFIG );
        !          1784:                 currprefs.m68k_speed       = SendMessage( GetDlgItem( hDlg, IDC_SPEED),TBM_GETPOS,0,0);
        !          1785:                 currprefs.copper_pos       = (int)(short)( SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_GETPOS, 0, 0 ));
        !          1786: #if CPU_LEVEL > 1
        !          1787:                 address_space_24           = IsDlgButtonChecked( hDlg, IDC_24BIT );
        !          1788: #endif
        !          1789:                 break;
        !          1790:             case PSN_RESET:
        !          1791:                 if(allow_quit_from_property_sheet)
        !          1792:                 {
        !          1793:                     quit_program = 1;
        !          1794:                     regs.spcflags |= SPCFLAG_BRK;
        !          1795:                 }
        !          1796:                 break;
        !          1797:         }
        !          1798:     }
        !          1799:     return(FALSE);
        !          1800: }
        !          1801: 
        !          1802: BOOL CALLBACK SoundDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          1803: {
        !          1804:     ConfigStructPtr cfgptr;
        !          1805: 
        !          1806:     switch(msg)
        !          1807:     {
        !          1808:     case PSM_QUERYSIBLINGS:
        !          1809:         cfgptr = (ConfigStructPtr)lParam;
        !          1810:         if( IsDlgButtonChecked( hDlg, IDC_8BIT ) )
        !          1811:             cfgptr->SoundBits = 8;
        !          1812:         if( IsDlgButtonChecked( hDlg, IDC_16BIT ) )
        !          1813:             cfgptr->SoundBits = 16;
        !          1814:         if( IsDlgButtonChecked( hDlg, IDC_11KHZ ) )
        !          1815:             cfgptr->SoundFreq = 11025;
        !          1816:         if( IsDlgButtonChecked( hDlg, IDC_22KHZ ) )
        !          1817:             cfgptr->SoundFreq = 22050;
        !          1818:         if( IsDlgButtonChecked( hDlg, IDC_44KHZ ) )
        !          1819:             cfgptr->SoundFreq = 44100;
        !          1820:         if( IsDlgButtonChecked( hDlg, IDC_48KHZ ) )
        !          1821:             cfgptr->SoundFreq = 48000;
        !          1822:         if( IsDlgButtonChecked( hDlg, IDC_SOUND0 ) )
        !          1823:             cfgptr->SoundSupport = -1;
        !          1824:         if( IsDlgButtonChecked( hDlg, IDC_SOUND1 ) )
        !          1825:             cfgptr->SoundSupport = 0;
        !          1826:         if( IsDlgButtonChecked( hDlg, IDC_SOUND2 ) )
        !          1827:             cfgptr->SoundSupport = 1;
        !          1828:         if( IsDlgButtonChecked( hDlg, IDC_SOUND3 ) )
        !          1829:             cfgptr->SoundSupport = 2;
        !          1830:         if( IsDlgButtonChecked( hDlg, IDC_SOUND4 ) )
        !          1831:             cfgptr->SoundSupport = 3;
        !          1832:         if( IsDlgButtonChecked( hDlg, IDC_STEREO ) )
        !          1833:             cfgptr->SoundStereo = 1;
        !          1834:         break;
        !          1835: 
        !          1836:     case WM_INITDIALOG:
        !          1837:         pages[ SOUND_ID ] = hDlg;
        !          1838:     case WM_USER:
        !          1839:         UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_SOUND ) );
        !          1840:         UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_FREQUENCY ) );
        !          1841:         UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_SOUNDSIZE ) );
        !          1842:         CheckDlgButton( hDlg, IDC_STEREO, currprefs.stereo );
        !          1843:         return(TRUE);
        !          1844: 
        !          1845:     case WM_NOTIFY:
        !          1846:         switch(((NMHDR *)lParam)->code)
        !          1847:         {
        !          1848:         case PSN_APPLY:
        !          1849:             // OK or Apply has been pressed
        !          1850:             if( IsDlgButtonChecked( hDlg, IDC_8BIT ) )
        !          1851:                 currprefs.sound_bits = 8;
        !          1852:             if( IsDlgButtonChecked( hDlg, IDC_16BIT ) )
        !          1853:                 currprefs.sound_bits = 16;
        !          1854:             if( IsDlgButtonChecked( hDlg, IDC_11KHZ ) )
        !          1855:                 currprefs.sound_freq = 11025;
        !          1856:             if( IsDlgButtonChecked( hDlg, IDC_22KHZ ) )
        !          1857:                 currprefs.sound_freq = 22050;
        !          1858:             if( IsDlgButtonChecked( hDlg, IDC_44KHZ ) )
        !          1859:                 currprefs.sound_freq = 44100;
        !          1860:             if( IsDlgButtonChecked( hDlg, IDC_48KHZ ) )
        !          1861:                 currprefs.sound_freq = 48000;
        !          1862:             if( IsDlgButtonChecked( hDlg, IDC_SOUND0 ) )
        !          1863:                 currprefs.produce_sound = -1;
        !          1864:             if( IsDlgButtonChecked( hDlg, IDC_SOUND1 ) )
        !          1865:                 currprefs.produce_sound = 0;
        !          1866:             if( IsDlgButtonChecked( hDlg, IDC_SOUND2 ) )
        !          1867:                 currprefs.produce_sound = 1;
        !          1868:             if( IsDlgButtonChecked( hDlg, IDC_SOUND3 ) )
        !          1869:                 currprefs.produce_sound = 2;
        !          1870:             if( IsDlgButtonChecked( hDlg, IDC_SOUND4 ) )
        !          1871:                 currprefs.produce_sound = 3;
        !          1872:             if( IsDlgButtonChecked( hDlg, IDC_STEREO ) )
        !          1873:                 currprefs.stereo = 1;
        !          1874:             break;
        !          1875:         case PSN_RESET:
        !          1876:             if(allow_quit_from_property_sheet)
        !          1877:             {
        !          1878:                 quit_program = 1;
        !          1879:                 regs.spcflags |= SPCFLAG_BRK;
        !          1880:             }
        !          1881:             break;
        !          1882:         }
        !          1883:         break;
        !          1884:     }
        !          1885:     return(FALSE);
        !          1886: }
        !          1887: 
        !          1888: void KickStuffSelection( HWND hDlg, int which )
        !          1889: {
        !          1890:     OPENFILENAME openFileName;
        !          1891:     char full_path[MAX_PATH] = "";
        !          1892:     char file_name[MAX_PATH] = "";
        !          1893:     char init_path[MAX_PATH] = "";
        !          1894:     char *amiga_path = NULL;
        !          1895: 
        !          1896:     if( amiga_path = getenv( "AmigaPath" ) )
        !          1897:     {
        !          1898:         strncpy( init_path, amiga_path, MAX_PATH );
        !          1899:         strncat( init_path, "\\ROMs\\", MAX_PATH );
        !          1900:     }
        !          1901:     else if( start_path )
        !          1902:     {
        !          1903:         strncpy( init_path, start_path, MAX_PATH );
        !          1904:         strncat( init_path, "..\\ROMs\\", MAX_PATH );
        !          1905:     }
        !          1906: 
        !          1907:     openFileName.lStructSize       = sizeof(OPENFILENAME);
        !          1908:     openFileName.hwndOwner         = hDlg;
        !          1909:     openFileName.hInstance         = hInst;
        !          1910:     if( which )
        !          1911:     {
        !          1912:         openFileName.lpstrFilter   = "Amiga Kickstart Files (*.ROM)\0*.ROM\0\0";
        !          1913:         openFileName.lpstrTitle    = "Select an Amiga ROM file...";
        !          1914:         openFileName.lpstrDefExt   = "ROM";
        !          1915:     }
        !          1916:     else
        !          1917:     {
        !          1918:         openFileName.lpstrFilter   = "Amiga Kickstart Key-Files (*.KEY)\0*.KEY\0\0";
        !          1919:         openFileName.lpstrTitle    = "Select an Amiga Key-File...";
        !          1920:         openFileName.lpstrDefExt   = "KEY";
        !          1921:     }
        !          1922:     openFileName.Flags             = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
        !          1923:     openFileName.lpstrCustomFilter = NULL;
        !          1924:     openFileName.nMaxCustFilter    = 0;
        !          1925:     openFileName.nFilterIndex      = 0;
        !          1926:     openFileName.lpstrFile         = full_path;
        !          1927:     openFileName.nMaxFile          = MAX_PATH;
        !          1928:     openFileName.lpstrFileTitle    = file_name;
        !          1929:     openFileName.nMaxFileTitle     = MAX_PATH;
        !          1930:     if( start_path )
        !          1931:         openFileName.lpstrInitialDir   = init_path;
        !          1932:     else
        !          1933:         openFileName.lpstrInitialDir   = NULL;
        !          1934:     openFileName.lpfnHook          = NULL;
        !          1935:     openFileName.lpTemplateName    = NULL;
        !          1936:     openFileName.lCustData         = 0;
        !          1937:     if(GetOpenFileName(&openFileName)==FALSE)
        !          1938:         MyOutputDebugString("GetOpenFileName() failed.\n");
        !          1939:     else
        !          1940:     {
        !          1941:         if( which )
        !          1942:             SetDlgItemText(hDlg,IDC_ROMFILE,full_path);
        !          1943:         else
        !          1944:             SetDlgItemText(hDlg,IDC_KEYFILE,full_path);
        !          1945:     }
        !          1946: }
        !          1947: 
        !          1948: void DiskSelection( HWND hDlg, WPARAM wParam, int flag )
        !          1949: {
        !          1950:     OPENFILENAME openFileName;
        !          1951:     char full_path[MAX_PATH] = "";
        !          1952:     char file_name[MAX_PATH] = "";
        !          1953:     char init_path[MAX_PATH] = "";
        !          1954:     BOOL result = FALSE;
        !          1955:     char *amiga_path = NULL;
        !          1956: 
        !          1957:     if( amiga_path = getenv( "AmigaPath" ) )
        !          1958:     {
        !          1959:         strncpy( init_path, amiga_path, MAX_PATH );
        !          1960:         strncat( init_path, "\\DiskFiles\\", MAX_PATH );
        !          1961:     }
        !          1962:     else if( start_path )
        !          1963:     {
        !          1964:         strncpy( init_path, start_path, MAX_PATH );
        !          1965:         strncat( init_path, "..\\DiskFiles\\", MAX_PATH );
        !          1966:     }
        !          1967: 
        !          1968:     openFileName.lStructSize       = sizeof(OPENFILENAME);
        !          1969:     openFileName.hwndOwner         = hDlg;
        !          1970:     openFileName.hInstance         = hInst;
        !          1971:     openFileName.lpstrFilter       = "Amiga Disk Files (*.ADF;*.ADZ)\0*.ADF;*.ADZ\0";
        !          1972:     if( flag )
        !          1973:         openFileName.lpstrTitle    = "Choose your blank Amiga Disk File...";
        !          1974:     else
        !          1975:         openFileName.lpstrTitle    = "Select an Amiga Disk File image...";
        !          1976:     openFileName.Flags             = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
        !          1977:     openFileName.lpstrDefExt       = "ADF";
        !          1978:     openFileName.lpstrCustomFilter = NULL;
        !          1979:     openFileName.nMaxCustFilter    = 0;
        !          1980:     openFileName.nFilterIndex      = 0;
        !          1981:     openFileName.lpstrFile         = full_path;
        !          1982:     openFileName.nMaxFile          = MAX_PATH;
        !          1983:     openFileName.lpstrFileTitle    = file_name;
        !          1984:     openFileName.nMaxFileTitle     = MAX_PATH;
        !          1985:     if( start_path )
        !          1986:         openFileName.lpstrInitialDir   = init_path;
        !          1987:     else
        !          1988:         openFileName.lpstrInitialDir   = NULL;
        !          1989:     openFileName.lpfnHook          = NULL;
        !          1990:     openFileName.lpTemplateName    = NULL;
        !          1991:     openFileName.lCustData         = 0;
        !          1992:     if( flag )
        !          1993:         result = GetSaveFileName( &openFileName );
        !          1994:     else
        !          1995:         result = GetOpenFileName( &openFileName );
        !          1996: 
        !          1997:     if( result == FALSE )
        !          1998:         MyOutputDebugString("GetOpenFileName() failed.\n");
        !          1999:     else
        !          2000:     {
        !          2001:         switch(wParam)
        !          2002:         {
        !          2003:         case IDC_DF0:
        !          2004:             SetDlgItemText(hDlg,IDC_DF0TEXT,full_path);
        !          2005:             break;
        !          2006:         case IDC_DF1:
        !          2007:             SetDlgItemText(hDlg,IDC_DF1TEXT,full_path);
        !          2008:             break;
        !          2009:         case IDC_DF2:
        !          2010:             SetDlgItemText(hDlg,IDC_DF2TEXT,full_path);
        !          2011:             break;
        !          2012:         case IDC_DF3:
        !          2013:             SetDlgItemText(hDlg,IDC_DF3TEXT,full_path);
        !          2014:             break;
        !          2015:         case IDC_CREATE:
        !          2016:             CreateDiskFile( full_path );
        !          2017:             break;
        !          2018:         }
        !          2019:     }
        !          2020: }
        !          2021: 
        !          2022: void GetSetDriveValues( HWND hDlg, DWORD drive_id, BOOL set )
        !          2023: {
        !          2024:     int dlg_item1, dlg_item2, dlg_item3;
        !          2025: 
        !          2026:     switch(drive_id)
        !          2027:     {
        !          2028:     case 0:
        !          2029:         dlg_item1 = IDC_UAE0PATH;
        !          2030:         dlg_item2 = IDC_UAE0NAME;
        !          2031:         dlg_item3 = IDC_RW0;
        !          2032:         break;
        !          2033:     case 1:
        !          2034:         dlg_item1 = IDC_UAE1PATH;
        !          2035:         dlg_item2 = IDC_UAE1NAME;
        !          2036:         dlg_item3 = IDC_RW1;
        !          2037:         break;
        !          2038:     case 2:
        !          2039:         dlg_item1 = IDC_UAE2PATH;
        !          2040:         dlg_item2 = IDC_UAE2NAME;
        !          2041:         dlg_item3 = IDC_RW2;
        !          2042:         break;
        !          2043:     case 3:
        !          2044:         dlg_item1 = IDC_UAE3PATH;
        !          2045:         dlg_item2 = IDC_UAE3NAME;
        !          2046:         dlg_item3 = IDC_RW3;
        !          2047:         break;
        !          2048:     }
        !          2049:     if(set)
        !          2050:     {
        !          2051:         GetDlgItemText(hDlg, dlg_item1, drives[drive_id].path, MAX_PATH);
        !          2052:         GetDlgItemText(hDlg, dlg_item2, drives[drive_id].name, MAX_PATH);
        !          2053:         drives[drive_id].rw = IsDlgButtonChecked(hDlg, dlg_item3);
        !          2054:     }
        !          2055:     else
        !          2056:     {
        !          2057:         SetDlgItemText(hDlg, dlg_item1, drives[drive_id].path);
        !          2058:         SetDlgItemText(hDlg, dlg_item2, drives[drive_id].name);
        !          2059:         CheckDlgButton(hDlg, dlg_item3, drives[drive_id].rw);
        !          2060:     }
        !          2061: }
        !          2062: 
        !          2063: void CreateDiskFile( char *name )
        !          2064: {
        !          2065:     HANDLE adf;
        !          2066:     int i, file_size = 880 * 1024; // size in bytes
        !          2067:     char *chunk = NULL;
        !          2068:     DWORD count;
        !          2069: 
        !          2070:     SetCursor( LoadCursor( NULL, IDC_WAIT ) );
        !          2071:     adf = CreateFile( name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
        !          2072:     if( adf != INVALID_HANDLE_VALUE )
        !          2073:     {
        !          2074:         if( chunk = malloc( 10240 ) )
        !          2075:         {
        !          2076:             for( i = 0; i < file_size; i += 10240 )
        !          2077:             {
        !          2078:                 WriteFile( adf, chunk, 10240, &count, NULL );
        !          2079:             }
        !          2080:         }
        !          2081:         CloseHandle( adf );
        !          2082:     }
        !          2083:     SetCursor( LoadCursor( NULL, IDC_ARROW ) );
        !          2084: }
        !          2085: 
        !          2086: long CreateHardFile( LONG hfsize )
        !          2087: {
        !          2088:     HANDLE hf;
        !          2089:     long result = 0;
        !          2090:     int i, file_size = hfsize * 1024 * 1024; // size in bytes
        !          2091:     char init_path[MAX_PATH] = "";
        !          2092:     char *chunk = NULL;
        !          2093:     DWORD count;
        !          2094: 
        !          2095:     SetCursor( LoadCursor( NULL, IDC_WAIT ) );
        !          2096: 
        !          2097:     if( start_path )
        !          2098:     {
        !          2099:         strncpy( init_path, start_path, MAX_PATH );
        !          2100:         strncat( init_path, "\\HardFile", MAX_PATH );
        !          2101:     }
        !          2102:     else
        !          2103:         strcpy( init_path, "HardFile" );
        !          2104: 
        !          2105:     if( file_size == 0 )
        !          2106:         DeleteFile( init_path );
        !          2107:     else
        !          2108:     {
        !          2109:         hf = CreateFile( init_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
        !          2110:         if( hf != INVALID_HANDLE_VALUE )
        !          2111:         {
        !          2112:             if( chunk = malloc( 16384 ) )
        !          2113:             {
        !          2114:                 for( i = 0; i < file_size; i += 16384 )
        !          2115:                 {
        !          2116:                     WriteFile( hf, chunk, 16384, &count, NULL );
        !          2117:                 }
        !          2118:             }
        !          2119:             CloseHandle( hf );
        !          2120:             result = i;
        !          2121:         }
        !          2122:     }
        !          2123:     SetCursor( LoadCursor( NULL, IDC_ARROW ) );
        !          2124:     return result;
        !          2125: }
        !          2126: 
        !          2127: BOOL CALLBACK HarddiskDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          2128: {
        !          2129:     UDACCEL accel[2] = { { 1, 1 }, { 3, 5 } };
        !          2130:     char hfsize[9] = "";
        !          2131:     ConfigStructPtr cfgptr;
        !          2132:     int i, result = IDYES;
        !          2133:     static BROWSEINFO browse_info;
        !          2134:     char directory_path[MAX_PATH];
        !          2135:     LPITEMIDLIST browse;
        !          2136:     LONG setting;
        !          2137: 
        !          2138:     switch(msg)
        !          2139:     {
        !          2140:         case PSM_QUERYSIBLINGS:
        !          2141:             cfgptr = (ConfigStructPtr)lParam;
        !          2142:             for( i = 0; i < NUM_DRIVES; i++ )
        !          2143:             {
        !          2144:                 GetSetDriveValues( hDlg, i, TRUE );
        !          2145:                 memcpy( &(cfgptr->drives[i]), &drives[i], sizeof( drive_specs ) );
        !          2146:             }
        !          2147:             cfgptr->HardFileBootPri = IsDlgButtonChecked( hDlg, IDC_BOOTPRI );
        !          2148:             break;
        !          2149: 
        !          2150:         case WM_INITDIALOG:
        !          2151:             pages[ HARDDISK_ID ] = hDlg;
        !          2152:         case WM_USER:
        !          2153:             browse_info.hwndOwner = hDlg;
        !          2154:             browse_info.pidlRoot  = NULL;
        !          2155:             browse_info.pszDisplayName = directory_path;
        !          2156:             browse_info.lpszTitle = "Please select your file-system root directory...";
        !          2157:             browse_info.ulFlags   = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS;
        !          2158:             browse_info.lpfn      = NULL;
        !          2159:             browse_info.iImage    = 0;
        !          2160:             for(i=0;i<NUM_DRIVES;i++)
        !          2161:                 GetSetDriveValues(hDlg, i, FALSE); // FALSE indicates Getting
        !          2162: 
        !          2163:             CheckDlgButton(hDlg, IDC_BOOTPRI, hf_bootpri);
        !          2164:             SendDlgItemMessage( hDlg, IDC_HFSPIN, UDM_SETRANGE, 0, MAKELONG( 256, 0 ) );
        !          2165:             SendDlgItemMessage( hDlg, IDC_HFSPIN, UDM_SETPOS, 0, hardfile_size / 1048576 );
        !          2166: 
        !          2167:             if( hardfile_size == 0)
        !          2168:             {
        !          2169:                 // hardfile does not exist, so disable the "Hardfile priority" check-box
        !          2170:                 EnableWindow( GetDlgItem( hDlg, IDC_BOOTPRI ), FALSE );
        !          2171:             }
        !          2172:             break;
        !          2173: 
        !          2174:         case WM_COMMAND:
        !          2175:             switch(wParam)
        !          2176:             {
        !          2177:             case IDC_CREATEHF:
        !          2178:                 setting = SendDlgItemMessage( hDlg, IDC_HFSPIN, UDM_GETPOS, 0, 0 );
        !          2179:                 if( hardfile_size != 0 )
        !          2180:                 {
        !          2181:                     result = MessageBox( hDlg, "You already have a hardfile.  Creating a new one will destroy the old one.  Proceed?", "HardFile Warning...", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2 | MB_APPLMODAL | MB_SETFOREGROUND );
        !          2182:                 }
        !          2183:                 if( result == IDYES )
        !          2184:                 {
        !          2185:                     hardfile_size = CreateHardFile( setting );
        !          2186:                     EnableWindow( GetDlgItem( hDlg, IDC_BOOTPRI ), hardfile_size ? TRUE:FALSE );
        !          2187:                 }
        !          2188:                 break;
        !          2189:             case IDC_UAE0:
        !          2190:             case IDC_UAE1:
        !          2191:             case IDC_UAE2:
        !          2192:             case IDC_UAE3:
        !          2193:                 if((browse=SHBrowseForFolder(&browse_info))!=NULL)
        !          2194:                 {
        !          2195:                     SHGetPathFromIDList( browse, directory_path );
        !          2196:                     if( directory_path[ strlen( directory_path ) - 1 ] == '\\' )
        !          2197:                         directory_path[ strlen( directory_path ) - 1 ] = 0;
        !          2198:                     if( wParam == IDC_UAE0 )
        !          2199:                         SetDlgItemText( hDlg, IDC_UAE0PATH, directory_path );
        !          2200:                     else if( wParam == IDC_UAE1 )
        !          2201:                         SetDlgItemText( hDlg, IDC_UAE1PATH, directory_path );
        !          2202:                     else if( wParam == IDC_UAE2 )
        !          2203:                         SetDlgItemText( hDlg, IDC_UAE2PATH, directory_path );
        !          2204:                     else
        !          2205:                         SetDlgItemText( hDlg, IDC_UAE3PATH, directory_path );
        !          2206:                 }
        !          2207:                 break;
        !          2208:             }
        !          2209:             break;
        !          2210: 
        !          2211:         case WM_NOTIFY:
        !          2212:             switch(((NMHDR *)lParam)->code)
        !          2213:             {
        !          2214:                 case PSN_APPLY:
        !          2215:                     for(i=0;i<NUM_DRIVES;i++)
        !          2216:                         GetSetDriveValues( hDlg, i, TRUE); // TRUE indicates Setting
        !          2217:                     hf_bootpri = IsDlgButtonChecked( hDlg, IDC_BOOTPRI );
        !          2218:                     break;
        !          2219:                 case PSN_RESET:
        !          2220:                     if(allow_quit_from_property_sheet)
        !          2221:                     {
        !          2222:                         quit_program = 1;
        !          2223:                         regs.spcflags |= SPCFLAG_BRK;
        !          2224:                     }
        !          2225:                     break;
        !          2226:             }
        !          2227:             return(TRUE);
        !          2228:         default:
        !          2229:             return(FALSE);
        !          2230:     }
        !          2231: 
        !          2232:     return(FALSE);
        !          2233: }
        !          2234: 
        !          2235: BOOL CALLBACK FloppiesDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          2236: {
        !          2237:     ConfigStructPtr cfgptr;
        !          2238: 
        !          2239:     switch(msg)
        !          2240:     {
        !          2241:         case PSM_QUERYSIBLINGS:
        !          2242:             cfgptr = (ConfigStructPtr)lParam;
        !          2243:             GetDlgItemText(hDlg, IDC_DF0TEXT, cfgptr->df[0], MAX_PATH);
        !          2244:             GetDlgItemText(hDlg, IDC_DF1TEXT, cfgptr->df[1], MAX_PATH);
        !          2245:             GetDlgItemText(hDlg, IDC_DF2TEXT, cfgptr->df[2], MAX_PATH);
        !          2246:             GetDlgItemText(hDlg, IDC_DF3TEXT, cfgptr->df[3], MAX_PATH);
        !          2247:             break;
        !          2248: 
        !          2249:         case WM_INITDIALOG:
        !          2250:             pages[ FLOPPY_ID ] = hDlg;
        !          2251:         case WM_USER:
        !          2252:             SetDlgItemText(hDlg, IDC_DF0TEXT, currprefs.df[0]);
        !          2253:             SetDlgItemText(hDlg, IDC_DF1TEXT, currprefs.df[1]);
        !          2254:             SetDlgItemText(hDlg, IDC_DF2TEXT, currprefs.df[2]);
        !          2255:             SetDlgItemText(hDlg, IDC_DF3TEXT, currprefs.df[3]);
        !          2256:             break;
        !          2257: 
        !          2258:         case WM_COMMAND:
        !          2259:             switch(wParam)
        !          2260:             {
        !          2261:             case IDC_DF0:
        !          2262:                 DiskSelection(hDlg,wParam,0);
        !          2263:                 break;
        !          2264:             case IDC_DF1:
        !          2265:                 DiskSelection(hDlg,wParam,0);
        !          2266:                 break;
        !          2267:             case IDC_DF2:
        !          2268:                 DiskSelection(hDlg,wParam,0);
        !          2269:                 break;
        !          2270:             case IDC_DF3:
        !          2271:                 DiskSelection(hDlg,wParam,0);
        !          2272:                 break;
        !          2273:             case IDC_EJECT0:
        !          2274:                 SetDlgItemText( hDlg, IDC_DF0TEXT, "" );
        !          2275:                 disk_eject( 0 );
        !          2276:                 break;
        !          2277:             case IDC_EJECT1:
        !          2278:                 SetDlgItemText( hDlg, IDC_DF1TEXT, "" );
        !          2279:                 disk_eject( 1 );
        !          2280:                 break;
        !          2281:             case IDC_EJECT2:
        !          2282:                 SetDlgItemText( hDlg, IDC_DF2TEXT, "" );
        !          2283:                 disk_eject( 2 );
        !          2284:                 break;
        !          2285:             case IDC_EJECT3:
        !          2286:                 SetDlgItemText( hDlg, IDC_DF3TEXT, "" );
        !          2287:                 disk_eject( 3 );
        !          2288:                 break;
        !          2289:             case IDC_CREATE:
        !          2290:                 DiskSelection( hDlg, wParam, 1 );
        !          2291:                 break;
        !          2292:             }
        !          2293:             break;
        !          2294: 
        !          2295:         case WM_NOTIFY:
        !          2296:             switch(((NMHDR *)lParam)->code)
        !          2297:             {
        !          2298:                 case PSN_APPLY:
        !          2299:                     GetDlgItemText(hDlg, IDC_DF0TEXT, currprefs.df[0], MAX_PATH);
        !          2300:                     if( currprefs.df[0][0] )
        !          2301:                     {
        !          2302:                         disk_insert(0,currprefs.df[0]);
        !          2303:                     }
        !          2304:                     GetDlgItemText(hDlg, IDC_DF1TEXT, currprefs.df[1], MAX_PATH);
        !          2305:                     if( currprefs.df[1][0] )
        !          2306:                     {
        !          2307:                         disk_insert(1,currprefs.df[1]);
        !          2308:                     }
        !          2309:                     GetDlgItemText(hDlg, IDC_DF2TEXT, currprefs.df[2], MAX_PATH);
        !          2310:                     if( currprefs.df[2][0] )
        !          2311:                     {
        !          2312:                         disk_insert(2,currprefs.df[2]);
        !          2313:                     }
        !          2314:                     GetDlgItemText(hDlg, IDC_DF3TEXT, currprefs.df[3], MAX_PATH);
        !          2315:                     if( currprefs.df[3][0] )
        !          2316:                     {
        !          2317:                         disk_insert(3,currprefs.df[3]);
        !          2318:                     }
        !          2319:                     break;
        !          2320:                 case PSN_RESET:
        !          2321:                     if(allow_quit_from_property_sheet)
        !          2322:                     {
        !          2323:                         quit_program = 1;
        !          2324:                         regs.spcflags |= SPCFLAG_BRK;
        !          2325:                     }
        !          2326:                     break;
        !          2327:             }
        !          2328:             return(TRUE);
        !          2329:         default:
        !          2330:             return(FALSE);
        !          2331:     }
        !          2332: 
        !          2333:     return(FALSE);
        !          2334: }
        !          2335: 
        !          2336: // Handle messages for the Joystick Settings page of our property-sheet
        !          2337: BOOL CALLBACK PortsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        !          2338: {
        !          2339:     ConfigStructPtr cfgptr;
        !          2340:     char joyspec[3] = "MA";
        !          2341:     LONG ser_port, item_height;
        !          2342:     RECT rect;
        !          2343: 
        !          2344:     switch(msg)
        !          2345:     {
        !          2346:         case PSM_QUERYSIBLINGS:
        !          2347:             cfgptr = (ConfigStructPtr)lParam;
        !          2348:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY0 ) )
        !          2349:                 joyspec[0] = '0';
        !          2350:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY1 ) )
        !          2351:                 joyspec[0] = '1';
        !          2352:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_MOUSE ) )
        !          2353:                 joyspec[0] = 'M';
        !          2354:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDA ) )
        !          2355:                 joyspec[0] = 'A';
        !          2356:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDB ) )
        !          2357:                 joyspec[0] = 'B';
        !          2358:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDC ) )
        !          2359:                 joyspec[0] = 'C';
        !          2360: 
        !          2361:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY0 ) )
        !          2362:                 joyspec[1] = '0';
        !          2363:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY1 ) )
        !          2364:                 joyspec[1] = '1';
        !          2365:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_MOUSE ) )
        !          2366:                 joyspec[1] = 'M';
        !          2367:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDA ) )
        !          2368:                 joyspec[1] = 'A';
        !          2369:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDB ) )
        !          2370:                 joyspec[1] = 'B';
        !          2371:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDC ) )
        !          2372:                 joyspec[1] = 'C';
        !          2373: 
        !          2374:             cfgptr->FakeJoystick = parse_joy_spec( joyspec );
        !          2375: 
        !          2376:             GetDlgItemText( hDlg, IDC_PARALLEL, cfgptr->PrinterName, CFG_PAR_LENGTH );
        !          2377: 
        !          2378:             switch( ser_port = SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETCURSEL, 0, 0L) )
        !          2379:             {
        !          2380:             case 1:
        !          2381:             case 2:
        !          2382:             case 3:
        !          2383:             case 4:
        !          2384:                 cfgptr->SerialPort = 1;
        !          2385: #ifdef __GNUC__
        !          2386:                 sprintf( cfgptr->SerialName, "COM%d", ser_port );
        !          2387: #else
        !          2388:                 _snprintf( cfgptr->SerialName, CFG_SER_LENGTH, "COM%d", ser_port );
        !          2389: #endif
        !          2390:                 break;
        !          2391:             default:
        !          2392:                 cfgptr->SerialPort = 0;
        !          2393:                 break;
        !          2394:             }
        !          2395: 
        !          2396:             break;
        !          2397: 
        !          2398:         case WM_INITDIALOG:
        !          2399:             pages[ PORTS_ID ] = hDlg;
        !          2400:         case WM_USER:
        !          2401:             UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_PORT0 ) );
        !          2402:             UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_PORT1 ) );
        !          2403:             SetDlgItemText( hDlg, IDC_PARALLEL, prtname );
        !          2404:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_RESETCONTENT, 0, 0L);
        !          2405:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"None" );
        !          2406:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM1" );
        !          2407:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM2" );
        !          2408:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM3" );
        !          2409:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM4" );
        !          2410:             if( currprefs.use_serial == 0 )
        !          2411:                 SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 0, 0L );
        !          2412:             else
        !          2413:             {
        !          2414:                 switch( sername[ strlen( sername ) - 1 ] )
        !          2415:                 {
        !          2416:                 case '2':
        !          2417:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 2, 0L );
        !          2418:                     break;
        !          2419:                 case '3':
        !          2420:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 3, 0L );
        !          2421:                     break;
        !          2422:                 case '4':
        !          2423:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 4, 0L );
        !          2424:                     break;
        !          2425:                 default:
        !          2426:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 1, 0L );
        !          2427:                     break;
        !          2428:                 }
        !          2429:             }
        !          2430: 
        !          2431:             // Retrieve the height, in pixels, of a list item.
        !          2432:             item_height = SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETITEMHEIGHT, 0, 0L);
        !          2433:             if (item_height != CB_ERR) 
        !          2434:             {
        !          2435:                 // Get actual box position and size.
        !          2436:                 GetWindowRect( GetDlgItem( hDlg, IDC_SERIAL ), &rect);
        !          2437:                 rect.bottom = rect.top + item_height * 5
        !          2438:                                   + SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETITEMHEIGHT, (WPARAM)-1, 0L)
        !          2439:                                   + item_height;
        !          2440:                 SetWindowPos( GetDlgItem( hDlg, IDC_SERIAL ), 0, 0, 0, rect.right - rect.left,
        !          2441:                              rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER);
        !          2442:             }
        !          2443:             if( hEmuThread )
        !          2444:             {
        !          2445:                 EnableWindow( GetDlgItem( hDlg, IDC_SERIAL ), FALSE );
        !          2446:                 EnableWindow( GetDlgItem( hDlg, IDC_PARALLEL ), FALSE );
        !          2447:             }
        !          2448:             return(TRUE);
        !          2449: 
        !          2450:         case WM_NOTIFY:
        !          2451:             switch(((NMHDR *)lParam)->code)
        !          2452:             {
        !          2453:             case PSN_APPLY:
        !          2454:                 // OK or Apply has been pressed
        !          2455:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY0 ) )
        !          2456:                     joyspec[0] = '0';
        !          2457:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY1 ) )
        !          2458:                     joyspec[0] = '1';
        !          2459:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_MOUSE ) )
        !          2460:                     joyspec[0] = 'M';
        !          2461:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDA ) )
        !          2462:                     joyspec[0] = 'A';
        !          2463:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDB ) )
        !          2464:                     joyspec[0] = 'B';
        !          2465:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDC ) )
        !          2466:                     joyspec[0] = 'C';
        !          2467: 
        !          2468:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY0 ) )
        !          2469:                     joyspec[1] = '0';
        !          2470:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY1 ) )
        !          2471:                     joyspec[1] = '1';
        !          2472:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_MOUSE ) )
        !          2473:                     joyspec[1] = 'M';
        !          2474:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDA ) )
        !          2475:                     joyspec[1] = 'A';
        !          2476:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDB ) )
        !          2477:                     joyspec[1] = 'B';
        !          2478:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDC ) )
        !          2479:                     joyspec[1] = 'C';
        !          2480: 
        !          2481:                 currprefs.fake_joystick = parse_joy_spec( joyspec );
        !          2482: 
        !          2483:                 GetDlgItemText( hDlg, IDC_PARALLEL, prtname, CFG_PAR_LENGTH );
        !          2484: 
        !          2485:                 switch( item_height = SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETCURSEL, 0, 0L) )
        !          2486:                 {
        !          2487:                 case 1:
        !          2488:                 case 2:
        !          2489:                 case 3:
        !          2490:                 case 4:
        !          2491:                     currprefs.use_serial = 1;
        !          2492: #ifdef __GNUC__
        !          2493:                     sprintf( sername, "COM%d", item_height );
        !          2494: #else
        !          2495:                     _snprintf( sername, CFG_SER_LENGTH, "COM%d", item_height );
        !          2496: #endif
        !          2497:                     break;
        !          2498:                 default:
        !          2499:                     currprefs.use_serial = 0;
        !          2500:                     break;
        !          2501:                 }
        !          2502: 
        !          2503: 
        !          2504:                     break;
        !          2505:                 case PSN_RESET:
        !          2506:                     if(allow_quit_from_property_sheet)
        !          2507:                     {
        !          2508:                         quit_program = 1;
        !          2509:                         regs.spcflags |= SPCFLAG_BRK;
        !          2510:                     }
        !          2511:                     break;
        !          2512:             }
        !          2513:             return(FALSE);
        !          2514:     }
        !          2515:     return(FALSE);
        !          2516: }
        !          2517: 
        !          2518: HWND AddStatusWindow(void)
        !          2519: {
        !          2520:     HWND hwndStatus; 
        !          2521:     RECT rcClient; 
        !          2522:     HLOCAL hloc; 
        !          2523:     LPINT lpParts; 
        !          2524:  
        !          2525:     // Create the status window. 
        !          2526:     hwndStatus = CreateWindowEx( 
        !          2527:         0,                       // no extended styles 
        !          2528:         STATUSCLASSNAME,         // name of status window class 
        !          2529:         (LPCTSTR) NULL,          // no text when first created 
        !          2530:         WS_CHILD | WS_VISIBLE,   // creates a child window 
        !          2531:         0, 0, 0, 0,              // ignores size and position 
        !          2532:         hMainWnd,                // handle to parent window 
        !          2533:         (HMENU) 0,               // child window identifier 
        !          2534:         hInst,                   // handle to application instance 
        !          2535:         NULL);                   // no window creation data 
        !          2536:  
        !          2537:     // Get the coordinates of the parent window's client area. 
        !          2538:     GetClientRect(hMainWnd, &rcClient); 
        !          2539:  
        !          2540:     // Allocate an array for holding the right edge coordinates. 
        !          2541:     hloc = LocalAlloc(LHND, sizeof(int) * 6); // six parts for status-window
        !          2542:     lpParts = LocalLock(hloc); 
        !          2543:  
        !          2544:     // Calculate the right edge coordinate for each part, and 
        !          2545:     // copy the coordinates to the array. 
        !          2546:     lpParts[0] = rcClient.right - 120;
        !          2547:     lpParts[1] = rcClient.right - 105;
        !          2548:     lpParts[2] = rcClient.right - 90;
        !          2549:     lpParts[3] = rcClient.right - 75;
        !          2550:     lpParts[4] = rcClient.right - 60;
        !          2551:     lpParts[5] = rcClient.right;
        !          2552:  
        !          2553:     // Tell the status window to create the six window parts. 
        !          2554:     SendMessage(hwndStatus, SB_SETPARTS, (WPARAM) 6, 
        !          2555:         (LPARAM) lpParts); 
        !          2556:  
        !          2557:     // Free the array, and return. 
        !          2558:     LocalUnlock(hloc); 
        !          2559:     LocalFree(hloc); 
        !          2560:     return hwndStatus; 
        !          2561: } 
        !          2562: 
        !          2563: /*
        !          2564: void SetStatusText(char *text, int part)
        !          2565: {
        !          2566:     if(status_window)
        !          2567:     {
        !          2568:         PostMessage(status_window, SB_SETTEXT, (WPARAM) part, (LPARAM) text);
        !          2569:     }
        !          2570: }
        !          2571: */
        !          2572: 
        !          2573: int gui_init (void)
        !          2574: {
        !          2575: #ifndef _WIN32
        !          2576:     if (!GetSettings ()) {
        !          2577:        MyOutputDebugString ("GetSettings() trying to quit...\n");
        !          2578:        return 0;
        !          2579:     }
        !          2580:     fprintf (stderr, "%lx %lx\n", gfxmem_size, z3fastmem_size);
        !          2581: #endif
        !          2582:     return 1;
        !          2583: }
        !          2584: 
        !          2585: int gui_update (void)
        !          2586: {
        !          2587: }
        !          2588: 
        !          2589: void gui_exit (void)
        !          2590: {
        !          2591: }
        !          2592: 
        !          2593: void gui_led (int led, int on)
        !          2594: {
        !          2595: 
        !          2596: }
        !          2597: 
        !          2598: void gui_filename (int num, const char *name)
        !          2599: {
        !          2600: }
        !          2601: 
        !          2602: LONG GetDisplayModeLogicalNumber( int x, int y )
        !          2603: {
        !          2604:     LONG modenum = 0;
        !          2605:     int i;
        !          2606:     for( i = 0; i < mode_count; i++ )
        !          2607:     {
        !          2608:         if( DisplayModes[i].depth == 2 )
        !          2609:         {
        !          2610:             if( ( DisplayModes[i].res.width == x ) &&
        !          2611:                 ( DisplayModes[i].res.height == y ) )
        !          2612:                 return modenum;
        !          2613:             modenum++;
        !          2614:         }
        !          2615:     }
        !          2616:     return 0;
        !          2617: }
        !          2618: 
        !          2619: LONG GetDisplayModeNumber( LONG logical_number )
        !          2620: {
        !          2621:     LONG modenum = 0;
        !          2622:     int i;
        !          2623:     for( i = 0; i < mode_count; i++ )
        !          2624:     {
        !          2625:         if( DisplayModes[i].depth == 2 && DisplayModes[i].res.width <= 800 && DisplayModes[i].res.height <= 600)
        !          2626:         {
        !          2627:             if( modenum == logical_number )
        !          2628:                 return i;
        !          2629:             modenum++;
        !          2630:         }
        !          2631:     }
        !          2632:     return 0;
        !          2633: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.