Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts, NoMonomorphismRestriction #-}
- -- Based on XMonad configuration file by Thomas ten Cate - <ttencate@gmail.com> http://www.haskell.org/haskellwiki/Xmonad/Config_archive/Thomas_ten_Cate's_xmonad.hs
- -- Modified by Max <ganassa@gmail.com>
- import XMonad
- import XMonad.Util.EZConfig
- import qualified XMonad.StackSet as S
- import XMonad.Actions.CycleWS
- import XMonad.Config.Gnome
- import XMonad.Hooks.EwmhDesktops
- import XMonad.Hooks.ManageDocks
- import XMonad.Layout.Combo
- import XMonad.Layout.Grid
- import XMonad.Layout.LayoutModifier
- import XMonad.Layout.Named
- import XMonad.Layout.NoBorders
- import XMonad.Layout.PerWorkspace
- import XMonad.Layout.Reflect
- import XMonad.Layout.TwoPane
- import XMonad.Layout.WindowNavigation
- import XMonad.Util.WindowProperties
- import Control.Monad
- import Data.Ratio
- import qualified Data.Map as M
- import System.Exit
- import XMonad.Hooks.DynamicLog
- import XMonad.Util.Run(spawnPipe)
- import System.IO
- import XMonad.Hooks.SetWMName
- import System.Exit
- import XMonad.Layout.Tabbed
- import qualified XMonad.StackSet as W
- import XMonad.Util.EZConfig
- import XMonad.Util.CustomKeys
- import XMonad.Layout.SubLayouts
- import XMonad.Layout.WindowNavigation
- import XMonad.Layout.BoringWindows
- import XMonad.Actions.UpdatePointer
- import XMonad.Layout.NoFrillsDecoration
- myBaseConfig = gnomeConfig
- myBorderWidth = 2
- myNormalBorderColor = "#202030"
- myFocusedBorderColor = "#A0A0D0"
- myTheme = defaultTheme
- myWorkspaces = (miscs 8) ++ ["fullscreen", "im"]
- where miscs = map (("F" ++) . show) . (flip take) [1..]
- isFullscreen = (== "fullscreen")
- basicLayout = Tall nmaster delta ratio where
- nmaster = 1
- delta = 3/100
- ratio = 2/3
- tallLayout = named "tall" $ avoidStruts $ subTabbed $ basicLayout
- wideLayout = named "wide" $ avoidStruts $ subTabbed $ Mirror basicLayout
- tabbedLayout = named "tab" $ avoidStruts $ noBorders simpleTabbed
- fullscreenLayout = named "fullscreen" $ noBorders Full
- imLayout = avoidStruts $ reflectHoriz $ withIMs ratio rosters chatLayout where
- chatLayout = Grid
- ratio = 1%6
- rosters = [skypeRoster, pidginRoster]
- pidginRoster = And (ClassName "Pidgin") (Role "buddy_list")
- skypeRoster = (ClassName "Skype") `And` (Not (Title "Options")) `And` (Not (Role "Chats")) `And` (Not (Role "CallWindowForm")) `And` (Not (Role "ConversationsWindow"))
- myLayoutHook = windowNavigation $ fullscreen $ im $ normal where
- normal = tallLayout
- ||| wideLayout
- ||| tabbedLayout
- fullscreen = onWorkspace "fullscreen" fullscreenLayout
- im = onWorkspace "im" imLayout
- myManageHook = imManageHooks <+> myMaxManageHooks <+> manageHook myBaseConfig
- imManageHooks = composeAll [isIM --> moveToIM] where
- isIM = foldr1 (<||>) [isPidgin, isSkype]
- isPidgin = className =? "Pidgin"
- isSkype = className =? "Skype"
- moveToIM = doF $ S.shift "im"
- myMaxManageHooks= composeAll
- [
- className =? "Gimp" --> doFloat
- , className =? "Vncviewer" --> doFloat
- , className =? "Unity-2d-panel" --> doIgnore
- , className =? "Unity-2d-launcher" --> doIgnore
- , manageDocks
- ]
- altMask = mod1Mask
- winMask = mod4Mask
- myKeys conf = M.fromList $
- [
- ((altMask, xK_F4) , kill)
- , ((controlMask, xK_F12) , spawn "xmonad --recompile; xmonad --restart")
- , ((controlMask .|. shiftMask, xK_F12) , io (exitWith ExitSuccess) )
- , ((winMask , xK_space ) , sendMessage NextLayout)
- , ((winMask .|. shiftMask, xK_r) , refresh)
- , ((winMask , xK_Home) , windows S.swapMaster)
- , ((altMask , xK_Tab) , windows S.focusDown)
- , ((altMask .|. shiftMask, xK_Tab ) , windows S.focusUp)
- , ((winMask .|. altMask , xK_h ) , sendMessage Shrink)
- , ((winMask .|. altMask , xK_Left ) , sendMessage Shrink)
- , ((winMask .|. altMask , xK_l ) , sendMessage Expand)
- , ((winMask .|. altMask , xK_Right ) , sendMessage Expand)
- , ((winMask , xK_t ) , withFocused $ windows . S.sink)
- , ((winMask .|. altMask , xK_plus) , sendMessage (IncMasterN 1))
- , ((winMask .|. altMask , xK_minus) , sendMessage (IncMasterN (-1)))
- , ((winMask , xK_a ) , prevWS)
- , ((winMask , xK_s ) , nextWS)
- , ((winMask .|. shiftMask, xK_a) , shiftToPrev)
- , ((winMask .|. shiftMask, xK_s) , shiftToNext)
- , ((winMask .|. controlMask , xK_h) , sendMessage $ pullGroup L)
- , ((winMask .|. controlMask , xK_Left) , sendMessage $ pullGroup L)
- , ((winMask .|. controlMask , xK_l) , sendMessage $ pullGroup R)
- , ((winMask .|. controlMask , xK_Right) , sendMessage $ pullGroup R)
- , ((winMask .|. controlMask , xK_k) , sendMessage $ pullGroup U)
- , ((winMask .|. controlMask , xK_Down) , sendMessage $ pullGroup U)
- , ((winMask .|. controlMask , xK_j) , sendMessage $ pullGroup D)
- , ((winMask .|. controlMask , xK_Up) , sendMessage $ pullGroup D)
- , ((winMask .|. controlMask , xK_m) , withFocused (sendMessage . MergeAll))
- , ((winMask .|. controlMask .|. shiftMask , xK_m) , withFocused (sendMessage . UnMergeAll))
- , ((winMask .|. controlMask , xK_u) , withFocused (sendMessage . UnMerge))
- , ((winMask , xK_Tab ) , onGroup W.focusDown')
- , ((winMask .|. shiftMask , xK_Tab ) , onGroup W.focusUp')
- , ((winMask, xK_Left ) , sendMessage $ Go L)
- , ((winMask, xK_h ) , sendMessage $ Go L)
- , ((winMask, xK_Right) , sendMessage $ Go R)
- , ((winMask, xK_l) , sendMessage $ Go R)
- , ((winMask, xK_Up ) , sendMessage $ Go U)
- , ((winMask, xK_k ) , sendMessage $ Go U)
- , ((winMask, xK_Down ) , sendMessage $ Go D)
- , ((winMask, xK_j ) , sendMessage $ Go D)
- , ((winMask .|. shiftMask, xK_Left ) , sendMessage $ Swap L)
- , ((winMask .|. shiftMask, xK_h ) , sendMessage $ Swap L)
- , ((winMask .|. shiftMask, xK_Right) , sendMessage $ Swap R)
- , ((winMask .|. shiftMask, xK_l) , sendMessage $ Swap R)
- , ((winMask .|. shiftMask, xK_Up ) , sendMessage $ Swap U)
- , ((winMask .|. shiftMask, xK_k ) , sendMessage $ Swap U)
- , ((winMask .|. shiftMask, xK_Down ) , sendMessage $ Swap D)
- , ((winMask .|. shiftMask, xK_j ) , sendMessage $ Swap D)
- ] ++
- [ ((winMask .|. altMask, 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)]
- ] ++
- [ ((winMask, k), windows $ S.greedyView i)
- | (i, k) <- zip myWorkspaces workspaceKeys
- ] ++
- [ ((winMask .|. shiftMask, k), (windows $ S.shift i) >> (windows $ S.greedyView i))
- | (i, k) <- zip myWorkspaces workspaceKeys
- ]
- where workspaceKeys = [xK_F1 .. xK_F10]
- myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
- [ ((altMask, button1), (\w -> focus w >> mouseMoveWindow w))
- , ((altMask, button3), (\w -> focus w >> mouseResizeWindow w))
- , ((altMask, button2), (\w -> focus w >> (withFocused $ windows . S.sink)))
- , ((altMask, button4), (const $ windows S.swapUp))
- , ((altMask, button5), (const $ windows S.swapDown))
- ]
- main =
- do
- xmproc <- spawnPipe "xmobar"
- xmonad $ myBaseConfig {
- modMask = winMask
- , workspaces = myWorkspaces
- , layoutHook = myLayoutHook
- , manageHook = myManageHook
- , borderWidth = myBorderWidth
- , normalBorderColor = myNormalBorderColor
- , focusedBorderColor = myFocusedBorderColor
- , keys = myKeys
- , mouseBindings = myMouseBindings
- , startupHook = setWMName "LG3D"
- , logHook = dynamicLogWithPP xmobarPP
- { ppOutput = hPutStrLn xmproc
- , ppLayout = const ""
- , ppTitle = xmobarColor "white" "" . shorten 60
- }
- }
- data AddRosters a = AddRosters Rational [Property] deriving (Read, Show)
- instance LayoutModifier AddRosters Window where
- modifyLayout (AddRosters ratio props) = applyIMs ratio props
- modifierDescription _ = "IMs"
- withIMs :: LayoutClass l a => Rational -> [Property] -> l a -> ModifiedLayout AddRosters l a
- withIMs ratio props = ModifiedLayout $ AddRosters ratio props
- gridIMs :: Rational -> [Property] -> ModifiedLayout AddRosters Grid a
- gridIMs ratio props = withIMs ratio props Grid
- hasAnyProperty :: [Property] -> Window -> X Bool
- hasAnyProperty [] _ = return False
- hasAnyProperty (p:ps) w = do
- b <- hasProperty p w
- if b then return True else hasAnyProperty ps w
- applyIMs :: (LayoutClass l Window) =>
- Rational
- -> [Property]
- -> S.Workspace WorkspaceId (l Window) Window
- -> Rectangle
- -> X ([(Window, Rectangle)], Maybe (l Window))
- applyIMs ratio props wksp rect = do
- let stack = S.stack wksp
- let ws = S.integrate' $ stack
- rosters <- filterM (hasAnyProperty props) ws
- let n = fromIntegral $ length rosters
- let (rostersRect, chatsRect) = splitHorizontallyBy (n * ratio) rect
- let rosterRects = splitHorizontally n rostersRect
- let filteredStack = stack >>= S.filter (`notElem` rosters)
- (a,b) <- runLayout (wksp {S.stack = filteredStack}) chatsRect
- return (zip rosters rosterRects ++ a, b)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement