diff --git a/.xmonad/xmonad.hs b/.xmonad/xmonad.hs index 1e4f417..ca6b104 100644 --- a/.xmonad/xmonad.hs +++ b/.xmonad/xmonad.hs @@ -6,17 +6,19 @@ -- -- Normally, you'd only override those defaults you care about. -- +{-# LANGUAGE NoMonomorphismRestriction #-} import XMonad import System.Exit -import XMonad.Layout.NoBorders ( noBorders, smartBorders ) +import XMonad.Layout.NoBorders (noBorders, smartBorders) import XMonad.Layout.ResizableTile import XMonad.Layout.SimplestFloat import XMonad.Actions.GridSelect -import XMonad.Actions.WindowBringer import XMonad.Actions.NoBorders +import XMonad.Actions.Warp(warpToScreen) +import XMonad.Actions.WindowBringer import Data.Monoid import qualified XMonad.StackSet as W @@ -39,22 +41,7 @@ myBorderWidth = 1 -- myModMask = mod4Mask --- The mask for the numlock key. Numlock status is "masked" from the --- current modifier status, so the keybindings will work with numlock on or --- off. You may need to change this on some systems. --- --- You can find the numlock modifier by running "xmodmap" and looking for a --- modifier with Num_Lock bound to it: --- --- > $ xmodmap | grep Num --- > mod2 Num_Lock (0x4d) --- --- Set numlockMask = 0 if you don't have a numlock key, or want to treat --- numlock status separately. --- -myNumlockMask = mod2Mask - --- The default number of workspaces (virtual screens) and their names. +-- | The default number of workspaces (virtual screens) and their names. -- By default we use numeric strings, but any string may be used as a -- workspace name. The number of workspaces is determined by the length -- of this list. @@ -63,122 +50,108 @@ myNumlockMask = mod2Mask -- -- > workspaces = ["web", "irc", "code" ] ++ map show [4..9] -- -myWorkspaces = ["1","2","3","4","5","6","7","8","9"] +myWorkspaces :: [WorkspaceId] +myWorkspaces = map show [1 .. 9 :: Int] -- Border colors for unfocused and focused windows, respectively. -- myNormalBorderColor = "#999999" myFocusedBorderColor = "#dd0000" ------------------------------------------------------------------------- --- Key bindings. Add, modify or remove key bindings here. --- +-- Custom keys myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ - - -- launch a terminal - [ ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf) - - -- launch dmenu - , ((modMask, xK_p ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"") - - -- launch gmrun - , ((modMask .|. shiftMask, xK_p ), spawn "gmrun") - - -- close focused window - , ((modMask .|. shiftMask, xK_c ), kill) - - -- Rotate through the available layout algorithms - , ((modMask, xK_space ), sendMessage NextLayout) - - -- Reset the layouts on the current workspace to default - , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) - - -- Resize viewed windows to the correct size - , ((modMask, xK_n ), refresh) - - -- Move focus to the next window - , ((modMask, xK_Tab ), windows W.focusDown) - - -- Move focus to the next window - , ((modMask, xK_j ), windows W.focusDown) - - -- Move focus to the next window - , ((modMask .|. shiftMask, xK_n ), sendMessage MirrorShrink) - - -- Move focus to the previous window - , ((modMask, xK_k ), windows W.focusUp ) - - -- Move focus to the next window - , ((modMask .|. shiftMask, xK_t ), sendMessage MirrorExpand) - - -- Move focus to the master window - , ((modMask, xK_m ), windows W.focusMaster ) - - -- Swap the focused window and the master window - , ((modMask, xK_Return), windows W.swapMaster) - - -- Swap the focused window with the next window - , ((modMask .|. shiftMask, xK_j ), windows W.swapDown ) - - -- Swap the focused window with the previous window - , ((modMask .|. shiftMask, xK_k ), windows W.swapUp ) - - -- Shrink the master area - , ((modMask, xK_h ), sendMessage Shrink) - - -- Expand the master area - , ((modMask, xK_l ), sendMessage Expand) - - -- Push window back into tiling - , ((modMask, xK_t ), withFocused $ windows . W.sink) - - -- Increment the number of windows in the master area - , ((modMask , xK_comma ), sendMessage (IncMasterN 1)) - - -- Deincrement the number of windows in the master area - , ((modMask , xK_period), sendMessage (IncMasterN (-1))) +myKeys = + -- Window management + [ ((modMask .|. shiftMask, xK_n ), sendMessage MirrorShrink) -- %! Expand current window + , ((modMask .|. shiftMask, xK_t ), sendMessage MirrorExpand) -- %! Shrink current window -- Bring dzen to the front - , ((modMask .|. shiftMask, xK_b ), spawn "ps -U hunner|grep dzen2|awk '{print $1}'|xargs kill -USR1") + , ("M-S-b", spawn "ps -U hunner|grep dzen2|awk '{print $1}'|xargs kill -USR1") -- Toggle the border of the currently focused window , ((modMask , xK_b ), withFocused toggleBorder) - -- toggle the status bar gap - -- TODO, update this binding with avoidStruts , ((modMask , xK_b ), - -- Gridselect to pick windows - --, ((modMask , xK_f ), (gridselect defaultGSConfig) >>= (\w -> case w of - -- Just w -> windows (bringWindow w) >> focus w >> windows W.shiftMaster - -- Nothing -> return ())) - , ((modMask , xK_g ), goToSelected defaultGSConfig) + --, ((modMask , xK_g ), goToSelected defaultGSConfig) + --, ((modMask , xK_g ), goToSelected gsconfig3) + , ((modMask , xK_a ), warpToCentre >> wsgrid) - -- Quit xmonad - , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) - - -- Restart xmonad - , ((modMask , xK_q ), restart "xmonad" True) + -- Goes to window or bring up window + , ((modMask .|. shiftMask, xK_g ), gotoMenu) + , ((modMask .|. shiftMask, xK_b ), bringMenu) ] ++ - - -- - -- mod-[1..9], Switch to workspace N - -- mod-shift-[1..9], Move client to workspace N - -- + -- mod-[1..9] %! Switch to workspace N + -- mod-shift-[1..9] %! Move client to workspace N [((m .|. modMask, k), windows $ f i) | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9] , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]] ++ - - -- - -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3 - -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3 - -- + -- mod-{w,e,r} %! Switch to physical/Xinerama screens 1, 2, or 3 + -- mod-shift-{w,e,r} %! Move client to screen 1, 2, or 3 [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) - | (key, sc) <- zip [xK_o, xK_e, xK_u] [0..] + | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..] , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] +{- +[10:28] dschoepe : gets (map W.tag . W.workspaces . windowset) should work +[10:28] aavogt : dschoepe: yeah +[10:31] aavogt : somewhat useful variation on that is: +[10:32] aavogt : gets $ map W.tag . uncurry (++) . partition (isJust . W.stack) . W.workspaces . windowset +[10:32] aavogt : to put the populated ones towards the inside +[10:33] aavogt : unfortunately, it is a bit more awkward to supply those ones with a different color +[10:34] aavogt : needs imports of Data.List and Data.Maybe +-} +warpToCentre = gets (W.screen . map W.tag . W.workspaces . windowset) >>= \x -> warpToScreen x 0.5 0.5 + +wsgrid = gridselect gsConfig =<< asks (map (\x -> (x,x)) . workspaces . config) +--promptedGoto = wsgrid >>= flip whenJust (switchTopic myTopicConfig) +--promptedShift = wsgrid >>= \x -> whenJust x $ \y -> windows (W.greedyView y . W.shift y) + +{- +-- | Like `gridSelect' but with the current windows and their titles as elements +gridselectWorkspace :: GSConfig W.Workspace -> X (Maybe W.Workspace) +gridselectWorkspace gsconf = workspaceMap >>= gridselect gsconf + +workspaceMap :: X [(String,W.Workspace)] +workspaceMap = do + ws <- gets workspaceset + wins <- mapM keyValuePair (W.workspaces ws) + return wins + where keyValuePair w = flip (,) w `fmap` decorateName' w + +decorateName' :: W.workspace -> X String +decorateName' w = do + fmap show $ getName w +-} + +{- +gsConfig = defaultGSConfig { gs_navigate = neiu `M.union` gs_navigate (defaultGSConfig`asTypeOf`gsConfig) } + where neiu = M.insert (0,xK_space) (const (0,0)) $ M.map (\(x,y) (a,b) -> (x+a,y+b)) $ M.fromList + [((0,xK_n),(-1,0)) + ,((0,xK_e),(0,1)) + ,((0,xK_i),(1,0)) + ,((0,xK_u),(0,-1))] +-} + +gsConfig = defaultGSConfig + { gs_navigate = M.unions + [reset + ,nethackKeys + ,gs_navigate -- get the default navigation bindings + $ defaultGSConfig `asTypeOf` gsConfig -- needed to fix an ambiguous type variable + ] + } + where addPair (a,b) (x,y) = (a+x,b+y) + nethackKeys = M.map addPair $ M.fromList + [((0,xK_y),(-1,-1)) + ,((0,xK_u),(1,-1)) + ,((0,xK_b),(-1,1)) + ,((0,xK_n),(1,1)) + ] + -- jump back to the center with the spacebar, regardless of the current position. + reset = M.singleton (0,xK_space) (const (0,0)) ------------------------------------------------------------------------ -- Mouse bindings: default actions bound to mouse events -- @@ -242,6 +215,8 @@ myManageHook = composeAll [ className =? "MPlayer" --> doFloat , title =? "VLC media player" --> doFloat , className =? "Gimp" --> doFloat + , className =? "Anki" --> doFloat + , className =? "Skype" --> doFloat , className =? "googleearth" --> doFloat , className =? "Pidgin" --> doFloat , className =? "mangclient" --> doFloat @@ -275,61 +250,25 @@ pickyFocusEventHook e@(CrossingEvent {ev_window = w, ev_event_type = t}) where shouldFollow = (/="Cellwriter") `fmap` className pickyFocusEventHook _ = return $ All True ------------------------------------------------------------------------- --- Status bars and logging - --- Perform an arbitrary action on each internal state change or X event. --- See the 'DynamicLog' extension for examples. --- --- To emulate dwm's status bar --- --- > logHook = dynamicLogDzen --- -myLogHook = return () - ------------------------------------------------------------------------- --- Startup hook - --- Perform an arbitrary action each time xmonad starts or is restarted --- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize --- per-workspace layout choices. --- --- By default, do nothing. -myStartupHook = return () - ------------------------------------------------------------------------- --- Now run xmonad with all the defaults we set up. - --- Run xmonad with the settings you specify. No need to modify this. +-- Run xmonad! -- main = xmonad defaults --- A structure containing your configuration settings, overriding --- fields in the default config. Any you don't override, will --- use the defaults defined in xmonad/XMonad/Config.hs --- --- No need to modify this. --- ---xmonad defaultConfig { handleEventHook = pickyFocusEventHook } -defaults = defaultConfig { - -- simple stuff - terminal = myTerminal, - focusFollowsMouse = myFocusFollowsMouse, - borderWidth = myBorderWidth, - modMask = myModMask, - numlockMask = myNumlockMask, - workspaces = myWorkspaces, - normalBorderColor = myNormalBorderColor, - focusedBorderColor = myFocusedBorderColor, +defaults = defaultConfig + { -- simple stuff + , terminal = myTerminal + , focusFollowsMouse = myFocusFollowsMouse + , borderWidth = myBorderWidth + , modMask = myModMask + , workspaces = myWorkspaces + , normalBorderColor = myNormalBorderColor + , focusedBorderColor = myFocusedBorderColor - -- key bindings - keys = myKeys, - mouseBindings = myMouseBindings, + , -- key bindings + , mouseBindings = myMouseBindings - -- hooks, layouts - layoutHook = myLayout, - manageHook = myManageHook, - logHook = myLogHook, - startupHook = myStartupHook, - handleEventHook = pickyFocusEventHook - } + , -- hooks, layouts + , layoutHook = myLayout + , manageHook = myManageHook + , handleEventHook = pickyFocusEventHook + } `additionalKeysP` myKeys