import Codec.Binary.UTF8.String import Graphics.X11.ExtraTypes.XF86 import qualified Data.Map as M import qualified XMonad.StackSet as W import System.Exit import System.IO import XMonad import XMonad.Actions.CycleWS import XMonad.Config.Desktop import XMonad.Hooks.DynamicLog import XMonad.Hooks.EwmhDesktops import XMonad.Hooks.ManageDocks import XMonad.Hooks.ManageHelpers import XMonad.Layout.IndependentScreens import XMonad.Layout.LayoutCombinators hiding ( (|||) ) import XMonad.Layout.Reflect import XMonad.Prompt import XMonad.Prompt.Shell(shellPrompt) import XMonad.Util.Font import XMonad.Util.Loggers import XMonad.Util.Run main = do spawn bar xmonad $ ewmh desktopConfig { manageHook = myManageHook <+> manageDocks <+> manageHook defaultConfig , layoutHook = myLayout , logHook = maLogouk , modMask = mod4Mask -- Rebind to Logo key , workspaces = ["●", "◕", "◑", "◔", "◯", "◐", "◒", "◓", "☦"] , borderWidth = 0 , keys = myKeys , terminal = "/run/current-system/sw/bin/st -t Terminal" , handleEventHook = handleEventHook defaultConfig <+> fullscreenEventHook } cBase03 = "#002b36" cBase02 = "#073642" cBase01 = "#586e75" cBase00 = "#657b83" cBase0 = "#839496" cBase1 = "#93a1a1" cBase2 = "#eee8d5" cBase3 = "#fdf6e3" cYellow = "#b58900" cOrange = "#cb4b16" cRed = "#dc322f" cMagenta = "#d33682" cViolet = "#6c71c4" cBlue = "#268bd2" cCyan = "#3aa198" cGreen = "#859900" -- Micro lemonbar lib lbTag t v = foldl (++) "" ["%{",t,v,"}"] lbBlock t o c s = (lbTag t o) ++ s ++ (lbTag t c) lbUnderline = lbBlock "" "+u" "-u" lbOverline = lbBlock "" "+o" "-o" lbFColor f = lbBlock "F" f "-" lbBColor b = lbBlock "B" b "-" lbUColor u = lbBlock "U" u "-" lbColor f b = lbFColor f . lbBColor b . lbUColor f sym "Tall" = "|" sym "Mirror Tall" = "-" sym "Full" = "F" sym _ = "◓" maLogouk = dynamicLogWithPP $ defaultPP { ppOutput = printToFile , ppCurrent = lbColor cOrange cBase03 . lbUnderline -- . sym , ppVisible = lbColor cYellow cBase03 . lbUnderline -- . sym , ppHidden = lbColor cBase2 cBase03 . lbUnderline -- . sym , ppHiddenNoWindows = lbColor cBase01 cBase03 -- . sym , ppLayout = sym , ppTitle = lbFColor cViolet . shorten 70 , ppSep = " " } printToFile :: String -> IO () printToFile s = do h <- openFile "/tmp/monitors/xmonad" WriteMode hPutStrLn h $ decodeString s -- xxxxxxxxxxxx -- v----------------| -- Hacky hack to fix the broken fix of dynamicLogWithPP hClose h myManageHook = composeAll [ className =? "float" --> doCenterFloat , manageDocks ] ------------------------------------------------------------------------ -- LogHook. Dynamically outputs logs nicely formatted for dzen2 -- -- myLogHook h = dynamicLogWithPP $ defaultPP { -- ppCurrent = dzenColor "#cb4b16" "#eee8d5", -- ppVisible = dzenColor "#657b83" "#eee8d5", -- ppHiddenNoWindows = dzenColor "#93a1a1" "#eee8d5", -- ppLayout = dzenColor "#6c71c4" "#eee8d5", -- ppTitle = (dzenColor "#cb4b16" "") . (fixedWidth 256), -- ppSep = " ", -- ppWsSep = " ", -- ppOutput = hPutStrLn h -- } -- where -- fixedWidth n l = take (n+5) $ l ++ (cycle ".") ------------------------------------------------------------------------ -- StatusBar. Call lemonbar -- start only if no already started bar = "pgrep lemonbar > /dev/null || /home/eeva/prefix/bin/mkstatus.sh | /home/eeva/prefix/bin/bar" ------------------------------------------------------------------------ -- StatusBar. Call dzen -- -- callLeftDzen = "dzen2 -ta 'l' -fn '" -- ++ dzenFont -- ++ "' -w 500 -h '24' -fg '#657b83' -bg '#eee8d5' -e 'button3='" -- ++ scrNum -- -- callRightDzen = "conky | dzen2 -ta 'r' -fn '" -- ++ dzenFont -- ++ "' -x 500 -h '24' -fg '#657b83' -bg '#eee8d5' -e 'onnewinput=;button3='" -- ++ scrNum -- -- dzenFont = "Hack:size=10:antialias=true:bold" -- scrNum = " -xs '1' -dock" ------------------------------------------------------------------------ -- Layouts. First three ones are struted for status bar and last one can hide -- it. -- myLayout = avoidStruts $ tiled ||| Mirror tiled ||| Full where tiled = Tall 1 (3/100) (1/2) -- Prompt config myXPConfig = defaultXPConfig { position = Top, promptBorderWidth = 5, font = "xft:tewi:style=Regular:antialias=false:autohint=false", height = 24, borderColor = cBase03, bgHLight = cBase02, fgHLight = cMagenta, bgColor = cBase03, fgColor = cBase0, defaultText = "" } ------------------------------------------------------------------------ -- Key bindings. Add, modify or remove key bindings here. -- myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $ [ -- launch dmenu --((modm, xK_p), spawn "dmenu_run -b -l 3") -- launch prompt ((modm, xK_p), shellPrompt myXPConfig) -- close focused window , ((modm, xK_Delete), kill) -- Rotate through the available layout algorithms , ((modm, xK_space ), sendMessage NextLayout) --, ((modm .|. shiftMask xK_Tab ), sendMessage PreviousLayout) -- Reset the layouts on the current workspace to default , ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) -- Resize viewed windows to the correct size , ((modm, xK_n ), refresh) -- Move focus to the master window , ((modm, xK_m ), windows W.focusMaster ) -- Swap the focused window and the master window , ((modm, xK_BackSpace), windows W.swapMaster) -- Move focus to the next window , ((modm, xK_j ), windows W.focusDown) , ((modm, xK_Down ), windows W.focusDown) -- Move focus to the previous window , ((modm, xK_k ), windows W.focusUp ) , ((modm, xK_Up ), windows W.focusUp) -- Swap the focused window with the next window , ((modm .|. shiftMask, xK_j ), windows W.swapDown ) , ((modm .|. shiftMask, xK_Down ), windows W.swapDown ) -- Swap the focused window with the previous window , ((modm .|. shiftMask, xK_k ), windows W.swapUp ) , ((modm .|. shiftMask, xK_Up ), windows W.swapUp ) -- Shrink the master area , ((modm, xK_h ), sendMessage Shrink) -- Expand the master area , ((modm, xK_l ), sendMessage Expand) -- Move to next Workspace , ((modm, xK_Right ), nextWS) -- Move to previous Workspace , ((modm, xK_Left ), prevWS) -- Move focused window to next Workspace , ((modm .|. shiftMask, xK_Right ), shiftToNext >> nextWS) -- Move focused window to previous Workspace , ((modm .|. shiftMask, xK_Left ), shiftToPrev >> prevWS) -- Cycle between windows , ((modm , xK_Tab ), toggleWS) -- Push window back into tiling , ((modm, xK_t ), withFocused $ windows . W.sink) -- Increment the number of windows in the master area , ((modm , xK_comma ), sendMessage (IncMasterN 1)) -- Deincrement the number of windows in the master area , ((modm , xK_period), sendMessage (IncMasterN (-1))) -- close focused window , ((modm .|. shiftMask, xK_c ), kill) -- Swap the focused window and the master window , ((modm, xK_Return), windows W.swapMaster) -- run my terminal , ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf) -- lock my session --, ((modm .|. shiftMask, xK_Delete), spawn "/usr/bin/sxlock -f \"-*-ubuntu mono-*-r-*-*-*-*-*-*-*-*-*-*\"") , ((modm .|. shiftMask, xK_Delete), spawn "/home/eeva/.nix-profile/bin/i3lock-fancy") -- quit xmonad , ((modm .|. shiftMask, xK_q), io (exitWith ExitSuccess)) -- Raise volume (XF86XK_AudioRaiseVolume) , ((0 , xF86XK_AudioRaiseVolume), spawn "/home/eeva/prefix/bin/volume up") -- Lower volume (XF86XK_AudioLowerVolume) , ((0 , xF86XK_AudioLowerVolume), spawn "/home/eeva/prefix/bin/volume down") -- Mute volume (xF86XK_AudioMute) , ((0 , xF86XK_AudioMute), spawn "/home/eeva/prefix/bin/volume toggle") -- Playlist play (xK_F7) , ((0 , xK_F7), spawn "/usr/bin/notify-send \"Current song\" \"$(mpc -h ~/.config/mpd/mpd.socket | head -n 1)\"") -- Playlist play (xK_F8) , ((0 , xK_F8), spawn "/home/eeva/prefix/bin/playlist toggle") -- Playlist stop (xK_F9) , ((0 , xK_F9), spawn "/home/eeva/prefix/bin/playlist stop") -- Launch App (XF86XK_Launch1) , ((0 , xF86XK_Launch1), spawn "/usr/bin/firefox") -- Adjust Brightness up (xF86XK_MonBrightnessUp) , ((0 , xF86XK_MonBrightnessUp), spawn "/usr/bin/xbacklight +10") -- Adjust Brightness down (xF86XK_MonBrightnessDown) , ((0 , xF86XK_MonBrightnessDown), spawn "/usr/bin/xbacklight -10") ] ++ -- -- mod-[1..9], Switch to workspace N -- -- mod-[1..9], Switch to workspace N -- mod-shift-[1..9], Move client to workspace N -- [((m .|. modm, k), windows $ f i) | (i, k) <- zip (XMonad.workspaces conf) [xK_F1 .. xK_F9] , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]] ++ -- -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3 -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3 -- [((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f)) | (key, sc) <- zip [xK_z, xK_e, xK_r] [0..] , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] -- Utility functions