add topic space module (wraps XMonad.Actions.TopicSpace) with dynamic topic space config
This commit is contained in:
parent
ddeafa09c2
commit
6efab03456
3 changed files with 119 additions and 1 deletions
|
@ -6,13 +6,15 @@ import XMonad
|
||||||
import qualified XMonad.StackSet as W
|
import qualified XMonad.StackSet as W
|
||||||
|
|
||||||
import XMonad.Custom.BindingUtils
|
import XMonad.Custom.BindingUtils
|
||||||
|
import XMonad.Custom.TopicSpace
|
||||||
|
|
||||||
|
|
||||||
myBasicKeyBindings :: [([Char], X ())]
|
myBasicKeyBindings :: [([Char], X ())]
|
||||||
myBasicKeyBindings = addMainModifierToBinding $ myFocusBindings ++ mySwapBindings ++ myMasterBindings ++ myXMonadBindings ++ myLaunchBindings
|
myBasicKeyBindings = addMainModifierToBinding $ myFocusBindings ++ mySwapBindings ++ myMasterBindings ++ myXMonadBindings ++ myLaunchBindings
|
||||||
|
|
||||||
myLaunchBindings :: [([Char], X ())]
|
myLaunchBindings :: [([Char], X ())]
|
||||||
myLaunchBindings = [
|
myLaunchBindings = [
|
||||||
("<Return>", spawn "kitty"),
|
("<Return>", spawnInTopicDir "kitty"),
|
||||||
("r", spawn "dmenu_run"),
|
("r", spawn "dmenu_run"),
|
||||||
("S-r", spawn "gmrun"),
|
("S-r", spawn "gmrun"),
|
||||||
("x", kill),
|
("x", kill),
|
||||||
|
|
114
src/XMonad/Custom/TopicSpace.hs
Normal file
114
src/XMonad/Custom/TopicSpace.hs
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
module XMonad.Custom.TopicSpace (
|
||||||
|
module XMonad.Actions.TopicSpace
|
||||||
|
, tiNames
|
||||||
|
, noActionTI, inHomeTI, simpleTI
|
||||||
|
, topicStartupHook
|
||||||
|
, currentTopicConfig
|
||||||
|
, goto
|
||||||
|
, spawnInTopicDir
|
||||||
|
) where
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------------
|
||||||
|
-- $usage
|
||||||
|
--
|
||||||
|
-- The goal of this is to wrap a more flexible interface around the XMoand.Actions.TopicSpace
|
||||||
|
-- module.
|
||||||
|
-- The goal is to store a TopicConfig as part of the (dynamic) state of the X monad
|
||||||
|
-- and initialize it with the user-given config in the X monad startup hook.
|
||||||
|
--
|
||||||
|
-- This has a number of benefits:
|
||||||
|
-- - Helper functions like goto :: Topic -> X () that are mentioned in the
|
||||||
|
-- XMonad.Actions.TopicSpace module can be implemented as part of this module
|
||||||
|
-- as they do not need to know the configuration "in advance" at definition time.
|
||||||
|
-- Notice that we have to use X () here anyways since we want to trigger a dynamic
|
||||||
|
-- action, so we can as well retrieve the TopicSpace config from the X monad
|
||||||
|
-- at runtime
|
||||||
|
-- - In particular, this allows splitting the *usage* of topics and the actual *configuration*
|
||||||
|
-- of topics into separate parts of code.
|
||||||
|
-- When defining keybindings involving topics (such as switching to them),
|
||||||
|
-- we do not need to know all topics and their respective configurations yet.
|
||||||
|
-- Conversely, we can define some topics at multiple different parts of code
|
||||||
|
-- and only combine them to the final topic configuration in the main xmonad.hs
|
||||||
|
-- configuration file.
|
||||||
|
-- This also means that 'picking' the right config out of a set of (custom)
|
||||||
|
-- modules is very easy now, since they do not have to rely on each other
|
||||||
|
-- - We can dynamically change the information associated to a workspace
|
||||||
|
-- Similar to XMonad.Actions.WorkspaceNames,
|
||||||
|
-- which dynamically adds comments to the names of workspaces,
|
||||||
|
-- this allows us to dynamically change e.g. the associated working
|
||||||
|
-- directory of a topic at runtime
|
||||||
|
-- - while still allowing generic functions like goto to be defined
|
||||||
|
--
|
||||||
|
--
|
||||||
|
|
||||||
|
-- import qualified Data.Map.Strict as M
|
||||||
|
import qualified XMonad.Util.ExtensibleState as XS
|
||||||
|
-- import qualified XMonad.StackSet as W
|
||||||
|
|
||||||
|
import XMonad
|
||||||
|
import XMonad.Actions.TopicSpace
|
||||||
|
|
||||||
|
|
||||||
|
-- | An alias for topicNames.
|
||||||
|
-- This establishes consistency with tiActions and tiDirs of similar functionality
|
||||||
|
tiNames :: [TopicItem] -> [Topic]
|
||||||
|
tiNames = topicNames
|
||||||
|
|
||||||
|
-- | Alias with better naming
|
||||||
|
noActionTI :: Topic -> Dir -> TopicItem
|
||||||
|
noActionTI = noAction
|
||||||
|
|
||||||
|
-- | Alias with better naming
|
||||||
|
inHomeTI :: Topic -> X () -> TopicItem
|
||||||
|
inHomeTI = inHome
|
||||||
|
|
||||||
|
-- | A topic with no associated info at all
|
||||||
|
simpleTI :: Topic -> TopicItem
|
||||||
|
simpleTI n = TI n "~/." (pure ())
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------t
|
||||||
|
-- X state implementation and tools
|
||||||
|
|
||||||
|
|
||||||
|
-- | Store config in X extensible state
|
||||||
|
-- We do this by wrapping into a store type to avoid
|
||||||
|
-- orphan instance declarations
|
||||||
|
data StoreTopicConfig = StoreTopicConfig TopicConfig
|
||||||
|
instance ExtensionClass StoreTopicConfig where
|
||||||
|
initialValue = StoreTopicConfig def
|
||||||
|
|
||||||
|
-- | Unwrap a stored topic config
|
||||||
|
topicConfig :: StoreTopicConfig -> TopicConfig
|
||||||
|
topicConfig (StoreTopicConfig tc) = tc
|
||||||
|
|
||||||
|
-- | Put initial topic Config into X state at startup
|
||||||
|
-- Add this to the XConfig startupHook
|
||||||
|
topicStartupHook :: TopicConfig -> X ()
|
||||||
|
topicStartupHook = XS.put . StoreTopicConfig
|
||||||
|
|
||||||
|
-- | Retrieve the current topic config from the X state
|
||||||
|
currentTopicConfig :: X TopicConfig
|
||||||
|
currentTopicConfig = fmap topicConfig XS.get
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------------------------
|
||||||
|
-- | These are the real utilities that we aimed for
|
||||||
|
|
||||||
|
|
||||||
|
-- | Topic-aware switch to topic with windows W.view
|
||||||
|
goto :: Topic -> X ()
|
||||||
|
goto topic = do
|
||||||
|
tc <- currentTopicConfig
|
||||||
|
switchTopic tc topic
|
||||||
|
|
||||||
|
-- | Like the standard from XMonad, but spawns in the working dir of the current topic
|
||||||
|
-- If the current workspace is not an actual topic (i.e. no information is stored about
|
||||||
|
-- the workspace in the topicConfig of the X monad), the home directory will be chosen
|
||||||
|
spawnInTopicDir :: String -> X ()
|
||||||
|
spawnInTopicDir cmd = do
|
||||||
|
tc <- currentTopicConfig
|
||||||
|
dir <- currentTopicDir tc
|
||||||
|
spawn $ "cd " ++ dir ++ "; " ++ cmd
|
|
@ -21,6 +21,7 @@ library
|
||||||
XMonad.Custom.Modifiers
|
XMonad.Custom.Modifiers
|
||||||
XMonad.Custom.NumberWorkspaces
|
XMonad.Custom.NumberWorkspaces
|
||||||
XMonad.Custom.WorkspaceNames
|
XMonad.Custom.WorkspaceNames
|
||||||
|
XMonad.Custom.TopicSpace
|
||||||
hs-source-dirs: src
|
hs-source-dirs: src
|
||||||
ghc-options: -funbox-strict-fields -Wall -Wno-unused-do-bind
|
ghc-options: -funbox-strict-fields -Wall -Wno-unused-do-bind
|
||||||
build-depends: base
|
build-depends: base
|
||||||
|
@ -28,4 +29,5 @@ library
|
||||||
, xmonad-contrib
|
, xmonad-contrib
|
||||||
, ghc
|
, ghc
|
||||||
, X11
|
, X11
|
||||||
|
, containers
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
|
|
Loading…
Reference in a new issue