From 8cabd9073218882f46d599bce5fbfa5b03064487 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Thu, 18 Aug 2022 10:11:10 +0300 Subject: [PATCH] nix/wm/xmonad: move xmonad to nix --- nix/home.nix | 2 +- nix/wm/xmonad/config.hs | 291 ++++++++++++++++++++++ nix/wm/{xmonad.nix => xmonad/default.nix} | 21 +- 3 files changed, 293 insertions(+), 21 deletions(-) create mode 100644 nix/wm/xmonad/config.hs rename nix/wm/{xmonad.nix => xmonad/default.nix} (53%) diff --git a/nix/home.nix b/nix/home.nix index f1e9db1..553bd26 100644 --- a/nix/home.nix +++ b/nix/home.nix @@ -5,7 +5,7 @@ let in { imports = [ - ./wm/xmonad.nix + ./wm/xmonad ./shell/zsh.nix ./progs/git.nix ./progs/pass.nix diff --git a/nix/wm/xmonad/config.hs b/nix/wm/xmonad/config.hs new file mode 100644 index 0000000..bee59c6 --- /dev/null +++ b/nix/wm/xmonad/config.hs @@ -0,0 +1,291 @@ +-- +-- xmonad example config file. +-- +-- A template showing all available configuration hooks, +-- and how to override the defaults in your own xmonad.hs conf file. +-- +-- 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.Grid +import XMonad.Layout.LimitWindows (limitWindows) +import XMonad.Layout.NoBorders +import XMonad.Util.EZConfig +import XMonad.Util.Run + +import qualified Data.Map as M +import qualified XMonad.StackSet as W + +-- The preferred terminal program, which is used in a binding below and by +-- certain contrib modules. +-- +myTerminal = "alacritty" + +-- Whether focus follows the mouse pointer. +myFocusFollowsMouse :: Bool +myFocusFollowsMouse = False + +-- Whether clicking on a window to focus also passes the click to the window +myClickJustFocuses :: Bool +myClickJustFocuses = False + +-- Width of the window border in pixels. +-- +myBorderWidth = 3 + +-- modMask lets you specify which modkey you want to use. The default +-- is mod1Mask ("left alt"). You may also consider using mod3Mask +-- ("right alt"), which does not conflict with emacs keybindings. The +-- "windows key" is usually mod4Mask. +-- +myModMask = mod1Mask + +-- The default number of workspaces (virtual screens) and their names. +-- By default we use numeric strings, but any string may be used as a +-- workspace name. The number of workspaces is determined by the length +-- of this list. +-- +-- A tagging example: +-- +-- > workspaces = ["web", "irc", "code" ] ++ map show [4..9] +-- +myWorkspaces = ["1:web", "2:code", "3:code", "4:code"] <> map show [5..6] <> ["7:fin", "8:cfg", "9:chat"] + +-- Border colors for unfocused and focused windows, respectively. +-- +myNormalBorderColor = "#444" +myFocusedBorderColor = "#f00" + +------------------------------------------------------------------------ +-- Now run xmonad with all the defaults we set up. + +-- Run xmonad with the settings you specify. No need to modify this. +-- +main = xmonad . ewmhFullscreen . ewmh . xmobarProp $ defaults + +-- A structure containing your configuration settings, overriding +-- fields in the default config. Any you don't override, will +-- use the defaults defined in xmonad/XMonad/Config.hs +-- +-- No need to modify this. +-- +defaults = def + -- simple stuff + { terminal = myTerminal + , focusFollowsMouse = myFocusFollowsMouse + , clickJustFocuses = myClickJustFocuses + , borderWidth = myBorderWidth + , modMask = myModMask + , workspaces = myWorkspaces + , normalBorderColor = myNormalBorderColor + , focusedBorderColor = myFocusedBorderColor + -- key bindings + , keys = myKeys + , mouseBindings = myMouseBindings + -- hooks, layouts + , layoutHook = myLayout + , manageHook = myManageHook + , handleEventHook = myEventHook + , logHook = myLogHook + , startupHook = myStartupHook + } + +------------------------------------------------------------------------ +-- Layouts: + +-- You can specify and transform your layouts by modifying these values. +-- If you change layout bindings be sure to use 'mod-shift-space' after +-- restarting (with 'mod-q') to reset your layout state to the new +-- defaults, as xmonad preserves your old layout settings by default. +-- +-- The available layouts. Note that each layout is separated by |||, +-- which denotes layout choice. +-- +myLayout = avoidStruts (myMirror (2/3) ||| myTall (1/2) ||| myFull ||| Grid) + where + myMirror = limitWindows 5 . Mirror . myTall + + myTall = boringWindows . smartBorders . Tall 1 (3/100) + + myFull = noBorders Full + +------------------------------------------------------------------------ +-- Startup hook + +-- Perform an arbitrary action each time xmonad starts or is restarted +-- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize +-- per-workspace layout choices. +-- +-- By default, do nothing. +myStartupHook = do + spawn "ibus exit" + +------------------------------------------------------------------------ +-- Status bars and logging + +-- Perform an arbitrary action on each internal state change or X event. +-- See the 'XMonad.Hooks.DynamicLog' extension for examples. +-- +myLogHook = return () + +------------------------------------------------------------------------ +-- Event handling + +-- * EwmhDesktops users should change this to ewmhDesktopsEventHook +-- +-- Defines a custom handler function for X Events. The function should +-- return (All True) if the default handler is to be run afterwards. To +-- combine event hooks use mappend or mconcat from Data.Monoid. +-- +myEventHook = mempty + +------------------------------------------------------------------------ +-- Window rules: + +-- Execute arbitrary actions and WindowSet manipulations when managing +-- a new window. You can use this to, for example, always float a +-- particular program, or have a client always appear on a particular +-- workspace. +-- +-- To find the property name associated with a program, use +-- > xprop | grep WM_CLASS +-- and click on the client you're interested in. +-- +-- To match on the WM_NAME, you can use 'title' in the same way that +-- 'className' and 'resource' are used below. +-- +myManageHook = composeAll + [ resource =? "desktop_window" --> doIgnore + , resource =? "kdesktop" --> doIgnore + -- apps + , className =? "Gimp" --> doFloat + , className =? "Gnome-calculator" --> doFloat + , className =? "Gnome-font-viewer" --> doFloat + , className =? "Org.gnome.Nautilus" --> doFloat + , resource =? "telegram-desktop" --> doShift "9:chat" + , className =? "Thunderbird" --> doShift "9:chat" + -- my libs + , resource =? "hwt" --> doFloat + ] + + +------------------------------------------------------------------------ +-- Key bindings. Add, modify or remove key bindings here. +-- +myKeys conf = mkKeymap conf $ + + -- launch a terminal + [ ("M-S-", spawn $ XMonad.terminal conf) + + -- launch a 'flameshot' to screenshot + , ("M-S-s", safeSpawn "flameshot" ["gui"]) + + -- launch 'librewolf' browser + , ("M-S-b", spawn "librewolf") + + -- launch 'dmenu_run' to choose applications + , ("M-p", spawn "dmenu_run") + + -- close focused window + , ("M4-S-c", kill) + + -- Rotate through the available layout algorithms + , ("M-", cycleThroughLayouts ["Full", "Mirror Tall"]) + , ("M-", cycleThroughLayouts ["Grid", "Tall", "Mirror Tall"]) + + -- Reset the layouts on the current workspace to default + , ("M-S-", setLayout $ XMonad.layoutHook conf) + + -- Resize viewed windows to the correct size + , ("M-n", refresh) + + -- Easy moution to focus windows + , ("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)) + -- Move focus to the next window + , ("M-j", windows W.focusDown) + -- Move focus to the previous window + , ("M-k", windows W.focusUp) + -- Move focus to the master window + , ("M-m", windows W.focusMaster) + + -- Swap the focused window and the master window + , ("M-", windows W.swapMaster) + -- Swap the focused window with the next window + , ("M-S-j", windows W.swapDown) + -- Swap the focused window with the previous window + , ("M-S-k", windows W.swapUp) + + -- Shrink the master area + , ("M-h", sendMessage Shrink) + -- Expand the master area + , ("M-l", sendMessage Expand) + + -- 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 "bash ~/scripts/lock.sh") + + -- Change volume + , ("", spawn "amixer -qD pulse sset Master toggle") + , ("", spawn "amixer -qD pulse sset Master 5%+") + , ("", spawn "amixer -qD pulse sset Master 5%-") + + -- Keyboard apps + , ("", 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-")]] + + +------------------------------------------------------------------------ +-- Mouse bindings: default actions bound to mouse events +-- +myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList + -- mod-button1, Set the window to floating mode and move by dragging + [ ((modm, button1), \w -> focus w >> mouseMoveWindow w >> windows W.shiftMaster) + + -- mod-button2, Raise the window to the top of the stack + , ((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) + + -- you may also bind events to the mouse scroll wheel (button4 and button5) + ] diff --git a/nix/wm/xmonad.nix b/nix/wm/xmonad/default.nix similarity index 53% rename from nix/wm/xmonad.nix rename to nix/wm/xmonad/default.nix index b3737fc..8808390 100644 --- a/nix/wm/xmonad.nix +++ b/nix/wm/xmonad/default.nix @@ -15,20 +15,6 @@ in }; config = mkIf cfg.enable { - /* - nixpkgs.overlays = [ - (self: super: { - haskellPackages = super.haskellPackages.override { - overrides = (hself: hsuper: { - xmonad = hsuper.xmonad_0_17_0; - xmonad-contrib = hsuper.xmonad-contrib_0_17_0; - xmonad-extras = hsuper.xmonad-extras_0_17_0; - }); - }; - }) - ]; - */ - home.packages = with pkgs; [ xclip # access x clipboard from a console dmenu # menu for x window system @@ -41,13 +27,8 @@ in windowManager.xmonad = { enable = true; enableContribAndExtras = true; + config = ./config.hs; }; }; - - xdg.configFile = { - # add config for xmonad window manager - # "xmonad/xmonad.hs".source = ../programs/xmonad/xmonad.hs; - # "xmobar/xmobar.hs".source = ../programs/xmonad/xmobar.hs; - }; }; }