import XMonad
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.EwmhDesktops
import XMonad.Util.Run(spawnPipe)
import XMonad.Util.EZConfig
import XMonad.Layout.NoBorders
import XMonad.Config.Gnome
import System.IO
import XMonad.Actions.CycleWS
import XMonad.Layout.IM
import XMonad.Layout.PerWorkspace
import XMonad.Layout.Reflect
import XMonad.Util.Scratchpad
import qualified XMonad.StackSet as W
import XMonad.Layout.Circle
import XMonad.Layout.DecorationMadness
import XMonad.Layout.HintedGrid
import XMonad.Layout.LayoutScreens
import XMonad.Layout.ComboP
import XMonad.Layout.Named
import XMonad.Layout.TwoPane
import XMonad.Layout.WindowNavigation -- directionally
import XMonad.Layout.MultiToggle -- (14) apply layout modifiers dynamically
import XMonad.Layout.MultiToggle.Instances
-- (15) ability to magnify the focused
import XMonad.Layout.ToggleLayouts
import XMonad.Layout.Tabbed
import XMonad.Layout.Accordion
import XMonad.Hooks.SetWMName
import qualified XMonad.Layout.Grid as G
import XMonad.Prompt
import XMonad.Prompt.Shell
import XMonad.Hooks.UrgencyHook
import XMonad.Hooks.ManageHelpers
import Data.List
import Data.Ratio
modm = mod4Mask -- win key for mod
myManageHook :: ManageHook
myManageHook = composeAll
[ className =? "MPlayer" --> doFloat
, className =? "Gitk" --> doFloat
, className =? "Emacs" --> doShift "2:emacs"
, className =? "Epiphany" --> doShift "3:web"
, className =? "Chrome" --> doShift "3:web"
, className =? "Firefox" --> doShift "3:web"
, className =? "Pidgin" --> doShift "4:im"
, className =? "Skype" --> doShift "4:im"
, className =? "Quodlibet" --> doShift "5:audio"
, className =? "Deluge" --> doShift "6:torrent"
, className =? "Gimp" --> doShift "7:gimp"
, className =? "Paman" --> doFloat
, className =? "Pavucontrol" --> doFloat
, className =? "Xmessage" --> doFloat
, className =? "Do" --> doIgnore
, isDialog --> doCenterFloat
, isFullscreen --> doFullFloat
, resource =? "desktop_window" --> doIgnore
, resource =? "kdesktop" --> doIgnore
, scratchpadManageHook (W.RationalRect 0.25 0.2 0.5 0.5) ]
-- shell prompt theme
mySP = defaultXPConfig
{ font = "xft:DejaVu Sans Mono:pixelsize=10"
, bgColor = "#000000"
, fgColor = "#f8f8f8"
, fgHLight = "#f8f8f8"
, bgHLight = "steelblue3"
, borderColor = "Red"
, promptBorderWidth = 1
, position = Top
, height = 20
, defaultText = []
}
-- | Strip xmobar markup. Useful to remove ppHidden color from ppUrgent
-- field. For example:
--
-- > , ppHidden = xmobarColor "gray20" "" . wrap "<" ">"
-- > , ppUrgent = xmobarColor "dark orange" "" . xmobarStrip
xmobarStrip :: String -> String
xmobarStrip = strip [] where
strip keep x
| null x = keep
| "') $ x)
| "" `isPrefixOf` x = strip keep (drop 5 x)
| '<' == head x = strip (keep ++ "<") (tail x)
| otherwise = let (good,x') = span (/= '<') x
in strip (keep ++ good) x'
myLayouts = (layoutHook gnomeConfig ||| G.Grid)
-- Grid True ||| Grid False; Meh, not that great
myLayout = toggle $ navkey $ tiled
||| Mirror tiled
||| Accordion
||| twoPane
where
-- default tiling algorithm partitions the screen into two panes
tiled = Tall nmaster delta ratio
twoPane = named "2P" $ TwoPane (3/100) (1/2)
full = named "F" $ noBorders Full
im = named "I" $ IM (2%7) (Title "Buddy List")
split x = combineTwoP (TwoPane 0.03 x)
-- The default number of windows in the master pane
nmaster = 1
-- Default proportion of screen occupied by master pane
ratio = 1/2
-- Percent of screen to increment by when resizing panes
delta = 3/100
-- hooks for navigation and full-screen keys
toggle = toggleLayouts (noBorders Full)
navkey = configurableNavigation (navigateColor "#111111")
usualL l = smartBorders $ avoidStruts $ l
gimpL = usualL $ withIM (0.11) (Role "gimp-toolbox") $ reflectHoriz $ withIM (0.15) (Role "gimp-dock") myLayouts
imL = usualL $ withIM (1%7) skype $ reflectHoriz $ withIM (1%7) pidgin myLayouts
where
pidgin = And (ClassName "Pidgin") (Role "buddy_list")
skype = (ClassName "Skype") `And` (Not (Title "Options")) `And` (Not (Role "Chats")) `And` (Not (Role "CallWindowForm"))
main = do
-- xmproc <- spawnPipe "xmobar ~/.xmobarrc"
-- dzen <- spawnPipe "dzen2"
xmonad $ withUrgencyHook NoUrgencyHook gnomeConfig {
modMask = mod4Mask
, workspaces = ["1:terminals", "2:emacs", "3:web", "4:im", "5:audio", "6:torrent", "7:gimp","8","9"]
, logHook = (dynamicLogWithPP $ xmobarPP
{ -- ppOutput = hPutStrLn xmproc
ppTitle = xmobarColor "lightblue" "" . shorten 100
, ppUrgent = xmobarColor "yellow" "red" . Main.xmobarStrip
}) >> ewmhDesktopsLogHook
>> setWMName "LG3D"
-- , logHook = dynamicLogWithPP $ dzenPP { ppOutput = hPutStrLn dzen }
, layoutHook = onWorkspace "8" myLayout $ onWorkspace "7:gimp" gimpL $ onWorkspace "4:im" imL $ usualL myLayouts
, borderWidth = 1
, manageHook = myManageHook <+> manageDocks
} `additionalKeys`
[ ((modm, xK_p), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"")
] `additionalKeysP`
[ ("M-`", scratchpadSpawnActionTerminal "xterm") -- scratch
, ("M-C-n", spawn "killall -1 nautilus") -- restart nautilus
, ("M-C-l", spawn "samsung_off") -- xrandr to panel
, ("M-C-o", spawn "office_on") -- xrandr to the office
, ("M-C-O", spawn "office_off") -- xrandr to panel
, ("M-C-h", spawn "samsung_on") -- xrandr to samsung
, ("M-C-H", spawn "samsung_off") -- xrandr to panel
, ("M-", prevWS ) -- left workspace
, ("M-", nextWS ) -- right workspace
, ("M-C-", shiftToPrev >> prevWS ) -- schlep left workspace
, ("M-C-", shiftToNext >> nextWS ) -- schlep right workspace
, ("M-s", shellPrompt mySP) -- shell
, ("M-C--", spawn "transset-df -a --dec .1")
, ("M-C-+", spawn "transset-df -a --inc .1")
, ("M-z", toggleWS)
, ("M-g d", layoutScreens 2 (TwoPane 0.5 0.5))
, ("M-g u", rescreen)
, ("M-C-", sendMessage $ NextLayout)
, ("M-S-", sendMessage $ Go R)
, ("M-S-", sendMessage $ Go L)
, ("M-S-", sendMessage $ Go U)
, ("M-S-", sendMessage $ Go D)
]