aboutsummaryrefslogtreecommitdiff
path: root/src/Main.hs
blob: 61298398b9ce2ef84639dceb3c93281459016409 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import XMonad
import Control.Exception
import XMonad.Hooks.DynamicLog
import Control.Concurrent
import XMonad.Layout.Spacing
import XMonad.Actions.WindowNavigation
import XMonad.Util.CustomKeys
import System.Directory
import System.FilePath
import System.Process
import Internal.Layout
import XMonad.Hooks.ManageHelpers
import XMonad.Layout.IndependentScreens
import Text.Printf
import Data.List.Split
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.ManageDocks
import XMonad.Util.Run (spawnPipe)
import Control.Monad (when)
import System.IO

import Internal.Keys
import Internal.LayoutDraw
import Data.List (partition, isPrefixOf)
import Data.Maybe


main = do
  -- Execute some commands.
  homeDir <- getHomeDirectory
  let fp = homeDir </> ".xmonad" </> "startup"

  xmproc <- spawnPipe "xmobar"

  config <-
    applyKeys $ docks $ def
       { terminal    = "alacritty"
       , modMask     = mod3Mask
       , borderWidth = 2
       , keys = \config -> mempty
       , focusedBorderColor = "#ff6c00"
       -- , normalBorderColor = "#ffd9bf"
       , normalBorderColor = "#000000"
       , layoutHook = avoidStruts myLayout
       , startupHook = do
          ewmhDesktopsStartup
          spawn fp
       , manageHook = composeAll [
           isFullscreen --> doFullFloat
         , className =? "Tilda" --> doFloat
         , className =? "yakuake" --> doFloat
         , className =? "MPlayer" --> doFloat
         , title =? "Event Tester" --> doFloat
         , className =? "mpv" --> doFloat
         , className =? "gnubby_ssh_prompt" --> doFloat
         ]
       , workspaces = map return (['0'..'9'] ++ ['a'..'z'])
       , handleEventHook = fullscreenEventHook
       , focusFollowsMouse = False
       , clickJustFocuses = False
       , logHook = do
           (_, _, layout) <- showLayout

           dynamicLogWithPP $ xmobarPP {
               ppCurrent = xmobarColor "#ff8888" "red" . printf "<fn=1>%s</fn>"
             , ppVisible = xmobarColor "#8888ff" "" . printf "<fn=6>%s</fn>"
             , ppHidden  = xmobarColor "#888888" "" . printf "<fn=2>%s</fn>"
             , ppWsSep = "<fn=1><fc=#808080> </fc></fn>"
             , ppTitle =
                 xmobarColor "#a0a0a0" "" .
                    printf "<fn=3><fc=#bbbbbb>%s</fc></fn>"

             , ppSep = xmobarColor "#404040" "" " │ "
             , ppLayout = const (fromMaybe "" layout)
             , ppExtras = []
             , ppOutput = hPutStrLn xmproc . reverse . trunc 80
             , ppOrder =  \ss ->
                 let (icons, etc) = partition ("<icon"`isPrefixOf`) ss
                     in icons ++ etc
             }
       }

  -- let toggleStructsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)

  xmonad config

  where
    trunc amt str = trunc' False amt str []
    trunc' _ _ [] acc = acc
    trunc' ignore amt (a:as) acc =
      case a of
        '<' -> trunc' True amt as (a : acc)
        '>' -> trunc' False amt as (a : acc)
        _ ->
          if ignore
            then trunc' True amt as (a : acc)
            else
              case amt of
                0 -> trunc' False 0 as acc
                4 | length as > 3 -> trunc' False 0 as ("... " ++ acc)
                _ -> trunc' False (amt - 1) as (a : acc)

    splitOnAll arr str = splitOnAll' arr [str]
    splitOnAll' [] str = str
    splitOnAll' (a:as) [str] = splitOnAll' as (splitOn a str)
    splitOnAll' _ lst = lst