diff --git a/src/XMonad/Core.hs b/src/XMonad/Core.hs index c79b992..29c7f77 100644 --- a/src/XMonad/Core.hs +++ b/src/XMonad/Core.hs @@ -68,6 +68,7 @@ data XState = XState , waitingUnmap :: !(M.Map Window Int) -- ^ the number of expected UnmapEvents , dragging :: !(Maybe (Position -> Position -> X (), X ())) , numberlockMask :: !KeyMask -- ^ The numlock modifier + , keyPressed :: !KeyCode -- ^ keycode of the key being pressed if any , extensibleState :: !(M.Map String (Either String StateExtension)) -- ^ stores custom state information. -- diff --git a/src/XMonad/Main.hs b/src/XMonad/Main.hs index 3b6ace1..bdcab3a 100644 --- a/src/XMonad/Main.hs +++ b/src/XMonad/Main.hs @@ -219,6 +219,7 @@ launch initxmc = do , mapped = S.empty , waitingUnmap = M.empty , dragging = Nothing + , keyPressed = 0 , extensibleState = M.empty } @@ -291,10 +292,15 @@ handle :: Event -> X () -- run window manager command handle (KeyEvent {ev_event_type = t, ev_state = m, ev_keycode = code}) | t == keyPress = withDisplay $ \dpy -> do - s <- io $ keycodeToKeysym dpy code 0 - mClean <- cleanMask m - ks <- asks keyActions - userCodeDef () $ whenJust (M.lookup (mClean, s) ks) id + kp <- gets keyPressed + if kp /= code then do + modify $ \s -> s { keyPressed = code } + s <- io $ keycodeToKeysym dpy code 0 + mClean <- cleanMask m + ks <- asks keyActions + userCodeDef () $ whenJust (M.lookup (mClean, s) ks) id + else return () + | t == keyRelease = modify $ \s -> s { keyPressed = 0 } -- manage a new window handle (MapRequestEvent {ev_window = w}) = withDisplay $ \dpy -> do diff --git a/src/XMonad/Operations.hs b/src/XMonad/Operations.hs index aa44dcd..747cbf7 100644 --- a/src/XMonad/Operations.hs +++ b/src/XMonad/Operations.hs @@ -482,6 +482,7 @@ readStateFile xmc = do , mapped = S.empty , waitingUnmap = M.empty , dragging = Nothing + , keyPressed = 0 , extensibleState = extState } where