From c64d163a48c534914e60ae49c6505e44a93df3a7 Mon Sep 17 00:00:00 2001 From: ndwarshuis Date: Mon, 17 Aug 2020 18:40:43 -0400 Subject: [PATCH] ADD autorandr selector --- app/rofi-autorandr.hs | 73 +++++++++++++++++++++++++++++++++++++++++++ package.yaml | 9 ++++++ 2 files changed, 82 insertions(+) create mode 100644 app/rofi-autorandr.hs diff --git a/app/rofi-autorandr.hs b/app/rofi-autorandr.hs new file mode 100644 index 0000000..158956a --- /dev/null +++ b/app/rofi-autorandr.hs @@ -0,0 +1,73 @@ +-------------------------------------------------------------------------------- +-- | rofi-autorandr - a rofi prompt to select autorandr profiles +-- +-- Simple wrapper to select an autorandr profile. + + +module Main (main) where + +import Control.Monad + +import Data.Maybe + +import Rofi.Command + +import System.Directory +import System.Environment +import System.Exit +import System.FilePath.Posix +import System.Process + +main :: IO () +main = runChecks >> getArgs >>= runPrompt + +-- TOOD not DRY +runChecks :: IO () +runChecks = checkExe "autorandr" >> checkExe "rofi" + +checkExe :: String -> IO () +checkExe cmd = do + res <- findExecutable cmd + unless (isJust res) $ do + putStrLn $ "Could not find executable: " ++ cmd + exitWith $ ExitFailure 1 + +newtype ARClientConf = ARClientConf [String] + +instance RofiConf ARClientConf where + defArgs (ARClientConf a) = a + +runPrompt :: [String] -> IO () +runPrompt a = do + let c = ARClientConf a + profs <- getAutoRandrProfiles + runRofiIO c $ selectAction $ emptyMenu + { groups = [untitledGroup $ toRofiActions [(p, selectProfile p) | p <- profs]] + , prompt = Just "Select Profile" + } + +-- TODO filter profiles based on which xrandr outputs are actually connected +getAutoRandrProfiles :: IO [String] +getAutoRandrProfiles = do + dir <- getAutoRandrDir + contents <- listDirectory dir + filterM (doesDirectoryExist . (dir )) contents + +getAutoRandrDir :: IO String +getAutoRandrDir = do + x <- xdgDir + res <- doesDirectoryExist x + if res then return x else legacyDir + where + xdgDir = do + e <- lookupEnv "XDG_CONFIG_HOME" + case e of + Nothing -> appendToHome "./config/autorandr" + Just p -> return $ p "autorandr" + legacyDir = appendToHome ".autorandr" + appendToHome p = ( p) <$> getHomeDirectory + +selectProfile :: String -> RofiIO ARClientConf () +selectProfile name = do + io $ putStrLn name + io $ void $ spawnProcess "autorandr" ["--change", name] diff --git a/package.yaml b/package.yaml index 4318d21..06121fd 100644 --- a/package.yaml +++ b/package.yaml @@ -50,6 +50,15 @@ library: - Rofi.Command executables: + rofi-autorandr: + main: rofi-autorandr.hs + source-dirs: app + ghc-options: + - -Wall + - -Werror + - -threaded + dependencies: + - rofi-extras rofi-bw: main: rofi-bw.hs source-dirs: app