------------------------------------------------------------------------------- |-- Module : XMonad.Actions.Commands-- Copyright : (c) David Glasser 2007-- License : BSD3---- Maintainer : glasser@mit.edu-- Stability : stable-- Portability : portable---- Allows you to run internal xmonad commands (X () actions) using-- a dmenu menu in addition to key bindings. Requires dmenu and-- the Dmenu XMonad.Actions module.-------------------------------------------------------------------------------moduleXMonad.Actions.Commands(-- * Usage-- $usagecommandMap,runCommand,runCommand',workspaceCommands,screenCommands,defaultCommands)whereimportXMonadimportXMonad.StackSethiding(workspaces)importXMonad.Util.Dmenu(dmenu)importqualifiedData.MapasMimportSystem.ExitimportData.Maybe-- $usage---- You can use this module with the following in your @~\/.xmonad\/xmonad.hs@:---- > import XMonad.Actions.Commands---- Then add a keybinding to the runCommand action:---- > , ((modm .|. controlMask, xK_y), commands >>= runCommand)---- and define the list of commands you want to use:---- > commands :: X [(String, X ())]-- > commands = defaultCommands---- Whatever key you bound to will now cause a popup menu of internal-- xmonad commands to appear. You can change the commands by changing-- the contents of the list returned by 'commands'. (If you like it-- enough, you may even want to get rid of many of your other key-- bindings!)---- For detailed instructions on editing your key bindings, see-- "XMonad.Doc.Extending#Editing_key_bindings".-- | Create a 'Data.Map.Map' from @String@s to xmonad actions from a-- list of pairs.commandMap::[(String,X())]->M.MapString(X())commandMapc=M.fromListc-- | Generate a list of commands to switch to\/send windows to workspaces.workspaceCommands::X[(String,X())]workspaceCommands=asks(workspaces.config)>>=\spaces->return[((m++showi),windows$fi)|i<-spaces,(f,m)<-[(view,"view"),(shift,"shift")]]-- | Generate a list of commands dealing with multiple screens.screenCommands::[(String,X())]screenCommands=[((m++showsc),screenWorkspace(fromIntegralsc)>>=flipwhenJust(windows.f))|sc<-[0,1]::[Int]-- TODO: adapt to screen changes,(f,m)<-[(view,"screen"),(shift,"screen-to-")]]-- | A nice pre-defined list of commands.defaultCommands::X[(String,X())]defaultCommands=dowscmds<-workspaceCommandsreturn$wscmds++screenCommands++otherCommandswhereotherCommands=[("shrink",sendMessageShrink),("expand",sendMessageExpand),("next-layout",sendMessageNextLayout),("default-layout",asks(layoutHook.config)>>=setLayout),("restart-wm",restart"xmonad"True),("restart-wm-no-resume",restart"xmonad"False),("xterm",spawn=<<asks(terminal.config)),("run",spawn"exe=`dmenu_path | dmenu -b` && exec $exe"),("kill",kill),("refresh",refresh),("focus-up",windowsfocusUp),("focus-down",windowsfocusDown),("swap-up",windowsswapUp),("swap-down",windowsswapDown),("swap-master",windowsswapMaster),("sink",withFocused$windows.sink),("quit-wm",io$exitWithExitSuccess)]-- | Given a list of command\/action pairs, prompt the user to choose a-- command and return the corresponding action.runCommand::[(String,X())]->X()runCommandcl=doletm=commandMapclchoice<-dmenu(M.keysm)fromMaybe(return())(M.lookupchoicem)-- | Given the name of a command from 'defaultCommands', return the-- corresponding action (or the null action if the command is not-- found).runCommand'::String->X()runCommand'c=dom<-fmapcommandMapdefaultCommandsfromMaybe(return())(M.lookupcm)