This shows you the differences between two versions of the page.
configuration:xmonad [2012/10/31 16:21] sjorge [Configuration files] |
configuration:xmonad [2014/10/09 22:02] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== XMonad ====== | ||
- | ===== Introduction ===== | ||
- | I revided my netbook, needed something minimal and every pixel counts! | ||
- | |||
- | ===== Screenshot ===== | ||
- | {{:configuration:xmonad.png|}} | ||
- | |||
- | ===== Packages ===== | ||
- | My netbook runs on Arch Linux, I will list the packages I needed. The names can be different on your system. | ||
- | |||
- | * XMonad | ||
- | * XMonad Contrib | ||
- | * Trayer | ||
- | * dmenu | ||
- | * dzen2 | ||
- | * conky | ||
- | |||
- | If you run arch like me, you can use the following to install them all: | ||
- | ''sudo pacman -S xmonad xmonad-contrib trayer dzen2 conky'' | ||
- | |||
- | ===== Configuration files ===== | ||
- | My setup uses a few configuration files, most are located withing **~/.xmonad** | ||
- | ^ path ^ description ^ | ||
- | | ~/.xmonad/xmonad.hs | main configuration file | | ||
- | | ~/.xmonad/apps | apps to launch on xmonad start | | ||
- | | ~/.xmonad/.conky_dzen | conky configuration for use with dzen | | ||
- | | ~/.xmonad/dzen2/* | pixmap images used in my status bar | | ||
- | | ~/.xmonad/bin/* | helper scripts and binries | | ||
- | | /usr/local/bin/xmonad-cdm-wrapper | wrapper for xmobad for use with cdm, tigervnc,... | | ||
- | ==== ~/.xmonad/xmonad.hs ==== | ||
- | <code> | ||
- | -- ~/.xmonad/xmonad.hs | ||
- | -- {{{ imports | ||
- | -- generic | ||
- | import XMonad | ||
- | import XMonad.Util.Run | ||
- | |||
- | -- actions | ||
- | import XMonad.Actions.CycleWS | ||
- | import XMonad.Actions.PerWorkspaceKeys | ||
- | |||
- | -- hooks | ||
- | import XMonad.Operations | ||
- | import XMonad.Hooks.DynamicLog | ||
- | import XMonad.Hooks.FadeInactive | ||
- | import XMonad.Hooks.EwmhDesktops -- fix chromium fullscreen | ||
- | import XMonad.Hooks.ManageDocks | ||
- | import XMonad.Hooks.ManageHelpers | ||
- | import XMonad.Hooks.SetWMName | ||
- | |||
- | -- layout | ||
- | import XMonad.Layout.NoBorders (smartBorders, noBorders) | ||
- | import XMonad.Layout.PerWorkspace (onWorkspace, onWorkspaces) | ||
- | import XMonad.Layout.SimpleFloat | ||
- | import XMonad.Layout.ResizableTile | ||
- | import XMonad.Layout.Grid | ||
- | |||
- | -- misc | ||
- | import System.Exit | ||
- | import System.IO | ||
- | import Data.Ratio ((%)) | ||
- | import qualified XMonad.StackSet as W | ||
- | import qualified Data.Map as M | ||
- | --}}} | ||
- | |||
- | -- {{{ main | ||
- | main = do | ||
- | dzenLeftBar <- spawnPipe myXmonadBar | ||
- | dzenRightBar <- spawnPipe myStatusBar | ||
- | xmonad $ ewmh defaultConfig { | ||
- | terminal = myTerminal | ||
- | , workspaces = myWorkspaces | ||
- | , keys = keys' | ||
- | , modMask = modMask' | ||
- | , layoutHook = layoutHook' | ||
- | , manageHook = manageHook' | ||
- | , logHook = myLogHook dzenLeftBar >> fadeInactiveLogHook 0xdddddddd | ||
- | , normalBorderColor = colorNormalBorder | ||
- | , focusedBorderColor = colorFocusedBorder | ||
- | , borderWidth = withPixelSize | ||
- | , startupHook = myStartup | ||
- | } | ||
- | --}}} | ||
- | |||
- | -- {{{ startup | ||
- | myStartup :: X () | ||
- | myStartup = do | ||
- | spawn "syndaemon -i 1 -t -d" -- synaptics timeout | ||
- | spawn "trayer --edge top --align right --widthtype pixel --heighttype pixel --expand true --align right --SetDockType true --SetPartialStrut true --tint 0x000000 --transparent true --alpha 0 --margin 75 --height 8 --width 238" | ||
- | spawn "xfce4-power-manager" | ||
- | spawn "sleep 2; volti" | ||
- | spawn "sleep 2; wicd-gtk --tray" | ||
- | |||
- | --}}} | ||
- | |||
- | -- {{{ config | ||
- | -- terminal | ||
- | myTerminal = "terminal" | ||
- | |||
- | -- modMask | ||
- | modMask' :: KeyMask | ||
- | modMask' = mod4Mask | ||
- | |||
- | -- colors | ||
- | colorNormalBorder = "#555753" | ||
- | colorFocusedBorder = "#8AE234" | ||
- | withPixelSize = 1 | ||
- | |||
- | -- workspaces | ||
- | myWorkspaces = ["1:main","2:general","3:classic","4:vbox","5:web","6:irc"] | ||
- | |||
- | --}}} | ||
- | |||
- | -- {{{ keys | ||
- | keys' conf@(XConfig {XMonad.modMask = modMask}) = M.fromList [ | ||
- | ((modMask, xK_p ), bindOn [("3:classic", spawn "/home/sjorge/.xmonad/bin/xmonad-xephyr-run"), ("4:vbox", spawn "/home/sjorge/.xmonad/bin/xmonad-windows-run"), ("", spawn "exe=`dmenu_run -nb black -sb black -nf \"#555753\" -sf \"#8AE234\"` && eval \"exec $exe\"")]) | ||
- | , ((modMask .|. shiftMask, xK_Return ), spawn $ XMonad.terminal conf) | ||
- | , ((modMask, xK_F2 ), spawn "gmrun") | ||
- | , ((modMask .|. shiftMask, xK_c ), kill) | ||
- | , ((modMask .|. shiftMask, xK_l ), spawn "xlock") | ||
- | |||
- | -- Programs | ||
- | , ((0, xK_Print ), spawn "scrot -e 'mkdie -p ~/Documents/screenshots/ && mv $f ~/Documents/screenshots/'") | ||
- | , ((modMask .|. shiftMask, xK_f ), spawn "firefox") | ||
- | , ((modMask .|. shiftMask, xK_g ), spawn "thunar") | ||
- | , ((modMask .|. shiftMask, xK_n ), spawn "wicd-gtk") | ||
- | |||
- | -- layouts | ||
- | , ((modMask, xK_space ), sendMessage NextLayout) | ||
- | , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) -- reset layout on current desktop to default | ||
- | , ((modMask .|. shiftMask, xK_m ), windows W.shiftMaster) | ||
- | , ((modMask, xK_b ), sendMessage ToggleStruts) | ||
- | , ((modMask, xK_F5 ), refresh) | ||
- | , ((modMask, xK_Tab ), windows W.focusDown) | ||
- | , ((modMask .|. shiftMask, xK_Tab ), windows W.focusUp) | ||
- | , ((modMask, xK_j ), sendMessage Expand) -- %! Shrink a master area | ||
- | , ((modMask .|. shiftMask, xK_j ), sendMessage Shrink) -- %! Expand a master area | ||
- | , ((modMask, xK_e ), sendMessage (IncMasterN 1)) | ||
- | , ((modMask, xK_r ), 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 conky dzen2 trayer syndaemon ; wicd-tray-kill ; xmonad --recompile && xmonad --restart") | ||
- | ] | ||
- | --}}} | ||
- | |||
- | -- {{{ statusbar | ||
- | myBitmapsDir = "/home/sjorge/.xmonad/dzen2" | ||
- | |||
- | -- dzen2 1366 - 1024 = 342 | ||
- | myXmonadBar = "dzen2 -w 1054 -h 16 -ta 'l' -fg '#555753' -bg '#000000' -fn 'Terminus-8'" | ||
- | myLogHook :: Handle -> X () | ||
- | myLogHook h = dynamicLogWithPP $ defaultPP | ||
- | { | ||
- | ppCurrent = dzenColor "#8AE234" "#000000" . pad | ||
- | , ppVisible = dzenColor "#555753" "#000000" . pad | ||
- | , ppHidden = dzenColor "#999999" "#000000" . pad | ||
- | , ppHiddenNoWindows = dzenColor "#555753" "#000000" . pad | ||
- | , ppUrgent = dzenColor "#cc0000" "#000000" . pad | ||
- | , ppWsSep = "" | ||
- | , ppSep = " | " | ||
- | , ppLayout = dzenColor "#555753" "#000000" . | ||
- | (\x -> case x of | ||
- | "ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/tall.xbm)" | ||
- | "Mirror ResizableTall" -> "^i(" ++ myBitmapsDir ++ "/mtall.xbm)" | ||
- | "Full" -> "^i(" ++ myBitmapsDir ++ "/full.xbm)" | ||
- | "Simple Float" -> "~" | ||
- | "IM Grid" -> "IM" | ||
- | _ -> x | ||
- | ) | ||
- | , ppTitle = ("" ++) . dzenColor "#B9EE85" "#000000" . dzenEscape | ||
- | , ppOutput = hPutStrLn h | ||
- | } | ||
- | |||
- | -- conky | ||
- | myStatusBar = "conky -c /home/sjorge/.xmonad/.conky_dzen_clock | dzen2 -x 1291 -w 75 -h 16 -ta 'r' -fg '#555753' -bg '#000000' -fn 'Terminus-8'" | ||
- | |||
- | --}}} | ||
- | |||
- | -- {{{ hooks | ||
- | -- management | ||
- | manageHook' :: ManageHook | ||
- | manageHook' = (composeAll . concat $ | ||
- | [ [resource =? r --> doIgnore | r <- myIgnores ] -- ignore desktop | ||
- | , [className =? c --> doShift "1:main" | c <- myMain ] -- move dev to main | ||
- | , [className =? c --> doShift "2:general" | c <- myGeneral ] -- move general to general | ||
- | , [name =? n --> doShift "3:classic" | n <- myClassic ] -- move general to general | ||
- | , [name =? n --> doShift "4:vbox" | n <- myVbox ] -- move general to general | ||
- | , [className =? c --> doShift "5:web" | c <- myWebs ] -- move webs to web | ||
- | , [className =? c --> doShift "6:irc" | c <- myIRC ] -- move irc to irc | ||
- | , [className =? c --> unfloat | c <- myNoFloatsC ] -- unfloat my floats | ||
- | , [className =? c --> doCenterFloat | c <- myFloatsC ] -- float my floats | ||
- | , [name =? n --> doCenterFloat | n <- myFloatsN ] -- float my names | ||
- | , [isFullscreen --> myDoFullFloat ] | ||
- | , [manageDocks ] | ||
- | ]) | ||
- | |||
- | where | ||
- | role = stringProperty "WM_WINDOW_ROLE" | ||
- | name = stringProperty "WM_NAME" | ||
- | unfloat = ask >>= doF . W.sink | ||
- | |||
- | -- sorters | ||
- | myMain = ["Terminal"] | ||
- | myGeneral = ["Thunar", "Deluge","Ristretto"] | ||
- | myClassic = ["Xmonad Classic"] | ||
- | myVbox = ["VirtualBox - Windows 7"] | ||
- | myWebs = ["Firefox","Google-chrome","Chromium","Chromium-browser","Opera"] | ||
- | myIRC = ["Xchat"] | ||
- | |||
- | -- resources | ||
- | myIgnores = ["desktop","desktop_window","notify-osd","stalonetray","trayer"] | ||
- | |||
- | -- floats | ||
- | myFloatsC = ["VirtualBox","Xmessage","XFontSel","Downloads","Wicd-client.py","xfce4-power-information","xfce4-power-manager-settings"] | ||
- | myFloatsN = ["Google Chrome Options","Chromium Options","XChat: Network List"] | ||
- | myNoFloatsC = ["Xephyr", "VirtualBox"] | ||
- | |||
- | -- fullscreen with focus | ||
- | myDoFullFloat :: ManageHook | ||
- | myDoFullFloat = doF W.focusDown <+> doFullFloat | ||
- | |||
- | -- layouts | ||
- | layoutHook' = onWorkspaces ["1:main" ] customLayoutTilted $ | ||
- | onWorkspaces ["3:classic" ] customLayoutFull $ | ||
- | onWorkspaces ["4:vbox" ] customLayoutFull $ | ||
- | onWorkspaces ["5:web" ] customLayoutFull $ | ||
- | onWorkspaces ["6:irc" ] customLayoutFull $ | ||
- | customLayoutDefault | ||
- | |||
- | customLayoutTilted = avoidStruts $ tiled ||| Mirror tiled | ||
- | where | ||
- | tiled = ResizableTall 1 (2/100) (1/2) [] | ||
- | |||
- | customLayoutDefault = avoidStruts $ Full ||| tiled ||| Mirror tiled | ||
- | where | ||
- | tiled = ResizableTall 1 (2/100) (1/2) [] | ||
- | |||
- | customLayoutFull = avoidStruts $ smartBorders Full | ||
- | --customLayoutFloat = avoidStruts $ simpleFloat | ||
- | |||
- | --}}} | ||
- | </code> | ||
- | ==== ~/.xmonad/apps ==== | ||
- | <code> | ||
- | #!/bin/bash | ||
- | ## core x configuration | ||
- | xsetroot -solid black | ||
- | xloadimage -onroot -center /home/sjorge/Documents/Themes/Backgrounds/xmonad.png | ||
- | xsetroot -cursor_name left_ptr | ||
- | setxkbmap -layout be | ||
- | xbindkeys | ||
- | |||
- | ## default apps | ||
- | sleep 5 | ||
- | #xchat & | ||
- | chromium & | ||
- | </code> | ||
- | ==== ~/.xmonad/.conky_dzen ==== | ||
- | <code> | ||
- | background yes | ||
- | out_to_console yes | ||
- | out_to_x no | ||
- | # Update interval in seconds | ||
- | update_interval 3 | ||
- | |||
- | TEXT | ||
- | ${if_empty ${exec ifconfig wlan0 | grep 'inet '}}^i(/home/sjorge/.xmonad/dzen2/net-wired.xbm)${else}^i(/home/sjorge/.xmonad/dzen2/wifi_01.xbm) ${exec iwconfig wlan0 | grep 'Signal level' | cut -d= -f3 | awk '{print 100+$1 "%"}'} ${exec iwgetid | cut -d\" -f2 | awk '{print $1}'}${endif} ${if_match ${exec cat /sys/class/power_supply/ADP1/online} == 1}^i(/home/sjorge/.xmonad/dzen2/ac_01.xbm)${else}^i(/home/sjorge/.xmonad/dzen2/bat_full_01.xbm)${endif} ${battery_percent BAT0}% | ^fg(\#B9EE85)${time %a %H:%M} | ||
- | </code> | ||
- | |||
- | **note: use sed or simular to replace my username** ''sed 's/sjorge/**YOURUSER**/gi' tempfile > .conky_dzen'' | ||
- | ==== /usr/local/bin/xmonad-cdm-wrapper ==== | ||
- | <code> | ||
- | #!/bin/sh | ||
- | ## apps | ||
- | [ -e ~/.xmonad/apps ] && ~/.xmonad/apps & | ||
- | ## xmonad | ||
- | exec ck-launch-session dbus-launch xmonad | ||
- | </code> | ||
- | |||
- | ==== ~/.xmonad/dzen2/ ==== | ||
- | {{:configuration:dzen2.tar|}} | ||
- | |||
- | <konsole> | ||
- | yami ~# mkdir -p ~/.xmonad | ||
- | yami ~# tar xvf dzen2.tar -C ~/.xmonad | ||
- | </konsole> | ||