xmonad / xmonad

The core of xmonad, a small but functional ICCCM-compliant tiling window manager
https://xmonad.org
BSD 3-Clause "New" or "Revised" License
3.35k stars 290 forks source link

Write mouse bidings and Xmonad Prompt bindings with EZ Keys ? #507

Open thealio opened 4 months ago

thealio commented 4 months ago

Hi I have these keybindis, that work OK with standard keybinds


myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $
    -- mod-button1, Set the window to floating mode and move by dragging
    [ ((modMask, 1), (\w -> focus w >> mouseMoveWindow w >> windows W.shiftMaster))
    -- mod-button2, Raise the window to the top of the stack
    , ((modMask, 2), (\w -> focus w >> windows W.shiftMaster))
    -- mod-button3, Set the window to floating mode and resize by dragging
    , ((modMask, 3), (\w -> focus w >> mouseResizeWindow w >> windows W.shiftMaster)) ]
myXPKeymap :: M.Map (KeyMask,KeySym) (XP ())
myXPKeymap = M.fromList $
     map (first $ (,) controlMask)      -- control + <key>
     [ (xK_z, killBefore)               -- kill line backwards
     , (xK_k, killAfter)                -- kill line forwards
     , (xK_a, startOfLine)              -- move to the beginning of the line
     , (xK_e, endOfLine)                -- move to the end of the line
     , (xK_m, deleteString Next)        -- delete a character foward
     , (xK_b, moveCursor Prev)          -- move cursor forward
     , (xK_f, moveCursor Next)          -- move cursor backward
     , (xK_BackSpace, killWord Prev)    -- kill the previous word
     , (xK_v, pasteString)              -- paste a string
     , (xK_q, quit)                     -- quit out of prompt
     , (xK_bracketleft, quit) ]
     ++

Now I'd like to write them using the XMonad.Util.EZConfig module keys and also wit addName , I tried many times , but unsuccesfully .

I wanna ask if this is technically possible, and how to do that. If it's not, I wanna made a feature request.

I have these lines for normal keys

xmonad $ ewmh $ docks $ addDescrKeys' ((mod4Mask, xK_F1), showKeybindings) myKeys $ ewmhFullscreen $ pagerHints $ myDefaults

myKeys :: XConfig Layout -> [((KeyMask, KeySym), NamedAction)]
myKeys conf =
  --(subtitle "Custom Keys":) $ mkNamedKeymap c $                 -- subtitle
  let subKeys str ks = subtitle' str : mkNamedKeymap conf ks in   -- subtitle'
------------------------------------------
  subKeys "Base xmonad"
  [ ("M-M1-r",      addName "Recompile & Restart xmonad" $ xmonadRecompile)  -- custom function
  , ("M-<Return>",  addName "Launch terminal"            $ spawn (myTerminal))
  , ("M1-r",        addName "Restart xmonad"             $ spawn "xmonad --restart")]

I'm using distrotube config as a code source : https://gitlab.com/dwt1/dotfiles/-/blob/master/.config/xmonad/xmonad.hs

slotThe commented 4 months ago

What are you having trouble with?

geekosaur commented 4 months ago

I'd like to note that this belongs in xmonad-contrib, not core.

The lower level mechanisms in EZKeys could be used to make a function that would let you use additionalKeysP-style bindings with Prompt. The higher level ones (additionalKeys and friends) won't work because they require and produce an XConfig, plus they expect the actions to be X (), not XP ().

addName isn't even meaningful here. Why do you want it?

Similarly, mouse bindings are not key bindings and so it's not useful to define mouse bindings in additionalKeysP style.

thealio commented 4 months ago

Hi, and thank you for your answer

I'd like to note that this belongs in xmonad-contrib, not core.

The lower level mechanisms in EZKeys could be used to make a function that would let you use additionalKeysP-style bindings with Prompt. The higher level ones (additionalKeys and friends) won't work because they require and produce an XConfig, plus they expect the actions to be X (), not XP ().

addName isn't even meaningful here. Why do you want it?

Similarly, mouse bindings are not key bindings and so it's not useful to define mouse bindings in additionalKeysP style.

The addName is used in a custom function that pipes the keybindings into rofi for have a list of keybindings

-- Show Keybindings                                
showKeybindings :: [((KeyMask, KeySym), NamedAction)] -> NamedAction
showKeybindings x = addName "Show Keybindings" $ io $ do
  h <- spawnPipe $ myMenu 
--  hPutStr h (unlines $ showKm x)         -- showKM adds ">>" before subtitles
  hPutStr h (unlines $ showKmSimple x)     -- showKmSimple doesn't add ">>" to subtitles
  hClose h
  return ()
  where
     myMenu = "rofi -dmenu -i -matching fuzzy -p 'Xmonad keys'"
-- Keybind for showing the keybinds list
myMenuKey = addDescrKeys' ((mod4Mask, xK_F1), showKeybindings)
myWorkspaces = myNamedWS
 -- Main section
main :: IO ()
main = do
    dbus <- D.connectSession      -- dbus is required for polybar
 -- Request access to the DBus name
    D.requestName dbus (D.busName_ "org.xmonad.Log")
        [D.nameAllowReplacement, D.nameReplaceExisting, D.nameDoNotQueue]

    xmonad $ ewmh $ docks $ addDescrKeys' ((mod4Mask, xK_F1), showKeybindings) myKeys $ ewmhFullscreen $ pagerHints $ myDefaults
 -- $ pagerHints is required for print the current layout in xmonad ( xprop -root _XMONAD_CURRENT_LAYOUT | awk '{print $NF}' | tr -d "\"" )

 -- Start polybar
myBarHook = do
    spawn "polybar --config=~/.config/polybar/config.ini mainbar-xmonad"  -- Start polybar

I wanna also pipe mouse bindings and prompt bindings in the keybind list