home/xmonad: cosmetic changes

This commit is contained in:
Dmitriy Pleshevskiy 2022-09-01 17:40:10 +03:00
parent 3d01d19c09
commit 02598f69ba
Signed by: pleshevskiy
GPG key ID: 1B59187B161C0215
2 changed files with 199 additions and 185 deletions

View file

@ -27,7 +27,11 @@
in in
{ {
default = pkgs.mkShell { default = pkgs.mkShell {
packages = with pkgs; [ git-crypt stylua ]; packages = with pkgs; [
git-crypt
stylua # lua formatter
ormolu # haskell formatter
];
}; };
}; };
}; };

View file

@ -7,40 +7,46 @@
-- Normally, you'd only override those defaults you care about. -- Normally, you'd only override those defaults you care about.
-- --
import Data.Monoid
import System.Exit
import XMonad
import XMonad.Actions.CycleSelectedLayouts (cycleThroughLayouts)
import XMonad.Actions.EasyMotion (ChordKeys (..),
EasyMotionConfig (..),
selectWindow)
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.StatusBar
import XMonad.Hooks.StatusBar.PP
import XMonad.Layout.BoringWindows (boringWindows)
import XMonad.Layout.Gaps (gaps)
import XMonad.Layout.Grid
import XMonad.Layout.LimitWindows (limitWindows)
import XMonad.Layout.NoBorders (smartBorders)
import XMonad.Layout.Spacing (spacing)
import XMonad.Layout.ThreeColumns (ThreeCol (..))
import XMonad.Util.EZConfig
import XMonad.Util.Run
import qualified Data.Map as M
import qualified XMonad.StackSet as W
-- Imports for Polybar -- Imports for Polybar
import qualified Codec.Binary.UTF8.String as UTF8 import qualified Codec.Binary.UTF8.String as UTF8
import qualified DBus as D import qualified DBus as D
import qualified DBus.Client as D import qualified DBus.Client as D
import qualified Data.Map as M
import Data.Monoid
import System.Exit
import XMonad
import XMonad.Actions.CycleSelectedLayouts (cycleThroughLayouts)
import XMonad.Actions.EasyMotion
( ChordKeys (..),
EasyMotionConfig (..),
selectWindow,
)
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
( composeOne,
doCenterFloat,
isDialog,
(-?>),
)
import XMonad.Hooks.StatusBar
import XMonad.Hooks.StatusBar.PP
import XMonad.Layout.BoringWindows (boringWindows)
import XMonad.Layout.Gaps (gaps)
import XMonad.Layout.Grid
import XMonad.Layout.LimitWindows (limitWindows)
import XMonad.Layout.NoBorders (smartBorders)
import XMonad.Layout.Spacing (spacing)
import XMonad.Layout.ThreeColumns (ThreeCol (..))
import qualified XMonad.StackSet as W
import XMonad.Util.EZConfig
import XMonad.Util.Run
-- The preferred terminal program, which is used in a binding below and by -- The preferred terminal program, which is used in a binding below and by
-- certain contrib modules. -- certain contrib modules.
-- --
myTerminal = "alacritty" myTerminal = "alacritty"
-- Whether focus follows the mouse pointer. -- Whether focus follows the mouse pointer.
myFocusFollowsMouse :: Bool myFocusFollowsMouse :: Bool
@ -52,59 +58,73 @@ myClickJustFocuses = False
-- Width of the window border in pixels. -- Width of the window border in pixels.
-- --
myBorderWidth = 2 myBorderWidth = 2
-- modMask lets you specify which modkey you want to use. The default -- modMask lets you specify which modkey you want to use. The default
-- is mod1Mask ("left alt"). You may also consider using mod3Mask -- is mod1Mask ("left alt"). You may also consider using mod3Mask
-- ("right alt"), which does not conflict with emacs keybindings. The -- ("right alt"), which does not conflict with emacs keybindings. The
-- "windows key" is usually mod4Mask. -- "windows key" is usually mod4Mask.
-- --
myModMask = mod1Mask myModMask = mod1Mask
-- Workspaces
webWs = "web" webWs = "web"
finWs = "fin" finWs = "fin"
sysWs = "sys" sysWs = "sys"
comWs = "com" comWs = "com"
devWs = ["dev", "dev2", "dev3"] devWs = ["dev", "dev2", "dev3"]
myWorkspaces = [webWs] <> devWs <> [finWs, sysWs, comWs] myWorkspaces = [webWs] <> devWs <> [finWs, sysWs, comWs]
-- Colors
blue = "#2E9AFE"
gray = "#7F7F7F"
blue = "#2E9AFE"
gray = "#7F7F7F"
orange = "#ea4300" orange = "#ea4300"
purple = "#9058c7" purple = "#9058c7"
red = "#722222"
red = "#722222"
-- Border colors for unfocused and focused windows, respectively. -- Border colors for unfocused and focused windows, respectively.
-- --
myNormalBorderColor = gray myNormalBorderColor = gray
myFocusedBorderColor = blue myFocusedBorderColor = blue
main :: IO () main :: IO ()
main = mkDbusClient >>= main' main = mkDbusClient >>= main'
main' :: D.Client -> IO () main' :: D.Client -> IO ()
main' dbus = xmonad . docks . ewmhFullscreen . ewmh $ def main' dbus =
-- simple stuff xmonad . docks . ewmhFullscreen . ewmh $
{ terminal = myTerminal def
, focusFollowsMouse = myFocusFollowsMouse { -- simple stuff
, clickJustFocuses = myClickJustFocuses terminal = myTerminal,
, borderWidth = myBorderWidth focusFollowsMouse = myFocusFollowsMouse,
, modMask = myModMask clickJustFocuses = myClickJustFocuses,
, workspaces = myWorkspaces borderWidth = myBorderWidth,
, normalBorderColor = myNormalBorderColor modMask = myModMask,
, focusedBorderColor = myFocusedBorderColor workspaces = myWorkspaces,
-- key bindings normalBorderColor = myNormalBorderColor,
, keys = myKeys focusedBorderColor = myFocusedBorderColor,
, mouseBindings = myMouseBindings -- key bindings
-- hooks, layouts keys = myKeys,
, layoutHook = myLayout mouseBindings = myMouseBindings,
, manageHook = myManageHook -- hooks, layouts
, handleEventHook = myEventHook layoutHook = myLayout,
, logHook = myPolybarLogHook dbus manageHook = myManageHook,
, startupHook = myStartupHook handleEventHook = myEventHook,
} logHook = myPolybarLogHook dbus,
startupHook = myStartupHook
}
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- Polybar settings (needs DBus client). -- Polybar settings (needs DBus client).
@ -114,30 +134,31 @@ mkDbusClient = do
dbus <- D.connectSession dbus <- D.connectSession
D.requestName dbus (D.busName_ "org.xmonad.log") opts D.requestName dbus (D.busName_ "org.xmonad.log") opts
return dbus return dbus
where where
opts = [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue] opts = [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue]
-- Emit a DBus signal on log updates -- Emit a DBus signal on log updates
dbusOutput :: D.Client -> String -> IO () dbusOutput :: D.Client -> String -> IO ()
dbusOutput dbus str = dbusOutput dbus str =
let opath = D.objectPath_ "/org/xmonad/Log" let opath = D.objectPath_ "/org/xmonad/Log"
iname = D.interfaceName_ "org.xmonad.Log" iname = D.interfaceName_ "org.xmonad.Log"
mname = D.memberName_ "Update" mname = D.memberName_ "Update"
signal = D.signal opath iname mname signal = D.signal opath iname mname
body = [D.toVariant $ UTF8.decodeString str] body = [D.toVariant $ UTF8.decodeString str]
in D.emit dbus $ signal { D.signalBody = body } in D.emit dbus $ signal {D.signalBody = body}
polybarHook :: D.Client -> PP polybarHook :: D.Client -> PP
polybarHook dbus = polybarHook dbus =
let wrapper c = wrap ("%{F" <> c <> "}") "%{F-}" let wrapper c = wrap ("%{F" <> c <> "}") "%{F-}"
in def { ppOutput = dbusOutput dbus in def
, ppCurrent = wrapper blue { ppOutput = dbusOutput dbus,
, ppVisible = wrapper purple ppCurrent = wrapper blue,
, ppUrgent = wrapper orange ppVisible = wrapper purple,
, ppHidden = wrapper gray ppUrgent = wrapper orange,
, ppHiddenNoWindows = wrapper red ppHidden = wrapper gray,
, ppTitle = wrapper purple . shorten 90 ppHiddenNoWindows = wrapper red,
} ppTitle = wrapper purple . shorten 90
}
myPolybarLogHook dbus = myLogHook <+> dynamicLogWithPP (polybarHook dbus) myPolybarLogHook dbus = myLogHook <+> dynamicLogWithPP (polybarHook dbus)
@ -159,8 +180,8 @@ myLayout = avoidStruts . smartBorders $ (Mirror tiled ||| tiled ||| column3 |||
column3 = gapSpaced 5 $ ThreeColMid nmaster incRatio ratio column3 = gapSpaced 5 $ ThreeColMid nmaster incRatio ratio
nmaster = 1 nmaster = 1
incRatio = (3/100) incRatio = (3 / 100)
ratio = (1/2) ratio = (1 / 2)
gapSpaced g = spacing g . myGaps g gapSpaced g = spacing g . myGaps g
myGaps gap = gaps [(U, gap), (D, gap), (L, gap), (R, gap)] myGaps gap = gaps [(U, gap), (D, gap), (L, gap), (R, gap)]
@ -187,6 +208,7 @@ myLogHook = return ()
-- Event handling -- Event handling
-- * EwmhDesktops users should change this to ewmhDesktopsEventHook -- * EwmhDesktops users should change this to ewmhDesktopsEventHook
-- --
-- Defines a custom handler function for X Events. The function should -- Defines a custom handler function for X Events. The function should
-- return (All True) if the default handler is to be run afterwards. To -- return (All True) if the default handler is to be run afterwards. To
@ -209,124 +231,112 @@ myEventHook = mempty
-- To match on the WM_NAME, you can use 'title' in the same way that -- To match on the WM_NAME, you can use 'title' in the same way that
-- 'className' and 'resource' are used below. -- 'className' and 'resource' are used below.
-- --
myManageHook = composeAll myManageHook = manageApps
[ resource =? "desktop_window" --> doIgnore where
, resource =? "kdesktop" --> doIgnore isRole = stringProperty "WM_WINDOW_ROLE"
-- apps isPopup = isRole =? "pop-up"
, className =? "Gimp" --> doFloat manageApps =
, className =? "Gnome-calculator" --> doFloat composeOne
, className =? "Gnome-font-viewer" --> doFloat [ resource =? "desktop_window" -?> doIgnore,
, className =? "Org.gnome.Nautilus" --> doFloat resource =? "kdesktop" -?> doIgnore,
, className =? "KotatogramDesktop" --> doShift comWs -- general
-- my libs isPopup -?> doCenterFloat,
, resource =? "hwt" --> doFloat isDialog -?> doCenterFloat,
] -- apps
className =? "Gimp" -?> doFloat,
className =? "nheko" -?> doShift comWs,
className =? "KotatogramDesktop" -?> doShift comWs,
className =? "gnome-calculator" -?> doCenterFloat
]
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- Key bindings. Add, modify or remove key bindings here. -- Key bindings. Add, modify or remove key bindings here.
-- --
myKeys conf = mkKeymap conf $ myKeys conf =
mkKeymap conf $
-- launch a terminal -- launch a terminal
[ ("M-S-<Return>", spawn $ XMonad.terminal conf) [ ("M-S-<Return>", spawn $ XMonad.terminal conf),
-- launch a 'flameshot' to screenshot
-- launch a 'flameshot' to screenshot ("M-S-s", safeSpawn "flameshot" ["gui"]),
, ("M-S-s", safeSpawn "flameshot" ["gui"]) -- launch 'librewolf' browser
("M-S-b", spawn "librewolf"),
-- launch 'librewolf' browser -- launch 'dmenu_run' to choose applications
, ("M-S-b", spawn "librewolf") ("M-p", spawn "dmenu_run"),
-- close focused window
-- launch 'dmenu_run' to choose applications ("M4-S-c", kill),
, ("M-p", spawn "dmenu_run") -- Rotate through the available layout algorithms
("M-<Space>", cycleThroughLayouts ["Full", "Mirror Spacing Tall"]),
-- close focused window ("M-<Tab>", cycleThroughLayouts ["Spacing ThreeCol", "Spacing Tall", "Mirror Spacing Tall"]),
, ("M4-S-c", kill) -- Reset the layouts on the current workspace to default
("M-S-<Space>", setLayout $ XMonad.layoutHook conf),
-- Rotate through the available layout algorithms -- Resize viewed windows to the correct size
, ("M-<Space>", cycleThroughLayouts ["Full", "Mirror Spacing Tall"]) ("M-n", refresh),
, ("M-<Tab>", cycleThroughLayouts ["Spacing ThreeCol", "Spacing Tall", "Mirror Spacing Tall"]) -- Easy moution to focus windows
("M-s", selectWindow easyMotionConfig >>= (`whenJust` windows . W.focusWindow)),
-- Reset the layouts on the current workspace to default -- Move focus to the next window
, ("M-S-<Space>", setLayout $ XMonad.layoutHook conf) ("M-j", windows W.focusDown),
-- Move focus to the previous window
-- Resize viewed windows to the correct size ("M-k", windows W.focusUp),
, ("M-n", refresh) -- Move focus to the master window
("M-m", windows W.focusMaster),
-- Easy moution to focus windows -- Swap the focused window and the master window
, ("M-s", selectWindow def{sKeys = AnyKeys [xK_a, xK_o, xK_e, xK_u, xK_h, xK_t, xK_n, xK_s]} >>= (`whenJust` windows . W.focusWindow)) ("M-<Return>", windows W.swapMaster),
-- Move focus to the next window -- Swap the focused window with the next window
, ("M-j", windows W.focusDown) ("M-S-j", windows W.swapDown),
-- Move focus to the previous window -- Swap the focused window with the previous window
, ("M-k", windows W.focusUp) ("M-S-k", windows W.swapUp),
-- Move focus to the master window -- Shrink the master area
, ("M-m", windows W.focusMaster) ("M-h", sendMessage Shrink),
-- Expand the master area
-- Swap the focused window and the master window ("M-l", sendMessage Expand),
, ("M-<Return>", windows W.swapMaster) -- Push window back into tiling
-- Swap the focused window with the next window ("M-t", withFocused $ windows . W.sink),
, ("M-S-j", windows W.swapDown) -- Increment the number of windows in the master area
-- Swap the focused window with the previous window ("M-,", sendMessage $ IncMasterN 1),
, ("M-S-k", windows W.swapUp) -- Deincrement the number of windows in the master area
("M-.", sendMessage $ IncMasterN (-1)),
-- Shrink the master area -- Toggle the status bar gap
, ("M-h", sendMessage Shrink) -- Use this binding with avoidStruts from Hooks.ManageDocks.
-- Expand the master area -- See also the statusBar function from Hooks.DynamicLog.
, ("M-l", sendMessage Expand) --
-- , ("M-b", sendMessage ToggleStruts)
-- Push window back into tiling
, ("M-t", withFocused $ windows . W.sink)
-- Increment the number of windows in the master area
, ("M-,", sendMessage $ IncMasterN 1)
-- Deincrement the number of windows in the master area
, ("M-.", sendMessage $ IncMasterN (-1))
-- Toggle the status bar gap
-- Use this binding with avoidStruts from Hooks.ManageDocks.
-- See also the statusBar function from Hooks.DynamicLog.
--
-- , ("M-b", sendMessage ToggleStruts)
-- Lock screen
, ("M4-l", spawn "betterlockscreen --lock --display 1 -- -e")
-- Change volume
, ("<XF86AudioMute>", spawn "amixer -q sset Master toggle")
, ("<XF86AudioRaiseVolume>", spawn "amixer -q sset Master 5%+")
, ("<XF86AudioLowerVolume>", spawn "amixer -q sset Master 5%-")
-- Keyboard apps
, ("<XF86Calculator>", spawn "gnome-calculator")
-- Quit xmonad
, ("M4-S-q", io exitSuccess)
]
++
--
-- mod-[1..9], Switch to workspace N
-- mod-shift-[1..9], Move client to workspace N
--
[("M-" ++ m ++ show k, windows $ f i)
| (i, k) <- zip (XMonad.workspaces conf) [1..9]
, (f, m) <- [(W.greedyView, ""), (W.shift, "S-")]]
-- Lock screen
("M4-l", spawn "betterlockscreen --lock --display 1 -- -e"),
-- Change volume
("<XF86AudioMute>", spawn "amixer -q sset Master toggle"),
("<XF86AudioRaiseVolume>", spawn "amixer -q sset Master 5%+"),
("<XF86AudioLowerVolume>", spawn "amixer -q sset Master 5%-"),
-- Keyboard apps
("<XF86Calculator>", spawn "gnome-calculator"),
-- Quit xmonad
("M4-S-q", io exitSuccess)
]
++
--
-- mod-[1..9], Switch to workspace N
-- mod-shift-[1..9], Move client to workspace N
--
[ ("M-" ++ m ++ show k, windows $ f i)
| (i, k) <- zip (XMonad.workspaces conf) [1 .. 9],
(f, m) <- [(W.greedyView, ""), (W.shift, "S-")]
]
where
easyMotionConfig =
def
{ sKeys = AnyKeys [xK_a, xK_o, xK_e, xK_u, xK_h, xK_t, xK_n, xK_s]
}
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- Mouse bindings: default actions bound to mouse events -- Mouse bindings: default actions bound to mouse events
-- --
myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList myMouseBindings (XConfig {XMonad.modMask = modm}) =
M.fromList
-- mod-button1, Set the window to floating mode and move by dragging -- mod-button1, Set the window to floating mode and move by dragging
[ ((modm, button1), \w -> focus w >> mouseMoveWindow w >> windows W.shiftMaster) [ ((modm, button1), \w -> focus w >> mouseMoveWindow w >> windows W.shiftMaster),
-- mod-button2, Raise the window to the top of the stack
-- mod-button2, Raise the window to the top of the stack ((modm, button2), \w -> focus w >> windows W.shiftMaster),
, ((modm, button2), \w -> focus w >> windows W.shiftMaster) -- mod-button3, Set the window to floating mode and resize by dragging
((modm, button3), \w -> focus w >> mouseResizeWindow w >> windows W.shiftMaster)
-- mod-button3, Set the window to floating mode and resize by dragging -- you may also bind events to the mouse scroll wheel (button4 and button5)
, ((modm, button3), \w -> focus w >> mouseResizeWindow w >> windows W.shiftMaster)
-- you may also bind events to the mouse scroll wheel (button4 and button5)
] ]