diff --git a/stella/src/build/makefile b/stella/src/build/makefile index 660b29ea7..c84b3aa50 100644 --- a/stella/src/build/makefile +++ b/stella/src/build/makefile @@ -13,7 +13,7 @@ ## See the file "license" for information on usage and redistribution of ## this file, and for a DISCLAIMER OF ALL WARRANTIES. ## -## $Id: makefile,v 1.54 2004-06-28 02:06:21 stephena Exp $ +## $Id: makefile,v 1.55 2004-07-10 22:25:57 stephena Exp $ ##============================================================================ ##============================================================================ @@ -25,7 +25,7 @@ ### add your own compiler optimizations here ### if none are provided, the defaults will be used -OPTIMIZATIONS = +OPTIMIZATIONS = -O2 -march=i586 ### to include joystick support JOYSTICK_SUPPORT = 1 diff --git a/stella/src/win32/StellaX/Game.cxx b/stella/src/win32/StellaX/Game.cxx new file mode 100755 index 000000000..f6b553a86 --- /dev/null +++ b/stella/src/win32/StellaX/Game.cxx @@ -0,0 +1,35 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 2004 by Stephen Anthony +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: Game.cxx,v 1.1 2004-07-10 22:25:58 stephena Exp $ +//============================================================================ + +#include "Game.hxx" + +Game::Game( void ) +{ + _available = false; + _rom = " "; + _md5 = " "; + _name = " "; + _rarity = " "; + _manufacturer = " "; + _note = " "; +} + + +Game::~Game( void ) +{ +} diff --git a/stella/src/win32/StellaX/Game.hxx b/stella/src/win32/StellaX/Game.hxx new file mode 100755 index 000000000..bdeddaa07 --- /dev/null +++ b/stella/src/win32/StellaX/Game.hxx @@ -0,0 +1,76 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 2004 by Stephen Anthony +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: Game.hxx,v 1.1 2004-07-10 22:25:58 stephena Exp $ +//============================================================================ + +#ifndef GAME_H +#define GAME_H + +#include "bspf.hxx" + +/** Hold game info for an Atari2600 game. */ +class Game +{ + public: + Game( void ); + ~Game( void ); + + /** sets the rom of a game */ + void setAvailable( bool available ) { _available = available; } + /** returns the rom of a game */ + bool isAvailable( void ) { return _available; } + + /** sets the rom of a game */ + void setRom( const string& rom ) { _rom = rom; }; + /** returns the rom of a game */ + string rom( void ) const { return _rom; } + + /** sets the md5 sum of a game */ + void setMd5( const string& md5 ) { _md5 = md5; }; + /** returns the md5 sum of a game */ + string md5( void ) const { return _md5; } + + /** sets the name of a game */ + void setName( const string& name ) { _name = name; } + /** returns the name of a game */ + string name( void ) const { return _name; } + + /** sets the rarity of a game */ + void setRarity( const string& rarity ) { _rarity = rarity; } + /** returns the rarity of a game */ + string rarity( void ) const { return _rarity; } + + /** sets the manufacturer of a game */ + void setManufacturer( const string& manufacturer) { _manufacturer = manufacturer; } + /** returns the manufacturer of a game */ + string manufacturer( void ) const { return _manufacturer; } + + /** sets the note of a game */ + void setNote( const string& note ) { _note = note; } + /** returns the note of a game */ + string note( void ) const { return _note; } + + protected: + bool _available; + string _rom; + string _md5; + string _name; + string _rarity; + string _manufacturer; + string _note; +}; + +#endif diff --git a/stella/src/win32/StellaX/GlobalData.cxx b/stella/src/win32/StellaX/GlobalData.cxx index a559706e0..71b9a9181 100644 --- a/stella/src/win32/StellaX/GlobalData.cxx +++ b/stella/src/win32/StellaX/GlobalData.cxx @@ -14,21 +14,22 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: GlobalData.cxx,v 1.2 2004-07-04 20:16:03 stephena Exp $ +// $Id: GlobalData.cxx,v 1.3 2004-07-10 22:25:58 stephena Exp $ //============================================================================ #include "pch.hxx" #include "resource.h" +#include "bspf.hxx" #include "Settings.hxx" #include "SettingsWin32.hxx" #include "GlobalData.hxx" CGlobalData::CGlobalData( HINSTANCE hInstance ) - : myInstance(hInstance) + : mySettings(0), + myInstance(hInstance) { - myPathName[0] = _T('\0'); mySettings = new SettingsWin32(); mySettings->loadConfig(); } diff --git a/stella/src/win32/StellaX/GlobalData.hxx b/stella/src/win32/StellaX/GlobalData.hxx index 2ea3cc832..5803d7ba1 100644 --- a/stella/src/win32/StellaX/GlobalData.hxx +++ b/stella/src/win32/StellaX/GlobalData.hxx @@ -14,7 +14,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: GlobalData.hxx,v 1.1 2004-06-28 23:13:54 stephena Exp $ +// $Id: GlobalData.hxx,v 1.2 2004-07-10 22:25:58 stephena Exp $ //============================================================================ #ifndef GLOBAL_DATA_HXX @@ -34,14 +34,6 @@ class CGlobalData CGlobalData( HINSTANCE hInstance ); ~CGlobalData( void ); - LPCTSTR PathName( void ) const - { - if ( myPathName[0] == _T('\0') ) - return NULL; - - return myPathName; - } - HINSTANCE ModuleInstance( void ) const { return myInstance; @@ -55,10 +47,7 @@ class CGlobalData private: Settings* mySettings; - string myArgumentList; - HINSTANCE myInstance; - TCHAR myPathName[ MAX_PATH ]; CGlobalData( const CGlobalData& ); // no implementation void operator=( const CGlobalData& ); // no implementation diff --git a/stella/src/win32/StellaX/MainDlg.cxx b/stella/src/win32/StellaX/MainDlg.cxx index 7ebf3356b..20fe8b95b 100644 --- a/stella/src/win32/StellaX/MainDlg.cxx +++ b/stella/src/win32/StellaX/MainDlg.cxx @@ -14,54 +14,33 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: MainDlg.cxx,v 1.3 2004-07-06 22:51:58 stephena Exp $ +// $Id: MainDlg.cxx,v 1.4 2004-07-10 22:25:58 stephena Exp $ //============================================================================ #include "pch.hxx" #include "MainDlg.hxx" +#include "Game.hxx" #include "GlobalData.hxx" #include "PropertySheet.hxx" #include "AboutPage.hxx" #include "ConfigPage.hxx" #include "resource.h" #include "Settings.hxx" +#include "PropsSet.hxx" +#include "MD5.hxx" #define BKGND_BITMAP_TOP 64 #define BKGND_BITMAP_BOTTOM 355 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -inline LPARAM ListView_GetItemData( HWND hwndList, int iItem ) -{ - LVITEM lvi; - lvi.mask = LVIF_PARAM; - lvi.iItem = iItem; - lvi.iSubItem = 0; - - ListView_GetItem(hwndList, &lvi); - - return lvi.lParam; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CMainDlg::CMainDlg( CGlobalData& rGlobalData, HINSTANCE hInstance ) +MainDlg::MainDlg( CGlobalData& rGlobalData, HINSTANCE hInstance ) : myGlobalData(rGlobalData), m_hInstance(hInstance) { } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CMainDlg::ClearList( void ) -{ - int nCount = ListView_GetItemCount( myHwndList ); - - for (int i = 0; i < nCount; ++i) - delete (CListData*)ListView_GetItemData( myHwndList, i ); - - ListView_DeleteAllItems( myHwndList ); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -int CMainDlg::DoModal( HWND hwndParent ) +int MainDlg::DoModal( HWND hwndParent ) { return DialogBoxParam( m_hInstance, MAKEINTRESOURCE(IDD), @@ -72,20 +51,20 @@ int CMainDlg::DoModal( HWND hwndParent ) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL CALLBACK -CMainDlg::StaticDialogFunc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +MainDlg::StaticDialogFunc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { - CMainDlg* pDlg; + MainDlg* pDlg; switch ( uMsg ) { case WM_INITDIALOG: - pDlg = reinterpret_cast( lParam ); + pDlg = reinterpret_cast( lParam ); pDlg->myHwnd = hDlg; (void)::SetWindowLong( hDlg, DWL_USER, reinterpret_cast( pDlg ) ); break; default: - pDlg = reinterpret_cast( ::GetWindowLong( hDlg, DWL_USER ) ); + pDlg = reinterpret_cast( ::GetWindowLong( hDlg, DWL_USER ) ); if ( pDlg == NULL ) return FALSE; break; @@ -96,7 +75,7 @@ CMainDlg::StaticDialogFunc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BOOL CALLBACK -CMainDlg::DialogFunc( UINT uMsg, WPARAM wParam, LPARAM lParam ) +MainDlg::DialogFunc( UINT uMsg, WPARAM wParam, LPARAM lParam ) { BOOL b; @@ -168,7 +147,7 @@ CMainDlg::DialogFunc( UINT uMsg, WPARAM wParam, LPARAM lParam ) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BOOL CMainDlg::OnInitDialog( void ) +BOOL MainDlg::OnInitDialog( void ) { DWORD dwRet; @@ -181,9 +160,7 @@ BOOL CMainDlg::OnInitDialog( void ) // Make the Rom note have bold text HWND hwndCtrl; - hwndCtrl = ::GetDlgItem( hwnd, IDC_ROMNOTE ); - HFONT hfont = (HFONT)::SendMessage( hwndCtrl, WM_GETFONT, 0, 0 ); LOGFONT lf; @@ -218,18 +195,25 @@ BOOL CMainDlg::OnInitDialog( void ) RECT rc; ::GetClientRect( myHwndList, &rc ); - LONG lTotalWidth = rc.right-rc.left - GetSystemMetrics(SM_CXVSCROLL); - int cx = lTotalWidth / CListData::GetColumnCount(); + // Declare the column headings + int columnHeader[] = { IDS_NAME, IDS_MANUFACTURER, IDS_RARITY }; - for (int i = 0; i < CListData::GetColumnCount(); ++i) + // Set the column widths + LONG lTotalWidth = rc.right-rc.left - GetSystemMetrics(SM_CXVSCROLL); + int columnWidth[3]; + columnWidth[0] = (int) (0.58 * lTotalWidth); + columnWidth[1] = (int) (0.25 * lTotalWidth); + columnWidth[2] = lTotalWidth - columnWidth[0] - columnWidth[1]; + + // Set up the column headings + for (int i = 0; i < sizeof(columnHeader)/sizeof(int); ++i) { - ::LoadString( m_hInstance, CListData::GetColumnNameIdForColumn( i ), - psz, nMaxString ); + LoadString( m_hInstance, columnHeader[i], psz, nMaxString ); LV_COLUMN lvc; lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_LEFT; - lvc.cx = cx; + lvc.cx = columnWidth[i]; lvc.pszText = psz; ListView_InsertColumn( myHwndList, i, &lvc ); } @@ -245,14 +229,14 @@ BOOL CMainDlg::OnInitDialog( void ) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BOOL CMainDlg::OnCommand( int id, HWND hwndCtl, UINT codeNotify ) +BOOL MainDlg::OnCommand( int id, HWND hwndCtl, UINT codeNotify ) { UNUSED_ALWAYS( hwndCtl ); UNUSED_ALWAYS( codeNotify ); HWND hwnd = *this; - CListData* pListData; - + Game* g; + string romfile; int nItem; switch (id) @@ -263,28 +247,23 @@ BOOL CMainDlg::OnCommand( int id, HWND hwndCtl, UINT codeNotify ) ASSERT( nItem != -1 ); if ( nItem == -1 ) { - ::MessageBox( m_hInstance, hwnd, IDS_NO_ITEM_SELECTED ); + MessageBox( m_hInstance, hwnd, IDS_NO_ITEM_SELECTED ); return TRUE; } - pListData = (CListData*)ListView_GetItemData( myHwndList, nItem ); - - TCHAR pszPathName[ MAX_PATH + 1 ]; - lstrcpy( pszPathName, myGlobalData.settings().getString("romdir").c_str() ); - lstrcat( pszPathName, _T("\\") ); - lstrcat( pszPathName, pListData->GetTextForColumn( CListData::FILENAME_COLUMN ) ); - - (void)m_stella.PlayROM( pszPathName, myGlobalData ); + g = (Game*) ListView_GetItemData( myHwndList, nItem ); + romfile = myGlobalData.settings().getString("romdir") + "\\" + g->rom(); + (void)m_stella.PlayROM( romfile, myGlobalData ); // Set focus back to the rom list - ::SetFocus( myHwndList ); + SetFocus( myHwndList ); return TRUE; break; // case IDC_PLAY case IDC_EXIT: - ClearList(); - ::EndDialog( hwnd, IDCANCEL ); + ListView_Clear(); + EndDialog( hwnd, IDCANCEL ); return TRUE; break; // case IDC_EXIT @@ -315,7 +294,7 @@ BOOL CMainDlg::OnCommand( int id, HWND hwndCtl, UINT codeNotify ) case IDC_RELOAD: { - UpdateRomList(); + LoadRomListFromDisk(); return TRUE; break; // case IDC_RELOAD @@ -326,24 +305,20 @@ BOOL CMainDlg::OnCommand( int id, HWND hwndCtl, UINT codeNotify ) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BOOL CMainDlg::OnNotify( int idCtrl, LPNMHDR pnmh ) +BOOL MainDlg::OnNotify( int idCtrl, LPNMHDR pnmh ) { UNUSED_ALWAYS( idCtrl ); switch ( pnmh->code ) { - case LVN_GETDISPINFO: - OnGetDispInfo( (NMLVDISPINFO*)pnmh ); - return TRUE; - - case LVN_COLUMNCLICK: - OnColumnClick( (LPNMLISTVIEW)pnmh ); - return TRUE; - case LVN_ITEMCHANGED: OnItemChanged( (LPNMLISTVIEW)pnmh ); return TRUE; +// case LVN_COLUMNCLICK: +// OnColumnClick( (LPNMLISTVIEW)pnmh ); +// return TRUE; + case NM_DBLCLK: // send out an ok click to play ::SendDlgItemMessage( *this, IDC_PLAY, BM_CLICK, 0, 0 ); @@ -354,6 +329,33 @@ BOOL CMainDlg::OnNotify( int idCtrl, LPNMHDR pnmh ) return FALSE; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void MainDlg::OnItemChanged( LPNMLISTVIEW pnmv ) +{ + HWND hwnd = *this; + + HWND hwndNote = ::GetDlgItem( hwnd, IDC_ROMNOTE ); + + RECT rc; + GetWindowRect(hwndNote, &rc); + ScreenToClient( hwnd, (LPPOINT)&rc ); + ScreenToClient( hwnd, ((LPPOINT)&rc)+1 ); + + int iItem = ListView_GetNextItem(pnmv->hdr.hwndFrom, -1, LVNI_SELECTED); + if (iItem == -1) + { + SetWindowText( hwndNote, _T("") ); + EnableWindow( GetDlgItem( hwnd, IDC_PLAY ), FALSE ); + InvalidateRect( hwnd, &rc, TRUE ); + return; + } + + Game* g = (Game*)ListView_GetItemData( pnmv->hdr.hwndFrom, pnmv->iItem ); + SetWindowText( hwndNote, g->note().c_str() ); + InvalidateRect( hwnd, &rc, TRUE ); + EnableWindow( GetDlgItem( hwnd, IDC_PLAY ), TRUE ); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static void ScreenToClient( HWND hwnd, LPRECT lpRect ) { @@ -370,7 +372,7 @@ static void FillSolidRect( HDC hdc, LPCRECT lpRect, COLORREF clr ) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -BOOL CMainDlg::OnEraseBkgnd( HDC hdc ) +BOOL MainDlg::OnEraseBkgnd( HDC hdc ) { // don't do this in 256 color @@ -419,7 +421,7 @@ BOOL CMainDlg::OnEraseBkgnd( HDC hdc ) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -HBRUSH CMainDlg::OnCtlColorStatic( HDC hdcStatic, HWND hwndStatic ) +HBRUSH MainDlg::OnCtlColorStatic( HDC hdcStatic, HWND hwndStatic ) { // don't do this in 256 color @@ -435,21 +437,20 @@ HBRUSH CMainDlg::OnCtlColorStatic( HDC hdcStatic, HWND hwndStatic ) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CMainDlg::UpdateRomList( void ) +void MainDlg::UpdateRomList( void ) { HWND hwndText; RECT rc; - DWORD dwError = PopulateRomList(); - if ( dwError != ERROR_SUCCESS ) - MessageBoxFromWinError( dwError, _T("PopulateRomList") ); + if ( !PopulateRomList() ) + MessageBoxFromWinError( 0, _T("PopulateRomList") ); // if items added, select first item and enable play button int nCount = ListView_GetItemCount( myHwndList ); if (nCount != 0) { myHeader.SetSortCol( 0, TRUE ); - ListView_SortItems( myHwndList, ListViewCompareFunc, (LPARAM)this ); +// ListView_SortItems( myHwndList, ListViewCompareFunc, (LPARAM)this ); ListView_SetItemState( myHwndList, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED ); } @@ -480,287 +481,200 @@ void CMainDlg::UpdateRomList( void ) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -DWORD CMainDlg::PopulateRomList( void ) +bool MainDlg::PopulateRomList( void ) { - DWORD dwRet; - ClearList(); + bool result = false; + bool cacheFileExists = myGlobalData.settings().fileExists("stellax.cache"); + bool cacheIsStale = false; // FIXME - TCHAR pszPath[ MAX_PATH ]; + if(cacheFileExists && !cacheIsStale) + result = LoadRomListFromCache(); + else + result = LoadRomListFromDisk(); - lstrcpy( pszPath, myGlobalData.settings().getString("romdir").c_str() ); - lstrcat( pszPath, _T("\\*.bin") ); + return result; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool MainDlg::LoadRomListFromDisk() +{ + ListView_Clear(); + + // Get the location of the romfiles (*.bin) + string romdir = myGlobalData.settings().getString("romdir"); + romdir += "\\"; + string romfiles = romdir + "*.bin"; WIN32_FIND_DATA ffd; - HANDLE hFind = FindFirstFile( pszPath, &ffd ); + HANDLE hFind = FindFirstFile( romfiles.c_str(), &ffd ); ListView_SetItemCount( myHwndList, 100 ); int iItem = 0; - BOOL fDone = (hFind == INVALID_HANDLE_VALUE); - while(!fDone) + bool done = (hFind == INVALID_HANDLE_VALUE); + while(!done) { - // File metadata will be read in ReadRomData() - CListData* pListData = new CListData; - if( pListData == NULL ) - return ERROR_NOT_ENOUGH_MEMORY; - - dwRet = pListData->Initialize(); - if( dwRet != ERROR_SUCCESS ) - return dwRet; - - if ( !pListData->m_strFileName.Set( ffd.cFileName ) ) - return FALSE; + Game* g = new Game(); + if( g == NULL ) + return false; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iItem = iItem++; lvi.iSubItem = 0; - lvi.pszText = LPSTR_TEXTCALLBACK; - lvi.lParam = (LPARAM)pListData; + lvi.pszText = ""; + lvi.lParam = (LPARAM) g; int nItem = ListView_InsertItem( myHwndList, &lvi ); ASSERT( nItem != -1 ); - ListView_SetItemText( myHwndList, nItem, - CListData::FILENAME_COLUMN, LPSTR_TEXTCALLBACK ); - ListView_SetItemText(myHwndList, nItem, - CListData::MANUFACTURER_COLUMN, LPSTR_TEXTCALLBACK); - ListView_SetItemText( myHwndList, nItem, - CListData::RARITY_COLUMN, LPSTR_TEXTCALLBACK ); + g->setAvailable( true ); + g->setRom( ffd.cFileName ); + + // Set the name (shown onscreen) to be the rom + // It will be overwritten later if a name is found in the properties set + g->setName( ffd.cFileName ); // go to the next rom file - fDone = !FindNextFile(hFind, &ffd); + done = !FindNextFile(hFind, &ffd); } if( hFind != INVALID_HANDLE_VALUE ) VERIFY( ::FindClose( hFind ) ); - return ERROR_SUCCESS; -} + // Create a propertiesset object and load the properties + // We don't create the propsSet until we need it, since it's + // a time-consuming process + PropertiesSet propsSet; + string theUserProFile = myGlobalData.settings().userPropertiesFilename(); + string theSystemProFile = myGlobalData.settings().systemPropertiesFilename(); + if(theUserProFile != "") + propsSet.load(theUserProFile, true); + else if(theSystemProFile != "") + propsSet.load(theSystemProFile, true); + else + propsSet.load("", false); -DWORD CMainDlg::ReadRomData(CListData* pListData) const -{ -/* - // TODO: Move this method to ListData class (?) - if( pListData == NULL ) + // Now, rescan the items in the listview and update the onscreen + // text and game properties + // Also generate a cache file so the program will start faster next time + ofstream cache("stellax.cache"); + int count = ListView_GetItemCount( myHwndList ); + cache << count << endl; + for (int i = 0; i < count; ++i) { - ASSERT( FALSE ); - return ERROR_BAD_ARGUMENTS; + Game* g = (Game*) ListView_GetItemData(myHwndList, i); + + // Get the MD5sum for this rom + // Use it to lookup the rom in the properties set + string rom = romdir + g->rom(); + ifstream in(rom.c_str(), ios_base::binary); + if(!in) + return false; + uInt8* image = new uInt8[512 * 1024]; + in.read((char*)image, 512 * 1024); + uInt32 size = in.gcount(); + in.close(); + string md5 = MD5( image, size ); + delete[] image; + + // Get the properties for this rom + Properties props; + propsSet.getMD5( md5, props ); + + // For some braindead reason, the ListView_SetItemText won't + // allow std::string::c_str(), so we create C-strings instead + char name[256], manufacturer[256], rarity[256]; + strncpy(name, props.get("Cartridge.Name").c_str(), 255); + strncpy(manufacturer, props.get("Cartridge.Manufacturer").c_str(), 255); + strncpy(rarity, props.get("Cartridge.Rarity").c_str(), 255); + + // Make sure the onscreen 'Name' field isn't blank + if(props.get("Cartridge.Name") == "") + strncpy(name, g->name().c_str(), 255); + + // Update the current game + // To save memory, 'Note' is the only item that needs to be saved + g->setNote( props.get("Cartridge.Note") ); + + // Update the cachefile with this game + cache << g->rom() << endl + << md5 << endl + << name << endl + << rarity << endl + << manufacturer << endl + << g->note() << endl; + + // Finally, update the listview itself + ListView_SetItemText( myHwndList, i, 0, name ); + ListView_SetItemText( myHwndList, i, 1, manufacturer ); + ListView_SetItemText( myHwndList, i, 2, rarity ); } + cache.close(); + SetFocus( myHwndList ); - // attempt to read the rom file - TCHAR pszPath[MAX_PATH + 1]; - lstrcpy( pszPath, myGlobalData.settings().getString("romdir").c_str() ); - lstrcat( pszPath, _T("\\") ); - lstrcat( pszPath, pListData->GetTextForColumn( CListData::FILENAME_COLUMN ) ); - - HANDLE hFile; - hFile = CreateFile( pszPath, - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL ); - if(hFile == INVALID_HANDLE_VALUE) - return GetLastError(); - - DWORD dwFileSize = ::GetFileSize( hFile, NULL ); - BYTE* pImage = new BYTE[dwFileSize]; - if( pImage == NULL ) - return ERROR_NOT_ENOUGH_MEMORY; - - DWORD dwRead; - if( ::ReadFile( hFile, pImage, dwFileSize, &dwRead, NULL ) ) - { - // Read the file, now check the md5 - std::string md5 = MD5( pImage, dwFileSize ); - - // search through the properties set for this MD5 - PropertiesSet& propertiesSet = m_stella.GetPropertiesSet(); - - uInt32 setSize = propertiesSet.size(); - - for (uInt32 i = 0; i < setSize; ++i) - { - if (propertiesSet.get(i).get("Cartridge.MD5") == md5) - { - // got it! - break; - } - } - - if (i != setSize) - { - const Properties& properties = propertiesSet.get(i); - - if ( ! pListData->m_strManufacturer.Set( - properties.get("Cartridge.Manufacturer").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! pListData->m_strName.Set( - properties.get("Cartridge.Name").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if (! pListData->m_strRarity.Set( - properties.get("Cartridge.Rarity").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! pListData->m_strNote.Set( - properties.get("Cartridge.Note").c_str() ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - } - else - { - // - // Any output here should be appended to the emucore\stella.pro file - // - - TRACE( "\"Cartridge.MD5\" \"%s\"\n\"Cartridge.Name\" \"%s\"\n\"\"\n", - md5.c_str(), - pListData->GetTextForColumn( CListData::FILENAME_COLUMN ) ); - } - } - - delete[] pImage; - - VERIFY( ::CloseHandle( hFile ) ); - - pListData->m_fPopulated = TRUE; -*/ - return ERROR_SUCCESS; + return true; } -void CMainDlg::OnColumnClick( LPNMLISTVIEW pnmv ) +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool MainDlg::LoadRomListFromCache() { - HCURSOR hcur = ::SetCursor(::LoadCursor(NULL, IDC_WAIT)); + ListView_Clear(); + char count[10], rom[256], md5[256], name[256], rarity[256], + manufacturer[256], note[256]; - myHeader.SetSortCol(pnmv->iSubItem, TRUE); - ListView_SortItems(pnmv->hdr.hwndFrom, ListViewCompareFunc, (LPARAM)this); + // We don't scan the roms at all; just load directly from the cache file + ifstream in("stellax.cache"); + if (!in) + return false; - // ensure the selected item is visible + in.getline(count, 9); + int numRoms = atoi(count); + ListView_SetItemCount( myHwndList, 100 ); - int nItem = ListView_GetNextItem( myHwndList, -1, LVNI_SELECTED ); - if (nItem != -1) - { - ListView_EnsureVisible( myHwndList, nItem, TRUE ); - } - - ::SetCursor(hcur); -} - -void CMainDlg::OnItemChanged( LPNMLISTVIEW pnmv ) -{ - HWND hwnd = *this; - - HWND hwndNote = ::GetDlgItem( hwnd, IDC_ROMNOTE ); - - RECT rc; - GetWindowRect(hwndNote, &rc); - ScreenToClient( hwnd, (LPPOINT)&rc ); - ScreenToClient( hwnd, ((LPPOINT)&rc)+1 ); - - int iItem = ListView_GetNextItem(pnmv->hdr.hwndFrom, -1, LVNI_SELECTED); - if (iItem == -1) + int iItem = 0; + for(int i = 0; i < numRoms; i++) { - SetWindowText( hwndNote, _T("") ); - EnableWindow( ::GetDlgItem( hwnd, IDC_PLAY ), FALSE ); - InvalidateRect( hwnd, &rc, TRUE ); - return; + string line; + Game* g = new Game(); + if( g == NULL ) + return false; + + // Get the data from the cache file + in.getline(rom, 255); + in.getline(md5, 255); + in.getline(name, 255); + in.getline(rarity, 255); + in.getline(manufacturer, 255); + in.getline(note, 255); + + // These are the only things we really need to save + g->setAvailable( true ); + g->setRom( rom ); + g->setNote( note ); + + LV_ITEM lvi; + lvi.mask = LVIF_TEXT | LVIF_PARAM; + lvi.iItem = iItem++; + lvi.iSubItem = 0; + lvi.pszText = ""; + lvi.lParam = (LPARAM) g; + int nItem = ListView_InsertItem( myHwndList, &lvi ); + + ASSERT( nItem != -1 ); + + ListView_SetItemText( myHwndList, nItem, 0, name ); + ListView_SetItemText( myHwndList, nItem, 1, manufacturer ); + ListView_SetItemText( myHwndList, nItem, 2, rarity ); } + SetFocus( myHwndList ); - CListData* pListData = (CListData*)ListView_GetItemData( - pnmv->hdr.hwndFrom, - pnmv->iItem ); - - SetWindowText( hwndNote, pListData->GetNote() ); - InvalidateRect( hwnd, &rc, TRUE ); - EnableWindow( ::GetDlgItem( hwnd, IDC_PLAY ), TRUE ); + return true; } -// --------------------------------------------------------------------------- -// LPSTR_TEXTCALLBACK message handlers -void CMainDlg::OnGetDispInfo(NMLVDISPINFO* pnmv) -{ - // Provide the item or subitem's text, if requested. - if( !(pnmv->item.mask & LVIF_TEXT ) ) - return; - - CListData* pListData = (CListData*) - ListView_GetItemData( pnmv->hdr.hwndFrom, pnmv->item.iItem ); - ASSERT( pListData ); - if( pListData == NULL ) - return; - - if( !pListData->IsPopulated() ) - ReadRomData( pListData ); - - pnmv->item.pszText = const_cast( pListData->GetTextForColumn(pnmv->item.iSubItem) ); -} - -int CALLBACK CMainDlg::ListViewCompareFunc( - LPARAM lParam1, - LPARAM lParam2, - LPARAM lParamSort - ) -{ - CMainDlg* pThis = reinterpret_cast( lParamSort ); - - // - // I assume that the metadata for column 0 is always available, - // while other column metadata requires a call to ReadRomData - // - - int nSortCol = pThis->myHeader.GetSortCol(); - - CListData* pItem1 = reinterpret_cast( lParam1 ); - if ( ! pItem1->IsPopulated() && nSortCol != 0 ) - { - pThis->ReadRomData( pItem1 ); - } - - CListData* pItem2 = reinterpret_cast( lParam2 ); - if ( ! pItem2->IsPopulated() && nSortCol != 0 ) - { - pThis->ReadRomData( pItem2 ); - } - - LPCTSTR pszItem1 = pItem1->GetTextForColumn( nSortCol ); - LPCTSTR pszItem2 = pItem2->GetTextForColumn( nSortCol ); - - // - // put blank items last - // - - if ( pszItem1 == NULL || pszItem1[0] == _T('\0') ) - { - return 1; - } - - if ( pszItem2 == NULL || pszItem2[0] == _T('\0') ) - { - return -1; - } - - // - // Compare the specified column. - // - - return lstrcmpi( pszItem1, pszItem2 ); -} - -// --------------------------------------------------------------------------- +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Cool caption message handlers - -void CMainDlg::OnDestroy( +void MainDlg::OnDestroy( void ) { @@ -773,24 +687,51 @@ void CMainDlg::OnDestroy( } } -void CMainDlg::OnNcPaint( +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void MainDlg::OnNcPaint( HRGN hrgn ) { m_CoolCaption.OnNcPaint( hrgn ); } -void CMainDlg::OnNcActivate( +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void MainDlg::OnNcActivate( BOOL fActive ) { m_CoolCaption.OnNcActivate( fActive ); } -BOOL CMainDlg::OnNcLButtonDown( +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +BOOL MainDlg::OnNcLButtonDown( INT nHitTest, POINTS pts ) { return m_CoolCaption.OnNCLButtonDown( nHitTest, pts ); } + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +LPARAM MainDlg::ListView_GetItemData( HWND hwndList, int iItem ) +{ + LVITEM lvi; + lvi.mask = LVIF_PARAM; + lvi.iItem = iItem; + lvi.iSubItem = 0; + + ListView_GetItem(hwndList, &lvi); + + return lvi.lParam; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void MainDlg::ListView_Clear( void ) +{ + int nCount = ListView_GetItemCount( myHwndList ); + + for (int i = 0; i < nCount; ++i) + delete (Game*) ListView_GetItemData( myHwndList, i ); + + ListView_DeleteAllItems( myHwndList ); +} diff --git a/stella/src/win32/StellaX/MainDlg.hxx b/stella/src/win32/StellaX/MainDlg.hxx index 00aa9fe6f..cf937d09c 100644 --- a/stella/src/win32/StellaX/MainDlg.hxx +++ b/stella/src/win32/StellaX/MainDlg.hxx @@ -1,10 +1,24 @@ -// -// StellaX -// Jeff Miller 05/10/2000 -// -#ifndef MAINDLG_H -#define MAINDLG_H -#pragma once +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2000 by Jeff Miller +// Copyright (c) 2004 by Stephen Anthony +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: MainDlg.hxx,v 1.3 2004-07-10 22:25:58 stephena Exp $ +//============================================================================ + +#ifndef __MAINDLG_H_ +#define __MAINDLG_H_ #include "resource.h" @@ -16,175 +30,19 @@ class CGlobalData; #include "HeaderCtrl.hxx" #include "RoundButton.hxx" -class CMainDlg; -class CListData +class MainDlg { - friend CMainDlg; - -public: - - CListData() : - m_fPopulated( FALSE ) - { - } - - DWORD Initialize() - { - // - // ListView control doesn't like NULLs returned, so initialize all - // - - if ( ! m_strName.Set( _T("") ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! m_strManufacturer.Set( _T("") ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! m_strRarity.Set( _T("") ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! m_strFileName.Set( _T("") ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - if ( ! m_strNote.Set( _T("") ) ) - { - return ERROR_NOT_ENOUGH_MEMORY; - } - - return ERROR_SUCCESS; - } - - // - // MetaData - // - - static int GetColumnCount( void ) - { - return 4; - } - - enum ColumnIndex - { - FILENAME_COLUMN, - NAME_COLUMN, - MANUFACTURER_COLUMN, - RARITY_COLUMN, - }; - - static UINT GetColumnNameIdForColumn( int nCol ) - { - UINT uID = 0; - - switch ( nCol ) - { - case NAME_COLUMN: - uID = IDS_NAME; - break; - - case MANUFACTURER_COLUMN: - uID = IDS_MANUFACTURER; - break; - - case RARITY_COLUMN: - uID = IDS_RARITY; - break; - - case FILENAME_COLUMN: - uID = IDS_FILENAME; - break; - - default: - ASSERT(FALSE); - break; - } - - return uID; - } - - LPCTSTR GetTextForColumn( int nCol ) const - { - LPCTSTR pszText = NULL; - - switch (nCol) - { - case NAME_COLUMN: - pszText = m_strName.Get(); - break; - - case MANUFACTURER_COLUMN: - pszText = m_strManufacturer.Get(); - break; - - case RARITY_COLUMN: - pszText = m_strRarity.Get(); - break; - - case FILENAME_COLUMN: - pszText = m_strFileName.Get(); - break; - - default: - ASSERT( FALSE ); - break; - } - - return pszText; - } - - LPCTSTR GetNote( void ) const - { - return m_strNote.Get(); - } - - BOOL IsPopulated( void ) const - { - return m_fPopulated; - } - -private: - - CSimpleString m_strName; - CSimpleString m_strManufacturer; - CSimpleString m_strRarity; - CSimpleString m_strFileName; - CSimpleString m_strNote; - BOOL m_fPopulated; - -private: - -CListData( const CListData& ); // no implementation -void operator=( const CListData& ); // no implementation - -}; - -// --------------------------------------------------------------------------- - -class CMainDlg -{ -public: - + public: enum { IDD = IDD_MAIN }; - CMainDlg( CGlobalData& rGlobalData, HINSTANCE hInstance ); + MainDlg( CGlobalData& rGlobalData, HINSTANCE hInstance ); virtual int DoModal( HWND hwndParent ); - operator HWND( void ) const - { - return myHwnd; - } - -private: + operator HWND( void ) const { return myHwnd; } + private: HWND myHwnd; CCoolCaption m_CoolCaption; @@ -196,66 +54,45 @@ private: CRoundButton myConfigButton; CRoundButton myExitButton; - // // Message handlers - // - BOOL OnInitDialog( void ); BOOL OnCommand( int id, HWND hwndCtl, UINT codeNotify ); BOOL OnNotify( int idCtrl, LPNMHDR pnmh ); BOOL OnEraseBkgnd( HDC hdc ); HBRUSH OnCtlColorStatic( HDC hdcStatic, HWND hwndStatic ); - // // wm_notify handlers - // - - void OnGetDispInfo( NMLVDISPINFO* pnmh ); - - void OnColumnClick( LPNMLISTVIEW pnmv ); void OnItemChanged( LPNMLISTVIEW pnmv ); +// void OnColumnClick( LPNMLISTVIEW pnmv ); - // // cool caption handlers - // - void OnDestroy( void ); void OnNcPaint( HRGN hrgn ); void OnNcActivate( BOOL fActive ); BOOL OnNcLButtonDown( INT nHitTest, POINTS pts ); - // // callback methods - // - BOOL CALLBACK DialogFunc( UINT uMsg, WPARAM wParam, LPARAM lParam ); - static BOOL CALLBACK StaticDialogFunc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ); - static int CALLBACK ListViewCompareFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ); // internal data - - DWORD PopulateRomList(); void UpdateRomList(); - DWORD ReadRomData( CListData* ) const; + bool PopulateRomList(); + bool LoadRomListFromDisk(); + bool LoadRomListFromCache(); HINSTANCE m_hInstance; // stuff in list - HWND myHwndList; - void ClearList(); + LPARAM ListView_GetItemData( HWND hwndList, int iItem ); + void ListView_Clear(); HFONT m_hfontRomNote; // Stella stuff - CGlobalData& myGlobalData; CStellaXMain m_stella; - -CMainDlg( const CMainDlg& ); // no implementation -void operator=( const CMainDlg& ); // no implementation - }; #endif diff --git a/stella/src/win32/StellaX/StellaX.aps b/stella/src/win32/StellaX/StellaX.aps index 7c80c61ae..3487aa81e 100644 Binary files a/stella/src/win32/StellaX/StellaX.aps and b/stella/src/win32/StellaX/StellaX.aps differ diff --git a/stella/src/win32/StellaX/StellaX.rc b/stella/src/win32/StellaX/StellaX.rc index 828bc592d..fe5655c1b 100644 --- a/stella/src/win32/StellaX/StellaX.rc +++ b/stella/src/win32/StellaX/StellaX.rc @@ -130,7 +130,7 @@ BEGIN CONTROL "Static",IDC_ROMPATH,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX | WS_GROUP,57,45,254,8 CONTROL "",IDC_ROMNOTE,"Static",SS_LEFTNOWORDWRAP | SS_NOPREFIX | - WS_GROUP,93,205,309,8 + WS_GROUP,105,205,297,8 LTEXT "Game notes (if available):",-1,7,205,98,8 CONTROL "&Reload",IDC_RELOAD,"Button",BS_OWNERDRAW | WS_TABSTOP, 172,226,54,16 diff --git a/stella/src/win32/StellaX/StellaX.vcproj b/stella/src/win32/StellaX/StellaX.vcproj index 58e76a808..7214549f6 100644 --- a/stella/src/win32/StellaX/StellaX.vcproj +++ b/stella/src/win32/StellaX/StellaX.vcproj @@ -20,7 +20,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\emucore;..\..\emucore\m6502\src\bspf\src;..\..\win32" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;BSPF_WIN32;DISPLAY_OPENGL" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;BSPF_WIN32;JOYSTICK_SUPPORT;SNAPSHOT_SUPPORT;DISPLAY_OPENGL" MinimalRebuild="TRUE" BasicRuntimeChecks="3" RuntimeLibrary="5" @@ -68,7 +68,7 @@ + + @@ -144,12 +147,21 @@ + + + + + + @@ -188,6 +200,9 @@ + + @@ -200,12 +215,21 @@ + + + + + + diff --git a/stella/src/win32/StellaX/StellaXMain.cxx b/stella/src/win32/StellaX/StellaXMain.cxx index 04b63b486..c7b3c24b2 100644 --- a/stella/src/win32/StellaX/StellaXMain.cxx +++ b/stella/src/win32/StellaX/StellaXMain.cxx @@ -14,7 +14,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: StellaXMain.cxx,v 1.3 2004-07-06 22:51:58 stephena Exp $ +// $Id: StellaXMain.cxx,v 1.4 2004-07-10 22:25:58 stephena Exp $ //============================================================================ #include @@ -37,15 +37,14 @@ CStellaXMain::~CStellaXMain() { } -void CStellaXMain::PlayROM( LPCTSTR filename, CGlobalData& globaldata ) +void CStellaXMain::PlayROM( string& romfile, CGlobalData& globaldata ) { - string rom = filename; ostringstream buf; // Make sure the specfied ROM exists - if(!globaldata.settings().fileExists(filename)) + if(!globaldata.settings().fileExists(romfile)) { - buf << "\"" << rom << "\" doesn't exist"; + buf << "\"" << romfile << "\" doesn't exist"; MessageBox( NULL, buf.str().c_str(), "Unknown ROM", MB_ICONEXCLAMATION|MB_OK); return; @@ -54,6 +53,6 @@ void CStellaXMain::PlayROM( LPCTSTR filename, CGlobalData& globaldata ) // Assume that the ROM file does exist, attempt to run external Stella // Since all settings are saved to the stella.ini file, we don't need // to pass any arguments here ... - buf << "\"" << rom << "\""; + buf << "\"" << romfile << "\""; ShellExecute(NULL, "open", "stella.exe", buf.str().c_str(), NULL, 0); } diff --git a/stella/src/win32/StellaX/StellaXMain.hxx b/stella/src/win32/StellaX/StellaXMain.hxx index f14a5857a..a5f7f4029 100644 --- a/stella/src/win32/StellaX/StellaXMain.hxx +++ b/stella/src/win32/StellaX/StellaXMain.hxx @@ -14,12 +14,14 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: StellaXMain.hxx,v 1.2 2004-07-04 20:16:03 stephena Exp $ +// $Id: StellaXMain.hxx,v 1.3 2004-07-10 22:25:58 stephena Exp $ //============================================================================ #ifndef STELLAX_H #define STELLAX_H +#include "bspf.hxx" + class CGlobalData; class CStellaXMain @@ -28,7 +30,7 @@ class CStellaXMain CStellaXMain(); ~CStellaXMain(); - void PlayROM( LPCTSTR filename, CGlobalData& globaldata ); + void PlayROM( string& romfile, CGlobalData& globaldata ); private: CStellaXMain( const CStellaXMain& ); // no implementation diff --git a/stella/src/win32/StellaX/main.cxx b/stella/src/win32/StellaX/main.cxx index ad2a9944d..2b3fb07b2 100644 --- a/stella/src/win32/StellaX/main.cxx +++ b/stella/src/win32/StellaX/main.cxx @@ -14,7 +14,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: main.cxx,v 1.1 2004-06-28 23:13:54 stephena Exp $ +// $Id: main.cxx,v 1.2 2004-07-10 22:25:58 stephena Exp $ //============================================================================ #include "pch.hxx" @@ -84,7 +84,7 @@ int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, CGlobalData globaldata( hInstance ); // show the ui - CMainDlg dlg( globaldata, hInstance ); + MainDlg dlg( globaldata, hInstance ); dlg.DoModal( NULL ); if ( hrCoInit == S_OK ) diff --git a/stella/src/win32/StellaX/pch.hxx b/stella/src/win32/StellaX/pch.hxx index e16009fc1..da406cea2 100644 --- a/stella/src/win32/StellaX/pch.hxx +++ b/stella/src/win32/StellaX/pch.hxx @@ -4,29 +4,18 @@ // #ifndef PCH_H #define PCH_H -#pragma once - -#ifndef _WIN32 -#error This file can only be compiled for a Win32 platform -#endif #define WIN32_LEAN_AND_MEAN -#define STRICT #define DIRECTINPUT_VERSION 5 + #include #include #include -// warning C4201: nonstandard extension used : nameless struct/union - -#pragma warning ( once: 4201 ) - #include #include #include -#include -#include #include #include "debug.hxx" @@ -34,9 +23,6 @@ // --------------------------------------------------------------------------- // Conditional defines -#define DOUBLE_WIDTH - -// // Macros // @@ -53,21 +39,19 @@ class CSimpleString { -public: - + public: CSimpleString() : m_psz( NULL ), m_cch( -1 ) - { - } + { + } ~CSimpleString() - { - delete[] m_psz; - m_psz = NULL; - - m_cch = -1; - } + { + delete[] m_psz; + m_psz = NULL; + m_cch = -1; + } BOOL Set( LPCTSTR psz ) { @@ -135,5 +119,4 @@ void MessageBoxFromGetLastError( LPCTSTR pszCaption /* = NULL */ ); - #endif diff --git a/stella/src/win32/Stella_Emulator.ncb b/stella/src/win32/Stella_Emulator.ncb index d96d08cf1..f2ba98d66 100644 Binary files a/stella/src/win32/Stella_Emulator.ncb and b/stella/src/win32/Stella_Emulator.ncb differ diff --git a/stella/src/win32/Stella_Emulator.suo b/stella/src/win32/Stella_Emulator.suo index 172fd2509..ba8cc046e 100644 Binary files a/stella/src/win32/Stella_Emulator.suo and b/stella/src/win32/Stella_Emulator.suo differ