summaryrefslogtreecommitdiffstats
path: root/xmonad/xmonad.hs
blob: 638326595edbb5f4cf13d29dc775c76901af7252 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
--
-- xmonad example config file.
--
-- A template showing all available configuration hooks,
-- and how to override the defaults in your own xmonad.hs conf file.
--
-- Normally, you'd only override those defaults you care about.
--

import XMonad
import XMonad.Actions.CycleWS
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.FadeInactive
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.Reflect
import XMonad.Layout.WindowNavigation
import XMonad.Prompt
import XMonad.Prompt.AppLauncher
import XMonad.Prompt.Input
import XMonad.Prompt.Shell
import XMonad.Prompt.XMonad
import XMonad.Util.Font(stringToPixel)
import XMonad.Util.Run(spawnPipe)
import XMonad.Util.EZConfig(additionalKeysP)
import qualified XMonad.StackSet as W
import System.IO
import Data.List
import System.Directory
import Data.Char

main = do
    xmproc <- spawnPipe "xmobar"
    xmonad $ withUrgencyHookC BorderUrgencyHook urgencyConfig { suppressWhen = Never } $ defaultConfig {
                 terminal           = "urxvtc",
                 modMask            = mod4Mask,
                 normalBorderColor  = "#000000",
                 focusedBorderColor = "#aaaaaa",
                 workspaces         = ["term", "browser", "docs", "4",
                                       "5", "6", "7", "8", "9"],
                 layoutHook         = avoidStruts myLayout,
                 manageHook         = myManageHook <+>
                                      manageDocks <+>
                                      manageHook defaultConfig,
                 logHook            = myFadeInactiveLogHook >>
                                      (myXmobarLogHook xmproc)
             } `additionalKeysP` [("C-M1-o", spawn "urxvtc")
                                 ,("C-M1-b", spawn "firefox")
                                 ,("C-S-l", spawn "xscreensaver-command -lock")
                                 -- ugh, can't customize the prompt text
                                 ,("C-M1-i", launchApp defaultXPConfig "urxvtc -name pwsafe -geometry 47x2 -e pwsafe -p")
                                 ,("C-M1-r", shellPrompt defaultXPConfig)
                                 ,("C-M1-x", xmonadPrompt defaultXPConfig)
                                 ,("C-M1-q", killAllPrompt)
                                 ,("C-M1-c", restart "xmonad" True)
                                 ,("C-M1-<Left>", prevWS)
                                 ,("C-M1-<Right>", nextWS)
                                 ,("C-M1-<Up>", focusUrgent)
                                 ,("C-S-M1-<Left>", shiftToPrev)
                                 ,("C-S-M1-<Right>", shiftToNext)
                                 ,("M1-<Tab>", windows W.focusDown)
                                 ,("M1-S-<Tab>", windows W.focusUp)
                                 ,("C-M1-h", sendMessage $ Go L)
                                 ,("C-M1-j", sendMessage $ Go D)
                                 ,("C-M1-k", sendMessage $ Go U)
                                 ,("C-M1-l", sendMessage $ Go R)
                                 ]

myLayout = configurableNavigation noNavigateBorders (tiled ||| Mirror tiled ||| Full)
    where
        tiled   = reflectHoriz $ Tall nmaster delta ratio
        nmaster = 2
        ratio   = 0.662
        delta   = 0.0005

myFadeInactiveLogHook =
    fadeInactiveLogHook 0xbbbbbbbb

myXmobarLogHook xmproc =
    dynamicLogWithPP $ xmobarPP
    { ppOutput = hPutStrLn xmproc
    , ppTitle  = xmobarColor "green" "" . shorten 100
    , ppUrgent = xmobarColor "yellow" "red" . xmobarStrip
    }

data BorderUrgencyHook = BorderUrgencyHook deriving (Read, Show)

instance UrgencyHook BorderUrgencyHook where
    urgencyHook _ win =
        do color <- withDisplay (\display -> io (stringToPixel display "#ff0000")); withDisplay (\display -> io (setWindowBorder display win color))

myManageHook = composeAll [ resource =? "xmessage"    --> doFloat
                          , resource =? "qemu"        --> doFloat
                          , resource =? "pwsafe"      --> doFloat
                          , resource =? "urxvt-kuake" --> doFloat
                          , resource =? "qemu-system-x86_64" --> doFloat
                          , resource =? "plugin-container" --> doFloat
                          , resource =? "explorer.exe" --> doFloat
                          , stringProperty "WM_WINDOW_ROLE" =? "CallWindow"  --> doFloat
                          , resource =? "firefox-bin" --> doF (W.shift "browser")
                          , resource =? "win"         --> doF (W.shift "docs") -- xpdf
                          , resource =? "feh"         --> doF (W.shift "docs")
                          ]

killAllPrompt = inputPromptWithCompl defaultXPConfig "killall" runningProcessesCompl ?+ killAll
killAll procName = spawn ("killall " ++ procName)
runningProcessesCompl str = runningProcesses >>= (\procs -> return $ filter (\proc -> str `isPrefixOf` proc) procs)
runningProcesses = getDirectoryContents "/proc" >>= (\dir -> return $ map (\pid -> "/proc/" ++ pid ++ "/comm") $ filter (\dir -> all isDigit dir) $ dir) >>= (\filenames -> sequence $ map (\filename -> openFile filename ReadMode >>= hGetContents) filenames) >>= (\procs -> return $ sort $ nub $ map (\proc -> init proc) procs)