packages feed

movie-monad-0.0.2.0: src/ScreensaverAndPowerManagement.hs

{-
  Movie Monad
  (C) 2017 David lettier
  lettier.com
-}

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

module ScreensaverAndPowerManagement where

import System.Process
import Control.Monad
import Data.Text

import qualified Records as R (ScreensaverAndPowerManagementActions(..))
import Utils (safeRunProcessGetOutput, linuxProcessIsRunning, spawnLinuxProcessAndDisown)

disable :: String -> IO R.ScreensaverAndPowerManagementActions
disable "linux" = do
  disabledPowerManagement <- disablePowerManagement
  disabledXScreensaver <- disableXScreensaver
  disabledCinnamonScreensaver <- disableCinnamonScreensaver
  disabledGnomeScreensaver <- disableGnomeScreensaver
  return R.ScreensaverAndPowerManagementActions {
        R.disabledPowerManagement = disabledPowerManagement
      , R.disabledXScreensaver = disabledXScreensaver
      , R.disabledCinnamonScreensaver = disabledCinnamonScreensaver
      , R.disabledGnomeScreensaver = disabledGnomeScreensaver
    }
disable _ =
  return R.ScreensaverAndPowerManagementActions {
        R.disabledPowerManagement = False
      , R.disabledXScreensaver = False
      , R.disabledCinnamonScreensaver = False
      , R.disabledGnomeScreensaver = False
    }

enable :: String -> R.ScreensaverAndPowerManagementActions -> IO ()
enable
  "linux"
  R.ScreensaverAndPowerManagementActions {
        R.disabledPowerManagement = disabledPowerManagement
      , R.disabledXScreensaver = disabledXScreensaver
      , R.disabledCinnamonScreensaver = disabledCinnamonScreensaver
      , R.disabledGnomeScreensaver = disabledGnomeScreensaver
    }
  = do
  when disabledPowerManagement enablePowerManagement
  when disabledXScreensaver enableXScreensaver
  when disabledCinnamonScreensaver enableCinnamonScreensaver
  when disabledGnomeScreensaver enableGnomeScreensaver
  return ()
enable _ _ = return ()

disablePowerManagement :: IO Bool
disablePowerManagement = do
  (_, out, _) <- safeRunProcessGetOutput "xset" ["-q"]
  let isEnabled =
        Data.Text.isInfixOf "dpms is enabled" $
          Data.Text.toLower $
            Data.Text.pack out
  if isEnabled
    then do
      _ <- System.Process.spawnCommand "sleep 1; xset -dpms s off"
      return True
    else return False

enablePowerManagement :: IO ()
enablePowerManagement =
  void $
    System.Process.spawnCommand "sleep 1; xset +dpms s on"

disableXScreensaver :: IO Bool
disableXScreensaver =
  disableScreensaver
    "xscreensaver"
    "xscreensaver-command --exit"

enableXScreensaver :: IO ()
enableXScreensaver = spawnLinuxProcessAndDisown "xscreensaver -no-splash"

disableCinnamonScreensaver :: IO Bool
disableCinnamonScreensaver =
  disableScreensaver
    "cinnamon-screensaver"
    "cinnamon-screensaver-command --exit"

enableCinnamonScreensaver :: IO ()
enableCinnamonScreensaver = spawnLinuxProcessAndDisown "cinnamon-screensaver"

disableGnomeScreensaver :: IO Bool
disableGnomeScreensaver =
  disableScreensaver
    "gnome-screensaver"
    "gnome-screensaver-command --exit"

enableGnomeScreensaver :: IO ()
enableGnomeScreensaver = spawnLinuxProcessAndDisown "gnome-screensaver"

disableScreensaver :: String -> String -> IO Bool
disableScreensaver processName disableCommand = do
  isRunning <- linuxProcessIsRunning processName
  if isRunning
    then do
      spawnLinuxProcessAndDisown disableCommand
      return True
    else return False