From a2ee354d77363ce469e748dd1073e05201aa75aa Mon Sep 17 00:00:00 2001 From: bloeys Date: Sat, 4 Feb 2023 04:42:38 +0400 Subject: [PATCH] Windows DPI awareness --- .winres/icon.png | Bin 0 -> 5533 bytes .winres/winres.json | 54 ++++++++++++++++++++++++++++++++++++++++ README.md | 22 +++++++++++++++- main.go | 42 ++++++++++++++++++++++++++++++- rsrc_windows_386.syso | Bin 0 -> 9474 bytes rsrc_windows_amd64.syso | Bin 0 -> 9474 bytes 6 files changed, 116 insertions(+), 2 deletions(-) create mode 100755 .winres/icon.png create mode 100755 .winres/winres.json create mode 100755 rsrc_windows_386.syso create mode 100755 rsrc_windows_amd64.syso diff --git a/.winres/icon.png b/.winres/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..b30990824cc9cc05ba785b000a8e4ff8076c363d GIT binary patch literal 5533 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 G{C@!AvSlm) literal 0 HcmV?d00001 diff --git a/.winres/winres.json b/.winres/winres.json new file mode 100755 index 0000000..d2b244d --- /dev/null +++ b/.winres/winres.json @@ -0,0 +1,54 @@ +{ + "RT_GROUP_ICON": { + "APP": { + "0000": [ + "icon.png" + ] + } + }, + "RT_MANIFEST": { + "#1": { + "0409": { + "identity": {}, + "description": "", + "minimum-os": "win7", + "execution-level": "", + "ui-access": false, + "auto-elevate": false, + "dpi-aware": "true/pm", + "dpi-awareness": "per monitor v2", + "disable-theming": false, + "disable-window-filtering": false, + "high-resolution-scrolling-aware": false, + "ultra-high-resolution-scrolling-aware": false, + "long-path-aware": false, + "printer-driver-isolation": false, + "gdi-scaling": false, + "segment-heap": false, + "use-common-controls-v6": true + } + } + }, + "RT_VERSION": { + "#1": { + "0000": { + "info": { + "0409": { + "Comments": "", + "CompanyName": "", + "FileDescription": "", + "FileVersion": "", + "InternalName": "", + "LegalCopyright": "", + "LegalTrademarks": "", + "OriginalFilename": "", + "PrivateBuild": "", + "ProductName": "", + "ProductVersion": "", + "SpecialBuild": "" + } + } + } + } + } +} \ No newline at end of file diff --git a/README.md b/README.md index eeafe91..5f4c431 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ -# nterm \ No newline at end of file +# nTerm + +## Developer Notes + +To build without a CLI showing on Windows build with: `go build -ldflags -H=windowsgui .`. + +### OS Manifests + +To ensure we get proper configuration on each OS, we sometimes need extra files that are part of the compilation. +This ensures we do get things like icons and proper DPI awareness (which is important for crisp text). + +Those manifests are turned into files (e.g. `*.syso`) that get detected and used by `go build` automatically. + +#### Windows + +The Windows manifest and icon are placed inside the `.winres` folder, which gets compiled into the required +`*.syso` files by running `go-winres make --in ./.winres/winres.json`. + +`go-winres` can be installed using `go install github.com/tc-hib/go-winres@latest`. + +**Note:** Any changes to things in `.winres` requires re-running the `go-winres` command and then recompiling the Go program. diff --git a/main.go b/main.go index 6a21a0b..0190dac 100755 --- a/main.go +++ b/main.go @@ -115,6 +115,9 @@ const ( // How many lines to move per scroll defaultScrollSpd = 1 + + unscaledWindowWidth = 1280 + unscaledWindowHeight = 720 ) var ( @@ -137,8 +140,11 @@ func main() { panic("Failed to init engine. Err: " + err.Error()) } + // This scaling lets us respect the user's request for zoomed-in programs + dpiScaling := getDpiScaling() + rend := rend3dgl.NewRend3DGL() - win, err := engine.CreateOpenGLWindowCentered("nTerm", 1280, 720, engine.WindowFlags_ALLOW_HIGHDPI|engine.WindowFlags_RESIZABLE, rend) + win, err := engine.CreateOpenGLWindowCentered("nTerm", int32(unscaledWindowWidth*dpiScaling), int32(unscaledWindowHeight*dpiScaling), engine.WindowFlags_ALLOW_HIGHDPI|engine.WindowFlags_RESIZABLE, rend) if err != nil { panic("Failed to create window. Err: " + err.Error()) } @@ -197,6 +203,40 @@ func main() { } } +func getDpiScaling() float32 { + + // Great read on DPI here: https://nlguillemot.wordpress.com/2016/12/11/high-dpi-rendering/ + + // The no-scaling DPI on different platforms (e.g. when scale=100% on windows) + var defaultDpi float32 = 96 + if runtime.GOOS == "windows" { + defaultDpi = 96 + } else if runtime.GOOS == "darwin" { + defaultDpi = 72 + } + + // Current DPI of the monitor + _, dpiHorizontal, _, err := sdl.GetDisplayDPI(0) + if err != nil { + dpiHorizontal = defaultDpi + fmt.Printf("Failed to get DPI with error '%s'. Using default DPI of '%f'\n", err.Error(), defaultDpi) + } + + // Scaling factor (e.g. will be 1.25 for 125% scaling on windows) + dpiScaling := dpiHorizontal / defaultDpi + + fmt.Printf( + "Default DPI=%f\nHorizontal DPI=%f\nDPI scaling=%f\nUnscaled window size (width, height)=(%d, %d)\nScaled window size (width, height)=(%d, %d)\n\n", + defaultDpi, + dpiHorizontal, + dpiScaling, + unscaledWindowWidth, unscaledWindowHeight, + int32(unscaledWindowWidth*dpiScaling), int32(unscaledWindowHeight*dpiScaling), + ) + + return dpiScaling +} + func (nt *nterm) handleSDLEvent(e sdl.Event) { switch e := e.(type) { diff --git a/rsrc_windows_386.syso b/rsrc_windows_386.syso new file mode 100755 index 0000000000000000000000000000000000000000..04296cf6193f871fb9bb518859e9eabd9924610e GIT binary patch literal 9474 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 literal 0 HcmV?d00001 diff --git a/rsrc_windows_amd64.syso b/rsrc_windows_amd64.syso new file mode 100755 index 0000000000000000000000000000000000000000..40cef853d9f91675fad6a90a5c8891aec0ebf518 GIT binary patch literal 9474 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 literal 0 HcmV?d00001