161 lines
4.0 KiB
Haskell
161 lines
4.0 KiB
Haskell
|
--------------------------------------------------------------------------------
|
||
|
-- | General commands
|
||
|
|
||
|
module XMonad.Internal.Command.Desktop
|
||
|
( myTerm
|
||
|
, runTerm
|
||
|
, runCalc
|
||
|
, runBrowser
|
||
|
, runEditor
|
||
|
, runFileManager
|
||
|
, runTogglePlay
|
||
|
, runPrevTrack
|
||
|
, runNextTrack
|
||
|
, runStopPlay
|
||
|
, runVolumeDown
|
||
|
, runVolumeUp
|
||
|
, runVolumeMute
|
||
|
, runToggleBluetooth
|
||
|
, runIncBacklight
|
||
|
, runDecBacklight
|
||
|
, runMinBacklight
|
||
|
, runMaxBacklight
|
||
|
, runToggleDPMS
|
||
|
, runRestart
|
||
|
, runRecompile
|
||
|
, runAreaCapture
|
||
|
, runScreenCapture
|
||
|
, runDesktopCapture
|
||
|
) where
|
||
|
|
||
|
import Control.Monad (void)
|
||
|
|
||
|
import System.Directory (getHomeDirectory)
|
||
|
|
||
|
import XMonad.Actions.Volume
|
||
|
import XMonad.Core
|
||
|
import XMonad.Internal.DBus.IntelBacklight
|
||
|
import XMonad.Internal.DBus.Screensaver
|
||
|
import XMonad.Internal.Notify
|
||
|
import XMonad.Internal.Shell
|
||
|
import XMonad.Operations
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
-- | Some nice apps
|
||
|
|
||
|
myTerm :: String
|
||
|
myTerm = "urxvt"
|
||
|
|
||
|
runTerm :: X ()
|
||
|
runTerm = spawn myTerm
|
||
|
|
||
|
runCalc :: X ()
|
||
|
runCalc = spawnCmd myTerm ["-e", "R"]
|
||
|
|
||
|
runBrowser :: X ()
|
||
|
runBrowser = spawn "brave"
|
||
|
|
||
|
runEditor :: X ()
|
||
|
runEditor = spawnCmd "emacsclient"
|
||
|
["-c", "-e", "\"(select-frame-set-input-focus (selected-frame))\""]
|
||
|
|
||
|
runFileManager :: X ()
|
||
|
runFileManager = spawn "pcmanfm"
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
-- | Multimedia Commands
|
||
|
|
||
|
myMultimediaCtl :: String
|
||
|
myMultimediaCtl = "playerctl"
|
||
|
|
||
|
runTogglePlay :: X ()
|
||
|
runTogglePlay = spawnCmd myMultimediaCtl ["play-pause"]
|
||
|
|
||
|
runPrevTrack :: X ()
|
||
|
runPrevTrack = spawnCmd myMultimediaCtl ["previous"]
|
||
|
|
||
|
runNextTrack :: X ()
|
||
|
runNextTrack = spawnCmd myMultimediaCtl ["next"]
|
||
|
|
||
|
runStopPlay :: X ()
|
||
|
runStopPlay = spawnCmd myMultimediaCtl ["stop"]
|
||
|
|
||
|
runVolumeDown :: X ()
|
||
|
runVolumeDown = void (lowerVolume 2)
|
||
|
|
||
|
runVolumeUp :: X ()
|
||
|
runVolumeUp = void (raiseVolume 2)
|
||
|
|
||
|
runVolumeMute :: X ()
|
||
|
runVolumeMute = void toggleMute
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
-- | System commands
|
||
|
|
||
|
runToggleBluetooth :: X ()
|
||
|
runToggleBluetooth = spawn
|
||
|
$ "bluetoothctl show | grep -q \"Powered: no\""
|
||
|
#!&& "a=on"
|
||
|
#!|| "a=off"
|
||
|
#!>> fmtCmd "bluetoothctl" ["power", "$a", ">", "/dev/null"]
|
||
|
#!&& fmtNotifyCmd defNoteInfo { body = Just $ Text "bluetooth powered $a" }
|
||
|
|
||
|
runIncBacklight :: X ()
|
||
|
runIncBacklight = io $ void callIncBrightness
|
||
|
|
||
|
runDecBacklight :: X ()
|
||
|
runDecBacklight = io $ void callDecBrightness
|
||
|
|
||
|
runMinBacklight :: X ()
|
||
|
runMinBacklight = io $ void callMinBrightness
|
||
|
|
||
|
runMaxBacklight :: X ()
|
||
|
runMaxBacklight = io $ void callMaxBrightness
|
||
|
|
||
|
runToggleDPMS :: X ()
|
||
|
runToggleDPMS = io $ void callToggle
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
-- | Configuration commands
|
||
|
|
||
|
runRestart :: X ()
|
||
|
runRestart = restart "xmonad" True
|
||
|
|
||
|
runRecompile :: X ()
|
||
|
runRecompile = do
|
||
|
-- assume that the conf directory contains a valid stack project
|
||
|
-- TODO this is hacky AF
|
||
|
confDir <- getXMonadDir
|
||
|
spawn $ cmd confDir
|
||
|
where
|
||
|
cmd c = fmtCmd "cd" [c]
|
||
|
#!&& fmtCmd "stack" ["install", ":xmonad"]
|
||
|
#!&& fmtNotifyCmd defNoteInfo { body = Just $ Text "compilation succeeded" }
|
||
|
#!|| fmtNotifyCmd defNoteError { body = Just $ Text "compilation failed" }
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
-- | Screen capture commands
|
||
|
|
||
|
getScreenshotDir :: IO FilePath
|
||
|
getScreenshotDir = do
|
||
|
h <- getHomeDirectory
|
||
|
return $ h ++ "/Pictures/screenshots"
|
||
|
|
||
|
runFlameshot :: String -> X ()
|
||
|
runFlameshot mode = do
|
||
|
ssDir <- io getScreenshotDir
|
||
|
spawnCmd "flameshot" $ mode : ["-p", ssDir]
|
||
|
|
||
|
-- TODO this will steal focus from the current window (and puts it
|
||
|
-- in the root window?) ...need to fix
|
||
|
runAreaCapture :: X ()
|
||
|
runAreaCapture = runFlameshot "gui"
|
||
|
|
||
|
-- myWindowCap = "screencap -w" --external script
|
||
|
|
||
|
runScreenCapture :: X ()
|
||
|
runScreenCapture = runFlameshot "screen"
|
||
|
|
||
|
runDesktopCapture :: X ()
|
||
|
runDesktopCapture = runFlameshot "full"
|