aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2023-12-13 17:15:19 -0700
committerJosh Rahm <rahm@google.com>2023-12-13 17:15:19 -0700
commita1e4abaa849be6df7377eac57ae2c3a159cd87ba (patch)
treec51af0ae51f8cc872c96c52de0aae67f15ac0a5f /src/Rahm/Desktop
parent4c14fed7b852296af422a9d2f7166abced2c52b9 (diff)
downloadrde-a1e4abaa849be6df7377eac57ae2c3a159cd87ba.tar.gz
rde-a1e4abaa849be6df7377eac57ae2c3a159cd87ba.tar.bz2
rde-a1e4abaa849be6df7377eac57ae2c3a159cd87ba.zip
Fix issue where pointer and keyboard were not being properly ungrabbed.
Diffstat (limited to 'src/Rahm/Desktop')
-rw-r--r--src/Rahm/Desktop/Submap.hs55
1 files changed, 30 insertions, 25 deletions
diff --git a/src/Rahm/Desktop/Submap.hs b/src/Rahm/Desktop/Submap.hs
index 9c20381..246d85c 100644
--- a/src/Rahm/Desktop/Submap.hs
+++ b/src/Rahm/Desktop/Submap.hs
@@ -16,7 +16,7 @@ module Rahm.Desktop.Submap
where
import Control.Concurrent (threadDelay)
-import Control.Exception (SomeException (SomeException), catch)
+import Control.Exception (SomeException (SomeException), catch, finally)
import Control.Monad (when)
import Control.Monad.Fix (fix)
import Control.Monad.Trans (MonadTrans (lift))
@@ -130,30 +130,35 @@ nextButtonOrKeyEvent = do
when b (MaybeT (return Nothing))
XConf {theRoot = root, display = d} <- ask
- io $ do
- grabKeyboard d root False grabModeAsync grabModeAsync currentTime
- grabPointer d root False buttonPressMask grabModeAsync grabModeAsync 0 0 currentTime
-
- ret <- MaybeT $
- io $
- fix $ \tryAgain -> do
- ret <-
- getMaskEventWithTimeout 5000 d (keyPressMask .|. buttonPressMask) $ \p -> do
- ev <- getEvent p
- case ev of
- ButtonEvent {ev_button = b, ev_state = m} ->
- return $ ButtonPress m b
- KeyEvent {ev_keycode = code, ev_state = m} -> do
- keysym <- keycodeToKeysym d code 0
- (_, str) <- lookupString (asKeyEvent p)
- return $ KeyPress m keysym str
- case ret of
- Just (KeyPress m sym str) | isModifierKey sym -> tryAgain
- x -> return x
-
- io $ do
- ungrabKeyboard d currentTime
- ungrabPointer d currentTime
+
+ ret <-
+ MaybeT $
+ io $
+ ( do
+ grabKeyboard d root False grabModeAsync grabModeAsync currentTime
+ grabPointer d root False buttonPressMask grabModeAsync grabModeAsync 0 0 currentTime
+ fix
+ ( \tryAgain ->
+ do
+ ret <-
+ getMaskEventWithTimeout 5000 d (keyPressMask .|. buttonPressMask) $ \p -> do
+ ev <- getEvent p
+ case ev of
+ ButtonEvent {ev_button = b, ev_state = m} ->
+ return $ ButtonPress m b
+ KeyEvent {ev_keycode = code, ev_state = m} -> do
+ keysym <- keycodeToKeysym d code 0
+ (_, str) <- lookupString (asKeyEvent p)
+ return $ KeyPress m keysym str
+ case ret of
+ Just (KeyPress m sym str) | isModifierKey sym -> tryAgain
+ x -> return x
+ )
+ )
+ `finally` ( do
+ ungrabKeyboard d currentTime
+ ungrabPointer d currentTime
+ )
m' <- lift $ cleanMask (event_mask ret)
return ret {event_mask = m'}