Suspend Keybinding Temporarily

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Suspend Keybinding Temporarily

Eyal Erez
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.

--
Eyal Erez <[hidden email]>

There are 10 types of people, those who know binary and those who don't.


_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Dmitriy Matrosov
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
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Brandon Allbery
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).

On Wed, Nov 28, 2018 at 1:20 PM Dmitriy Matrosov <[hidden email]> 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
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad


--
brandon s allbery kf8nh

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Dmitriy Matrosov


On November 28, 2018 9:25:00 PM GMT+03:00, Brandon Allbery <[hidden email]> 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 <[hidden email]>
>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
>> [hidden email]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>
_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Brandon Allbery
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.

On Thu, Nov 29, 2018 at 6:01 AM Dmitriy Matrosov <[hidden email]> wrote:


On November 28, 2018 9:25:00 PM GMT+03:00, Brandon Allbery <[hidden email]> 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 <[hidden email]>
>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
>> [hidden email]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>
_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad


--
brandon s allbery kf8nh

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Dmitriy Matrosov
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.
>
> On Thu, Nov 29, 2018 at 6:01 AM Dmitriy Matrosov <[hidden email]
> <mailto:[hidden email]>> wrote:
>
>
>
>     On November 28, 2018 9:25:00 PM GMT+03:00, Brandon Allbery
>     <[hidden email] <mailto:[hidden email]>> 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
>     <[hidden email] <mailto:[hidden email]>>
>      >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
>      >> [hidden email] <mailto:[hidden email]>
>      >> http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>      >>
>     _______________________________________________
>     xmonad mailing list
>     [hidden email] <mailto:[hidden email]>
>     http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>
>
>
> --
> brandon s allbery kf8nh
> [hidden email] <mailto:[hidden email]>

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Dmitriy Matrosov
In reply to this post by Brandon Allbery
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 <[hidden email]
> <mailto:[hidden email]>> wrote:
>
>
>
>     On November 28, 2018 9:25:00 PM GMT+03:00, Brandon Allbery
>     <[hidden email] <mailto:[hidden email]>> 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
>     <[hidden email] <mailto:[hidden email]>>
>      >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
>      >> [hidden email] <mailto:[hidden email]>
>      >> http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>      >>
>     _______________________________________________
>     xmonad mailing list
>     [hidden email] <mailto:[hidden email]>
>     http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>
>
>
> --
> brandon s allbery kf8nh
> [hidden email] <mailto:[hidden email]>

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Brandon Allbery
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).

On Thu, Nov 29, 2018 at 4:07 PM Dmitriy Matrosov <[hidden email]> 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 <[hidden email]
> <mailto:[hidden email]>> wrote:
>
>
>
>     On November 28, 2018 9:25:00 PM GMT+03:00, Brandon Allbery
>     <[hidden email] <mailto:[hidden email]>> 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
>     <[hidden email] <mailto:[hidden email]>>
>      >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
>      >> [hidden email] <mailto:[hidden email]>
>      >> http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>      >>
>     _______________________________________________
>     xmonad mailing list
>     [hidden email] <mailto:[hidden email]>
>     http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>
>
>
> --
> brandon s allbery kf8nh
> [hidden email] <mailto:[hidden email]>

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad


--
brandon s allbery kf8nh

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Brandon Allbery
Er. What version of ghc? That sounds like either a ghc runtime bug, or a system configuration issue. In particular, xmonad creates no threads itself, so that would be the ghc runtime's IO manager thread.

On Fri, Nov 30, 2018 at 3:07 PM Dmitriy Matrosov <[hidden email]> wrote:
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 <[hidden email]
 > <mailto:[hidden email]>> 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
 >     <[hidden email] <mailto:[hidden email]>
 >      > <mailto:[hidden email] <mailto:[hidden email]>>> wrote:
 >      >
 >      >
 >      >
 >      >     On November 28, 2018 9:25:00 PM GMT+03:00, Brandon Allbery
 >      >     <[hidden email] <mailto:[hidden email]>
 >     <mailto:[hidden email] <mailto:[hidden email]>>> 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
 >      >     <[hidden email] <mailto:[hidden email]>
 >     <mailto:[hidden email] <mailto:[hidden email]>>>
 >      >      >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
 >      >      >> [hidden email] <mailto:[hidden email]>
 >     <mailto:[hidden email] <mailto:[hidden email]>>
 >      >      >> http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
 >      >      >>
 >      >     _______________________________________________
 >      >     xmonad mailing list
 >      > [hidden email] <mailto:[hidden email]>
 >     <mailto:[hidden email] <mailto:[hidden email]>>
 >      > http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
 >      >
 >      >
 >      >
 >      > --
 >      > brandon s allbery kf8nh
 >      > [hidden email] <mailto:[hidden email]>
 >     <mailto:[hidden email] <mailto:[hidden email]>>
 >
 >     _______________________________________________
 >     xmonad mailing list
 >     [hidden email] <mailto:[hidden email]>
 >     http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
 >
 >
 >
 > --
 > brandon s allbery kf8nh
 > [hidden email] <mailto:[hidden email]>



--
brandon s allbery kf8nh

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Dmitriy Matrosov


On November 30, 2018 11:18:51 PM GMT+03:00, Brandon Allbery <[hidden email]> wrote:
>Er. What version of ghc? That sounds like either a ghc runtime bug, or
>a
>system configuration issue. In particular, xmonad creates no threads
>itself, so that would be the ghc runtime's IO manager thread.

That reminds me, that i've compiled my xmonad build with `-threaded - with-rtsopts=-N`. I've tried without these options and for now it seems stable. May that be the case?

Ghc versions are different: this error happens to me with different stack snapshots from time to time more than year already.

>On Fri, Nov 30, 2018 at 3:07 PM Dmitriy Matrosov <[hidden email]>
>wrote:
>
>> 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
><[hidden email]
>>  > <mailto:[hidden email]>> 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
>>  >     <[hidden email] <mailto:[hidden email]>
>>  >      > <mailto:[hidden email] <mailto:[hidden email]>>>
>wrote:
>>  >      >
>>  >      >
>>  >      >
>>  >      >     On November 28, 2018 9:25:00 PM GMT+03:00, Brandon
>Allbery
>>  >      >     <[hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>>
>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
>>  >      >     <[hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>>
>>  >      >      >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
>>  >      >      >> [hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>
>>  >      >      >>
>http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>  >      >      >>
>>  >      >     _______________________________________________
>>  >      >     xmonad mailing list
>>  >      > [hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>
>>  >      > http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>  >      >
>>  >      >
>>  >      >
>>  >      > --
>>  >      > brandon s allbery kf8nh
>>  >      > [hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>
>>  >
>>  >     _______________________________________________
>>  >     xmonad mailing list
>>  >     [hidden email] <mailto:[hidden email]>
>>  >     http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>  >
>>  >
>>  >
>>  > --
>>  > brandon s allbery kf8nh
>>  > [hidden email] <mailto:[hidden email]>
>>
>>
_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
Reply | Threaded
Open this post in threaded view
|

Re: Suspend Keybinding Temporarily

Brandon Allbery
Threaded builds would run a certain risk of confusing X11 under some circumstances (specifically, if you tried to use the existing server connection in a thread, you could see X11 protocol errors). They shouldn't produce that error.

On Mon, Dec 3, 2018 at 9:38 AM Dmitriy Matrosov <[hidden email]> wrote:


On November 30, 2018 11:18:51 PM GMT+03:00, Brandon Allbery <[hidden email]> wrote:
>Er. What version of ghc? That sounds like either a ghc runtime bug, or
>a
>system configuration issue. In particular, xmonad creates no threads
>itself, so that would be the ghc runtime's IO manager thread.

That reminds me, that i've compiled my xmonad build with `-threaded - with-rtsopts=-N`. I've tried without these options and for now it seems stable. May that be the case?

Ghc versions are different: this error happens to me with different stack snapshots from time to time more than year already.

>On Fri, Nov 30, 2018 at 3:07 PM Dmitriy Matrosov <[hidden email]>
>wrote:
>
>> 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
><[hidden email]
>>  > <mailto:[hidden email]>> 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
>>  >     <[hidden email] <mailto:[hidden email]>
>>  >      > <mailto:[hidden email] <mailto:[hidden email]>>>
>wrote:
>>  >      >
>>  >      >
>>  >      >
>>  >      >     On November 28, 2018 9:25:00 PM GMT+03:00, Brandon
>Allbery
>>  >      >     <[hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>>
>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
>>  >      >     <[hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>>
>>  >      >      >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
>>  >      >      >> [hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>
>>  >      >      >>
>http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>  >      >      >>
>>  >      >     _______________________________________________
>>  >      >     xmonad mailing list
>>  >      > [hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>
>>  >      > http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>  >      >
>>  >      >
>>  >      >
>>  >      > --
>>  >      > brandon s allbery kf8nh
>>  >      > [hidden email] <mailto:[hidden email]>
>>  >     <mailto:[hidden email] <mailto:[hidden email]>>
>>  >
>>  >     _______________________________________________
>>  >     xmonad mailing list
>>  >     [hidden email] <mailto:[hidden email]>
>>  >     http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad
>>  >
>>  >
>>  >
>>  > --
>>  > brandon s allbery kf8nh
>>  > [hidden email] <mailto:[hidden email]>
>>
>>
_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad


--
brandon s allbery kf8nh

_______________________________________________
xmonad mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/xmonad