mirror of
https://github.com/xmonad/xmonad-contrib.git
synced 2025-08-01 04:31:52 -07:00
When `runProcessWithInput` is invoked immediately after `ungrabPointer`/`ungrabKeyboard`, we don't actually ungrab at all because `runProcessWithInput` blocks and the ungrab requests wait in Xlib's queue for a requests that needs a queue flush. Common uses of `unGrab` (before `spawn`) aren't followed by a blocking action, so the ungrab requests are flushed by xmonad's main loop, and this is merely a timing issue—fork/exec takes a while and xmonad probably manages to get back to its main loop in time. Uses of `runProcessWithInput` in ordinary non-submap key bindings happen to work because key bindings are passive grabs—the grab is released by the user's fingers releasing the key itself, even if xmonad's ungrab requests are stuck in a blocked queue. Submap key bindings, however, take an active grab and therefore need to ungrab explicitly. Easy fix—explicit `sync`. Fixes: https://github.com/xmonad/xmonad/issues/313
45 lines
1.6 KiB
Haskell
45 lines
1.6 KiB
Haskell
-----------------------------------------------------------------------------
|
|
-- |
|
|
-- Module : XMonad.Util.Ungrab
|
|
-- Copyright : (c) 2016 Brandon S Allbery
|
|
-- License : BSD-style (see xmonad/LICENSE)
|
|
--
|
|
-- Maintainer : allbery.b@gmail.com
|
|
-- Stability : unstable
|
|
-- Portability : unportable
|
|
--
|
|
-- Allow releasing xmonad's keyboard grab
|
|
--
|
|
-----------------------------------------------------------------------------
|
|
|
|
module XMonad.Util.Ungrab
|
|
( -- * Usage:
|
|
-- $usage
|
|
unGrab
|
|
) where
|
|
|
|
import Graphics.X11.Xlib (sync)
|
|
import Graphics.X11.Xlib.Extras (currentTime)
|
|
import Graphics.X11.Xlib.Misc (ungrabKeyboard, ungrabPointer)
|
|
import XMonad.Core
|
|
|
|
-- $usage
|
|
-- Start a keyboard action with this if it is going to run something
|
|
-- that needs to do a keyboard, pointer, or server grab. For example,
|
|
--
|
|
-- > , ((modm .|. controlMask, xK_p), unGrab >> spawn "scrot")
|
|
--
|
|
-- (Other examples are screen lockers and "gksu".)
|
|
-- This avoids needing to insert a pause/sleep before running the
|
|
-- command.
|
|
--
|
|
-- xmonad retains the keyboard grab during key actions because if they
|
|
-- use a Submap, they need the keyboard to be grabbed, and if they had
|
|
-- to assert their own grab then the asynchronous nature of X11 allows
|
|
-- race conditions between xmonad, other clients, and the X server that
|
|
-- would cause keys to sometimes be "leaked" to the focused window.
|
|
|
|
-- | Release xmonad's keyboard grab, so other grabbers can do their thing.
|
|
unGrab :: X ()
|
|
unGrab = withDisplay $ \d -> io (ungrabKeyboard d currentTime >> ungrabPointer d currentTime >> sync d False)
|