--
-- Miguel's Xmonad Config.
-- Last Update: 2018-05-29
--
import XMonad
import XMonad.Actions.PhysicalScreens
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Actions.SpawnOn
import XMonad.Layout.Gaps
import XMonad.Util.Run
import qualified XMonad.StackSet as W
import XMonad.Util.EZConfig
import XMonad.Hooks.SetWMName
import XMonad.Hooks.ICCCMFocus
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.UrgencyHook
import XMonad.Util.NamedWindows
import XMonad.Util.WorkspaceCompare
import System.IO
-- testing layouts
import XMonad.Layout.NoBorders
import XMonad.Layout.Accordion
import XMonad.Layout.Circle
import XMonad.Layout.Column
import XMonad.Layout.Grid
import XMonad.Layout.OneBig
import XMonad.Layout.Spiral
import XMonad.Layout.ThreeColumns
import XMonad.Layout.Tabbed
configPath="/home/miguel/git/dotfiles/xmonad"
-- DREAMS / TODO
-- notify-send replace/ always same workspace
-- bells for different apps: mutt, slrn , cmabber
-- xterm-float that will float with 80x20 chars
-- ...
-- http://xmonad.org/manpage.html
-- xmona key-bindings :
-- mod-shift-return - launch terminal
-- mod-p - launch dmenu
-- mod-shift-p - launch gmrun (!!?)
-- mod-shift-c - close focused
-- mod-space - rotate through layout algos
-- mod-shift-space - reset layout to def (!!?)
-- mod-tab / mod-shift-tab
-- mod-j/k (+shifted)
-- mod-l/h
-- mod-return
-- mod-t
-- mod-,/.
-- mod-`1234567890-=< (+shifted)
-- mod-qwer (+shifted)
-- mouse-1/2/3
-- http://pbrisbin.com/posts/using_notify_osd_for_xmonad_notifications/
data LibNotifyUrgencyHook = LibNotifyUrgencyHook deriving (Read, Show)
instance UrgencyHook LibNotifyUrgencyHook where
urgencyHook LibNotifyUrgencyHook w = do
name <- getName w
Just idx <- fmap (W.findTag w) $ gets windowset
safeSpawn "notify-send" [show name, "workspace " ++ idx]
-- TODO: would still like fullscreen flash vids to not crop and leave xmobar drawn
-- TODO: remove the red border when doing fullscreen? tried adding 'smartBorders' to the layoutHook but that didn't work
-- TODO: hook in TopicSpaces, start specific apps on specific workspaces
-- extra workspaces (used below)
--myExtraWorkspaces =
-- [
-- (xK_quoteleft, "~★"),
-- (xK_1, "1⚒"),
-- (xK_2, "2⚁"),
-- (xK_3, "3⚂"),
-- (xK_4, "4⚃"),
-- (xK_5, "5⚄"),
-- (xK_6, "6✉"),
-- (xK_7, "7⚛"),
-- (xK_8, "8♬"),
-- (xK_9, "9☎"),
-- (xK_0, "0☭"),
-- (xK_minus, "-☹"),
-- (xK_equal, "+☺"),
-- (xK_BackSpace, "<☠")
-- ]
-- | The available layouts. Note that each layout is separated by |||, which
-- denotes layout choice.||| Circle||| OneBig (3/4) (3/4) ||| spiral (1/1.61803) ||| tabbedBottom shrinkText def {fontName="xft:Sans-13:bold",decoHeight=60}
layout = tiled ||| Mirror tiled ||| noBorders Full ||| Grid ||| ThreeColMid 1 (3/100) (1/2)
where
-- default tiling algorithm partitions the screen into two panes
tiled = Tall nmaster delta ratio
-- The default number of windows in the master pane
nmaster = 1
-- Default proportion of screen occupied by master pane
ratio = 1/2
-- Percent of screen to increment by when resizing panes
delta = 3/100
myExtraWorkspaces =
[
(xK_quoteleft, "~"),
(xK_1, "1"),
(xK_2, "2"),
(xK_3, "3"),
(xK_4, "4"),
(xK_5, "5"),
(xK_6, "6"),
(xK_7, "7"),
(xK_8, "8"),
(xK_9, "9"),
(xK_0, "0"),
(xK_minus, "-"),
(xK_equal, "+"),
(xK_BackSpace, "<")
]
main = do
xmproc <- spawnPipe $ "/usr/bin/xmobar "++configPath++"/xmobarrc"
xmonad
$ withUrgencyHook LibNotifyUrgencyHook
$ docks $ ewmh defaultConfig {
-- workspaces = ["~","1","2","3","4","5","6","7","8","9","0"] ++ (map snd myExtraWorkspaces),
workspaces = (map snd myExtraWorkspaces),
borderWidth = 5,
-- focusedBorderColor = "#ff4444",
focusedBorderColor = "#0000ff",
normalBorderColor = "#777777",
-- workspaces = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n"] ,
-- ++ map show [1,2,3,4],
-- focusFollowsMouse = False,
modMask = mod4Mask,
--terminal = "urxvt",
terminal = "xterm -e tmux"
-- if you are using xmonad 0.9, you can avoid web flash videos getting cropped in fullscreen like so:
-- manageHook = ( isFullscreen --> doFullFloat ) <+> manageDocks <+> manageHook defaultConfig,
-- (no longer needed in 0.10)
,manageHook = composeAll []
--[ className =? "XTerm" --> doFloat ]
-- (className=? "qemu-system-i386" -->doShift "2")
-- <+> ( title=?"xterm-float" --> (doRectFloat$W.RationalRect 0 0 0.5 0.5) )
-- <+> manageSpawn <+> manageDocks <+> manageHook defaultConfig
,layoutHook = avoidStruts $ layout
-- ,startupHook = do
-- spawnOn "1" "xterm"
-- spawnOn "6" "xterm -e irssi"
-- spawnOn "6" "xterm -e slrn"
-- spawnOn "6" "xterm -e mutt"
-- spawnOn "9" "chromium --new-window https://people.live.com/ https://www.facebook.com/"
--spawnOn "7" "chromium --new-window http://softwarefools.com/"
-- spawn "chromium --new-window http://softwarefools.com/"
-- spawnOn "9" "skype"
-- spawnOn "9" "pidgin"
-- spawnOn "9" "nm-applet"
-- spawnOn "9" "skype --dbpath=/home/miguel/.Skype_atene"
-- setWMName "LG3D"
--,
,logHook =
takeTopFocus >>( dynamicLogWithPP $ xmobarPP
{
-- ppOrder = reverse,
ppSort = mkWsSort $ getXineramaPhysicalWsCompare horizontalScreenOrderer, --getSortByXineramaPhysicalRule def,
ppOutput = hPutStrLn xmproc,
ppTitle = xmobarColor "green" "" . shorten 50,
ppCurrent = (\x -> ""++x++""),
ppVisible = (\x -> ""++x++""),
ppHidden = (\x -> ""++x++""),
ppHiddenNoWindows = (\x -> ""++x++"")
,ppVisibleNoWindows = Just (\x-> ""++x++"")
})
} `additionalKeys`
(
[
((mod4Mask, xK_F1 ), spawn "xterm -e vim ~/.xmonad/xmonad.hs")
,((mod4Mask , xK_b ), sendMessage ToggleStruts)
, ((mod4Mask, xK_m ), spawn "notify-send \"$( fetchmail )\"")
, ((mod4Mask, xK_c ), spawn "notify-send \"$(xclip -o)\"")
, ((mod4Mask, xK_p ), spawn "dmenu_run -nb '#000' -nf '#77aaff' -sb '#77aadd' -sf black -fn '-adobe-courier-medium-r-*-*-34-*-*-*-*-*-*-*'")
-- mods-s screenshot window
-- , ((mod4Mask, xK_s ), spawn "xwd | convert - /tmp/screen.png && gimp /tmp/screen.png")
--
-- mods-s spawn surf wrapper
-- , ((mod4Mask, xK_s ), spawn "surf")
-- mods-f fullscreen screenshot
, ((mod4Mask, xK_f ), spawn "xwd -root | convert - /tmp/screen.png && gimp /tmp/screen.png")
-- mod-g - go/ jump to window
-- , ((mod4Mask, xK_g ), spawn "wmctrl -a \"$(wmctrl -l | sed s/[^[:blank:]]*..[^[:blank:]]*.[^[:blank:]]*.// | dmenu)\"")
, ((mod4Mask, xK_v ), spawn "bash -l -c \"/home/miguel/opt/vim/bin/gvim -c \\\":cd `echo -e '/home/miguel/_int/dev/FoolOs\n/home/miguel/' | dmenu` \\\" \"")
-- , ((mod4Mask, xK_q ), spawn "notify-send \"mod-q disabled\"")
, ((mod4Mask, xK_x ), spawn "slock")
, ((mod4Mask .|. shiftMask, xK_x ), spawn "ans=$(zenity --list --text 'wanna restart?' --radiolist --column 'Pick' --column 'Opinion' TRUE '' FALSE 'sudo shutdown -r now' FALSE 'sudo shutdown -h now' ); $ans")
-- , ((mod4Mask .|. shiftMask, xK_space ), spawn "xterm -e /home/miguel/bin/msrv")
-- window list
-- http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Prompt-Window.html
-- , ((mod4Mask .|. shiftMask, xK_g ), gotoMenu)
-- , ((mod4Mask .|. shiftMask, xK_b ), bringMenu)
]
-- https://wiki.haskell.org/Xmonad/Frequently_asked_questions / 3.3.3 Screens are in wrong order
++
[
((m .|. mod4Mask, key), screenWorkspace sc >>= flip whenJust (windows . f)) -- Replace 'mod1Mask' with your mod key of choice.
| (key, sc) <- zip [xK_q,xK_w, xK_e, xK_r] [3,2,0,1] -- was [0..] *** change to match your screen order ***
, (f, m) <- [(W.view, 0), (W.shift, shiftMask)]
]
--
-- mod-[1..9], Switch to workspace N
-- mod-shift-[1..9], Move client to workspace N
--
-- [((m .|. mod4Mask, k), windows $ f i)
-- | (i, k) <- zip (XMonad.workspaces defaultConfig) [xK_grave, xK_1, xK_2, xK_3, xK_4, xK_5, xK_6, xK_7, xK_8, xK_9, xK_0, xK_minus, xK_equal, xK_BackSpace]
-- , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
++
[
((mod4Mask, key), (windows $ W.greedyView ws))
| (key,ws) <- myExtraWorkspaces
]
++
[
((mod4Mask .|. shiftMask, key), (windows $ W.shift ws))
| (key,ws) <- myExtraWorkspaces
]
)