diff options
Diffstat (limited to 'lib/XMonad')
| -rw-r--r-- | lib/XMonad/Config/LaNinpre.hs | 412 |
1 files changed, 412 insertions, 0 deletions
diff --git a/lib/XMonad/Config/LaNinpre.hs b/lib/XMonad/Config/LaNinpre.hs new file mode 100644 index 0000000..d0db7b1 --- /dev/null +++ b/lib/XMonad/Config/LaNinpre.hs @@ -0,0 +1,412 @@ +{-# OPTIONS_HADDOCK prune #-} +---------------------------------------------------------------------- +-- | +-- Module : XMonad.Config.LaNinpre +-- Description : personal stuff for xmonad +-- Maintainer : la-ninpre +-- License : ISC +-- Copyright : la-ninpre <aaoth AT aaoth DOT xyz> +-- +-- this module exists because i find it more convenient to manage some things +-- from here instead of doing it right in xmonad config +-- +---------------------------------------------------------------------- + +module XMonad.Config.LaNinpre ( + -- $global + + -- * fonts + -- $fonts + myFonts, + + -- * colors + -- $colors + MyColorTheme(..), + def, + myNormColor, + myFocusColor, + + -- * software constants + -- $software + myTerminal, + myBrowser, + myGeminiClient, + myFileMgr, + myMocp, + myEditor, + + -- * hooks + -- $hooks + myManageHook, + myStartupHook, + + -- * scratchpads + -- $scratchpads + myScratchPads, + + -- * workspaces + -- $workspaces + myWorkspaces, + + -- * misc + -- $misc + myModMask, + myBorderWidth, + myAppGrid, + ) where + +import Data.List +import Data.Map as M +import Data.Maybe +import Data.Monoid + +import XMonad +import qualified XMonad.StackSet as W +import XMonad.Hooks.ManageHelpers +import XMonad.Hooks.SetWMName +import XMonad.Util.NamedScratchpad +import XMonad.Util.SpawnOnce + +-- $global +-- +-- constants and functions starting with \'my\' are exported and used in +-- xmonad config. + +-- $fonts +-- +-- default fonts and helper functions for them. + +-- | default lato font +fontLatoDef :: String +fontLatoDef = fontXft "Lato" "regular" 14 + +-- | font for @ShowWMName@ +-- +-- normal variant +-- +-- > fontSWN = fontXft "Press Start 2P" "regular" 60 +-- +-- sitelen pona pona variant +-- +-- > fontSWN = fontXft "sitelen\\-pona" "regular" 80 +fontSWN :: String +fontSWN = fontXft "linja pona" "regular" 80 + +-- | fonts list +myFonts :: [String] +myFonts = [ fontLatoDef + , fontSWN + ] + +-- ** helper functions +-- +-- | font constructor +-- +-- it is just a helper function to simplify the process of specifying font +-- with xft. +fontXft :: String -- ^ font family + -> String -- ^ font style + -> Int -- ^ font size + -> String + +fontXft font style size = intercalate ":" [ "xft" + , font + , style + , "size=" ++ show size + , "antialias=true" + , "hinting=true" + ] + +-- $colors +-- +-- color theme and stuff + +myColorTheme :: MyColorTheme +myColorTheme = MyColorTheme "#111111" "#ccbbcc" "#223333" "#ffaaaa" + +-- | unfocused window border colour +myNormColor :: String +myNormColor = col_bg def + +-- | focused window border colour +myFocusColor :: String +myFocusColor = col_bg_alt def + +-- | color theme datatype +-- +-- 'Default' instance gives simple four-color colorscheme +data MyColorTheme = MyColorTheme { + col_bg :: String, + col_fg :: String, + col_bg_alt :: String, + col_fg_alt :: String +} + +instance Default MyColorTheme where + def = myColorTheme + + +-- $software +-- +-- these are just contstants + +-- | set terminal emulator +myTerminal :: String +myTerminal = "alacritty" + +-- | set default browser +myBrowser :: String +myBrowser = "firefox" + +-- | set gemini client +myGeminiClient :: String +myGeminiClient = "amfora" + +-- | set file manager +myFileMgr :: String +myFileMgr = "thunar" + +-- | music on console +-- +-- this is to avoid spamming strings everywhere. @moc@ doesn't comply with +-- XDG_CONFIG_HOME, so we force it to do so. +myMocp :: String +myMocp = "mocp -M '~/.config/moc'" + +-- | set editor +myEditor :: String +myEditor = myTerminal ++ " -e vim" + +-- $hooks +-- +-- hooks for xmonad config + +-- ** startup hook +-- +-- start things at login. + +-- | actual instance +myStartupHook :: X () +myStartupHook = do + --spawnOnce "dunst &" + --spawnOnce "lxsession &" + --spawnOnce "picom &" + --spawnOnce "nm-applet &" + --spawnOnce "volumeicon &" + spawnOnce "setxkbmap -layout us,ru -option 'grp:alt_shift_toggle'" + spawnOnce "kbdd" + {-spawnOnce ("trayer --edge top " + ++ "--align right " + ++ "--widthtype request " + ++ "--SetDockType true --SetPartialStrut true --expand false " + ++ "--monitor 0 --transparent true --alpha 0 " + ++ "--tint 0x19191a --height 24 &" + ) + -} + spawnOnce "~/.fehbg &" + setWMName "LG3D" + +-- ** manage hook +-- +-- @doFloat@ forces a window to float. useful for dialog boxes and such. +-- using @doShift (myWorkspaces !! 7)@ sends program to workspace 8 +-- i'm doing it this way because otherwise i would have to write out the full +-- name of my workspaces and the names would be very long if using clickable workspaces. + +-- | manage hook +myManageHook :: Query (Endo WindowSet) +myManageHook = composeAll + [ className =? "confirm" --> doFloat + , className =? "file_progress" --> doFloat + , className =? "dialog" --> doFloat + , className =? "download" --> doFloat + , className =? "error" --> doFloat + , className =? "notification" --> doFloat + , className =? "pinentry-gtk-2" --> doFloat + , className =? "splash" --> doFloat + , className =? "toolbar" --> doFloat + , className =? "Gimp" --> doFloat + , className =? "Cadence" --> doFloat + , className =? "Steam" --> doFloat + , className =? "Image Lounge" --> doFloat + , title =? "Oracle VM VirtualBox Manager" --> doFloat + -- web workspace + , title =? "Mozilla Firefox" --> doShift ( myWorkspaces !! 1 ) + , className =? "Brave-browser" --> doShift ( myWorkspaces !! 1 ) + , className =? "amfora" --> doShift ( myWorkspaces !! 1 ) + , className =? "qutebrowser" --> doShift ( myWorkspaces !! 1 ) + -- doc workspace + , className =? "Geary" --> doShift ( myWorkspaces !! 3 ) + , className =? "libreoffice" --> doShift ( myWorkspaces !! 3 ) + -- , className =? "libreoffice-impress" --> doShift ( myWorkspaces !! 3 ) + -- vm workspace + , className =? "VirtualBox Manager" --> doShift ( myWorkspaces !! 4 ) + -- chat workspace + , className =? "discord" --> doShift ( myWorkspaces !! 5 ) + , className =? "TelegramDesktop" --> doShift ( myWorkspaces !! 5 ) + , className =? "Element" --> doShift ( myWorkspaces !! 5 ) + , className =? "Steam" --> doShift ( myWorkspaces !! 5 ) + -- full workspace + , isFullscreen --> doShift ( myWorkspaces !! 6 ) + -- vid workspace + , className =? "Deadbeef" --> doShift ( myWorkspaces !! 7 ) + , appName =? "mpv" --> doShift ( myWorkspaces !! 7 ) + , className =? "vlc" --> doShift ( myWorkspaces !! 7 ) + -- gfx workspace + , className =? "Gimp" --> doShift ( myWorkspaces !! 8 ) + , className =? "Blender" --> doShift ( myWorkspaces !! 8 ) + , className =? "obs" --> doShift ( myWorkspaces !! 8 ) + , isFullscreen --> doFullFloat + ] <+> namedScratchpadManageHook myScratchPads + +-- $scratchpads +-- +-- currently i have: +-- +-- * plain terminal scratchpad +-- +-- * music on console +-- +-- * calculator (qalculate-gtk) +-- +-- * mpv instance that plays playlist in @~\/Video\/sp_playlist.m3u@ + +-- | scratchpad list +myScratchPads :: [NamedScratchpad] +myScratchPads = [ NS "terminal" spawnTerm findTerm manageTerm + , NS "mocp" spawnMocp findMocp manageMocp + , NS "calculator" spawnCalc findCalc manageCalc + , NS "mpvfloat" spawnMpv findMpv manageMpv + ] + where + -- terminal + spawnTerm = myTerminal ++ " -t scratchpad" + findTerm = title =? "scratchpad" + manageTerm = customFloating $ W.RationalRect l t w h + where + h = 0.9 + w = 0.9 + t = 0.95 - h + l = 0.95 - w + -- music on console + spawnMocp = myTerminal ++ " -t mocp -e " ++ myMocp + findMocp = title =? "mocp" + manageMocp = customFloating $ W.RationalRect l t w h + where + h = 0.9 + w = 0.9 + t = 0.95 - h + l = 0.95 - w + -- calculator + spawnCalc = "qalculate-gtk" + findCalc = className =? "Qalculate-gtk" + manageCalc = customFloating $ W.RationalRect l t w h + where + h = 0.5 + w = 0.4 + t = 0.75 - h + l = 0.70 - w + -- mpv scratchpad to watch some stuff listed in ~/Video/sp_playlist.m3u + spawnMpv = "mpv --pause -x11-name mpv-sp ~/Video/sp_playlist.m3u" + ++ mpvGeometry mpvPercentage mpvPercentage + findMpv = appName =? "mpv-sp" + manageMpv = customFloating $ W.RationalRect l t w h + where + h = mpvPercentage + w = mpvPercentage + t = 0.03 + l = 0.996 - w + +-- ** helper functions +-- +-- | percentage of mpv scratchpad at start +mpvPercentage :: Rational +mpvPercentage = 1/4 + +-- | mpv needs geometry of window at start, so it won't resize itself, when +-- playing next video on a playlist +mpvGeometry :: RealFrac a + => a -- ^ relative height of window + -> a -- ^ relative width of window + -> String + +mpvGeometry h w = " --geometry=" ++ show pw ++ "x" ++ show ph + where + pw = ceiling (1920 * w) + ph = ceiling (1080 * h) + +-- $workspaces +-- +-- i've got three ways of specifying them. first one is pretty close to the +-- original dt's config. second is using sitelen pona pona font by jackhumbert +-- (check it out [here](https://jackhumbert.github.io/sitelen-pona-pona/)). +-- and third one is using linja pona font by jan same +-- (check it out [here](http://musilili.net/linja-pona/)). +-- +-- * normal variant +-- +-- > myWorkspaces = [ "dev" +-- > , "www" +-- > , "sys" +-- > , "doc" +-- > , "vm" +-- > , "chat" +-- > , "full" +-- > , "vid" +-- > , "gfx" +-- > ] +-- +-- * one using sitelen pona pona by jackhumbert +-- +-- this is specified with actual glyph codes because xmobar +-- don't allow for ligatures and otf features. +-- +-- > myWorkspaces = [ "\xee3d" -- nanpa +-- > , "\xee3b" -- musi +-- > , "\xee49" -- pali +-- > , "\xee2a" -- lipu +-- > , "\xee53" -- poki +-- > , "\xee6c" -- toki +-- > , "\xee63" -- suli +-- > , "\xee60" -- sitelen +-- > , "\xee1e" -- kule +-- > ] + +-- | workspaces container +myWorkspaces :: [String] +myWorkspaces = [ "\xe661\xe921" -- sona nanpa + , "\xe63b" -- musi + , "\xe649" -- pali + , "\xe62a\xf105" -- lipu ale + , "\xe653\xf115" -- poki ilo + , "\xe66c" -- toki + , "\xe62a\xf200" -- lipu suli + , "\xf010\xe915" -- sitelen tawa + , "\xf010\xf107" -- sitelen ante + ] + +-- $misc +-- +-- misc constants + +-- | set windows key as modkey +myModMask :: KeyMask +myModMask = mod4Mask + +-- | specify border width +myBorderWidth :: Dimension +myBorderWidth = 1 + +-- | app grid for 'GridSelect' layout +myAppGrid :: [(String,String)] +myAppGrid = [ ("files" ,"thunar" ) + , ("mail" ,"thunderbird") + , ("blender" ,"blender-3.1") + , ("inkscape" ,"inkscape" ) + , ("discord" ,"discord" ) + , ("steam" ,"steam" ) + , ("obs" ,"obs" ) + , ("gimp" ,"gimp" ) + , ("ardour" ,"ardour6" ) + , ("kdenlive" ,"kdenlive" ) + ] |
