From fcd1461e068de8f24bf0f144b930088c9f464d89 Mon Sep 17 00:00:00 2001 From: Trey Blancher Date: Fri, 14 May 2021 19:13:28 -0400 Subject: [PATCH] Added xmonad.hs for multiple bottom docks problem --- 2021-05-14_xmonad.hs | 593 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100755 2021-05-14_xmonad.hs diff --git a/2021-05-14_xmonad.hs b/2021-05-14_xmonad.hs new file mode 100755 index 0000000..fb9f7d4 --- /dev/null +++ b/2021-05-14_xmonad.hs @@ -0,0 +1,593 @@ +{-# LANGUAGE DeriveDataTypeable #-} +{-# LANGUAGE DeriveDataTypeable #-} +import XMonad +import XMonad.Config.Desktop +-- Actions +import XMonad.Actions.CycleWS +import XMonad.Actions.DynamicWorkspaces as DW +import XMonad.Actions.GridSelect +import XMonad.Actions.OnScreen +import XMonad.Actions.SpawnOn +import XMonad.Actions.UpdatePointer +import XMonad.Actions.WindowGo +import XMonad.Actions.WorkspaceNames hiding (workspaceNamesPP) + +-- Data +import Data.List +import Data.Monoid +import Data.Ratio +import qualified Data.Map as M + +-- Hooks +import XMonad.Hooks.DynamicLog +import XMonad.Hooks.EwmhDesktops +import XMonad.Hooks.FadeInactive +import XMonad.Hooks.ManageDocks +import XMonad.Hooks.ManageHelpers +import XMonad.Hooks.SetWMName + +-- Layout +import XMonad.Layout +import XMonad.Layout.IM as IM -- GIMP stuff +import qualified XMonad.Layout.IndependentScreens as IS +import XMonad.Layout.LayoutHints (layoutHints) +import XMonad.Layout.NoBorders (smartBorders, noBorders) +import XMonad.Layout.PerWorkspace +import XMonad.Layout.Reflect -- GIMP stuff +import XMonad.Layout.ResizableTile +import XMonad.Layout.SimpleFloat +import XMonad.Layout.Tabbed +import XMonad.Layout.TrackFloating -- GIMP stuff + +-- Util +import XMonad.Util.EZConfig +import XMonad.Util.Font +import XMonad.Util.Loggers +import XMonad.Util.Paste +import XMonad.Util.Run +import XMonad.Util.Ungrab +import XMonad.Util.WorkspaceCompare +import qualified XMonad.Util.ExtensibleState as XS + +-- Miscellaneous +import Control.Applicative +import Control.Monad (liftM) +import Graphics.X11.ExtraTypes.XF86 +import System.IO +import System.Exit +import XMonad.Operations +import XMonad.Prompt +import XMonad.Prompt.Window +import qualified Codec.Binary.UTF8.String as UTF8 +--import qualified DBus as D +--import qualified DBus.Client as D +import qualified XMonad.StackSet as W + + +-- DynamicWorkspaces Stuff +filterWorkspaces :: [WorkspaceId] -> [WindowSpace] -> [WindowSpace] +filterWorkspaces ws = filter (\(W.Workspace tag _ _) -> tag `elem` ws) + -- xScreen are the type classes which hold the workspace name lists +newtype LeftScreen = LeftScreen {getLeftScreen :: [WorkspaceId]} deriving (Typeable,Read,Show) +instance ExtensionClass LeftScreen where + initialValue = LeftScreen [] + extensionType = PersistentExtension + +newtype CenterScreen = CenterScreen {getCenterScreen :: [WorkspaceId]} deriving (Typeable,Read,Show) +instance ExtensionClass CenterScreen where + initialValue = CenterScreen [] + extensionType = PersistentExtension + +newtype RightScreen = RightScreen {getRightScreen :: [WorkspaceId]} deriving (Typeable,Read,Show) +instance ExtensionClass RightScreen where + initialValue = RightScreen [] + extensionType = PersistentExtension + + +-- End DynamicWorkspaces code (keybindings are below) -- +getTopBar :: Int -> String +getTopBar sc = if sc == 1 + then "dzen2 -dock -p -x 0 -ta l -w 1024 -e 'onstart:lower;button2=togglehide;sigusr1=togglehide'" + else "dzen2 -dock -p -x 1920 -ta l -w 1024 -e 'onstart:lower;button2=togglehide;sigusr1=togglehide'" + +getTennessineBar :: Int -> String +getTennessineBar sc = if sc == 1 + then "ssh tennessine 'conky' | dzen2 -dock -p -x 0 -y -1 -ta l -w 1920 -e 'sigusr1=togglehide'" + else "ssh tennessine 'conky' | dzen2 -dock -p -x 1920 -y -1 -ta l -w 1920 -e 'sigusr1=togglehide'" + +getFerrumBar :: Int -> String +getFerrumBar sc = if sc == 1 + then "conky | dzen2 -dock -p -x 0 -y -38 -ta l -w 1920 -e 'sigusr1=togglehide'" + else "conky | dzen2 -dock -p -x 1920 -y -38 -ta l -w 1920 -e 'sigusr1=togglehide'" + +toggleHomeScreens :: X () +toggleHomeScreens = do + sc <- IS.countScreens + if sc == 1 + then do + --spawn "xrandr --output DVI-I-2-1 --off --output DVI-I-3-2 --off" + spawn "while true; do \n\ + \~/bin/battery; \n\ + \echo -n ' '; \n\ + \~/bin/temp.sh; \n\ + \echo -n ' '; \n\ + \date \"+%a, %b %d %T\"; \n\ + \/usr/bin/sed -E \"s/($(date +%_d)\b)/^fg(green)\1^fg()/\" ; \n\ + \sleep 1; \n\ + \done | dzen2 -dock -p -x 1600 -w 325 -u -h 24 -ta r -sa c -e 'sigusr1=togglehide'&" + + else if sc == 3 + then do + spawn "xrandr --output eDP-1-1 --primary --auto --output DVI-I-3-2 --auto --left-of eDP-1-1 --output DVI-I-2-1 --auto --right-of eDP-1-1" +-- spawn "xrandr --output eDP-1-1 --primary --auto --output DVI-I-2-1 --auto --left-of eDP-1-1 --output DVI-I-3-2 --auto --right-of eDP-1-1" + spawn "while true; do \n\ + \~/bin/battery; \n\ + \echo -n ' '; \n\ + \~/bin/temp.sh; \n\ + \echo -n ' '; \n\ + \date '+%a, %b %d %T'; \n\ + \sleep 1; \n\ + \done | dzen2 -dock -p -x 1602 -w 325 -h 24 -ta l -fg #aaaaaa -bg #000000 -fn 'xos4 Terminus:style=Regular:Pixelsize=12' &" + spawn "while true; do \n\ + \~/bin/battery; \n\ + \echo -n ' '; \n\ + \~/bin/temp.sh; \n\ + \echo -n ' '; \n\ + \date '+%a, %b %d %T'; \n\ + \sleep 1; \n\ + \done | dzen2 -dock -p -x 3522 -w 325 -h 24 -ta l -fg #aaaaaa -bg #000000 -fn 'xos4 Terminus:style=Regular:Pixelsize=12' &" + spawn "while true; do \n\ + \~/bin/battery; \n\ + \echo -n ' '; \n\ + \~/bin/temp.sh; \n\ + \echo -n ' '; \n\ + \date '+%a, %b %d %T'; \n\ + \sleep 1; \n\ + \done | dzen2 -dock -p -x 5442 -w 325 -h 24 -ta l -fg #aaaaaa -bg #000000 -fn 'xos4 Terminus:style=Regular:Pixelsize=12' &" +{- spawn "while true; do echo -n $(cat /tmp/temp); echo -n ' '; date '+%a, %b %d %T'; sleep 1; done | dzen2 -dock -p -x 1710 -w 210 -e 'onstart:lower;button2=togglehide' -h 24 -ta l -fg #aaaaaa -bg #000000 -fn Terminus-10 -xs 1 &" + spawn "while true; do echo -n $(cat /tmp/temp); echo -n ' '; date '+%a, %b %d %T'; sleep 1; done | dzen2 -dock -p -x 3630 -w 210 -e 'onstart:lower;button2=togglehide' -h 24 -ta l -fg #aaaaaa -bg #000000 -fn Terminus-10 -xs 0 &" + spawn "while true; do echo -n $(cat /tmp/temp); echo -n ' '; date '+%a, %b %d %T'; sleep 1; done | dzen2 -dock -p -x 5550 -w 210 -e 'onstart:lower;button2=togglehide' -h 24 -ta r -fg #aaaaaa -bg #000000 -fn Terminus-10 -xs 2 &" -} + else + return () + + +-- get these with xprop +myManageHook = composeAll + [ isDialog --> doFloat + , className =? "Gnome-dictionary" --> doFloat + , className =? "Xfce4-dict" --> doFloat + , className =? "Goldendict" --> doFloat + , className =? "Last.fm" --> doFloat + , className =? "Xmessage" --> doFloat + , className =? "Audacious" --> doFloat + --, className =? "Gimp" --> doFloat + , className =? "Skype" --> doFloat + , className =? "Keepassx" --> doFloat + , className =? "Kcalc" --> doFloat + , className =? "Clementine" --> doFloat + , className =? "SpiderOak" --> doFloat + , className =? "Pavucontrol" --> doFloat + , className =? "Gnome-calendar" --> doFloat + +{- The following sets doFloat on the Orage window (as above) + But also ensures that it appears only on the left screen + (screen 0). (screenWorkspace 0) returns X (Maybe WorkspaceId), + and the liftX function lifts an X action to a Query (which is + Maybe WorkspaceId) and the next lines return the workspace (if +not empty), or do nothing if (Maybe WorkspaceId) -> Nothing. +idHook maps to mempty, which means do nothing +-} + , className =? "Orage" --> doFloat + <+> do + ws <- liftX (screenWorkspace 0) + case ws of + Just w -> doShift w + Nothing -> idHook + -- end Orage window stuff + + -- Weather report stuff + , className =? "Wrapper" --> doFloat + <+> do + ws <- liftX (screenWorkspace 0) + case ws of + Just w -> doShift w + Nothing -> idHook + -- end Weather Report window stuff + + + -- , className =? "Plasma-desktop" --> doFloat + -- <+> do + -- ws <- liftX (screenWorkspace 0) + -- case ws of + -- Just w -> doShift w + -- Nothing -> idHook + -- end Plasma desktop stuff + + , className =? "Xfce4-notifyd" --> doIgnore + , manageDocks + ] + + +--shiftInsert w = +-- let translatedProgs = ["Chromium", "Chrome"] +-- in do +-- c <- runQuery className w; +-- let toTranslate = any (== c) translatedProgs +-- if toTranslate then spawn ("CLIP=$(xclip -out -selection clipboard); xclip -out" +-- ++ " | xclip -in -selection clipboard; xdotool key --clearmodifiers --window " +-- ++ show w ++ " ctrl+v; echo -n $CLIP | xclip -in -selection clipboard") +-- else sendKey shiftMask xK_Insert + +layoutH = layoutHints + -- $ onWorkspace "5:" (Mirror tiled2 + -- ||| tiled ||| Full) + -- $ onWorkspaces ["1:wkbr","2:wksh"] (Full + -- ||| tiled ||| Mirror tiled) + $ Full + ||| Mirror tiled + ||| tabbed shrinkText myTheme + ||| tiled + where + tiled = Tall 1 (3 % 100) (1/2) + --tiled2 = Tall 1 (3 % 100) (5 % 9) + +myTheme :: Theme +myTheme = defaultTheme { + fontName = myFont +} +myFont = "xft:Terminus:style=Regular:Pixelsize=12" + +fadeHook = fadeInactiveLogHook fadeAmount + where fadeAmount = 0.8 + +makeLauncher yargs run exec close = concat + ["exe=`yegonesh ", yargs, "` && ", run, " ", exec, "$exe", close] + +--launcher = makeLauncher "-x -- -nf grey -nb black -fn 'xos4 Terminus:Pixelsize=8'" "eval" "\"exec " "\"" +launcher = makeLauncher "-x" "eval" "\"exec " "\"" + + +main = do + sc <- IS.countScreens + dzenTopBar <- spawnPipe (getTopBar sc) + dzenTennessineBar <- spawnPipe (getTennessineBar sc) + dzenFerrumBar <- spawnPipe (getFerrumBar sc) + xmonad $ docks $ ewmh $ desktopConfig { + workspaces = ["shell","vivaldi","pindrop","kofc","VM"] + , terminal = myTerminal + , focusFollowsMouse = True + , manageHook = manageDocks <+> myManageHook <+> manageHook desktopConfig + , handleEventHook = docksEventHook <+> handleEventHook desktopConfig + , layoutHook = avoidStruts $ layoutH + , logHook = myLogHook dzenTopBar >> fadeHook >> updatePointer (0.5, 0.5) (0, 0) + , borderWidth = 1 + , normalBorderColor = "#333333" + , focusedBorderColor = "#CCCC00" + , modMask = winKey + , startupHook = docksStartupHook <+> myStartup + } `additionalKeys` myKeys + + +myStartup :: X () +myStartup = do + --setWMName "LG3D" + toggleHomeScreens + spawn "trayer --edge top --align right --widthtype request --margin 318 --expand false --SetDockType true --SetPartialStrut false --tint 0x000000 --transparent true --alpha 0 --height 24 --monitor 'primary'" + --spawn "gnome-gmail-notifier" + spawn "xset dpms 600" + --spawn "xautolock -secure -time 10 -locker 'i3lock -c 000000 -i /home/trey/images/black.png'" + spawn "xautolock -secure -time 10 -locker 'i3lock -c 000000'" + +myBitmapsDir = "/home/trey/.xmonad/dzen2" +--centerBar = fmap getCenterBar IS.countScreens +--bottomBar = fmap getBottomBar IS.countScreens + +--leftBar = "dzen2 -w 0 -h 24 -ta l -fg #555753 -bg #000000 -fn Terminus-10 -xs 1" + +-- rightBar = "dzen2 -w 3840 -h 24 -ta r -fg #555753 -bg #000000 -fn Terminus-10 -xs 2" + +myLogHook :: Handle -> X () +myLogHook h = dynamicLogWithPP $ defaultPP + { + ppCurrent = dzenColor "#8AE234" "#000000" . pad + , ppVisible = dzenColor "#555753" "#000000" . pad + , ppHidden = dzenColor "#999999" "#000000" . pad + , ppHiddenNoWindows = dzenColor "#555753" "#000000" . pad + , ppUrgent = dzenColor "#cc0000" "#000000" . pad + , ppWsSep = "." + , ppSep = " | " + , ppLayout = dzenColor "#660000" "#000000" . + (\x -> case x of + "Tall" -> "^i(" ++ myBitmapsDir ++ "/tall.xbm)" + "Mirror Tall" -> "^i(" ++ myBitmapsDir ++ "/mtall.xbm)" + "Full" -> "^i(" ++ myBitmapsDir ++ "/full.xbm)" + "Simple Float" -> "~" + "IM Grid" -> "IM" + _ -> x + ) + , ppTitle = ("" ++) . dzenColor "#ff6600" "#000000" . dzenEscape + , ppOutput = hPutStrLn h + } + +winKey :: KeyMask +winKey = mod4Mask + +lAlt :: KeyMask +lAlt = mod1Mask + +{-Multiline comment for reference +winKey :: KeyMask +winKey :: KeyMask-} + +--myTerminal :: String +--myTerminal = "konsole" +--myTerminal = "ssh-agent urxvtc -cd ~" +myTerminal = "alacritty" +--myTerminal = "terminator" +--altTerminal = "urxvtc -cd ~ -name altUrxvt4 + +--myTerminal = "gnome-terminal" +--myTerminal = "terminator" + +{-slotWksp = ["1:main", "2:jobs", "3:is660","4:office","5:sysadmin","6:irc","7:digium", "8:vm","9:dump","0:music","F1:man","F2:jobs","F3:isovr","F4:offovr","F5:sysovr","F6:ircovr","F7:dgmovr","F8:vmovr","F9:dmpovr","F10:musovr"] + +leftWksp = ["01:main","02:jobs","03:is660","04:office","05:sysadmin","06:irc","07:digium","08:vm","09:dump","10:music"] + +rightWksp = [ + "F1:man" + , "F2:jobs" + , "F3:isovr" + , "F4:offovr" + , "F5:sysovr" + , "F6:ircovr" + , "F7:dgmovr" + , "F8:vmovr" + , "F9:dmpovr" + , "F10:musovr" +]-} + + +{- Many of the key combinations below match or are analogs of key combinations + - in Windows. This is to keep the amount of mental context switching to a + - minimum. + - + -} +myKeys = [ + --((winKey , xK_t), withFocused $ windows . W.sink) -- Push window back into tiling (default) + ((winKey .|. shiftMask, xK_t), withFocused $ windows . W.sink) -- Push window back into tiling + --, ((winKey , xK_l), spawnHere "xscreensaver-command --lock && sleep 3 && xset dpms force off") + --, ((winKey , xK_l), spawnHere "gnome-screensaver-command --lock && sleep 10 && xset dpms force off") + --, ((winKey , xK_l), spawnHere "dm-tool lock") + , ((winKey , xK_l), spawnHere "i3lock --color 000000 -i /home/trey/images/black.png && sleep 3 && xset dpms force off") +-- , ((winKey , xK_l), spawnHere "light-locker-command --lock && sleep 10 && xset dpms force off") +-- , ((winKey , xK_l), spawnHere "dm-tool lock && sleep 3 && xset dpms force off") +-- ((winKey , xK_l), spawnHere "xscreensaver-command --lock") +-- ((winKey , xK_l), spawnHere "qdbus org.kde.krunner /ScreenSaver Lock") + , ((winKey , xK_Return), do + windows (viewOnScreen 0 "shell") + --ifWindows (resource =? "main") (mapM_ focus) (spawnHere myTerminal)) + ifWindows (resource =? "Alacritty") (mapM_ focus) (spawnHere myTerminal)) + , ((controlMask .|. lAlt, xK_BackSpace), (spawnHere "xfdesktop --quit")) + , ((controlMask .|. lAlt, xK_Delete), (spawnHere "pkill -9 chromium")) + , ((controlMask .|. shiftMask, xK_Return), (spawnHere myTerminal)) + , ((controlMask .|. shiftMask, xK_3), spawn "scrot --exec 'mkdir -p ~/Desktop && mv $f ~/Desktop' && paplay ~/wav/camera.wav") + , ((controlMask .|. shiftMask, xK_4), unGrab >> spawn "scrot --exec 'mkdir -p ~/Desktop && mv $f ~/Desktop' --select && paplay ~/wav/camera.wav") + -- windows (viewOnScreen 1 "ws") + -- ifWindows (resource =? "altUrxvt") (mapM_ focus) (spawnHere altTerminal)) + , ((lAlt, xK_v), spawn "clipmenu && xdotool key Ctrl+v") + --, ((winKey .|. shiftMask, xK_v), do + -- windows (viewOnScreen 1 "virtualbox") + -- ifWindows (className =? "Gvim") (mapM_ focus) (spawnHere "gvim")) + --, ((winKey , xK_v), do + -- windows (viewOnScreen 1 "timetracker") + -- ifWindows (title =? "osmium:timetracker") (mapM_ focus) (spawnHere "urxvtc -cd ~/timetracker -e 'tmux attach -t timetracker || tmux -2 new-session -s timetracker'")) + --, ((lAlt , xK_v), spawnHere "xfce4-popup-clipman") + --, ((winKey , xK_x), windowPromptGoto dXPConfig) + , ((winKey .|. shiftMask, xK_x), windowPromptBring dXPConfig) + --, ((winKey .|. shiftMask, xK_Return), windows W.swapMaster) + --, ((winKey .|. shiftMask, xK_Return), spawnHere myTerminal) + , ((winKey , xK_b), do + spawnHere "pkill -USR1 dzen2" + spawnHere "pkill trayer" + sendMessage $ ToggleStrut U) + , ((lAlt , xK_g), spawnHere "~/bin/google_selection.sh") + --, ((winKey , xK_g), ifWindows (className =? "Google-chrome") (mapM_ focus) (spawnHere "google-chrome")) + , ((winKey , xK_g), ifWindows (className =? "Google-chrome") (mapM_ focus) (spawnHere "google-chrome-stable")) + --, ((winKey , xK_r), do + -- windows (viewOnScreen 1 "wb") + -- ifWindows (className =? "Google-chrome-stable") (mapM_ focus) (spawnHere "google-chrome-stable")) + --ifWindows (className =? "Google-chrome") (mapM_ focus) (spawnHere "chromium --user-data-directory=~/work/avoxi/chromium")) +--, ((winKey , xK_g), spawnHere "google-chrome --purge-memory-button ") + --, ((winKey , xK_i), spawnHere "iceweasel") + --, ((winKey , xK_i), spawnHere "clementine") + , ((winKey , xK_i), ifWindows (className =? "Clementine") (mapM_ killWindow) (spawnHere "clementine")) +-- , ((winKey , xK_d ), ifWindows (className =? "Goldendict") (mapM_ killWindow) (spawnHere "goldendict")) +-- , ((winKey , xK_d), ifWindows (className =? "Xfce4-dict") (mapM_ killWindow) (spawnHere "xfce4-dict")) + , ((winKey , xK_d), ifWindows (className =? "Gnome-dictionary") (mapM_ killWindow) (spawnHere "gnome-dictionary")) + , ((winKey , xK_f), spawnHere (myTerminal ++ " -e vifm . ~")) + --, ((winKey , xK_f), spawnHere ("export SHELL=/bin/bash && " ++ myTerminal ++ " -e mc")) + --, ((winKey , xK_e), spawnHere ("export SHELL=/bin/bash && " ++ myTerminal ++ " -e mc")) -- key stroke matches Win+E (from Win7) + , ((winKey , xK_o), do + --windows (viewOnScreen 0 "of") + ifWindows (fmap("libreoffice" `isPrefixOf`) className) (mapM_ focus) (spawnHere "libreoffice")) + -- , ((winKey , xK_o), do + -- windows (viewOnScreen 1 "rbank") + -- ifWindows (className =? "Opera") (mapM_ focus) (spawnHere "opera")) +-- , ((winKey .|. controlMask , xK_a), spawnHere "/home/trey/launchers/airdroid.desktop") +-- , ((winKey , xK_s), do + -- windows (viewOnScreen 1 "hng") + -- ifWindows (className =? "Skype") (mapM_ focus) (spawnHere "skype")) + , ((winKey , xK_s), ifWindows (className =? "Pavucontrol") (mapM_ killWindow) (spawnHere "pavucontrol")) + , ((winKey , xK_c), kill) + , ((winKey .|. controlMask , xK_c), spawn "gnome-calendar") + --, ((winKey , xK_m), windows W.focusMaster) + , ((winKey , xK_comma), sendMessage (IncMasterN 1)) + , ((winKey , xK_period), sendMessage (IncMasterN (-1))) + , ((winKey , xK_j), windows W.focusDown) -- explicitly setting the default + , ((winKey .|. controlMask, xK_j), windows W.swapDown) -- explicitly setting the default + , ((winKey , xK_k), windows W.focusUp) -- explicitly setting the default + , ((winKey .|. controlMask, xK_k), windows W.swapUp) -- explicitly setting the default + , ((lAlt , xK_Tab), windows W.focusDown) -- replicating MS Windows task switcher behavior + , ((winKey , xK_Tab), goToSelected defaultGSConfig) + , ((lAlt .|. shiftMask, xK_Tab), windows W.focusUp) -- replicating MS Windows task switcher behavior + , ((winKey .|. controlMask, xK_Return), windows W.swapMaster) + , ((winKey, xK_space ), sendMessage NextLayout) + --, ((winKey .|. shiftMask, xK_space), setLayout $ XMonad.layoutHook conf) -- the default, commented here for documentation and posterity + , ((winKey , xK_p), spawnHere launcher) + , ((winKey .|. shiftMask, xK_p), spawnHere "gmrun") + --, ((winKey .|. controlMask , xK_d), spawn ("sleep 1 && date +%F | tr -d '\n' | ~/bin/genxmacro | xmacroplay -d 0.1 $DISPLAY")) + --, ((controlMask .|. shiftMask , xK_d), spawn ("sleep 1 && date '+%F %T %p: ' | tr -d '\n' | ~/bin/genxmacro | xmacroplay -d 0.1 $DISPLAY")) + --, ((winKey .|. controlMask , xK_k), spawn ("sleep 1 && cat ~/.macros/code.macro | xmacroplay -d 0.1 $DISPLAY")) + --, ((shiftMask, xK_Insert), withFocused shiftInsert) + --, ((controlMask, xK_n), raiseMaybe (spawnHere myTerminal) (className =? "URxvt")) + , ((winKey , xK_Print), spawnHere "xfce4-screenshooter") + , ((winKey , xK_Left), prevWS) + , ((winKey , xK_Right), nextWS) + , ((winKey , xK_Up), spawnHere "skippy-xd") + --, ((0, xF86XK_Calculator), spawnHere "/home/trey/bin/calc") + --, ((0, xF86XK_Calculator), ifWindows (className =? "Gcalctool") (mapM_ killWindow) (spawnHere "gcalctool")) + , ((0, xF86XK_Calculator), ifWindows (className =? "Gnome-calculator") (mapM_ killWindow) (spawnHere "gnome-calculator")) + , ((0, xF86XK_AudioPlay), spawn "clementine --play-pause") + --, ((0, xF86XK_AudioMute), spawn "amixer -c 0 set Master toggle") + , ((0, xF86XK_AudioMute), spawn "pamixer --toggle-mute") + , ((0, xF86XK_AudioRaiseVolume), spawn "pamixer --increase 5") + , ((0, xF86XK_AudioLowerVolume), spawn "pamixer --decrease 5") + , ((0, xF86XK_MonBrightnessUp), spawn "sudo xbacklight -inc 5") + , ((0, xF86XK_MonBrightnessDown), spawn "sudo xbacklight -dec 5") +-- , ((winKey .|. controlMask, xK_Left), shiftToPrev >> prevWS) +-- , ((winKey .|. controlMask, xK_Right), shiftToNext >> nextWS) + , ((winKey .|. controlMask, xK_h), sendMessage Shrink) + , ((winKey .|. lAlt, xK_h), do + --windows (viewOnScreen 1 "hng") + --windows (viewOnScreen 1 "chromium") + --ifWindows (className =? "Chromium") (mapM_ focus) (spawnHere "chromium")) + windows (viewOnScreen 1 "vivaldi") + ifWindows (className =? "Vivaldi-stable") (mapM_ focus) (spawnHere "vivaldi-stable")) + --ifWindows (className =? "Iceweasel") (mapM_ focus) (spawnHere "iceweasel")) + , ((winKey .|. controlMask, xK_l), sendMessage Expand) + --, ((winKey , xK_1), windows (viewOnScreen 0 "shell")) + , ((winKey , xK_1), ifWindows (className =? "Alacritty") (mapM_ focus) (spawnHere myTerminal)) + , ((winKey , xK_2), windows (viewOnScreen 0 "chromium")) + , ((winKey , xK_a), do + windows (viewOnScreen 1 "pindrop") + --ifWindows (className =? "Pidgin") (mapM_ focus) (spawnHere "pidgin")) + ifWindows (className =? "Slack") (mapM_ focus) (spawnHere "slack")) + {- + , ((winKey , xK_2), windows (viewOnScreen 0 "02:jobs")) + , ((winKey , xK_3), windows (viewOnScreen 0 "03:is660")) + , ((winKey , xK_4), windows (viewOnScreen 0 "04:office")) + , ((winKey , xK_5), windows (viewOnScreen 0 "05:sysadmin")) + , ((winKey , xK_6), windows (viewOnScreen 0 "06:irc")) + , ((winKey , xK_7), windows (viewOnScreen 0 "07:digium")) + , ((winKey , xK_8), windows (viewOnScreen 0 "08:vm")) + , ((winKey , xK_9), windows (viewOnScreen 0 "09:dump")) + , ((winKey , xK_0), windows (viewOnScreen 0 "10:music")) + , ((winKey , xK_F1), windows (viewOnScreen 1 "F1:man")) + , ((winKey , xK_F2), windows (viewOnScreen 1 "F2:jobs")) + , ((winKey , xK_F3), windows (viewOnScreen 1 "F3:isovr")) + , ((winKey , xK_F4), windows (viewOnScreen 1 "F4:offovr")) + , ((winKey , xK_F5), windows (viewOnScreen 1 "F5:sysovr")) + , ((winKey , xK_F6), windows (viewOnScreen 1 "F6:ircovr")) + , ((winKey , xK_F7), windows (viewOnScreen 1 "F7:dgmovr")) + , ((winKey , xK_F8), windows (viewOnScreen 1 "F8:vmovr")) + , ((winKey , xK_F9), windows (viewOnScreen 1 "F9:dmpovr")) + , ((winKey , xK_F10), windows (viewOnScreen 1 "F10:musovr"))-} + , ((winKey , xK_q), spawn "killall dzen2 trayer; xmonad --recompile; xmonad --restart") + , ((winKey .|. shiftMask , xK_q), io (exitWith ExitSuccess)) + -- win+h shows the selected workspace + , ((winKey , xK_h), DW.withWorkspace myXPConfigSelect $ \wk -> do + sc <- screenBy 0 + if sc == 0 + --then XS.modify $ LeftScreen . (wk :) . getLeftScreen -- prefix to list + then XS.modify $ LeftScreen . (++ [wk]) . getLeftScreen -- append to list + --else XS.modify $ RightScreen . (wk :) . getRightScreen -- prefix to list + else XS.modify $ RightScreen . (++ [wk]) . getRightScreen -- append to list + windows $ W.view wk) + -- win+z moves the current window to the selected workspace + , ((winKey , xK_z), DW.withWorkspace myXPConfigSelect (\ws -> do + sc <- screenBy 0 + if sc == 0 + then XS.modify $ LeftScreen . nub . (ws :) . getLeftScreen -- prefix to list + else XS.modify $ RightScreen . nub . (ws :) . getRightScreen -- prefix to list + --then XS.modify $ LeftScreen . nub . (++ [ws]) . getLeftScreen -- append to list + --else XS.modify $ RightScreen . nub . (++ [ws]) . getRightScreen -- append to list + + windows $ W.shift ws + -- refresh + )) + -- win+BackSpace removes the current workspace + , ((winKey , xK_BackSpace), do + curr <- gets (W.currentTag . windowset) + sc <- screenBy 0 + if sc == 0 + then do + ws <- XS.gets getLeftScreen + XS.put (LeftScreen (filter (/= curr) ws)) + else do + ws <- XS.gets getRightScreen + XS.put (RightScreen (filter (/= curr) ws)) + DW.removeWorkspace + ) + -- win+ctrl+e renames the current workspace + , ((winKey .|. controlMask , xK_r), do + old <- gets (W.currentTag . windowset) + DW.renameWorkspace myXPConfigNew + created <- gets (W.currentTag . windowset) + sc <- screenBy 0 + if sc == 0 + then do + ws <- XS.gets getLeftScreen + XS.put (LeftScreen (filter (/= old) ws)) + --XS.modify $ LeftScreen . (created :) . getLeftScreen -- prefix to list + XS.modify $ LeftScreen . (++ [created]) . getLeftScreen -- append to list + else do + ws <- XS.gets getRightScreen + XS.put (RightScreen (filter (/= old) ws)) + --XS.modify $ RightScreen . (created :) . getRightScreen -- prefix to list + XS.modify $ RightScreen . (++ [created]) . getRightScreen -- append to list + refresh) + -- win+m creates a new workspace + , ((winKey , xK_m) , DW.withWorkspace myXPConfigNew $ \wk -> do + sc <- screenBy 0 + if sc == 0 + --then XS.modify $ LeftScreen . (wk :) . getLeftScreen -- prefix to list + then XS.modify $ LeftScreen . (++ [wk]) . getLeftScreen -- append to list + --else XS.modify $ RightScreen . (wk :) . getRightScreen -- prefix to list + else XS.modify $ RightScreen . (++ [wk]) . getRightScreen -- append to list + windows $ W.view wk) + --, ((winKey .|. shiftMask, xK_d) -- macro conflict dialog problem needs to be resolved + ] + ++ + -- Set up window -> workspace keys + [((m .|. winKey, key), screenWorkspace sc >>= flip whenJust (windows . f)) +-- | (key, sc) <- zip [xK_w, xK_r] [0..] + -- | (key, sc) <- zip [xK_Left, xK_Right] [0..] -- For arrow keys + | (key, sc) <- zip [xK_e, xK_w, xK_r] [0..] -- For w,r keys + -- | (key, sc) <- zip [xK_w, xK_r] [1,0] -- For w,r keys in backwards order + -- | (key, sc) <- zip [xK_w, xK_r] [1,0] -- For w,r keys in backwards order + , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] + + +dXPConfig = defaultXPConfig { + bgColor = "yellow" + , fgColor = "blue" + , font = myFont + +} + +myXPConfigSelect = defaultXPConfig { + bgColor = "yellow" + , fgColor = "blue" + , autoComplete = Just 0 + , showCompletionOnTab = True + , font = myFont +} + +myXPConfigNew = defaultXPConfig { + bgColor = "yellow" + , fgColor = "blue" + , autoComplete = Nothing + , showCompletionOnTab = True + , font = myFont +} +