Created
June 24, 2013 15:30
-
-
Save sashainparis/5850899 to your computer and use it in GitHub Desktop.
xmonad is a tiling window manager for Linux: http://xmonad.org/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-------------------- imports -------------------- | |
--necessary | |
import XMonad | |
import qualified XMonad.StackSet as W | |
import qualified Data.Map as M | |
import System.Exit | |
import Graphics.X11.Xlib | |
import System.IO (Handle, hPutStrLn) | |
--utilities | |
import XMonad.Util.Run (spawnPipe) | |
import XMonad.Actions.NoBorders | |
import XMonad.Actions.CycleWS | |
--hooks | |
import XMonad.Hooks.ManageDocks | |
import XMonad.Hooks.DynamicLog | |
import XMonad.Hooks.XPropManage | |
import XMonad.Hooks.FadeInactive | |
--MO' HOOKS | |
import Graphics.X11.Xlib.Extras | |
import Foreign.C.Types (CLong) | |
--layouts | |
import XMonad.Layout.NoBorders | |
import XMonad.Layout.ResizableTile | |
import XMonad.Layout.Named | |
import XMonad.Layout.PerWorkspace | |
import XMonad.Layout.Spacing | |
import XMonad.Layout.Spiral | |
import XMonad.Layout.Tabbed | |
import Data.Ratio((%)) | |
import XMonad.Config.Azerty | |
-------------------- main -------------------- | |
main = do | |
h <- spawnPipe "xmobar ~/.xmobarrc" | |
xmonad $ defaultConfig | |
{ workspaces = ["term", "web", "irc", "code", "else"] | |
, modMask = mod4Mask | |
, borderWidth = 1 | |
, normalBorderColor = "#1C1C1C" | |
, focusedBorderColor = "#1C1C1C" | |
-- , terminal = "urxvt -depth 32 -bg rgba:0000/0000/0000/4444 -tint darkgrey -sh 75 -fade 15 -fadecolor cyan -fn 'xft:Courier New:pixelsize=12'" | |
, logHook = logHook' h >> (fadeLogHook) | |
, manageHook = manageHook' | |
, layoutHook = layoutHook' | |
, keys = keys' | |
} | |
-------------------- loghooks -------------------- | |
logHook' :: Handle -> X () | |
logHook' h = dynamicLogWithPP $ customPP { ppOutput = hPutStrLn h } | |
customPP :: PP | |
customPP = defaultPP { ppCurrent = xmobarColor "#D81860" "" | |
, ppTitle = shorten 75 | |
, ppSep = "<fc=#D81860> | </fc>" | |
, ppHiddenNoWindows = xmobarColor "#4d4d4d" "" | |
} | |
fadeLogHook :: X () | |
fadeLogHook = fadeInactiveLogHook fadeAmount | |
where fadeAmount = 0.9 | |
-------------------- layouthooks -------------------- | |
layoutHook' = customLayout | |
customLayout = onWorkspace "wb" simpleTabbed $ avoidStrutsOn [U] (spiral (6/7) ||| spaced ||| smartBorders tiled ||| smartBorders (Mirror tiled) ||| noBorders Full) | |
where | |
spaced = named "Spacing" $ spacing 6 $ Tall 1 (3/100) (1/2) | |
tiled = named "Tiled" $ ResizableTall 1 (2/100) (1/2) [] | |
-------------------- menuhook -------------------- | |
getProp :: Atom -> Window -> X (Maybe [CLong]) | |
getProp a w = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w | |
checkAtom name value = ask >>= \w -> liftX $ do | |
a <- getAtom name | |
val <- getAtom value | |
mbr <- getProp a w | |
case mbr of | |
Just [r] -> return $ elem (fromIntegral r) [val] | |
_ -> return False | |
checkDialog = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_DIALOG" | |
checkMenu = checkAtom "_NET_WM_WINDOW_TYPE" "_NET_WM_WINDOW_TYPE_MENU" | |
manageMenus = checkMenu --> doFloat | |
manageDialogs = checkDialog --> doFloat | |
-------------------- managehook -------------------- | |
manageHook' :: ManageHook | |
manageHook' = manageHook defaultConfig <+> manageDocks <+> manageMenus <+> manageDialogs <+> myManageHook | |
myManageHook :: ManageHook | |
myManageHook = composeAll . concat $ | |
[ [className =? c --> doFloat | c <- myFloats] | |
, [title =? t --> doFloat | t <- myOtherFloats] | |
, [className =? r --> doIgnore | r <- myIgnores] | |
, [className =? im --> doF (W.shift "irc") | im <- imMessenger] | |
, [className =? bw --> doF (W.shift "web") | bw <- browsers] | |
, [className =? e --> doF (W.shift "else") | e <- elseApps] | |
] | |
where | |
myFloats = ["Gimp", "vlc", "Nitrogen", "Thunar", "Leafpad"] | |
myOtherFloats = ["Downloads", "Firefox Preferences", "Save As...", "Send file", "Open", "File Transfers"] | |
myIgnores = ["trayer", "stalonetray"] | |
imMessenger = ["irssi"] | |
browsers = ["Firefox", "Uzbl"] | |
elseApps = ["Mirage", "Gimp"] | |
-------------------- keybinds -------------------- | |
keys' :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ()) | |
keys' conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ | |
--launching/killing | |
[ ((modMask, xK_p ), spawn "dmenu_run -fn \"-*-lime-*-*-*-*-*-*-*-*-*-*-*-*\" -nb \"#1C1C1C\" -nf \"#4d4d4d\" -sb \"#2A2A2A\" -sf \"#D81860\"") | |
, ((modMask .|. shiftMask, xK_Return ), spawn $ XMonad.terminal conf) | |
, ((modMask, xK_f ), spawn "firefox --config=.configs") | |
, ((modMask, xK_g ), spawn "google-chrome") | |
, ((modMask .|. shiftMask, xK_m ), spawn "gnome-terminal -e ncmpcpp") | |
, ((modMask .|. shiftMask, xK_Right ), spawn "mpc next") | |
, ((modMask .|. shiftMask, xK_Left ), spawn "mpc prev") | |
, ((modMask .|. shiftMask, xK_Up ), spawn "mpc volume +5") | |
, ((modMask .|. shiftMask, xK_Down ), spawn "mpc volume -5") | |
, ((modMask .|. shiftMask, xK_s ), spawn "mpc pause") | |
, ((modMask .|. shiftMask, xK_p ), spawn "mpc play") | |
, ((modMask .|. shiftMask, xK_c ), kill) | |
--lock | |
, ((modMask, xK_v ), spawn "xscreensaver-command -lock") | |
--layouts | |
, ((modMask, xK_space ), sendMessage NextLayout) | |
, ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) | |
, ((modMask, xK_b ), sendMessage ToggleStruts) | |
-- refresh | |
, ((modMask, xK_n ), refresh) | |
, ((modMask .|. shiftMask, xK_w ), withFocused toggleBorder) | |
-- focus | |
, ((modMask, xK_Tab ), windows W.focusDown) | |
, ((modMask, xK_j ), windows W.focusDown) | |
, ((modMask, xK_k ), windows W.focusUp) | |
, ((modMask, xK_m ), windows W.focusMaster) | |
-- swapping | |
, ((modMask .|. shiftMask, xK_j ), windows W.swapDown ) | |
, ((modMask .|. shiftMask, xK_k ), windows W.swapUp ) | |
-- increase or decrease number of windows in the master area | |
, ((modMask .|. controlMask, xK_h ), sendMessage (IncMasterN 1)) | |
, ((modMask .|. controlMask, xK_l ), sendMessage (IncMasterN (-1))) | |
-- resizing | |
, ((modMask, xK_h ), sendMessage Shrink) | |
, ((modMask, xK_l ), sendMessage Expand) | |
, ((modMask .|. shiftMask, xK_h ), sendMessage MirrorShrink) | |
, ((modMask .|. shiftMask, xK_l ), sendMessage MirrorExpand) | |
-- a basic CycleWS setup | |
, ((modMask, xK_Right), nextWS) | |
, ((modMask, xK_Left), prevWS) | |
, ((modMask .|. shiftMask, xK_Right), shiftToNext >> nextWS) | |
, ((modMask .|. shiftMask, xK_Left), shiftToPrev >> prevWS) | |
, ((modMask, xK_z), toggleWS) | |
-- quit, or restart | |
, ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) | |
, ((modMask , xK_q ), restart "xmonad" True) | |
] | |
++ | |
-- mod-[1..9] %! Switch to workspace N | |
-- mod-shift-[1..9] %! Move client to workspace N | |
[((m .|. modMask, k), windows $ f i) | |
| (i, k) <- zip (XMonad.workspaces conf) [xK_F1 .. xK_F5] | |
, (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment