Initial commit
This commit is contained in:
		
							
								
								
									
										265
									
								
								src/XMonad/Config/MasseR.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								src/XMonad/Config/MasseR.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,265 @@
 | 
			
		||||
{-# LANGUAGE OverloadedStrings #-}
 | 
			
		||||
module XMonad.Config.MasseR  where
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import           XMonad.Password
 | 
			
		||||
import           XMonad.CustomPrompt
 | 
			
		||||
import           XMonad.TopicSpace
 | 
			
		||||
import qualified Data.List                          as List
 | 
			
		||||
import           XMonad
 | 
			
		||||
import           XMonad.Actions.CycleWS             (swapNextScreen)
 | 
			
		||||
import           XMonad.Actions.Search
 | 
			
		||||
import           XMonad.Hooks.EwmhDesktops          (ewmh, ewmhDesktopsStartup)
 | 
			
		||||
import           XMonad.Hooks.SetWMName             (setWMName)
 | 
			
		||||
import           XMonad.Hooks.UrgencyHook           (args, dzenUrgencyHook,
 | 
			
		||||
                                                     withUrgencyHook)
 | 
			
		||||
import           XMonad.Layout.Accordion
 | 
			
		||||
import           XMonad.Layout.BinarySpacePartition (emptyBSP)
 | 
			
		||||
import           XMonad.Layout.Decoration           (Decoration,
 | 
			
		||||
                                                     DefaultShrinker)
 | 
			
		||||
import           XMonad.Layout.DwmStyle
 | 
			
		||||
import           XMonad.Layout.HintedGrid
 | 
			
		||||
import           XMonad.Layout.LayoutModifier       (ModifiedLayout)
 | 
			
		||||
import           XMonad.Layout.Master
 | 
			
		||||
import           XMonad.Layout.NoBorders            (smartBorders)
 | 
			
		||||
import           XMonad.Layout.PerWorkspace         (onWorkspace)
 | 
			
		||||
import           XMonad.Layout.Renamed
 | 
			
		||||
import           XMonad.Layout.Simplest             (Simplest)
 | 
			
		||||
import           XMonad.Layout.Spiral
 | 
			
		||||
import           XMonad.Layout.Tabbed               (TabbedDecoration,
 | 
			
		||||
                                                     Theme (..), shrinkText,
 | 
			
		||||
                                                     tabbed)
 | 
			
		||||
import           XMonad.Layout.ToggleLayouts        (ToggleLayout (..))
 | 
			
		||||
import           XMonad.Prompt.RunOrRaise           (runOrRaisePrompt)
 | 
			
		||||
import qualified XMonad.StackSet                    as W
 | 
			
		||||
import           XMonad.Util.EZConfig
 | 
			
		||||
 | 
			
		||||
import           XMonad.XMobar                             (zenburnPP)
 | 
			
		||||
 | 
			
		||||
import           Data.Monoid                        (Endo, (<>))
 | 
			
		||||
 | 
			
		||||
import           XMonad.Util.NamedScratchpad
 | 
			
		||||
import           XMonad.Util.SpawnOnce
 | 
			
		||||
 | 
			
		||||
import           System.IO                          (hClose, hPutStr)
 | 
			
		||||
import           XMonad.Actions.Navigation2D
 | 
			
		||||
import           XMonad.Util.NamedActions
 | 
			
		||||
import           XMonad.Util.Run                    (spawnPipe)
 | 
			
		||||
 | 
			
		||||
import           XMonad.Config.MasseR.ExtraConfig
 | 
			
		||||
-- import Customizations
 | 
			
		||||
 | 
			
		||||
import qualified Data.Text                          as T
 | 
			
		||||
 | 
			
		||||
import           XMonad.Hooks.DynamicLog            (statusBar)
 | 
			
		||||
 | 
			
		||||
import qualified Data.Set                           as S
 | 
			
		||||
 | 
			
		||||
spotify :: XConfig l -> NamedAction
 | 
			
		||||
spotify conf = submapName . mkNamedKeymap conf $
 | 
			
		||||
   [ ("M-p", addName "Play" $ spawn "sp play") ]
 | 
			
		||||
 | 
			
		||||
scratchpads :: [NamedScratchpad]
 | 
			
		||||
scratchpads = [
 | 
			
		||||
    NS "notes" "vim -g --role notes -c 'e ~/wikidata/index.md'" (wmRole =? "notes") nonFloating
 | 
			
		||||
    ]
 | 
			
		||||
    where wmRole = stringProperty "WM_WINDOW_ROLE"
 | 
			
		||||
 | 
			
		||||
scratchSubmaps :: XConfig l -> NamedAction
 | 
			
		||||
scratchSubmaps conf = submapName . mkNamedKeymap conf $ [
 | 
			
		||||
    ("M-n", addName "Open notes" $ namedScratchpadAction scratchpads "notes")
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
-- Search engines inside submaps
 | 
			
		||||
searchSubmaps :: XConfig l -> NamedAction
 | 
			
		||||
searchSubmaps conf =
 | 
			
		||||
    let mkBrowser = promptSearchBrowser def "qutebrowser"
 | 
			
		||||
        _googleP = addName "Search google" $ mkBrowser google
 | 
			
		||||
        ddgP = addName "Search duckduckgo" $ mkBrowser (searchEngine "duckduckgo" "http://duckduckgo.com/?q=")
 | 
			
		||||
    in submapName . mkNamedKeymap conf $
 | 
			
		||||
            [ ("d", ddgP) -- Training to use ddg again
 | 
			
		||||
            , ("g", ddgP) -- training to use ddg again
 | 
			
		||||
            ]
 | 
			
		||||
 | 
			
		||||
myNav2d :: Navigation2DConfig
 | 
			
		||||
myNav2d = def { defaultTiledNavigation = lineNavigation }
 | 
			
		||||
 | 
			
		||||
showKeybindings :: [((KeyMask, KeySym), NamedAction)] -> NamedAction
 | 
			
		||||
showKeybindings x = addName "Show keybindings" $ io $ do
 | 
			
		||||
    h <- spawnPipe "zenity --text-info --font=terminus"
 | 
			
		||||
    hPutStr h (unlines $ showKm x)
 | 
			
		||||
    hClose h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Layout
 | 
			
		||||
myTabConfig ::  Theme
 | 
			
		||||
myTabConfig = def {
 | 
			
		||||
      activeBorderColor = "#DCDCCC"
 | 
			
		||||
    , activeTextColor = "#DCDCCC"
 | 
			
		||||
    , activeColor = "#3F3F3F"
 | 
			
		||||
    , fontName = "xft:Inconsolata-9"
 | 
			
		||||
    , inactiveBorderColor = "#262626"
 | 
			
		||||
    , inactiveTextColor = "#9FAFAF"
 | 
			
		||||
    , inactiveColor = "#262626"
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(=~?) :: XMonad.Query String -> String -> XMonad.Query Bool
 | 
			
		||||
q =~? x = fmap (x `List.isInfixOf`) q
 | 
			
		||||
 | 
			
		||||
-- Manage hooks
 | 
			
		||||
-- Move programs to their workspaces
 | 
			
		||||
myManageHook :: XMonad.Query (Endo WindowSet)
 | 
			
		||||
myManageHook = composeAll $ concat [
 | 
			
		||||
      dynamicsHook
 | 
			
		||||
    , webHooks
 | 
			
		||||
    , pdfHooks
 | 
			
		||||
    , documentHooks
 | 
			
		||||
    , floatHooks
 | 
			
		||||
    , debuggerHooks
 | 
			
		||||
    , ideHooks
 | 
			
		||||
    , flowHook
 | 
			
		||||
  ]
 | 
			
		||||
  where
 | 
			
		||||
    classHook y = map (\x -> className =? x --> y)
 | 
			
		||||
    ideHooks = classHook (doShift "eclipse") [
 | 
			
		||||
            "Anypoint Studio"
 | 
			
		||||
        ]
 | 
			
		||||
    webHooks = classHook (doShift "web") [
 | 
			
		||||
          "Firefox"
 | 
			
		||||
        , "qutebrowser"
 | 
			
		||||
        , "Midori"
 | 
			
		||||
        , "chromium-browser"
 | 
			
		||||
        , "Uzbl-tabbed"
 | 
			
		||||
        , "Uzbl-core"
 | 
			
		||||
      ]
 | 
			
		||||
    pdfHooks = classHook (doShift "pdf") [
 | 
			
		||||
          "Evince"
 | 
			
		||||
        , "Okular"
 | 
			
		||||
        , "Kpdf"
 | 
			
		||||
        , "Xdvi"
 | 
			
		||||
        , ".zathura-wrapped_"
 | 
			
		||||
      ]
 | 
			
		||||
    documentHooks = classHook (doShift "documents") [
 | 
			
		||||
          "libreoffice"
 | 
			
		||||
        , "libreoffice-calc"
 | 
			
		||||
        , "Assistant"
 | 
			
		||||
        , "Bouml"
 | 
			
		||||
      ]
 | 
			
		||||
    floatHooks = classHook doFloat [
 | 
			
		||||
          "SMplayer"
 | 
			
		||||
        , "Gimp"
 | 
			
		||||
        , "MPlayer"
 | 
			
		||||
        , "Kaffeine"
 | 
			
		||||
        , "Xmessage"
 | 
			
		||||
        , "Wfica_Seamless"
 | 
			
		||||
        , "mpv"
 | 
			
		||||
      ]
 | 
			
		||||
    debuggerHooks = classHook (doShift "debugger") [
 | 
			
		||||
          "JSwat Debugger",
 | 
			
		||||
          "DBeaver"
 | 
			
		||||
      ]
 | 
			
		||||
    dynamicsHook = [title =~? "Dynamics" --> doShift "dynamics"]
 | 
			
		||||
    flowHook = [title =~? "www.flowdock.com" --> doShift "flowdock"]
 | 
			
		||||
 | 
			
		||||
myKeys :: ExtraConfig -> XConfig l -> [((KeyMask, KeySym), NamedAction)]
 | 
			
		||||
myKeys extraConfig conf =
 | 
			
		||||
    let subKeys str ks = subtitle str : mkNamedKeymap conf ks in
 | 
			
		||||
    subKeys "Actions" [ ("M-S-r", addName "foo" $ spawn "xmonad --restart")
 | 
			
		||||
                      , ("M-C-l", addName "Lock screen" $ spawn locker)] ^++^
 | 
			
		||||
    subKeys "System" [ ("<XF86Sleep>", addName "Suspend machine" $ spawn "sudo pm-suspend")
 | 
			
		||||
                     , ("<XF86AudioRaiseVolume>", addName "Increase volume" $ spawn "amixer set Master 2%+")
 | 
			
		||||
                     , ("<XF86AudioLowerVolume>", addName "Decrease volume" $ spawn "amixer set Master 2%-")
 | 
			
		||||
                     , ("M-<plus>", addName "Increase volume" $ spawn "amixer set Master 2+")
 | 
			
		||||
                     , ("M-<minus>", addName "Decrease volume" $ spawn "amixer set Master 2-")
 | 
			
		||||
                     -- , ("<XF86AudioPlay>", addName "Play/pause spotify" $ spawn "/home/masse/.local/bin/sp play")
 | 
			
		||||
                     , ("<XF86AudioPlay>", addName "Play/pause mopidy" $ spawn "mpc toggle")
 | 
			
		||||
                     , ("M-m", spotify conf)
 | 
			
		||||
                     , ("M-S-<Space>", addName "Swap screens" swapNextScreen)
 | 
			
		||||
                     , ("M-<Backspace>", addName "Kill window" kill)
 | 
			
		||||
                     -- scrot requires `unGrab`
 | 
			
		||||
                     , ("M-<Print>", addName "Take screenshot" $ spawn (screenshot . applications $ extraConfig))] ^++^
 | 
			
		||||
    subKeys "Launchers" [ ("M-S-y", addName "Open youtube" $ spawn "mpv $(clip -o)")
 | 
			
		||||
                        , ("M-S-<Return>", addName "Open terminal" $ spawn $ XMonad.terminal conf)
 | 
			
		||||
                        , ("M-n", scratchSubmaps conf)
 | 
			
		||||
                        , ("M-s", searchSubmaps conf)
 | 
			
		||||
                        , ("M-p", addName "Retrieve password" $ passPrompt def)
 | 
			
		||||
                        , ("M-S-e", addName "Open with app" xdg_open)
 | 
			
		||||
                        , ("M-e", addName "Run app" $ runOrRaisePrompt def)] ^++^
 | 
			
		||||
    subKeys "Windows" [ ("M-j", addName "Go down" $ windowGo D False)
 | 
			
		||||
                      , ("M-k", addName "Go up" $ windowGo U False)
 | 
			
		||||
                      , ("M-h", addName "Go left" $ windowGo L False)
 | 
			
		||||
                      , ("M-l", addName "Go right" $ windowGo R False)
 | 
			
		||||
                      , ("M-S-j", addName "Shift window down" $ windowSwap D False)
 | 
			
		||||
                      , ("M-S-k", addName "Shift window up" $ windowSwap U False)
 | 
			
		||||
                      , ("M-S-h", addName "Shift window left" $ windowSwap L False)
 | 
			
		||||
                      , ("M-S-l", addName "Shift window right" $ windowSwap R False)
 | 
			
		||||
                      , ("M-.", addName "Go to previous window" $ windows W.focusDown)
 | 
			
		||||
                      , ("M-,", addName "Go to next window" $ windows W.focusUp)
 | 
			
		||||
                      , ("M-S-m", addName "Swap master" $ windows W.swapMaster)
 | 
			
		||||
                      ] ^++^
 | 
			
		||||
    subKeys "Projects & Workspaces" (topicKeys' extraConfig conf) ^++^
 | 
			
		||||
    subKeys "Layout management" [ ("M-C-<Space>", addName "Toggle layout" $ sendMessage ToggleLayout)
 | 
			
		||||
                                , ("M-<Space>", addName "Next layout" $ sendMessage NextLayout)] ^++^
 | 
			
		||||
    subKeys "Resize" []
 | 
			
		||||
  where
 | 
			
		||||
    locker = "sh ~/scripts/lock.sh"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
myStartupHook :: X ()
 | 
			
		||||
myStartupHook = spawnOnce "$HOME/wminit"
 | 
			
		||||
 | 
			
		||||
masser :: ExtraConfig -> IO ()
 | 
			
		||||
masser extraConfig = xmonad =<< statusBar (bar extraConfig) zenburnPP toggleStrutsKey myConfig
 | 
			
		||||
  where
 | 
			
		||||
    toggleStrutsKey XConfig{modMask=modm} = (modm, xK_b)
 | 
			
		||||
    bar = prompt . applications
 | 
			
		||||
    myConfig = withUrgencyHook dzenUrgencyHook { args = ["-bg", "darkgreen", "-xs", "1"]} $
 | 
			
		||||
                     withNavigation2DConfig myNav2d $
 | 
			
		||||
                     ewmh $
 | 
			
		||||
                     addDescrKeys' ((mod4Mask, xK_F1), showKeybindings) (myKeys extraConfig) $
 | 
			
		||||
                     def {
 | 
			
		||||
                       modMask = mod4Mask -- Hyper
 | 
			
		||||
                       , terminal = urxvt . applications $ extraConfig
 | 
			
		||||
                       , keys = const mempty
 | 
			
		||||
                       , workspaces = let defaults = ["irc", "web", "mail"]
 | 
			
		||||
                                          external = map (T.unpack . topicName) . topics $ extraConfig
 | 
			
		||||
                                      in S.toList (S.fromList defaults <> S.fromList external)
 | 
			
		||||
                       , layoutHook = smartBorders myLayout
 | 
			
		||||
                       , clickJustFocuses = False
 | 
			
		||||
                       , startupHook = myStartupHook >> ewmhDesktopsStartup >> setWMName "LG3D"
 | 
			
		||||
                       , borderWidth = 2
 | 
			
		||||
                       , normalBorderColor = "#262626"
 | 
			
		||||
                       , focusedBorderColor = "#7F9F7F"
 | 
			
		||||
                       , manageHook = myManageHook
 | 
			
		||||
                       , focusFollowsMouse = False
 | 
			
		||||
                     }
 | 
			
		||||
    myLayout = onWorkspace "web" webLayout $
 | 
			
		||||
               onWorkspace "dynamics" webLayout $
 | 
			
		||||
               onWorkspace "pdf" pdfLayout $
 | 
			
		||||
               onWorkspace "documents" documentLayout $
 | 
			
		||||
               onWorkspace "mail" mailLayout $
 | 
			
		||||
               onWorkspace "irc" ircLayout
 | 
			
		||||
               defLayout
 | 
			
		||||
      where
 | 
			
		||||
        -- Default layout
 | 
			
		||||
        defLayout = tiled ||| tabLayout ||| readLayout ||| bspLayout ||| vimLayout ||| spiral (6/7) ||| Full
 | 
			
		||||
        ircLayout = GridRatio (4/3) False ||| emptyBSP
 | 
			
		||||
        -- Pdfs are restricted to tabs
 | 
			
		||||
        vimLayout = Mirror (mastered (1/100) (4/5) Accordion)
 | 
			
		||||
        pdfLayout =  readLayout ||| tiled ||| tabLayout
 | 
			
		||||
        readLayout = renamed [Replace "2/3"] (dwmStyle shrinkText myTabConfig (mastered (1/100) (2/3) Accordion))
 | 
			
		||||
        bspLayout = renamed [Replace "master bsp"] (dwmStyle shrinkText myTabConfig (mastered (1/100) (2/3) (Mirror emptyBSP)))
 | 
			
		||||
        -- Documents are by default tabs, but have looser restrictions
 | 
			
		||||
        documentLayout = tabLayout ||| Full ||| tiled ||| Mirror tiled
 | 
			
		||||
        -- Web is either tabbed, full, or tiled
 | 
			
		||||
        webLayout = readLayout ||| tabLayout ||| Full ||| tiled
 | 
			
		||||
        tiled = Tall nmaster delta ratio
 | 
			
		||||
        -- I need to restrict the type or type inferencer can't deduce type classes
 | 
			
		||||
        tabLayout :: ModifiedLayout (Decoration TabbedDecoration DefaultShrinker) Simplest Window
 | 
			
		||||
        tabLayout = tabbed shrinkText myTabConfig
 | 
			
		||||
        mailLayout = readLayout ||| tabLayout
 | 
			
		||||
        delta = 3/100
 | 
			
		||||
        ratio = 1/2
 | 
			
		||||
        nmaster = 1
 | 
			
		||||
							
								
								
									
										14
									
								
								src/XMonad/Config/MasseR/ExtraConfig.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/XMonad/Config/MasseR/ExtraConfig.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
{-# LANGUAGE DeriveGeneric #-}
 | 
			
		||||
module XMonad.Config.MasseR.ExtraConfig where
 | 
			
		||||
 | 
			
		||||
import GHC.Generics (Generic)
 | 
			
		||||
import Data.Text (Text)
 | 
			
		||||
 | 
			
		||||
data Applications = Applications { browser :: FilePath, launcher :: FilePath, prompt :: FilePath, screenshot :: FilePath, urxvt :: FilePath } deriving (Show, Generic)
 | 
			
		||||
 | 
			
		||||
data TopicRule = TopicRule { topicName :: Text
 | 
			
		||||
                           , topicHome :: Maybe Text
 | 
			
		||||
                           , topicAction :: Maybe Text }
 | 
			
		||||
                           deriving (Show, Generic)
 | 
			
		||||
 | 
			
		||||
data ExtraConfig = ExtraConfig { applications :: Applications, topics :: [ TopicRule ] } deriving (Show, Generic)
 | 
			
		||||
		Reference in New Issue
	
	Block a user