Jag har nyligen börjat använda Xmonad som fönsterhanterare. Konfigurationsmöjligheterna är i stort sett oändliga, men det tar ett tag att klura ut hur saker och ting ska göras. Min konfiguration:
- Xmonad för fönsterhantering, ingen skrivbordsmiljö
- dzen2 som statusrad för Xmonad
- Conky + ytterligare en dzen2 för systeminformation
- Trayer som statusfält (för Dropbox etc.)
- rxvt-unicode som terminal
- xcompmgr för trevliga fönstereffekter (transparens, toningar etc.)
- Gnome Tracker för snabb filsökning (funkar utan att använda hela skrivbordsmiljön)
- udiskie för automontering av lagringsmedia
För att automatiskt starta upp allt används denna .xsessionrc:
Selec All Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/sh # Load your X Resource defaults, if you have them... if [ -f $HOME/.Xdefaults ]; then xrdb -merge $HOME/.Xdefaults fi #Hack to make OpenOffice dialogs work with Xmonad export SAL_USE_VCLPLUGIN=gen # Run dropbox dropbox start& #Start compositing manager. Light dropshadows and quick fades. xcompmgr -cCfF -o0.40 -D3& #Start metadata search tool tracker-control -s& #Automount removable media udiskie& |
OpenOffice-hacket (export SAL_USE_VCLPLUGIN=gen) är nödvändigt, eftersom dialogrutor mer eller mindre kraschar programmet annars. Jag har inte hittat någon riktigt tillfredställande lösning på problemet, men detta fungerar i alla fall.
.Xdefaults innehåller lite färginställningar med mera för rxvt-unicode:
Selec All Code:
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 | URxvt.foreground: white URxvt.depth: 32 URxvt*background: rgba:0000/0000/0000/dddd URxvt.fading: 30 URxvt.fadeColor: [0]black URxvt.saveLines:32767 URxvt.scrollBar: false URxvt.urgentOnBell: true URxvt*font:xft:Terminus:pixelsize=14 URxvt*color0: #6c6c6c URxvt*color1: #e9897c URxvt*color2: #b6e77d URxvt*color3: #ecebbe URxvt*color4: #a9cdeb URxvt*color5: #ea96eb URxvt*color6: #c9caec URxvt*color7: #f2f2f2 URxvt*color8: #747474 URxvt*color9: #f99286 URxvt*color10: #c3f786 URxvt*color11: #fcfbcc URxvt*color12: #b6defb URxvt*color13: #fba1fb URxvt*color14: #d7d9fc URxvt*color15: #e2e2e2 |
Nedan följer min xmonad.hs, ”huvudsaken” med det här inlägget. Det finns mycket som kan förbättras och städas upp, jag får nog anledning att återkomma.
Selec All Code:
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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | import XMonad import XMonad.Core import XMonad.Prompt import XMonad.Prompt.Shell import XMonad.Prompt.Man import XMonad.Prompt.AppLauncher as AL import XMonad.Layout import XMonad.Layout.NoBorders import XMonad.Layout.ResizableTile import XMonad.Hooks.DynamicLog import XMonad.Hooks.ManageDocks import XMonad.Hooks.UrgencyHook import XMonad.Hooks.SetWMName import XMonad.Hooks.ManageHelpers import qualified XMonad.StackSet as W import XMonad.Util.EZConfig import XMonad.Util.Run import XMonad.Util.Loggers import XMonad.Util.WorkspaceCompare import XMonad.Util.Scratchpad import XMonad.Actions.WindowBringer import Control.Monad (liftM2) import Graphics.X11.Xlib import Data.List import qualified Data.Map as M import System.IO main = do dzenproc <- spawnPipe myStatusBar conkyproc <- spawnPipe myConkyBar spawn myTrayer xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig { manageHook = manageDocks <+> myManageHook <+> manageHook defaultConfig , layoutHook = avoidStruts $ smartBorders $ layoutHook defaultConfig , logHook = dynamicLogWithPP $ myDzenPP dzenproc , modMask = myModKey -- Rebind Mod to the Windows key , focusFollowsMouse = False , workspaces = myWorkspaces , terminal = "urxvt" } `additionalKeysP` myKeys myManageHook = scratchpadManageHook (W.RationalRect 0.3 0.2 0.4 0.4) <+> (composeAll . concat $ [ [ isDialog --> doFloat] , [className =? c --> doFloat | c <- myCFloats] , [title =? t --> doFloat | t <- myTFloats] , [resource =? r --> doFloat | r <- myRFloats] , [ fmap ( c `isInfixOf`) className --> doFloat | c <- myMatchAnywhereFloatsC ] , [ fmap ( c `isInfixOf`) title --> doFloat | c <- myMatchAnywhereFloatsT ] , [resource =? i --> doIgnore | i <- myIgnores] , [isFullscreen --> (doF W.focusDown <+> doFullFloat)] , [(className =? x <||> title =? x <||> resource =? x) --> doShift "1:web" | x <- my1Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShift "2:comm" | x <- my2Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShift "3:office" | x <- my3Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShift "4:dev" | x <- my4Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "5:video" | x <- my5Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "6" | x <- my6Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "7" | x <- my7Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "8" | x <- my8Shifts] , [(className =? x <||> title =? x <||> resource =? x) --> doShiftAndGo "9:misc" | x <- my9Shifts] ] ) where doShiftAndGo = doF . liftM2 (.) W.greedyView W.shift myCFloats = ["Nitrogen", "Nvidia-settings", "Transmission-gtk", "Xmessage", "Gimp", "Tracker-search-tool", "Qjackctl"] myTFloats = ["Downloads", "Firefox Preferences", "Save As..."] myRFloats = [] myMatchAnywhereFloatsC = ["Ardour"] myMatchAnywhereFloatsT = [] myIgnores = [] my1Shifts = ["Firefox"] my2Shifts = ["Thunderbird"] my3Shifts = ["libreoffice-startcenter", "libreoffice-writer", "Libreoffice"] my4Shifts = ["emacs"] my5Shifts = ["Vlc"] my6Shifts = [] my7Shifts = [] my8Shifts = [] my9Shifts = [] -- Theme settings myFont = "-*-terminus-*-*-*-*-14-*-*-*-*-*-iso8859-*" myNormalFGColor = "#ffffff" myNormalBGColor = "#000000" myFocusedFGColor = "#ff8888" myFocusedBGColor = "#555555" myVisibleFGColor = "#ffffff" myVisibleBGColor = "#555555" myHiddenFGColor = "#d0d0d0" myHiddenBGColor = "#000000" myUrgentFGColor = "#ffffff" myUrgentBGColor = "#ff0000" myHighlightedFGColor = "#FFFFFF" myHighlightedBGColor = "#222222" mySeperatorColor = "#555555" myTitleColor = "#9F9FFF" --Shell prompt settings myXPConfig = defaultXPConfig { position = Bottom, promptBorderWidth = 0, height = 24, bgColor = myNormalBGColor, fgColor = myNormalFGColor, fgHLight = myHighlightedFGColor, bgHLight = myHighlightedBGColor, font = myFont } -- Define workspaces myWorkspaces = ["1:web", "2:comm", "3:office", "4:dev", "5:video", "6", "7", "8", "9:misc"] -- Modified key bindings myModKey = mod4Mask myKeys = [ -- Use shellPrompt instead of default dmenu ("M-p", shellPrompt myXPConfig) -- Do not leave useless conky, dzen and trayer after restart , ("M-q", spawn "killall trayer conky dzen2; xmonad --recompile; xmonad --restart") , ("M-s", spawn "dbus-send --system --print-reply --dest=\"org.freedesktop.UPower\" /org/freedesktop/UPower org.freedesktop.UPower.Suspend") , ("M-S-t", scratchpadSpawnAction defaultConfig {terminal = "urxvt"}) , ("<XF86AudioLowerVolume>", spawn "amixer sset Master 3dB- unmute") , ("<XF86AudioRaiseVolume>", spawn "amixer sset Master 3dB+ unmute") , ("<XF86Eject>", spawn "eject -T") , ("M-S-g", gotoMenu) , ("M-S-b", bringMenu) , ("M-S-f", focusUrgent) , ("M-S-x", spawn "transmission-gtk") , ("M-S-p", spawn "tracker-search-tool") , ("M-S-s", spawn "setxkbmap se -variant svoraka2") , ("M-S-o", spawn "setxkbmap se -variant mac") ] -- PP used to generate log data for dzen myDzenPP h = defaultPP { ppSep = " " , ppWsSep = "" , ppCurrent = wrap ("^fg(" ++ myFocusedFGColor ++ ")^bg(" ++ myFocusedBGColor ++ ") ") " ^fg()^bg()^p()" . \wsId -> dropIx wsId , ppVisible = wrap ("^fg(" ++ myVisibleFGColor ++ ")^bg(" ++ myVisibleBGColor ++ ") ") " ^fg()^bg()^p()" . \wsId -> dropIx wsId , ppHidden = wrap ("^fg(" ++ myHiddenFGColor ++ ") ") " " . noScratchPad . \wsId -> dropIx wsId , ppUrgent = wrap ("^bg(" ++ myUrgentBGColor ++ ")") "^bg()" , ppTitle = dzenColor ("" ++ myTitleColor ++ "") "" . wrap "< " " >" , ppLayout = dzenColor ("" ++ myNormalFGColor ++ "") "" . (\x -> case x of "Full" -> "[ ]" "Tall" -> "[|]" "Mirror Tall" -> "[-]" _ -> x ) , ppSort = getSortByXineramaRule , ppOrder = \(ws:l:t:_) -> [ws] ++ [l] ++ [t] , ppOutput = hPutStrLn h } where dropIx wsId = if (':' `elem` wsId) then drop 2 wsId else wsId --Remove the digit before the workspace name when displaying noScratchPad ws = if ws == "NSP" then "" else ws --Hide the workspace where the scratchpad is hidden away to --Set up dzen2 for the status bar on Xinerama screen 1 myStatusBar = "dzen2 -xs 1 -x '0' -y '0' -h '18' -w '1428' -ta 'l' -fg '" ++ myNormalFGColor ++ "' -bg '" ++ myNormalBGColor ++ "' -fn '" ++ myFont ++ "'" --Conky is piped into a secon instance of dzen2. Conky settings are read from .xmonad/conky_bar myConkyBar = "conky -c '.xmonad/conky_bar' | dzen2 -xs 1 -x '1428' -y '0' -h '18' -w '300' -ta 'l' -fg '" ++ myNormalFGColor ++ "' -bg '" ++ myNormalBGColor ++ "' -fn '" ++ myFont ++ "'" --Set up trayer in the top right corner myTrayer = "trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --widthtype pixel --width 192 --transparent true --alpha 0 --tint 0x000000 --heighttype pixel --height 18" |
