diff options
author | tv <tv@krebsco.de> | 2023-11-06 20:18:04 +0100 |
---|---|---|
committer | tv <tv@krebsco.de> | 2023-11-06 20:18:04 +0100 |
commit | c7159e1951dae3a8615a2de481ebbdbe3e4f0cfc (patch) | |
tree | cf598ed4ead7ef4c669d24f8871fe7b1bf58ef39 | |
parent | c03f381136cb66173469e273a032a93a512cec30 (diff) |
xmonad ewmhExtra: switch to desktop greedily
-rw-r--r-- | pkgs/haskell/xmonad-tv/src/XMonad/Hooks/EwmhDesktops/Extra.hs | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/pkgs/haskell/xmonad-tv/src/XMonad/Hooks/EwmhDesktops/Extra.hs b/pkgs/haskell/xmonad-tv/src/XMonad/Hooks/EwmhDesktops/Extra.hs index bf84314..7a8947f 100644 --- a/pkgs/haskell/xmonad-tv/src/XMonad/Hooks/EwmhDesktops/Extra.hs +++ b/pkgs/haskell/xmonad-tv/src/XMonad/Hooks/EwmhDesktops/Extra.hs @@ -9,11 +9,12 @@ import Data.Maybe (fromMaybe) import Data.Monoid (All) import Data.Tuple.Extra (both) import Graphics.X11.EWMH (getDesktopNames, setDesktopNames) -import Graphics.X11.EWMH.Atom (_NET_DESKTOP_NAMES) +import Graphics.X11.EWMH.Atom (_NET_CURRENT_DESKTOP, _NET_DESKTOP_NAMES) import Graphics.X11.Xlib.Display.Extra (withDefaultDisplay) import XMonad hiding (workspaces) +import XMonad.Prelude ((!?)) -- this is part of >=base-4.19's Data.List import XMonad.Actions.DynamicWorkspaces (addHiddenWorkspace, removeEmptyWorkspaceByTag) -import XMonad.StackSet (mapWorkspace, tag, workspaces) +import XMonad.StackSet (currentTag, greedyView, mapWorkspace, tag, workspaces) import XMonad.Util.WorkspaceCompare (getSortByIndex) import qualified Data.Map.Strict as Map import qualified Data.Set as Set @@ -44,6 +45,23 @@ ewmhExtra c = do ewmhDesktopsExtraEventHook :: Event -> X All ewmhDesktopsExtraEventHook = \case + + -- Replace default non-greedy implementation of + -- XMonad.Hooks.EwmhDesktops.ewmhDesktopsEventHook' + ClientMessageEvent{ev_window, ev_message_type, ev_data = n : _} + | ev_message_type == _NET_CURRENT_DESKTOP-> do + r <- asks theRoot + when (ev_window == r) $ + withWindowSet $ \s -> do + sort <- getSortByIndex + case (map tag . sort . workspaces $ s) !? fromIntegral n of + Just t -> + when (currentTag s /= t) $ + windows $ greedyView t + _ -> + trace $ "Bad _NET_CURRENT_DESKTOP with data=" <> show n + mempty + PropertyEvent{ev_window, ev_atom} -> do r <- asks theRoot when (ev_window == r && ev_atom == _NET_DESKTOP_NAMES) $ |