{-# LANGUAGE DeriveDataTypeable #-} import XMonad import qualified XMonad.Config import XMonad.Config.Gnome import XMonad.Actions.DynamicWorkspaces import XMonad.Prompt import XMonad.Prompt.Shell import XMonad.Prompt.XMonad import XMonad.Util.Run import qualified XMonad.Layout import qualified XMonad.Util.EZConfig as EZ import qualified XMonad.StackSet as W import XMonad.Actions.CycleWS import qualified XMonad.Actions.DynamicWorkspaceOrder as DO import XMonad.Hooks.EwmhDesktops import System.Taffybar.Hooks.PagerHints (pagerHints) import XMonad.Layout.Grid import XMonad.Layout.Minimize import XMonad.Layout.NoBorders import XMonad.Layout.PerWorkspace import XMonad.Layout.MultiToggle import XMonad.Layout.MultiToggle.Instances import XMonad.Actions.WindowGo import Control.Monad (liftM2) import XMonad.Hooks.ManageHelpers import XMonad.Hooks.ManageDocks (avoidStruts) import XMonad.Util.ExtensibleState as XS import XMonad.Layout.IndependentScreens (countScreens) import XMonad.Hooks.SetWMName launchInSpeshulTerminal :: String -> String -> X () launchInSpeshulTerminal roleTitle cmd = do safeSpawn "mate-terminal" [ "--role" , roleTitle , "--title" , roleTitle , "-e" , cmd ] launchSpeshulUnlessPresent :: String -> String -> X () launchSpeshulUnlessPresent roleTitle cmd = do raiseMaybe (launchInSpeshulTerminal roleTitle cmd) (title =? roleTitle) launchOrRaiseEmail :: X () launchOrRaiseEmail = do launchSpeshulUnlessPresent "OfflineIMAP" "offlineimap" launchSpeshulUnlessPresent "Mutt" "mutt" myManageHook = composeAll [ title =? "OfflineIMAP" --> doShift "mail" , title =? "Mutt" --> viewShift "mail" , className =? "Steam" --> doFloat , className =? "steam" --> doFullFloat , isFullscreen --> doFullFloat ] where viewShift = doF . liftM2 (.) W.greedyView W.shift data ScreenTracker = ScreenTracker { stScreenCount :: Int } deriving (Typeable, Read, Show) instance ExtensionClass ScreenTracker where initialValue = ScreenTracker { stScreenCount = 0 } extensionType = PersistentExtension myScreenChangeHook :: X () myScreenChangeHook = do liftIO $ putStrLn "Examining screen count..." st <- XS.get let count = stScreenCount st nowCount <- countScreens if count == nowCount then liftIO $ putStrLn "No change" else do XS.put $ st { stScreenCount = nowCount } liftIO $ putStrLn $ "Changed from " ++ (show count) ++ " to " ++ (show nowCount) if (nowCount > 1) then safeSpawn "mate-display-properties" [] else liftIO $ putStrLn "Not doing anything, nowCount < 2" liftIO $ putStrLn "Screen count examined." myEventHandler :: (Event -> X a) -> Event -> X a myEventHandler h e@(ConfigureEvent {ev_window = w}) = (whenX (isRoot w) myScreenChangeHook) >> h e myEventHandler h e = h e myPromptConfig :: XPConfig myPromptConfig = def { font = "xft:Inconsolata Medium-8" , height = 40 } mainLayout = layoutHook XMonad.Config.def myLayoutHook = smartBorders . minimize . mkToggle (single FULL) $ perWS where perWS = onWorkspace "mail" (avoidStruts XMonad.Layout.Full) $ onWorkspace "vms" (avoidStruts griddy) $ (layoutHook gnomeConfig) griddy = Grid ||| mainLayout main :: IO () main = do xmonad $ ewmh $ pagerHints $ gnomeConfig { modMask = mod4Mask , manageHook = myManageHook <+> manageHook gnomeConfig , workspaces = defaultWorkSpaces , handleEventHook = myEventHandler fullscreenEventHook , layoutHook = myLayoutHook , startupHook = startupHook gnomeConfig >> setWMName "LG3D" , focusedBorderColor = "#FFA500" } `EZ.additionalKeysP` [ -- General keys ("M-x", spawn "mate-terminal") , ("M-M1-C-m", launchOrRaiseEmail) , ("M-M1-C-d", safeSpawn "mate-control-center" ["display"]) , ("M1-", shellPrompt myPromptConfig) -- Screens, Workspaces and Windows , ("M1-C-", DO.moveTo Prev HiddenWS) , ("M1-C-", DO.moveTo Next HiddenWS) , ("", DO.moveTo Prev HiddenWS) , ("", DO.moveTo Next HiddenWS) , ("M1-C-S-", DO.shiftTo Prev HiddenWS >> DO.moveTo Prev HiddenWS) , ("M1-C-S-", DO.shiftTo Next HiddenWS >> DO.moveTo Next HiddenWS) , ("M1-C-", prevScreen) , ("M1-C-", nextScreen) , ("M1-C-S-", shiftPrevScreen >> prevScreen) , ("M1-C-S-", shiftNextScreen >> nextScreen) , ("M-", windows W.focusDown) , ("M-S-", windows W.focusUp) , ("M1-", kill) , ("M-", sendMessage $ Toggle FULL) , ("M-S-t", withFocused $ windows . W.sink) , ("M-z", withFocused minimizeWindow) , ("M-S-z", sendMessage RestoreNextMinimizedWin) -- Workspace management , ("M-t", addWorkspacePrompt myPromptConfig) , ("M-r", renameWorkspace myPromptConfig) , ("M-w", removeEmptyWorkspace) , ("M-C-M1-", DO.swapWith Prev HiddenWS) , ("M-C-M1-", DO.swapWith Next HiddenWS) -- Management keys , ("M-", xmonadPrompt myPromptConfig) , ("M-S-r", spawn "if type xmonad; then xmonad --recompile && xmonad --restart; else xmessage xmonad not in \\$PATH: \"$PATH\"; fi") , ("M-C-M1-s", spawn "/home/dsilvers/bin/dmenu_shutdown") , ("M1-C-l", spawn "mate-screensaver-command --lock") ] `EZ.additionalKeys` extraKeyMappings mod4Mask defaultWorkSpaces :: [String] defaultWorkSpaces = ["mail", "irc", "www", "emacs", "term"] extraKeyMappings :: ButtonMask -> [((ButtonMask, KeySym), X ())] extraKeyMappings modm = [ ((modm, xK_Menu), spawn "/home/danielsilverstone/bin/dmenu_shutdown") ]