- fix some window size bugs regarding interaction between toolbar/lockdown/maximize/rotation/gap/layout

- make close rom clear the screen
- disable auto-unpause-on-reset if a movie is active
- prevent menu display from lingering over toolbar sometimes
- switch cw/ccw toolbar buttons (because the previous order was really confusing)
- fix crash in DD_DoDisplay
This commit is contained in:
nitsuja 2009-12-23 12:10:25 +00:00
parent 9a4457e4ff
commit a9d76cb8c5
2 changed files with 73 additions and 34 deletions

View File

@ -655,13 +655,13 @@ void WINCLASS::sizingMsg(WPARAM wParam, LPARAM lParam, LONG keepRatio)
bool verticalDrag = (wParam == WMSZ_TOP) || (wParam == WMSZ_BOTTOM); bool verticalDrag = (wParam == WMSZ_TOP) || (wParam == WMSZ_BOTTOM);
if(verticalDrag && !(keepRatio & KEEPY)) if(verticalDrag && !(keepRatio & KEEPY))
{ {
int clientHeight = rect->bottom - rect->top - frameWidth; int clientHeight = rect->bottom - rect->top - frameHeight;
if(clientHeight < minHeight) if(clientHeight < minHeight)
rect->bottom += minHeight - clientHeight; rect->bottom += minHeight - clientHeight;
} }
else if(horizontalDrag && !(keepRatio & KEEPX)) else if(horizontalDrag && !(keepRatio & KEEPX))
{ {
int clientWidth = rect->right - rect->left - frameHeight; int clientWidth = rect->right - rect->left - frameWidth;
if(clientWidth < minWidth) if(clientWidth < minWidth)
rect->right += minWidth - clientWidth; rect->right += minWidth - clientWidth;
} }

View File

@ -438,8 +438,14 @@ VOID CALLBACK KeyInputTimer( UINT idEvent, UINT uMsg, DWORD_PTR dwUser, DWORD_PT
InputTimer<true>(); InputTimer<true>();
} }
void ScaleScreen(float factor) void ScaleScreen(float factor, bool user)
{ {
if(user) // have to exit maximized mode if the user told us to set a specific window size
{
bool maximized = IsZoomed(MainWindow->getHWnd())==TRUE;
if(maximized) ShowWindow(MainWindow->getHWnd(),SW_NORMAL);
}
if(windowSize == 0) if(windowSize == 0)
{ {
int defw = GetPrivateProfileInt("Video", "Window width", 256, IniName); int defw = GetPrivateProfileInt("Video", "Window width", 256, IniName);
@ -511,7 +517,7 @@ static void GetNdsScreenRect(RECT* r)
RECT zero; RECT zero;
SetRect(&zero,0,0,0,0); SetRect(&zero,0,0,0,0);
if(zero == MainScreenRect) *r = SubScreenRect; if(zero == MainScreenRect) *r = SubScreenRect;
else if(zero == SubScreenRect) *r = MainScreenRect; else if(zero == SubScreenRect || video.layout == 2) *r = MainScreenRect;
else else
{ {
RECT* dstRects [2] = {&MainScreenRect, &SubScreenRect}; RECT* dstRects [2] = {&MainScreenRect, &SubScreenRect};
@ -1140,12 +1146,12 @@ void doLCDsLayout()
if (video.layout_old == 1) if (video.layout_old == 1)
{ {
newwidth = oldwidth / 2; newwidth = oldwidth / 2;
newheight = oldheight * 2; newheight = (oldheight * 2) + (video.screengap * oldheight / 192);
} }
else if (video.layout_old == 2) else if (video.layout_old == 2)
{ {
newwidth = oldwidth; newwidth = oldwidth;
newheight = oldheight * 2; newheight = (oldheight * 2) + (video.screengap * oldheight / 192);
} }
else else
{ {
@ -1155,8 +1161,6 @@ void doLCDsLayout()
MainWindow->checkMenu(ID_LCDS_VERTICAL, true); MainWindow->checkMenu(ID_LCDS_VERTICAL, true);
MainWindow->checkMenu(ID_LCDS_HORIZONTAL, false); MainWindow->checkMenu(ID_LCDS_HORIZONTAL, false);
MainWindow->checkMenu(ID_LCDS_ONE, false); MainWindow->checkMenu(ID_LCDS_ONE, false);
} }
else else
{ {
@ -1177,12 +1181,14 @@ void doLCDsLayout()
MainWindowToolbar->EnableButton(IDC_ROTATE90, false); MainWindowToolbar->EnableButton(IDC_ROTATE90, false);
MainWindowToolbar->EnableButton(IDC_ROTATE270, false); MainWindowToolbar->EnableButton(IDC_ROTATE270, false);
int scaledGap = oldheight - ((MainScreenRect.bottom - MainScreenRect.top) + (SubScreenRect.bottom - SubScreenRect.top));
if (video.layout == 1) if (video.layout == 1)
{ {
if (video.layout_old == 0) if (video.layout_old == 0)
{ {
newwidth = oldwidth * 2; newwidth = oldwidth * 2;
newheight = oldheight / 2; newheight = (oldheight - scaledGap) / 2;
} }
else if (video.layout_old == 2) else if (video.layout_old == 2)
{ {
@ -1203,7 +1209,7 @@ void doLCDsLayout()
if (video.layout_old == 0) if (video.layout_old == 0)
{ {
newwidth = oldwidth; newwidth = oldwidth;
newheight = oldheight / 2; newheight = (oldheight - scaledGap) / 2;
} }
else if (video.layout_old == 1) else if (video.layout_old == 1)
{ {
@ -1280,14 +1286,13 @@ static void DD_FillRect(LPDIRECTDRAWSURFACE7 surf, int left, int top, int right,
//the directdraw final presentation portion of display, including rotating //the directdraw final presentation portion of display, including rotating
static void DD_DoDisplay() static void DD_DoDisplay()
{ {
int res; if(backbuffer_invalidate)
goto CREATE;
memset(&ddsd, 0, sizeof(ddsd)); memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd); ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags=DDSD_ALL; ddsd.dwFlags=DDSD_ALL;
res = lpBackSurface->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_WRITEONLY, NULL); int res = lpBackSurface->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_WRITEONLY, NULL);
if(backbuffer_invalidate)
goto CREATE;
if(FAILED(res)) if(FAILED(res))
{ {
@ -1298,8 +1303,8 @@ static void DD_DoDisplay()
|| FAILED(IDirectDrawSurface7_Restore(lpBackSurface))) || FAILED(IDirectDrawSurface7_Restore(lpBackSurface)))
{ {
CREATE: CREATE:
if(CreateDDrawBuffers() < 0) CreateDDrawBuffers();
return; return;
} }
} }
else else
@ -2499,7 +2504,7 @@ int _main()
SetMinWindowSize(); SetMinWindowSize();
ScaleScreen(windowSize); ScaleScreen(windowSize, false);
DragAcceptFiles(MainWindow->getHWnd(), TRUE); DragAcceptFiles(MainWindow->getHWnd(), TRUE);
@ -2922,13 +2927,13 @@ void FixAspectRatio()
{ {
if(windowSize != 0) if(windowSize != 0)
{ {
ScaleScreen(windowSize); ScaleScreen(windowSize, false);
} }
else if(ForceRatio) else if(ForceRatio)
{ {
RECT rc; RECT rc;
GetWindowRect(MainWindow->getHWnd(), &rc); GetWindowRect(MainWindow->getHWnd(), &rc);
SendMessage(MainWindow->getHWnd(), WM_SIZING, WMSZ_BOTTOMRIGHT, (LPARAM)&rc); SendMessage(MainWindow->getHWnd(), WM_SIZING, WMSZ_BOTTOMRIGHT, (LPARAM)&rc); // calls WINCLASS::sizingMsg
MoveWindow(MainWindow->getHWnd(), rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE); MoveWindow(MainWindow->getHWnd(), rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE);
} }
} }
@ -2944,6 +2949,11 @@ void SetScreenGap(int gap)
//======================================================================================== //========================================================================================
void SetRotate(HWND hwnd, int rot, bool user) void SetRotate(HWND hwnd, int rot, bool user)
{ {
bool maximized = IsZoomed(hwnd)==TRUE;
if(((rot == 90) || (rot == 270)) == ((video.rotation == 90) || (video.rotation == 270)))
maximized = false; // no need to toggle out to windowed if the dimensions aren't changing
if(maximized) ShowWindow(hwnd,SW_NORMAL);
{
Lock lock (win_backbuffer_sync); Lock lock (win_backbuffer_sync);
RECT rc; RECT rc;
@ -2999,8 +3009,8 @@ void SetRotate(HWND hwnd, int rot, bool user)
case 270: cwid = IDC_ROTATE0; ccwid = IDC_ROTATE180; break; case 270: cwid = IDC_ROTATE0; ccwid = IDC_ROTATE180; break;
} }
MainWindowToolbar->ChangeButtonID(6, cwid); MainWindowToolbar->ChangeButtonID(6, ccwid);
MainWindowToolbar->ChangeButtonID(7, ccwid); MainWindowToolbar->ChangeButtonID(7, cwid);
/* Recreate the DirectDraw back buffer */ /* Recreate the DirectDraw back buffer */
if (lpBackSurface!=NULL) if (lpBackSurface!=NULL)
@ -3028,6 +3038,9 @@ void SetRotate(HWND hwnd, int rot, bool user)
gpu_SetRotateScreen(video.rotation); gpu_SetRotateScreen(video.rotation);
UpdateScreenRects(); UpdateScreenRects();
UpdateWndRects(hwnd);
}
if(maximized) ShowWindow(hwnd,SW_MAXIMIZE);
} }
void AviEnd() void AviEnd()
@ -3171,7 +3184,8 @@ static BOOL OpenCore(const char* filename)
if(LoadROM(filename, LogicalName)) if(LoadROM(filename, LogicalName))
{ {
romloaded = TRUE; romloaded = TRUE;
Unpause(); if(movieMode == MOVIEMODE_INACTIVE)
Unpause();
// Update the toolbar // Update the toolbar
MainWindowToolbar->EnableButton(IDM_PAUSE, true); MainWindowToolbar->EnableButton(IDM_PAUSE, true);
@ -3269,6 +3283,12 @@ void CloseRom()
Hud.resetTransient(); Hud.resetTransient();
NDS_Reset(); NDS_Reset();
// clear screen so the last frame we rendered doesn't stick around
// (TODO: maybe NDS_Reset should do this?)
memset(GPU_screen, 0xFF, sizeof(GPU_screen));
InvalidateRect(MainWindow->getHWnd(), NULL, FALSE); // make sure the window refreshes with the cleared screen
MainWindowToolbar->EnableButton(IDM_PAUSE, false); MainWindowToolbar->EnableButton(IDM_PAUSE, false);
MainWindowToolbar->EnableButton(IDM_CLOSEROM, false); MainWindowToolbar->EnableButton(IDM_CLOSEROM, false);
MainWindowToolbar->EnableButton(IDM_RESET, false); MainWindowToolbar->EnableButton(IDM_RESET, false);
@ -3570,7 +3590,7 @@ void FilterUpdate(HWND hwnd, bool user)
SetScreenGap(video.screengap); SetScreenGap(video.screengap);
SetRotate(hwnd, video.rotation, false); SetRotate(hwnd, video.rotation, false);
if(user && windowSize==0) {} if(user && windowSize==0) {}
else ScaleScreen(windowSize); else ScaleScreen(windowSize, false);
WritePrivateProfileInt("Video", "Filter", video.currentfilter, IniName); WritePrivateProfileInt("Video", "Filter", video.currentfilter, IniName);
WritePrivateProfileInt("Video", "Width", video.width, IniName); WritePrivateProfileInt("Video", "Width", video.width, IniName);
WritePrivateProfileInt("Video", "Height", video.height, IniName); WritePrivateProfileInt("Video", "Height", video.height, IniName);
@ -3605,6 +3625,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case WM_EXITMENULOOP: case WM_EXITMENULOOP:
SPU_Pause(0); SPU_Pause(0);
if (autoframeskipenab && frameskiprate) AutoFrameSkip_IgnorePreviousDelay(); if (autoframeskipenab && frameskiprate) AutoFrameSkip_IgnorePreviousDelay();
if(MainWindowToolbar->Visible())
UpdateWindow(MainWindowToolbar->GetHWnd());
break; break;
case WM_ENTERMENULOOP: //Update menu items that needs to be updated dynamically case WM_ENTERMENULOOP: //Update menu items that needs to be updated dynamically
{ {
@ -3702,6 +3724,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
MainWindow->checkMenu(IDM_SCREENSEP_COLORWHITE, ((ScreenGapColor&0xFFFFFF) == 0xFFFFFF)); MainWindow->checkMenu(IDM_SCREENSEP_COLORWHITE, ((ScreenGapColor&0xFFFFFF) == 0xFFFFFF));
MainWindow->checkMenu(IDM_SCREENSEP_COLORGRAY, ((ScreenGapColor&0xFFFFFF) == 0x7F7F7F)); MainWindow->checkMenu(IDM_SCREENSEP_COLORGRAY, ((ScreenGapColor&0xFFFFFF) == 0x7F7F7F));
MainWindow->checkMenu(IDM_SCREENSEP_COLORBLACK, ((ScreenGapColor&0xFFFFFF) == 0x000000)); MainWindow->checkMenu(IDM_SCREENSEP_COLORBLACK, ((ScreenGapColor&0xFFFFFF) == 0x000000));
DesEnableMenuItem(mainMenu, IDM_SCREENSEP_DRAGEDIT, !IsZoomed(hwnd) && video.layout==0);
// Show toolbar // Show toolbar
MainWindow->checkMenu(IDM_SHOWTOOLBAR, MainWindowToolbar->Visible()); MainWindow->checkMenu(IDM_SHOWTOOLBAR, MainWindowToolbar->Visible());
@ -3814,8 +3837,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case 270: cwid = IDC_ROTATE0; ccwid = IDC_ROTATE180; break; case 270: cwid = IDC_ROTATE0; ccwid = IDC_ROTATE180; break;
} }
MainWindowToolbar->AppendButton(cwid, IDB_ROTATECW, rotstate, false);
MainWindowToolbar->AppendButton(ccwid, IDB_ROTATECCW, rotstate, false); MainWindowToolbar->AppendButton(ccwid, IDB_ROTATECCW, rotstate, false);
MainWindowToolbar->AppendButton(cwid, IDB_ROTATECW, rotstate, false);
bool showtb = GetPrivateProfileBool("Display", "Show Toolbar", true, IniName); bool showtb = GetPrivateProfileBool("Display", "Show Toolbar", true, IniName);
MainWindowToolbar->Show(showtb); MainWindowToolbar->Show(showtb);
@ -4110,6 +4133,10 @@ DOKEYDOWN:
int yfudge = (fsheight-fakeheight)/2; int yfudge = (fsheight-fakeheight)/2;
OffsetRect(&FullScreenRect,xfudge,yfudge); OffsetRect(&FullScreenRect,xfudge,yfudge);
} }
else if(wParam==SIZE_RESTORED)
{
FixAspectRatio();
}
UpdateWndRects(hwnd); UpdateWndRects(hwnd);
MainWindowToolbar->OnSize(); MainWindowToolbar->OnSize();
@ -4304,7 +4331,7 @@ DOKEYDOWN:
else if(wParam == recentRoms_clearid) else if(wParam == recentRoms_clearid)
{ {
/* Clear all the recent ROMs */ /* Clear all the recent ROMs */
if(IDOK == MessageBox(hwnd, "Are you sure you want to clear the recent ROMs list?", "DeSmuME", MB_OKCANCEL | MB_ICONQUESTION)) if(IDYES == MessageBox(hwnd, "Are you sure you want to clear the recent ROMs list?", "DeSmuME", MB_YESNO | MB_ICONQUESTION))
ClearRecentRoms(); ClearRecentRoms();
return 0; return 0;
} }
@ -5205,32 +5232,32 @@ DOKEYDOWN:
case IDC_WINDOW1_5X: case IDC_WINDOW1_5X:
windowSize=kScale1point5x; windowSize=kScale1point5x;
ScaleScreen(windowSize); ScaleScreen(windowSize, true);
WritePrivateProfileInt("Video","Window Size",windowSize,IniName); WritePrivateProfileInt("Video","Window Size",windowSize,IniName);
break; break;
case IDC_WINDOW2_5X: case IDC_WINDOW2_5X:
windowSize=kScale2point5x; windowSize=kScale2point5x;
ScaleScreen(windowSize); ScaleScreen(windowSize, true);
WritePrivateProfileInt("Video","Window Size",windowSize,IniName); WritePrivateProfileInt("Video","Window Size",windowSize,IniName);
break; break;
case IDC_WINDOW1X: case IDC_WINDOW1X:
windowSize=1; windowSize=1;
ScaleScreen(windowSize); ScaleScreen(windowSize, true);
WritePrivateProfileInt("Video","Window Size",windowSize,IniName); WritePrivateProfileInt("Video","Window Size",windowSize,IniName);
break; break;
case IDC_WINDOW2X: case IDC_WINDOW2X:
windowSize=2; windowSize=2;
ScaleScreen(windowSize); ScaleScreen(windowSize, true);
WritePrivateProfileInt("Video","Window Size",windowSize,IniName); WritePrivateProfileInt("Video","Window Size",windowSize,IniName);
break; break;
case IDC_WINDOW3X: case IDC_WINDOW3X:
windowSize=3; windowSize=3;
ScaleScreen(windowSize); ScaleScreen(windowSize, true);
WritePrivateProfileInt("Video","Window Size",windowSize,IniName); WritePrivateProfileInt("Video","Window Size",windowSize,IniName);
break; break;
case IDC_WINDOW4X: case IDC_WINDOW4X:
windowSize=4; windowSize=4;
ScaleScreen(windowSize); ScaleScreen(windowSize, true);
WritePrivateProfileInt("Video","Window Size",windowSize,IniName); WritePrivateProfileInt("Video","Window Size",windowSize,IniName);
break; break;
@ -5250,12 +5277,18 @@ DOKEYDOWN:
case IDM_DEFSIZE: case IDM_DEFSIZE:
{ {
windowSize = 1; windowSize = 1;
ScaleScreen(1); ScaleScreen(1, true);
} }
break; break;
case IDM_LOCKDOWN: case IDM_LOCKDOWN:
{ {
RECT rc;
GetClientRect(hwnd, &rc);
SetStyle(GetStyle()^DWS_LOCKDOWN); SetStyle(GetStyle()^DWS_LOCKDOWN);
MainWindow->setClientSize(rc.right-rc.left, rc.bottom-rc.top);
WritePrivateProfileBool("Video", "Window Lockdown", (GetStyle()&DWS_LOCKDOWN)!=0, IniName); WritePrivateProfileBool("Video", "Window Lockdown", (GetStyle()&DWS_LOCKDOWN)!=0, IniName);
} }
return 0; return 0;
@ -5268,6 +5301,9 @@ DOKEYDOWN:
case IDM_SHOWTOOLBAR: case IDM_SHOWTOOLBAR:
{ {
bool maximized = IsZoomed(hwnd)==TRUE;
if(maximized) ShowWindow(hwnd,SW_NORMAL);
RECT rc; RECT rc;
GetClientRect(hwnd, &rc); rc.top += MainWindowToolbar->GetHeight(); GetClientRect(hwnd, &rc); rc.top += MainWindowToolbar->GetHeight();
@ -5277,6 +5313,8 @@ DOKEYDOWN:
MainWindow->setClientSize(rc.right-rc.left, rc.bottom-rc.top); MainWindow->setClientSize(rc.right-rc.left, rc.bottom-rc.top);
WritePrivateProfileBool("Display", "Show Toolbar", nowvisible, IniName); WritePrivateProfileBool("Display", "Show Toolbar", nowvisible, IniName);
if(maximized) ShowWindow(hwnd,SW_MAXIMIZE);
} }
return 0; return 0;
@ -5955,7 +5993,8 @@ void ResetGame()
if(movieMode != MOVIEMODE_PLAY) if(movieMode != MOVIEMODE_PLAY)
{ {
NDS_Reset(); NDS_Reset();
Unpause(); if(movieMode == MOVIEMODE_INACTIVE)
Unpause();
} }
} }