diff --git a/lib/NOM/IO.hs b/lib/NOM/IO.hs index f1692c2..ef55342 100644 --- a/lib/NOM/IO.hs +++ b/lib/NOM/IO.hs @@ -9,14 +9,14 @@ import Data.ByteString.Char8 qualified as ByteString import Data.Text qualified as Text import Data.Time (ZonedTime, getZonedTime) import NOM.Error (NOMError) -import NOM.Print (Config (..)) +import NOM.Print (Config (..), printHelp) import NOM.Print.Table as Table (bold, displayWidth, displayWidthBS, markup, red, truncate) import NOM.State (PrintNameStyle (..), PrintState (..), initPrintState) import NOM.Update.Monad (UpdateMonad, getNow) import Relude import Streamly.Data.Fold qualified as Fold import Streamly.Data.Stream qualified as Stream -import System.Console.ANSI (SGR (Reset), setSGRCode) +import System.Console.ANSI (SGR (Reset), hClearScreen, setSGRCode) import System.Console.ANSI qualified as Terminal import System.Console.Terminal.Size qualified as Terminal.Size import System.IO qualified @@ -252,6 +252,10 @@ processTextStream config parser updater maintenance printerMay finalize initialS printerMay & maybe keepProcessing \(printer, output_handle) -> do linesVar <- newTVarIO 0 let keepProcessingStdin :: IO () + let toggleHelp :: IO () = atomically $ do + print_state <- readTMVar print_state_var + writeTMVar print_state_var $ print_state{printHelp = not print_state.printHelp} + writeTMVar new_user_input () keepProcessingStdin = forever $ do key <- getKey case key of @@ -260,15 +264,25 @@ processTextStream config parser updater maintenance printerMay finalize initialS print_state <- readTMVar print_state_var let print_state_style = if print_state.printName == PrintName then PrintDerivationPath else PrintName writeTMVar print_state_var $ print_state{printName = print_state_style} - writeTMVar input_received () - "?" -> do + writeTMVar new_user_input () + "?" -> toggleHelp + "h" -> toggleHelp + "f" -> do atomically $ do - print_state <- takeTMVar print_state_var - putTMVar print_state_var $ print_state{printHelp = True} - writeTMVar input_received () + print_state <- readTMVar print_state_var + writeTMVar print_state_var $ print_state{freeze = not print_state.freeze} + writeTMVar new_user_input () _ -> pure () writeToScreen :: IO () - writeToScreen = writeStateToScreen (not config.silent) linesVar state_var print_state_var output_builder_var refresh_display_var maintenance printer output_handle + writeToScreen = do + print_state <- atomically $ readTMVar print_state_var + case (print_state.freeze, print_state.printHelp) of + (True, _) -> pure () -- Freezing the output, do not print anything. + (_, True) -> do + hClearScreen output_handle + ByteString.hPut output_handle printHelp + System.IO.hFlush output_handle + _ -> writeStateToScreen (not config.silent) printedLinesVar state_var print_state_var output_builder_var refresh_display_var maintenance printer output_handle keepPrinting :: IO () keepPrinting = forever do runConcurrently diff --git a/lib/NOM/Print.hs b/lib/NOM/Print.hs index 2dac460..dd5134a 100644 --- a/lib/NOM/Print.hs +++ b/lib/NOM/Print.hs @@ -1,4 +1,4 @@ -module NOM.Print (stateToText, showCode, Config (..)) where +module NOM.Print (stateToText, showCode, printHelp, Config (..)) where import Data.Foldable qualified as Unsafe import Data.IntMap.Strict qualified as IntMap @@ -588,3 +588,13 @@ printDuration diff timeDiffSeconds :: Int -> Text timeDiffSeconds = printDuration . fromIntegral + +printHelp :: ByteString +printHelp = + "\n==================\n" + <> "Nix Output Monitor\n" + <> "==================\n" + <> "Hotkeys\n\n" + <> "n: toggle derivation name/derivation path print\n" + <> "f: toggle screen freeze\n" + <> "? or h: toggle help screen\n" diff --git a/lib/NOM/State.hs b/lib/NOM/State.hs index 6906577..28944cc 100644 --- a/lib/NOM/State.hs +++ b/lib/NOM/State.hs @@ -202,6 +202,7 @@ data PrintNameStyle = PrintName | PrintDerivationPath deriving stock (Show, Eq, data PrintState = MkPrintState { printName :: PrintNameStyle , printHelp :: Bool + , freeze :: Bool } deriving stock (Show, Eq, Ord, Generic) @@ -210,6 +211,7 @@ initPrintState = MkPrintState { printName = PrintName , printHelp = False + , freeze = False } data NOMV1State = MkNOMV1State