-- ###### Imports ###### -- -- ### Xmonad ### -- import XMonad import XMonad.Core as XMonad hiding (workspaces,manageHook,keys,logHook,startupHook,borderWidth,mouseBindings ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,focusFollowsMouse ,handleEventHook,clickJustFocuses) import qualified XMonad.Core as XMonad (workspaces,manageHook,keys,logHook,startupHook,borderWidth,mouseBindings ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,focusFollowsMouse ,handleEventHook,clickJustFocuses) import XMonad.Operations import XMonad.Util.Run import XMonad.Actions.CycleWS import XMonad.Actions.SpawnOn import qualified Data.Map as M import qualified XMonad.StackSet as W import Data.Bits ((.|.)) import Data.Monoid import Data.Ratio ((%)) import Graphics.X11.Xlib import Graphics.X11.Xlib.Extras -- ### System ### -- import System.IO import System.Exit -- ### Prompt ### -- import XMonad.Prompt import XMonad.Prompt.RunOrRaise (runOrRaisePrompt) import XMonad.Prompt.AppendFile (appendFilePrompt) -- ### Hooks ### -- import XMonad.ManageHook import XMonad.Hooks.ManageDocks import XMonad.Hooks.ManageHelpers import XMonad.Hooks.SetWMName import XMonad.Hooks.DynamicLog import XMonad.Hooks.UrgencyHook import XMonad.Hooks.FadeInactive import XMonad.Hooks.EwmhDesktops import XMonad.Operations -- ### Layout ### -- import XMonad.Layout import XMonad.Layout.NoBorders (smartBorders, noBorders) import XMonad.Layout.PerWorkspace (onWorkspace, onWorkspaces) import XMonad.Layout.Reflect (reflectHoriz) import XMonad.Layout.IM import XMonad.Layout.SimpleFloat import XMonad.Layout.Spacing import XMonad.Layout.ResizableTile import XMonad.Layout.LayoutHints import XMonad.Layout.LayoutModifier import XMonad.Layout.Grid import XMonad.Layout.Tabbed import XMonad.Layout.TrackFloating -- ###### End Imports ### -- -- ###### Config ###### -- -- ### Terminal ### -- myTerminal = "terminator" -- ### modMask ### -- mymodMask :: KeyMask mymodMask = mod4Mask -- ### Workspaces ### -- myWorkspaces = ["1:cKlap","2:www","3:dev","4:file","5:virt","6:mayhem","7:media","8:com"] -- ### Bars/Dzen2 ### -- myXmonadBar = "dzen2 -x '0' -y '0' -h '18' -w '1000' -ta 'l' -fg '#999999' -bg '#000000' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'" myTrayBar = "~/.xmonad/dzen/status_bars/dzen_secondary.sh | dzen2 -x '1000' -y '0' -h '18' -w '366' -ta 'r' -fg '#999999' -bg '#000000' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'" myStatusBar = "~/.xmonad/dzen/status_bars/dzen_main.sh | dzen2 -x '0' -w '1000' -y '750' -h '18' -fg '#999999' -bg '#000000' -ta 'l' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'" myMpdBar = "~/.xmonad/dzen/status_bars/dzen_audio.sh | dzen2 -x '1000' -w '366' -y '750' -h '18' -fg '#999999' -bg '#000000' -ta 'r' -fn '-*-fixed-medium-*-*-*-12-*-*-*-*-*-iso8859-*'" myBitmapsDir = "/home/coke/.xmonad/dzen" -- ### Main ### -- main = do --bg <- spawnPipe "feh --bg-tile /home/coke/wallpapers/ska.jpg" dzenLeftBar <- spawnPipe myXmonadBar dzenStatusBar <- spawnPipe myStatusBar dzenTrayBar <- spawnPipe myTrayBar dzenMpdBar <- spawnPipe myMpdBar xmonad $ defaultConfig { terminal = myTerminal , workspaces = myWorkspaces , keys = myKeys , modMask = mymodMask , layoutHook = myLayoutHook , manageHook = manageSpawn <+> myManageHook , logHook = myLogHook dzenLeftBar , normalBorderColor = colorNormalBorder , focusedBorderColor = colorFocusedBorder , borderWidth = 0 , startupHook = myStartupHook } -- ### StartupHook ### -- myStartupHook :: X () myStartupHook = do spawn "compton -cfb -D 1 -r 10 -l -15 -t -12 -o 0.6 -e 1.0 -i 1.0" spawn "xscreensaver -nosplash" spawn "xsetroot -cursor_name left_ptr" -- spawnOn "8:com" "terminator -x screen irssi" -- spawnOn "1:cKlap" "aterm -e htop" -- spawnOn "1:cKlap" "aterm -e tty-clock -c -C 1 -s -n" -- spawnOn "1:cKlap" "terminator -x alsamixer --card=1" -- spawnOn "1:cKlap" "terminator -x ncmpcpp" -- spawnOn "1:cKlap" "terminator -x wicd-curses" -- spawnOn "1:cKlap" "terminator -x htop" -- spawnOn "2:www" "google-chrome-stable" spawnOn "4:file" "nautilus --no-desktop --browser" spawnOn "6:mayhem" "terminator -x ssh coke@ccokee.no-ip.org" -- spawnOn "6:mayhem" "terminator -x ssh root@ccokee.no-ip.org:2222" -- spawnOn "6:mayhem" "terminator" -- spawnOn "8:com" "skype" -- ### ManageHook ### -- myManageHook :: ManageHook myManageHook = (composeAll . concat $ [ [resource =? r --> doIgnore | r <- myIgnores] -- ignore desktop , [className =? c --> doShift "3:develop" | c <- myDev ] -- move myDev to dev , [className =? c --> doShift "4:file" | c <- myFiles ] -- move myFiles to file , [className =? c --> doShift "7:media" | c <- myMedia ] -- move myMedia to media , [className =? c --> doShift "8:com" | c <- myChat ] -- move myChat to com , [className =? c --> doShift "5:virt" | c <- myVBox ] -- move myVBox to virt , [className =? c --> doCenterFloat | c <- myFloats ] -- float my floats , [name =? n --> doCenterFloat | n <- myNames ] -- float my names , [isFullscreen --> myDoFullFloat ]]) where role = stringProperty "WM_WINDOW_ROLE" name = stringProperty "WM_NAME" -- classnames myTerms = ["aterm","urxvt","terminator"] myFloats = ["vlc","gimp","VirtualBox","skype"] myWebs = ["Firefox","google-chrome-stable"] myMedia = ["Spotify","vlc","kodi"] myChat = ["skype"] myFiles = ["nautilus","thunar","mc"] myDev = ["gvim","eclipse","ADT","emacs"] myVBox = ["VirtualBox","Virtualbox-bin","vbox"] -- resources myIgnores = ["desktop","desktop_window","notify-osd","stalonetray","trayer"] -- names myNames = ["bashrun","Google Chrome Options","Chromium Options"] -- ### LogHook ### -- myLogHook :: Handle -> X () myLogHook h = dynamicLogWithPP $ defaultPP { ppCurrent = dzenColor "#c9dee8" "#000000" . wrap "^fg(#c9dee8)[^fg(#ffffff)" "^fg(#c9dee8)]" , ppVisible = dzenColor "#c9dee8" "#000000" . wrap "^fg(#999999)[^fg(#c9dee8)" "^fg(#999999)]" , ppHidden = dzenColor "#eeeeee" "#000000" . pad , ppHiddenNoWindows = dzenColor "#999999" "#000000" . pad , ppUrgent = dzenColor "#ff0000" "#000000" . pad , ppWsSep = " " , ppSep = ":" , ppLayout = dzenColor "#c9dee8" "#000000" . (\x -> case x of "Spacing 7 ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/tall.xbm)" "Mirror ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/mtall.xbm)" "Full" -> "^i(" ++ myBitmapsDir ++ "/full.xbm)" "Simple Float" -> "~" _ -> x ) , ppTitle = (" " ++) . dzenColor "#c9dee8" "#000000" . dzenEscape , ppOutput = hPutStrLn h } -- ### LayoutHook ### -- myLayoutHook = onWorkspaces ["1:cKlap"] cKlapLayout $ onWorkspaces ["2:www"] wwwLayout $ onWorkspaces ["3:develop"] simpLayout $ onWorkspaces ["4:files"] wwwLayout $ onWorkspaces ["5:virt"] vBoxLayout $ --onWorkspaces ["6:mayhem"] netLayout $ onWorkspaces ["7:media"] mediaLayout $ onWorkspaces ["8:com"] chatLayout $ simpLayout -- ### Layouts ### -- cKlapLayout = avoidStruts $ tiled ||| Mirror tiled ||| noBorders Full ||| simpleFloat where tiled = spacing 7 $ ResizableTall 1 (2/100) (2/3) [] wwwLayout = avoidStruts $ noBorders tiled ||| Mirror tiled ||| noBorders Full ||| simpleFloat where tiled = spacing 7 $ ResizableTall 1 (2/100) (1/2) [] simpLayout = avoidStruts $ noBorders Full ||| tiled ||| Mirror tiled ||| simpleFloat where tiled = spacing 7 $ ResizableTall 1 (2/100) (1/2) [] vBoxLayout = avoidStruts $ noBorders simpleFloat --netLayout = spacing 7 $ avoidStruts $ smartBorders $ withIM (1%5) (And (Resource "aterm") (Role "buddy_list")) Grid mediaLayout = noBorders Full $ withIM 0.11 (Role "gimp-toolbox") $ reflectHoriz $ withIM 0.15 (Role "gimp-dock") (trackFloating simpleTabbed) chatLayout = avoidStruts $ withIM (1%5) (And (ClassName "skype") (Role "buddy_list")) simpleFloat -- ### Theme ### -- colorOrange = "#83bbf4" colorDarkGray = "#1B1D1E" colorPink = "#F92672" colorGreen = "#A6E22E" colorBlue = "#66D9EF" colorYellow = "#E6DB74" colorWhite = "#CCCCC6" colorNormalBorder = "#CCCCCC" colorFocusedBorder = "#EEEEEE" -- ### Fonts ### -- barFont = "-*-fixed-*-*-*-*-10-*-*-*-*-*-*-*" barXFont = "fixed" xftFont = "xft: fixed" -- ### Prompt Config ### -- mXPConfig :: XPConfig mXPConfig = defaultXPConfig { font = barFont , bgColor = colorDarkGray , fgColor = colorGreen , bgHLight = colorGreen , fgHLight = colorDarkGray , promptBorderWidth = 0 , height = 12 , historyFilter = deleteConsecutive } -- ### Run or Raise Menu ### -- largeXPConfig :: XPConfig largeXPConfig = mXPConfig { font = xftFont , height = 12 } -- ### Trick for fullscreen switching windows ### -- myDoFullFloat :: ManageHook myDoFullFloat = doF W.focusDown <+> doFullFloat -- ### Key Bindings ### -- myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ [ ((modMask, xK_p ), runOrRaisePrompt largeXPConfig) , ((modMask, xK_k ), spawn $ XMonad.terminal conf) , ((modMask, xK_F2 ), spawn "gmrun") , ((modMask .|. shiftMask, xK_c ), kill) , ((modMask .|. shiftMask, xK_l ), spawn "xscreensaver-command -lock") , ((0, xK_Print ), spawn "scrot -e 'mv $f ~/screenshots/'") , ((modMask, xK_c ), spawn "google-chrome-stable") , ((modMask, xK_n ), spawn "nautilus --no-desktop --browser") , ((0, 0x1008ff12 ), spawn "amixer -c 1 sset Master toggle") -- XF86AudioMute , ((0, 0x1008ff11 ), spawn "amixer -c 1 sset Master 5%-") -- XF86AudioLowerVolume , ((0, 0x1008ff13 ), spawn "amixer -c 1 sset Master 5%+") , ((0, 0x1008ff14 ), spawn "rhythmbox-client --play-pause") , ((0, 0x1008ff17 ), spawn "rhythmbox-client --next") , ((0, 0x1008ff16 ), spawn "rhythmbox-client --previous") , ((modMask, xK_x ), spawn "xbmc") , ((modMask, xK_g ), spawn "gimp") , ((modMask, xK_i ), spawn "screen irssi") , ((modMask, xK_v ), spawn "VirtualBox") , ((modMask .|. shiftMask, xK_v ), spawn "VBoxManage startvm 'Windows 10'") , ((modMask, xK_m ), spawn "vlc") , ((modMask .|. shiftMask, xK_m ), spawn "kodi") , ((modMask, xK_d ), spawn "deluge-gtk") , ((modMask, xK_e ), spawn "eclipse") , ((modMask .|. shiftMask, xK_e ), spawn "emacs") , ((modMask, xK_space ), sendMessage NextLayout) , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) -- reset layout on current desktop to default , ((modMask, xK_b ), sendMessage ToggleStruts) , ((modMask, xK_r ), refresh) , ((modMask, xK_Tab ), windows W.focusDown) -- move focus to next window , ((modMask .|. shiftMask, xK_j ), windows W.focusDown) , ((modMask .|. shiftMask, xK_k ), windows W.focusUp ) , ((modMask .|. shiftMask, xK_Down ), windows W.swapDown) -- swap the focused window with the next window , ((modMask .|. shiftMask, xK_Up ), windows W.swapUp) -- swap the focused window with the previous window , ((modMask, xK_Return ), windows W.swapMaster) , ((modMask, xK_t ), withFocused $ windows . W.sink) -- Push window back into tiling , ((modMask, xK_h ), sendMessage Shrink) -- %! Shrink a master area , ((modMask, xK_l ), sendMessage Expand) -- %! Expand a master area , ((modMask, xK_comma ), sendMessage (IncMasterN 1)) , ((modMask, xK_period ), sendMessage (IncMasterN (-1))) -- workspaces , ((modMask .|. controlMask, xK_Right ), nextWS) , ((modMask .|. shiftMask, xK_Right ), shiftToNext) , ((modMask .|. controlMask, xK_Left ), prevWS) , ((modMask .|. shiftMask, xK_Left ), shiftToPrev) -- quit, or restart , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) , ((modMask, xK_q ), spawn "killall dzen2 && /home/my_user/.cabal/bin/xmonad --recompile && /home/my_user/.cabal/bin/xmonad --restart") ] ++ -- 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_1 .. xK_9] , (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 .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) -- | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..] -- , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] -- ###### End Config ###### --