-
-
Save fujin/8409944 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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