diff --git a/daemon/app/ghc-specter-daemon/Render.hs b/daemon/app/ghc-specter-daemon/Render.hs index 320355e4..bf282973 100644 --- a/daemon/app/ghc-specter-daemon/Render.hs +++ b/daemon/app/ghc-specter-daemon/Render.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE ForeignFunctionInterface #-} {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} @@ -16,6 +17,7 @@ import Control.Monad.IO.Class (MonadIO (..)) import Control.Monad.Trans.Reader (ReaderT (runReaderT)) import Data.Maybe (isNothing) import Foreign.C.String (CString, withCString) +import Foreign.C.Types (CFloat (..)) import Foreign.Marshal.Alloc (callocBytes, free) import Foreign.Marshal.Utils (toBool) import Foreign.Ptr (nullPtr) @@ -45,7 +47,8 @@ import ImGui.Enum ImGuiMouseButton_ (..), ) import ImGui.ImGuiIO.Implementation - ( imGuiIO_Fonts_get, + ( imGuiIO_FontGlobalScale_set, + imGuiIO_Fonts_get, imGuiIO_MouseWheelH_get, imGuiIO_MouseWheel_get, ) @@ -71,6 +74,14 @@ import Util.GUI ) import Util.Render (SharedState (..)) +#ifdef __MACOS__ +foreign import ccall unsafe "detectScaleFactor" + c_detectScaleFactor :: IO CFloat +#else +c_detectScaleFactor :: IO CFloat +c_detectScaleFactor = pure 1.0 +#endif + singleFrame :: ImGuiIO -> GLFWwindow -> @@ -183,16 +194,17 @@ prepareAssets io = do let free_sans_path = dir "assets" "FreeSans.ttf" free_mono_path = dir "assets" "FreeMono.ttf" fonts <- imGuiIO_Fonts_get io - -- _fontDefault <- imFontAtlas_AddFontDefault fonts + scale <- c_detectScaleFactor _fontDefault <- withCString free_sans_path $ \cstr -> do - imFontAtlas_AddFontFromFileTTF fonts cstr (8 * 2.0) + imFontAtlas_AddFontFromFileTTF fonts cstr (13 * scale) + imGuiIO_FontGlobalScale_set io (1.0 / scale) fontSans <- withCString free_sans_path $ \cstr -> do - imFontAtlas_AddFontFromFileTTF fonts cstr 8 + imFontAtlas_AddFontFromFileTTF fonts cstr (8 * scale) fontMono <- withCString free_mono_path $ \cstr -> - imFontAtlas_AddFontFromFileTTF fonts cstr 8 + imFontAtlas_AddFontFromFileTTF fonts cstr (8 * scale) pure (fontSans, fontMono) main :: diff --git a/daemon/app/ghc-specter-daemon/cbits/shim.mm b/daemon/app/ghc-specter-daemon/cbits/shim.mm new file mode 100644 index 00000000..e17f8435 --- /dev/null +++ b/daemon/app/ghc-specter-daemon/cbits/shim.mm @@ -0,0 +1,16 @@ +#ifdef __MACOS__ +#include +#endif + +extern "C" { + +float detectScaleFactor( void ) { +#ifdef __MACOS__ + return NSScreen.mainScreen.backingScaleFactor; +#else + return 1.0; +#endif +} + +} + diff --git a/daemon/ghc-specter-daemon.cabal b/daemon/ghc-specter-daemon.cabal index 373f3134..16f14dfc 100644 --- a/daemon/ghc-specter-daemon.cabal +++ b/daemon/ghc-specter-daemon.cabal @@ -74,6 +74,12 @@ library Paths_ghc_specter_daemon hs-source-dirs: src + if os(darwin) + cpp-options: -D__MACOS__ + cxx-options: -D__MACOS__ + frameworks: Cocoa + cxx-sources: + app/ghc-specter-daemon/cbits/shim.mm ghc-options: -Wall -Wunused-packages -Werror build-depends: OGDF diff --git a/flake.lock b/flake.lock index e8da2036..330d2a47 100644 --- a/flake.lock +++ b/flake.lock @@ -55,11 +55,11 @@ ] }, "locked": { - "lastModified": 1695331086, - "narHash": "sha256-tHps+Do0dVSy6GCfzw2nGGhWCk8UmRBEJRSSbPsb4WQ=", + "lastModified": 1695336243, + "narHash": "sha256-79bMDRIk3JWVVdyTiNbtZBhTxWV4by/7jdKSLTJ7Ve0=", "owner": "wavewave", "repo": "hs-imgui", - "rev": "f2789f947bf9005f4bc02eaeb50ad4c1b1b810c8", + "rev": "a094d233cbecd4f25fb70ab651c9735f4d4dedae", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 6b51d978..729a9c35 100644 --- a/flake.nix +++ b/flake.nix @@ -62,7 +62,12 @@ "ghc-specter-plugin" = hself.callCabal2nix "ghc-specter-plugin" ./plugin {}; "ghc-specter-daemon" = - hself.callCabal2nix "ghc-specter-daemon" ./daemon {}; + final.haskell.lib.overrideCabal + (hself.callCabal2nix "ghc-specter-daemon" ./daemon {}) + (old: { + libraryFrameworkDepends = + final.lib.optional pkgs.stdenv.isDarwin final.darwin.apple_sdk.frameworks.Cocoa; + }); "ghc-build-analyzer" = hself.callCabal2nix "ghc-build-analyzer" ./ghc-build-analyzer {}; }; @@ -116,7 +121,8 @@ pkgs.ormolu pyenv ] - ++ (pkgs.lib.optional (pkgs.stdenv.isLinux && !pkgs.lib.inPureEvalMode) nixGL.packages.${system}.default); + ++ (pkgs.lib.optional (pkgs.stdenv.isLinux && !pkgs.lib.inPureEvalMode) nixGL.packages.${system}.default) + ++ (pkgs.lib.optionals (pkgs.stdenv.isDarwin) [pkgs.darwin.apple_sdk.frameworks.Cocoa]); shellHook = '' export PS1="\n[${prompt}:\w]$ \0" '';