From c0fe3c4dc6fe09cb0240e07d3ac34a57aeb6ca3f Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 27 Sep 2019 13:01:03 -0700 Subject: [PATCH] Adding awareness of window minimization/maximization --- BeefLibs/Beefy2D/src/BFWindow.bf | 30 ++++++-- BeefySysLib/BFWindow.h | 8 ++- BeefySysLib/BeefySysLib.cpp | 9 ++- BeefySysLib/platform/win/DXRenderDevice.cpp | 10 ++- BeefySysLib/platform/win/WinBFApp.cpp | 78 +++++++++++++++++++-- BeefySysLib/platform/win/WinBFApp.h | 3 +- 6 files changed, 118 insertions(+), 20 deletions(-) diff --git a/BeefLibs/Beefy2D/src/BFWindow.bf b/BeefLibs/Beefy2D/src/BFWindow.bf index 4ebef814..3e9d9d42 100644 --- a/BeefLibs/Beefy2D/src/BFWindow.bf +++ b/BeefLibs/Beefy2D/src/BFWindow.bf @@ -44,7 +44,9 @@ namespace Beefy UseParentMenu = 0x20'0000, CaptureMediaKeys = 0x40'0000, Fullscreen = 0x80'0000, - FakeFocus = 0x0100'0000 + FakeFocus = 0x0100'0000, + ShowMinimized = 0x0200'0000, + ShowMaximized = 0x0400'0000, }; public enum HitTestResult @@ -101,6 +103,13 @@ namespace Beefy #if !STUDIO_CLIENT public class BFWindow : BFWindowBase, INativeWindow { + public enum ShowKind + { + Normal, + Minimized, + Maximized + } + delegate void NativeMovedDelegate(void* window); delegate int32 NativeCloseQueryDelegate(void* window); delegate void NativeClosedDelegate(void* window); @@ -130,6 +139,11 @@ namespace Beefy public int32 mY; public int32 mWindowWidth; public int32 mWindowHeight; + public int32 mNormX; + public int32 mNormY; + public int32 mNormWidth; + public int32 mNormHeight; + public ShowKind mShowKind; public int32 mClientX; public int32 mClientY; public int32 mClientWidth; @@ -185,8 +199,11 @@ namespace Beefy [StdCall, CLink] static extern void BFWindow_GetPosition(void* window, out int32 x, out int32 y, out int32 width, out int32 height, out int32 clientX, out int32 clientY, out int32 clientWidth, out int32 clientHeight); + [StdCall, CLink] + static extern void BFWindow_GetPlacement(void* window, out int32 normX, out int32 normY, out int32 normWidth, out int32 normHeight, out int32 showKind); + [StdCall, CLink] - static extern void BFWindow_Resize(void* window, int32 x, int32 y, int32 width, int32 height); + static extern void BFWindow_Resize(void* window, int32 x, int32 y, int32 width, int32 height, int showKind); [StdCall, CLink] static extern void BFWindow_Close(void* window, int32 force); @@ -425,10 +442,10 @@ namespace Beefy } } - public virtual void Resize(int x, int y, int width, int height) + public virtual void Resize(int x, int y, int width, int height, ShowKind showKind = .Normal) { Debug.Assert(mNativeWindow != null); - BFWindow_Resize(mNativeWindow, (int32)x, (int32)y, (int32)width, (int32)height); + BFWindow_Resize(mNativeWindow, (int32)x, (int32)y, (int32)width, (int32)height, (int32)showKind); } public void SetForeground() @@ -476,6 +493,11 @@ namespace Beefy public virtual void Moved() { BFWindow_GetPosition(mNativeWindow, out mX, out mY, out mWindowWidth, out mWindowHeight, out mClientX, out mClientY, out mClientWidth, out mClientHeight); + + int32 showKind = 0; + BFWindow_GetPlacement(mNativeWindow, out mNormX, out mNormY, out mNormWidth, out mNormHeight, out showKind); + mShowKind = (.)showKind; + mIsDirty = true; } diff --git a/BeefySysLib/BFWindow.h b/BeefySysLib/BFWindow.h index 5e10e60e..7c43c45c 100644 --- a/BeefySysLib/BFWindow.h +++ b/BeefySysLib/BFWindow.h @@ -50,7 +50,10 @@ enum BFWINDOW_USE_PARENT_MENU = 0x200000, BFWINDOW_CAPTURE_MEDIA_KEYS = 0x400000, BFWINDOW_FULLSCREEN = 0x800000, - BFWINDOW_FAKEFOCUS = 0x1000000 + BFWINDOW_FAKEFOCUS = 0x1000000, + BFWINDOW_SHOWMINIMIZED = 0x2000000, + BFWINDOW_SHOWMAXIMIZED = 0x4000000, + }; class RenderWindow; @@ -118,7 +121,8 @@ public: virtual void SetTitle(const char* title) = 0; virtual void SetMinimumSize(int minWidth, int minHeight, bool clientSized) = 0; virtual void GetPosition(int* x, int* y, int* width, int* height, int* clientX, int* clientY, int* clientWidth, int* clientHeight) = 0; - virtual void Resize(int x, int y, int width, int height) = 0; + virtual void GetPlacement(int* normX, int* normY, int* normWidth, int* normHeight, int* showKind) = 0; + virtual void Resize(int x, int y, int width, int height, int showKind) = 0; virtual void SetClientPosition(int x, int y) = 0; virtual void SetMouseVisible(bool isMouseVisible) = 0; virtual void SetAlpha(float alpha, uint32 destAlphaSrcMask, bool isMouseVisible) = 0; diff --git a/BeefySysLib/BeefySysLib.cpp b/BeefySysLib/BeefySysLib.cpp index 7311d35f..328a2240 100644 --- a/BeefySysLib/BeefySysLib.cpp +++ b/BeefySysLib/BeefySysLib.cpp @@ -312,9 +312,14 @@ BF_EXPORT void BF_CALLTYPE BFWindow_GetPosition(BFWindow* window, int* x, int* y window->GetPosition(x, y, width, height, clientX, clientY, clientWidth, clientHeight); } -BF_EXPORT void BF_CALLTYPE BFWindow_Resize(BFWindow* window, int x, int y, int width, int height) +BF_EXPORT void BF_CALLTYPE BFWindow_GetPlacement(BFWindow* window, int* normX, int* normY, int* normWidth, int* normHeight, int* showKind) { - window->Resize(x, y, width, height); + window->GetPlacement(normX, normY, normWidth, normHeight, showKind); +} + +BF_EXPORT void BF_CALLTYPE BFWindow_Resize(BFWindow* window, int x, int y, int width, int height, int showKind) +{ + window->Resize(x, y, width, height, showKind); } BF_EXPORT void BF_CALLTYPE BFWindow_SetForeground(BFWindow* window) diff --git a/BeefySysLib/platform/win/DXRenderDevice.cpp b/BeefySysLib/platform/win/DXRenderDevice.cpp index dad7a3c4..702fd71a 100644 --- a/BeefySysLib/platform/win/DXRenderDevice.cpp +++ b/BeefySysLib/platform/win/DXRenderDevice.cpp @@ -1485,10 +1485,9 @@ Texture* DXRenderDevice::LoadTexture(ImageData* imageData, int flags) desc.MipLevels = 1; desc.ArraySize = 1; desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - desc.SampleDesc.Count = 1; - //desc.Usage = D3D11_USAGE_DYNAMIC; + desc.SampleDesc.Count = 1; desc.Usage = D3D11_USAGE_DEFAULT; - //desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.CPUAccessFlags = 0; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; //OutputDebugStrF("Creating texture\n"); @@ -1535,10 +1534,9 @@ Texture* DXRenderDevice::CreateDynTexture(int width, int height) desc.ArraySize = 1; desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - //desc.Usage = D3D11_USAGE_DYNAMIC; + desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_DEFAULT; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.CPUAccessFlags = 0; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; ID3D11Texture2D* d3DTexture = NULL; diff --git a/BeefySysLib/platform/win/WinBFApp.cpp b/BeefySysLib/platform/win/WinBFApp.cpp index 3afcca0c..801a0f3d 100644 --- a/BeefySysLib/platform/win/WinBFApp.cpp +++ b/BeefySysLib/platform/win/WinBFApp.cpp @@ -168,6 +168,8 @@ WinBFWindow::WinBFWindow(BFWindow* parent, const StringImpl& title, int x, int y if ((windowFlags & BFWINDOW_TOPMOST) && (parent == NULL)) relativeWindow = HWND_TOP; int showFlags = SWP_SHOWWINDOW; +// if (windowFlags & BFWINDOW_SHOWMINIMIZED) +// showFlags = SWP_ mHasFocus = true; mSoftHasFocus = true; if (windowFlags & BFWINDOW_FAKEFOCUS) @@ -186,7 +188,29 @@ WinBFWindow::WinBFWindow(BFWindow* parent, const StringImpl& title, int x, int y mSoftHasFocus = false; } - SetWindowPos(mHWnd, relativeWindow, x, y, width, height, showFlags); + if (windowFlags & (BFWINDOW_SHOWMINIMIZED | BFWINDOW_SHOWMAXIMIZED)) + { + WINDOWPLACEMENT wndPlacement = { sizeof(WINDOWPLACEMENT), 0 }; + ::GetWindowPlacement(mHWnd, &wndPlacement); + + if (windowFlags & BFWINDOW_SHOWMINIMIZED) + wndPlacement.showCmd = SW_SHOWMINIMIZED; + else if (windowFlags & BFWINDOW_SHOWMAXIMIZED) + wndPlacement.showCmd = SW_SHOWMAXIMIZED; + else + wndPlacement.showCmd = SW_SHOWNORMAL; + + wndPlacement.rcNormalPosition.left = x; + wndPlacement.rcNormalPosition.top = y; + wndPlacement.rcNormalPosition.right = x + width; + wndPlacement.rcNormalPosition.bottom = y + height; + ::SetWindowPlacement(mHWnd, &wndPlacement); + } + else + { + SetWindowPos(mHWnd, relativeWindow, x, y, width, height, showFlags); + } + SetTimer(mHWnd, 0, 10, NULL); @@ -1174,10 +1198,10 @@ void WinBFWindow::SetMinimumSize(int minWidth, int minHeight, bool clientSized) void WinBFWindow::GetPosition(int* x, int* y, int* width, int* height, int* clientX, int* clientY, int* clientWidth, int* clientHeight) { RECT windowRect; - GetWindowRect(mHWnd, &windowRect); + ::GetWindowRect(mHWnd, &windowRect); RECT clientRect; - GetClientRect(mHWnd, &clientRect); + ::GetClientRect(mHWnd, &clientRect); if (clientRect.right <= clientRect.left) return; // TODO: return failure? @@ -1195,9 +1219,53 @@ void WinBFWindow::GetPosition(int* x, int* y, int* width, int* height, int* clie *clientY = startPt.y; } -void WinBFWindow::Resize(int x, int y, int width, int height) +void WinBFWindow::GetPlacement(int* normX, int* normY, int* normWidth, int* normHeight, int* showKind) { - ::MoveWindow(mHWnd, x, y, width, height, FALSE); + WINDOWPLACEMENT wndPlacement = { sizeof(WINDOWPLACEMENT), 0 }; + ::GetWindowPlacement(mHWnd, &wndPlacement); + *normX = wndPlacement.rcNormalPosition.left; + *normY = wndPlacement.rcNormalPosition.top; + *normWidth = wndPlacement.rcNormalPosition.right - wndPlacement.rcNormalPosition.left; + *normHeight = wndPlacement.rcNormalPosition.bottom - wndPlacement.rcNormalPosition.top; + switch (wndPlacement.showCmd) + { + case SW_SHOWMINIMIZED: + *showKind = 1; + break; + case SW_SHOWMAXIMIZED: + *showKind = 2; + break; + default: + *showKind = 0; + break; + } +} + +void WinBFWindow::Resize(int x, int y, int width, int height, int showKind) +{ + WINDOWPLACEMENT wndPlacement = { sizeof(WINDOWPLACEMENT), 0 }; + ::GetWindowPlacement(mHWnd, &wndPlacement); + + switch (showKind) + { + case 1: + wndPlacement.showCmd = SW_SHOWMINIMIZED; + break; + case 2: + wndPlacement.showCmd = SW_SHOWMAXIMIZED; + break; + case 3: + wndPlacement.showCmd = SW_SHOWNORMAL; + break; + } + + wndPlacement.rcNormalPosition.left = x; + wndPlacement.rcNormalPosition.top = y; + wndPlacement.rcNormalPosition.right = x + width; + wndPlacement.rcNormalPosition.bottom = y + height; + ::SetWindowPlacement(mHWnd, &wndPlacement); + + //::MoveWindow(mHWnd, x, y, width, height, FALSE); mRenderWindow->Resized(); if (mMovedFunc != NULL) mMovedFunc(this); diff --git a/BeefySysLib/platform/win/WinBFApp.h b/BeefySysLib/platform/win/WinBFApp.h index 8282578a..71087a42 100644 --- a/BeefySysLib/platform/win/WinBFApp.h +++ b/BeefySysLib/platform/win/WinBFApp.h @@ -69,7 +69,8 @@ public: virtual void LostFocus(BFWindow* newFocus) override; virtual void SetMinimumSize(int minWidth, int minHeight, bool clientSized) override; virtual void GetPosition(int* x, int* y, int* width, int* height, int* clientX, int* clientY, int* clientWidth, int* clientHeight) override; - virtual void Resize(int x, int y, int width, int height) override; + virtual void GetPlacement(int* normX, int* normY, int* normWidth, int* normHeight, int* showKind) override; + virtual void Resize(int x, int y, int width, int height, int showKind) override; virtual void SetClientPosition(int x, int y) override; virtual void SetMouseVisible(bool isMouseVisible) override; virtual void SetAlpha(float alpha, uint32 destAlphaSrcMask, bool isMouseVisible) override;