summaryrefslogtreecommitdiff
blob: 5fb256601585904da22a088c0e34403c5d56620d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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