From 9930ae843604439a0d4b1ef488fe59a9edca6ddd Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 16 Sep 2019 09:32:02 -0700 Subject: [PATCH] Added screen DPI awareness --- BeefLibs/Beefy2D/src/BFWindow.bf | 8 +++++++ BeefySysLib/BFWindow.h | 3 ++- BeefySysLib/BeefySysLib.cpp | 5 +++++ BeefySysLib/platform/win/WinBFApp.h | 1 + IDE/src/IDEApp.bf | 33 ++++++++++++++++++++++++++++- IDE/src/Settings.bf | 5 ++++- 6 files changed, 52 insertions(+), 3 deletions(-) diff --git a/BeefLibs/Beefy2D/src/BFWindow.bf b/BeefLibs/Beefy2D/src/BFWindow.bf index 3dc95c47..4ebef814 100644 --- a/BeefLibs/Beefy2D/src/BFWindow.bf +++ b/BeefLibs/Beefy2D/src/BFWindow.bf @@ -224,6 +224,9 @@ namespace Beefy [StdCall, CLink] static extern void* BFWindow_DeleteMenuItem(void* window, void* item); + [StdCall, CLink] + static extern int BFWindow_GetDPI(void* window); + public static BFWindow GetBFWindow(void* window) { return sWindowDictionary[(int)window]; @@ -555,6 +558,11 @@ namespace Beefy //TODO: REMOVE //Debug.WriteLine("LostFocus {0}", mTitle); } + + public virtual int GetDPI() + { + return BFWindow_GetDPI(mNativeWindow); + } public virtual void KeyChar(char32 theChar) { diff --git a/BeefySysLib/BFWindow.h b/BeefySysLib/BFWindow.h index e8b633cf..5e10e60e 100644 --- a/BeefySysLib/BFWindow.h +++ b/BeefySysLib/BFWindow.h @@ -124,9 +124,10 @@ public: virtual void SetAlpha(float alpha, uint32 destAlphaSrcMask, bool isMouseVisible) = 0; virtual void SetForeground() = 0; virtual void SetNonExclusiveMouseCapture() { mNonExclusiveMouseCapture = true; } - virtual void CaptureMouse() {} + virtual void CaptureMouse() {} virtual bool IsMouseCaptured() { return false; } virtual void LostFocus(BFWindow* newFocus) = 0; + virtual int GetDPI() { return 0; } virtual BFMenu* AddMenuItem(BFMenu* parent, int insertIdx, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) = 0; virtual void ModifyMenuItem(BFMenu* item, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) = 0; diff --git a/BeefySysLib/BeefySysLib.cpp b/BeefySysLib/BeefySysLib.cpp index 4efc696d..8c04112c 100644 --- a/BeefySysLib/BeefySysLib.cpp +++ b/BeefySysLib/BeefySysLib.cpp @@ -381,6 +381,11 @@ BF_EXPORT void BF_CALLTYPE BFWindow_Close(BFWindow* window, int force) window->TryClose(); } +BF_EXPORT int BF_CALLTYPE BFWindow_GetDPI(BFWindow* window) +{ + return window->GetDPI(); +} + /// BF_EXPORT TextureSegment* BF_CALLTYPE Gfx_CreateRenderTarget(int width, int height, int destAlpha) diff --git a/BeefySysLib/platform/win/WinBFApp.h b/BeefySysLib/platform/win/WinBFApp.h index 4a9cac8b..c3984d94 100644 --- a/BeefySysLib/platform/win/WinBFApp.h +++ b/BeefySysLib/platform/win/WinBFApp.h @@ -75,6 +75,7 @@ public: virtual void SetAlpha(float alpha, uint32 destAlphaSrcMask, bool isMouseVisible) override; virtual void CaptureMouse() override; virtual bool IsMouseCaptured() override; + virtual int GetDPI() { return ::GetDpiForWindow(mHWnd); } virtual BFMenu* AddMenuItem(BFMenu* parent, int insertIdx, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) override; virtual void ModifyMenuItem(BFMenu* item, const char* text, const char* hotKey, BFSysBitmap* bitmap, bool enabled, int checkState, bool radioCheck) override; diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 846db4fc..2cb6265b 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -121,6 +121,7 @@ namespace IDE public String mDbgCompileDir ~ delete _; public String mDbgVersionedCompileDir ~ delete _; public DateTime mDbgHighestTime; + public bool mIsFirstRun; //public ToolboxPanel mToolboxPanel; public Monitor mMonitor = new Monitor() ~ delete _; @@ -9596,6 +9597,7 @@ namespace IDE // User setting can affect automated testing, so use default settings mSettings.Load(); mSettings.Apply(); + mIsFirstRun = !mSettings.mLoadedSettings; } DarkTheme aTheme = new DarkTheme(); @@ -9677,11 +9679,29 @@ namespace IDE LoadWorkspace(mVerb); } - if ((mRunningTestScript) || (!LoadWorkspaceUserData())) + bool loadedWorkspaceUserData = false; + + if ((!mRunningTestScript) && (LoadWorkspaceUserData())) + { + loadedWorkspaceUserData = true; + } + else + { CreateDefaultLayout(); + } WorkspaceLoaded(); + if ((mIsFirstRun) && (!loadedWorkspaceUserData)) + { + GetWorkspaceRect(var workX, var workY, var workWidth, var workHeight); + + int32 height = (int32)(workHeight * 0.85f); + int32 width = Math.Min(4 * height / 3, (int32)(workWidth * 0.85f)); + + mRequestedWindowRect = .(workX + (workWidth - width)/2, workY + (workHeight - height)/2, width, height); + } + // { BFWindow.Flags flags = .Border | .ThickFrame | .Resizable | .SysMenu | @@ -9694,6 +9714,17 @@ namespace IDE (int32)mRequestedWindowRect.mY, (int32)mRequestedWindowRect.mWidth, (int32)mRequestedWindowRect.mHeight, flags, mMainFrame); } + + if (mIsFirstRun) + { + // If this is our first time running, set up a scale based on DPI + int dpi = mMainWindow.GetDPI(); + if (dpi >= 120) + { + mSettings.mEditorSettings.mUIScale = 100 * Math.Min(dpi / 96.0f, 4.0f); + } + } + UpdateTitle(); mMainWindow.SetMinimumSize(GS!(480), GS!(360)); mMainWindow.mIsMainWindow = true; diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index 5495725c..f2f02aa3 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -631,6 +631,8 @@ namespace IDE } } + public bool mLoadedSettings; + public CompilerSettings mCompilerSettings = new .() ~ delete _; public EditorSettings mEditorSettings = new .() ~ delete _; public VSSettings mVSSettings = new .() ~ delete _; @@ -712,6 +714,7 @@ namespace IDE if (sd.Load(path) case .Err) return; + mLoadedSettings = true; using (sd.Open("Editor")) mEditorSettings.Deserialize(sd); using (sd.Open("Keys")) @@ -750,7 +753,7 @@ namespace IDE public void Apply() { - gApp.mSettings.mEditorSettings.mUIScale = Math.Clamp(gApp.mSettings.mEditorSettings.mUIScale, 25, 400); + gApp.mSettings.mEditorSettings.mUIScale = Math.Clamp(gApp.mSettings.mEditorSettings.mUIScale, 50, 400); gApp.mSettings.mEditorSettings.mFontSize = Math.Clamp(gApp.mSettings.mEditorSettings.mFontSize, 6.0f, 72.0f); Font.ClearFontNameCache();