[xmonad] Fwd: Re: Suspend Keybinding Temporarily

Dmitriy Matrosov sgf.dma at gmail.com
Fri Nov 30 20:08:28 UTC 2018


Sorry, i've sent mail privately instead of sending it to the list.

-------- Forwarded Message --------
Subject: Re: [xmonad] Suspend Keybinding Temporarily
Date: Fri, 30 Nov 2018 23:07:01 +0300
From: Dmitriy Matrosov <sgf.dma at gmail.com>
To: Brandon Allbery <allbery.b at gmail.com>

On 11/30/2018 12:11 AM, Brandon Allbery wrote:
> Yes. More specifically, it's ultimately using the execve() syscall, via
> one of the wrappers which propagates the environment (which one depends
> on whether it's asked to do $PATH search or not).

So.. here is version using environment:

         import XMonad
         import XMonad.Operations
         import XMonad.Util.EZConfig

         import System.Environment
         import Control.Exception

         main :: IO ()
         main = do
                 let xcf = def
                             { modMask = mod4Mask
                             , handleExtraArgs = disableKeysE
                             }
                             `additionalKeys`
                             [ ((mod4Mask, xK_d), disableKeysOn) ]
                 xmonad xcf

         disableKeysOn :: X ()
         disableKeysOn       = do
             trace "Preparing to disable keys and restarting.."
             io $ setEnv "XMONAD_DISABLE_KEYS" "1"
             restart "xmonad" True

         disableKeysE :: [String] -> XConfig Layout -> IO (XConfig Layout)
         disableKeysE _ xcf = do
             me <- lookupEnv "XMONAD_DISABLE_KEYS"
             case me of
               Just _    -> do
                 trace "Disabling all keys."
                 unsetEnv "XMONAD_DISABLE_KEYS"
                 return (xcf {keys = \_ -> mempty})
               Nothing   -> return xcf

It also restarts xmonad on key press (when disabling keys) and all
works fine, but.. xmonad frequently crashes with

         xmonad: failed to create OS thread: Resource temporarily 
unavailable

I don't think this crash relates somehow to using environment, and it
happened from time to time before too, but still.. Can you advise,
how to fix it?

> On Thu, Nov 29, 2018 at 4:07 PM Dmitriy Matrosov <sgf.dma at gmail.com
> <mailto:sgf.dma at gmail.com>> wrote:
>
>     On 11/29/2018 09:50 PM, Brandon Allbery wrote:
>      > You were talking about restart, between the running xmonad and its
>      > replacement via executeFile. There, you can use the environment.
>     There
>      > is no way to pass information between an invoked "xmonad
>     --restart" and
>      > the running xmonad.
>
>     You mean, `executeFile` preserves environment? So, i may change 
it from
>     running xmonad (by e.g. keybinding) and then restart it?
>
>      > On Thu, Nov 29, 2018 at 6:01 AM Dmitriy Matrosov
>     <sgf.dma at gmail.com <mailto:sgf.dma at gmail.com>
>      > <mailto:sgf.dma at gmail.com <mailto:sgf.dma at gmail.com>>> wrote:
>      >
>      >
>      >
>      >     On November 28, 2018 9:25:00 PM GMT+03:00, Brandon Allbery
>      >     <allbery.b at gmail.com <mailto:allbery.b at gmail.com>
>     <mailto:allbery.b at gmail.com <mailto:allbery.b at gmail.com>>> wrote:
>      >      >Not by default; there's already a bug (
>      >      >https://github.com/xmonad/xmonad/issues/78) about our not
>     obeying the
>      >      >ICCCM
>      >      >replace protocol unless started by replacing some other WM.
>      >      >
>      >      >There's a few other places you can hide extra parameters;
>     starting
>      >     that
>      >      >early, the environment is probably the easiest to use, 
provided
>      >     they're
>      >      >not
>      >      >too large (see why there's a state file now).
>      >
>      >     Hm, i don't understand how to use environment. I need to pass
>      >     something to running xmonad process (to which i send
>      >     XMONAD_RESTART). As far as i know, i can't change 
environment of
>      >     another process..
>      >
>      >
>      >      >On Wed, Nov 28, 2018 at 1:20 PM Dmitriy Matrosov
>      >     <sgf.dma at gmail.com <mailto:sgf.dma at gmail.com>
>     <mailto:sgf.dma at gmail.com <mailto:sgf.dma at gmail.com>>>
>      >      >wrote:
>      >      >
>      >      >> Hi.
>      >      >>
>      >      >> On 11/21/2018 09:49 PM, Eyal Erez wrote:
>      >      >> > Hi,
>      >      >> >
>      >      >> > I'm getting some collisions between my xmonad
>     keybindings and an
>      >      >> > application I'm running (it's a game that is suppose to
>     run full
>      >      >screen
>      >      >> > but in reality just uses a large window).  I was
>     wondering if I
>      >      >could
>      >      >> > suspend or change some keybindings from a script that I
>     can run
>      >      >before
>      >      >> > the app launches and then restore later.
>      >      >> >
>      >      >> > Is this at all possible?  Happy to entertain other 
options.
>      >      >>
>      >      >> Here is proof of concept:
>      >      >>
>      >      >>
>      >      >>          import XMonad
>      >      >>          import XMonad.Hooks.EwmhDesktops
>      >      >>
>      >      >>          import System.Directory
>      >      >>          import System.FilePath
>      >      >>
>      >      >>
>      >      >>          main :: IO ()
>      >      >>          main = do
>      >      >>                  let xcf = ewmh $ def
>      >      >>                              { modMask = mod4Mask
>      >      >>                              , handleExtraArgs = 
disableKeys
>      >      >>                              }
>      >      >>                  xmonad xcf
>      >      >>
>      >      >>          disableKeys :: [String] -> XConfig Layout -> IO
>     (XConfig
>      >      >Layout)
>      >      >>          disableKeys _ xcf = do
>      >      >>              xd <- getXMonadDir
>      >      >>              let disableFn = xd </> "disable_keys"
>      >      >>              b <- doesFileExist disableFn
>      >      >>              if b
>      >      >>                then do
>      >      >>                  trace "Disabling all keys."
>      >      >>                  removeFile disableFn
>      >      >>                  return (xcf {keys = \_ -> mempty})
>      >      >>                else return xcf
>      >      >>
>      >      >>
>      >      >> To disable all keys create file `~/.xmonad/disable_keys`
>     and then
>      >      >> restart xmonad with `xmonad --restart`. All keys will be
>     disabled
>      >      >> _and_ file deleted (to avoid locking yourself), thus next
>     restart
>      >      >will
>      >      >> restore all keys back.
>      >      >>
>      >      >> As far as i understand, xmonad grabs keys in
>     `X.Main.launch` before
>      >      >> entering main loop. Thus, the one way to change key grab
>     is to
>      >      >restart
>      >      >> xmonad. I need to modify `XConfig` before calling
>      >     X.Main.launch`, and
>      >      >> this may be done by `handleExtraArgs` (called in 
`launch'` in
>      >      >> `X.Main.xmonad`). Unfortunately, it seems, that xmonad
>     does not
>      >     allow
>      >      >> to pass extra cmd arguments during restart
>     (`X.Operations.restart`
>      >      >> always starts xmonad with name `xmonad` and no
>     arguments). Also, i
>      >      >> can't use extensible state in `handleExtraArgs`, because
>     it runs in
>      >      >> `IO` (`X` context is not yet built at that time).  Thus,
>     to pass
>      >      >> something to it, i may use either file or (probably)
>      >     `--replace`. The
>      >      >> above version uses file. And i have no luck with
>     `--replace`: it
>      >      >> seems, `xmonad` can't replace itself?..
>      >      >> _______________________________________________
>      >      >> xmonad mailing list
>      >      >> xmonad at haskell.org <mailto:xmonad at haskell.org>
>     <mailto:xmonad at haskell.org <mailto:xmonad at haskell.org>>
>      >      >> http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>      >      >>
>      >     _______________________________________________
>      >     xmonad mailing list
>      > xmonad at haskell.org <mailto:xmonad at haskell.org>
>     <mailto:xmonad at haskell.org <mailto:xmonad at haskell.org>>
>      > http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>      >
>      >
>      >
>      > --
>      > brandon s allbery kf8nh
>      > allbery.b at gmail.com <mailto:allbery.b at gmail.com>
>     <mailto:allbery.b at gmail.com <mailto:allbery.b at gmail.com>>
>
>     _______________________________________________
>     xmonad mailing list
>     xmonad at haskell.org <mailto:xmonad at haskell.org>
>     http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>
>
>
> --
> brandon s allbery kf8nh
> allbery.b at gmail.com <mailto:allbery.b at gmail.com>



More information about the xmonad mailing list