--- /dev/null
+--- xmonad/src/XMonad/Core.hs 2010-09-05 05:11:42.000000000 +0400
++++ xmonad/src/XMonad/Core.hs 2010-09-18 07:59:14.000000000 +0400
+@@ -65,6 +65,7 @@
+ , 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.
+ --
+--- xmonad/src/XMonad/Main.hs 2010-09-05 05:11:42.000000000 +0400
++++ xmonad/src/XMonad/Main.hs 2010-09-18 08:03:11.000000000 +0400
+@@ -129,6 +129,7 @@
+ , mapped = S.empty
+ , waitingUnmap = M.empty
+ , dragging = Nothing
++ , keyPressed = 0
+ , extensibleState = extState
+ }
+ allocaXEvent $ \e ->
+@@ -190,10 +191,15 @@
+ -- 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
--- /dev/null
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=5
+
+# ebuild generated by hackport 0.4.6.9999
+#hackport: flags: -generatemanpage,-testing
+
+CABAL_FEATURES="bin lib profile haddock hoogle hscolour test-suite"
+inherit haskell-cabal
+
+DESCRIPTION="A tiling window manager"
+HOMEPAGE="http://xmonad.org"
+SRC_URI="mirror://hackage/packages/archive/${PN}/${PV}/${P}.tar.gz"
+
+LICENSE="BSD"
+SLOT="0/${PV}"
+KEYWORDS="~amd64 ~ppc64 ~sparc ~x86"
+IUSE="+default-term no-autorepeat-keys"
+
+RDEPEND="dev-haskell/data-default:=[profile?]
+ dev-haskell/extensible-exceptions:=[profile?]
+ dev-haskell/mtl:=[profile?]
+ dev-haskell/setlocale:=[profile?]
+ >=dev-haskell/utf8-string-0.3:=[profile?] <dev-haskell/utf8-string-1.1:=[profile?]
+ >=dev-haskell/x11-1.5:=[profile?] <dev-haskell/x11-1.7:=[profile?]
+ >=dev-lang/ghc-7.4.1:=
+"
+DEPEND="${RDEPEND}
+ >=dev-haskell/cabal-1.8
+ test? ( >=dev-haskell/quickcheck-2 )
+"
+PDEPEND="default-term? ( x11-terms/xterm )
+ x11-apps/xmessage
+"
+
+SAMPLE_CONFIG="xmonad.hs"
+SAMPLE_CONFIG_LOC="man"
+
+src_prepare() {
+ use no-autorepeat-keys && epatch "$FILESDIR"/${PN}-0.12-check-repeat.patch
+
+ # allow user patches
+ epatch_user
+}
+
+src_configure() {
+ haskell-cabal_src_configure \
+ --flag=-generatemanpage \
+ --flag=-testing
+}
+
+src_install() {
+ cabal_src_install
+
+ echo -e "#!/bin/sh\n/usr/bin/xmonad" > "${T}/${PN}"
+ exeinto /etc/X11/Sessions
+ doexe "${T}/${PN}"
+
+ insinto /usr/share/xsessions
+ doins "${FILESDIR}/${PN}.desktop"
+
+ doman man/xmonad.1
+ dohtml man/xmonad.1.html
+
+ dodoc CONFIG README.md CHANGES.md
+}
+
+pkg_postinst() {
+ haskell-cabal_pkg_postinst
+
+ elog "A sample ${SAMPLE_CONFIG} configuration file can be found here:"
+ elog " /usr/share/${PF}/ghc-$(ghc-version)/${SAMPLE_CONFIG_LOC}/${SAMPLE_CONFIG}"
+ elog "The parameters in this file are the defaults used by xmonad."
+ elog "To customize xmonad, copy this file to:"
+ elog " ~/.xmonad/${SAMPLE_CONFIG}"
+ elog "After editing, use 'mod-q' to dynamically restart xmonad "
+ elog "(where the 'mod' key defaults to 'Alt')."
+ elog ""
+ elog "Read the README or man page for more information, and to see "
+ elog "other possible configurations go to:"
+ elog " http://haskell.org/haskellwiki/Xmonad/Config_archive"
+ elog "Please note that many of these configurations will require the "
+ elog "x11-wm/xmonad-contrib package to be installed."
+}