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"

  One Response to “XMonad som fönsterhanterare”

  1. Stört nördigt =). Och riktigt roligt =D.

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

© 2011 swedberg.info Suffusion theme by Sayontan Sinha