Skip to content

Instantly share code, notes, and snippets.

@fujin
Created January 13, 2014 23:12
Show Gist options
  • Save fujin/8409944 to your computer and use it in GitHub Desktop.
Save fujin/8409944 to your computer and use it in GitHub Desktop.
import System.Posix.Unistd
import XMonad hiding (Tall)
import qualified XMonad.StackSet as W
import qualified Data.Map as M
import Control.Monad (filterM)
import Data.Char (ord)
import Data.List
import Data.Maybe
import Data.Ratio
import System.IO
import System.Exit
import qualified DBus as D
import qualified DBus.Client as D
import qualified Codec.Binary.UTF8.String as UTF8
import XMonad.Actions.CopyWindow
import XMonad.Actions.CycleWS
import XMonad.Actions.DynamicWorkspaces
import qualified XMonad.Actions.DynamicWorkspaceOrder as DO
import XMonad.Actions.FloatKeys
import XMonad.Actions.RotSlaves
import XMonad.Actions.Submap
import XMonad.Actions.UpdateFocus
import XMonad.Actions.WindowBringer
import XMonad.Actions.WindowGo
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.FadeInactive
import XMonad.Hooks.ICCCMFocus
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.Place
import XMonad.Hooks.SetWMName
import XMonad.Hooks.UrgencyHook
import qualified XMonad.Layout.BoringWindows as B
import XMonad.Layout.HintedGrid
import XMonad.Layout.HintedTile
import XMonad.Layout.IM
import XMonad.Layout.LayoutHints
import qualified XMonad.Layout.Magnifier as Mag
import XMonad.Layout.Maximize
import XMonad.Layout.Minimize
import XMonad.Layout.MultiColumns
import XMonad.Layout.NoBorders
import XMonad.Layout.PerWorkspace
import XMonad.Layout.Reflect
import XMonad.Layout.ResizableTile
import XMonad.Layout.ThreeColumns
import XMonad.Layout.ToggleLayouts
import XMonad.Layout.TwoPane
import XMonad.Prompt
import XMonad.Prompt.AppendFile
import XMonad.Prompt.Man
import XMonad.Prompt.Shell
import XMonad.Prompt.Window
import XMonad.Util.Paste
import XMonad.Util.Run
import XMonad.Util.NamedWindows
import XMonad.Util.WorkspaceCompare
import qualified Data.Map as M
-- Taffybar, via dbus
import DBus.Client
import System.Taffybar.XMonadLog ( dbusLog, dbusLogWithPP )
-- Makes ~? usable in manageHook and other places to match
-- window properties against regexes.
-- From: http://thread.gmane.org/gmane.comp.lang.haskell.xmonad/7058/focus=7062
import Text.Regex.Posix ((=~))
q ~? x = fmap (=~ x) q
main :: IO ()
main = do
client <- connectSession
-- Probably want to modify the urgent one later. Maybe we don't even need it.
let pp = defaultPP
xmonad $ withUrgencyHook NoUrgencyHook
$ ewmh defaultConfig
{ terminal = "urxvtc"
, workspaces = myWorkSpaces
, normalBorderColor = myInactiveBorderColor
, focusedBorderColor = myActiveBorderColor
, manageHook = myPreManageHook
<+> placeHook (withGaps (24,0,0,0)
(inBounds
(underMouse (0.5, 0.5))))
<+> manageDocks
<+> myManageHook
, startupHook = setWMName "LG3D"
, logHook = dbusLogWithPP client pp
, modMask = myModMask
, keys = myKeys
, layoutHook = smartBorders
$ layoutHintsWithPlacement (0.5, 0.5)
$ maximize
$ minimize
$ B.boringWindows
$ toggleLayouts (noBorders Full)
$ avoidStruts
$ onWorkspace "terminal" (noBorders Full)
$ onWorkspace "comm" (noBorders Full)
$ onWorkspace "im" im
$ onWorkspace "gimp" gimp
$ tp
||| rtp
||| rtiled
||| file
||| grid
||| (noBorders Full)
}
where
myWorkSpaces = [ "terminal", "browser", "vm", "comm", "gimp" ]
tiled = HintedTile 1 (3%100) 0.648 TopLeft Tall
rtiled = Mag.magnifier' (ResizableTall 1 (3%100) 0.648 [])
tp = TwoPane 0.03 0.62
monlayout = withIM (0.34) (ClassName "Gnome-terminal") $ Full
rtp = Mirror $ TwoPane 0.03 0.6
im = withIM (0.15) (Role "contact_list") $ reflectHoriz $
withIM (0.15) (Title "Hangouts") $ reflectHoriz $
multiCol [1] 1 0.01 (-0.5)
rgrid = Grid True
grid = Grid False
file = ThreeCol 1 (3/100) (0.33)
gimp = withIM (0.11) (Role "gimp-toolbox") $ reflectHoriz $
withIM (0.15) (Role "gimp-dock") Full
read = withIM (0.12) (ClassName "Rox") $ Full
-- mod Mask
myModMask = mod4Mask
-- Paths
myBitmapsPath = "/home/aj/.dzen/bitmaps/"
-- Colors
myFgColor = "gray80"
myBgColor = "black"
myHighlightedFgColor = "white"
myHighlightedBgColor = "gray40"
myActiveBorderColor = "gray80"
myInactiveBorderColor = "gray20"
myPreManageHook :: ManageHook
myPreManageHook = composeAll
[ title =? "handy" --> doCenterFloat
, className =? "feh" --> doCenterFloat
, className =? "MPlayer" --> doCenterFloat
]
-- And this manageHook goes after the placeHook
myManageHook :: ManageHook
myManageHook = composeAll
[ className ~? "(Do|Do.exe)" --> doIgnore
, className =? "Synapse" --> doIgnore
, resource =? "Dialog" --> doFloat
, title ~? "Page.s. Unresponsive" --> doFloat
, title =? "Options" --> doFloat
, title =? "Edit Bookmark" --> doFloat
, title =? "Session Manager" --> doFloat
, title =? "Bulk rename files" --> doFloat
, className =? "Apt-listchanges" --> doFloat
, title =? "Firefox Preferences" --> doFloat
, title =? "Thunderbird Preferences" --> doFloat
, title =? "Add-ons" --> doFloat
, className =? "Xmessage" --> doFloat
, title ~? "mythfrontend" --> doNewHWS "tv"
, className ~? "(Gimp-2.6|Gimp)" --> doNewWS "gimp"
, title ~? ".*VirtualBox.*" --> doNewWS "vm"
, title ~? ".*Nightly.*" --> doNewWS "browser"
, className =? "Savebox" --> doOpenUnder
, className =? "rdesktop" --> doNewWS "rdp"
, role =? "buddy_list" --> doFloat
, role =? "conversation" --> doFloat
, className =? "Unity-2d-panel" --> doIgnore
, className =? "Unity-2d-launcher" --> doIgnore
, title =? "Sublime Color Picker" --> doFloat
, resource ~? "crx_.*" --> doShift "im"
]
where
unFloat = ask >>= doF . W.sink
doOpenUnder = doF W.swapDown
role = stringProperty "WM_WINDOW_ROLE"
doNewWS tg = (liftX $ addUniqueWS tg) >> doShift tg
addUniqueWS tg = withWindowSet $ \s ->
if null (filter ( (== tg) . W.tag) (W.workspaces s))
then addWorkspace tg
else return()
doNewHWS tg = (liftX $ addUniqueHiddenWS tg) >> doShift tg
addUniqueHiddenWS tg = withWindowSet $ \s ->
if null (filter ( (== tg) . W.tag) (W.workspaces s))
then addHiddenWorkspace tg
else return()
-- Prompt config
myXPConfig = defaultXPConfig {
position = Bottom,
promptBorderWidth = 0,
height = 15,
bgColor = myBgColor,
fgColor = myFgColor,
fgHLight = myHighlightedFgColor,
bgHLight = myHighlightedBgColor
}
-- Union default and new key bindings
myKeys x = M.union (M.fromList (newKeys x)) (keys defaultConfig x)
-- Add new and/or redefine key bindings
newKeys conf@(XConfig {XMonad.modMask = modm}) = [
-- Use shellPrompt instead of default dmenu
((modm, xK_p), shellPrompt myXPConfig),
((modm, xK_g), spawn "chromium"),
((modm, xK_s), spawn "skype"),
((modm, xK_b), sendMessage ToggleStruts)
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment