aboutsummaryrefslogtreecommitdiffstats
path: root/NextWorkspace.hs
diff options
context:
space:
mode:
authormail <mail@joachim-breitner.de>2007-10-07 01:30:10 +0200
committermail <mail@joachim-breitner.de>2007-10-07 01:30:10 +0200
commitdc8d1c63c72cbacc30864eb86b138b0d35871d39 (patch)
tree193f261939e0f4ef1d32e819e24cc250addffa4c /NextWorkspace.hs
parentb636fe8472c0e306834b0c757891278bc28559fa (diff)
downloadXMonadContrib-dc8d1c63c72cbacc30864eb86b138b0d35871d39.tar.gz
XMonadContrib-dc8d1c63c72cbacc30864eb86b138b0d35871d39.tar.xz
XMonadContrib-dc8d1c63c72cbacc30864eb86b138b0d35871d39.zip
NextWorkspace: Go forward or backward
Hi, inspired by RotView, I implemented an Extension that allows the user to go forward or backward in the list of workspaces, or to move the current window to the next or previous workspace. Haddock included. Works here, but hardly tested (and while tired). Cu torrow @ HacII, if you are there. Greetings, Joachim darcs-hash:20071006233010-c9905-35ef3364ee10c770aef2a35a295d11b519b0ca7c.gz
Diffstat (limited to '')
-rw-r--r--NextWorkspace.hs91
1 files changed, 91 insertions, 0 deletions
diff --git a/NextWorkspace.hs b/NextWorkspace.hs
new file mode 100644
index 0000000..8243a62
--- /dev/null
+++ b/NextWorkspace.hs
@@ -0,0 +1,91 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module : XMonadContrib.NextWorkspace
+-- Copyright : (c) Joachim Breitner <mail@joachim-breitner.de>
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : Joachim Breitner <mail@joachim-breitner.de>
+-- Stability : unstable
+-- Portability : unportable
+--
+-- Provides bindings to cycle forward or backward through the list
+-- of workspaces, and to move windows there.
+--
+-----------------------------------------------------------------------------
+
+module XMonadContrib.NextWorkspace (
+ -- * Usage
+ -- $usage
+ nextWorkspace,
+ prevWorkspace,
+ shiftToNext,
+ shiftToPrev,
+ ) where
+
+import Control.Monad.State ( gets )
+import Data.List ( sortBy, findIndex )
+import Data.Maybe ( fromMaybe )
+import Data.Ord ( comparing )
+
+import XMonad
+import StackSet hiding (filter, findIndex)
+import Operations
+import {-# SOURCE #-} qualified Config (workspaces)
+
+-- $usage
+-- You can use this module with the following in your Config.hs file:
+--
+-- > import XMonadContrib.NextWorkspace
+--
+-- > , ((modMask, xK_Right), nextWorkspace)
+-- > , ((modMask, xK_Left), prevWorkspace)
+-- > , ((modMask .|. shiftMask, xK_Right), shiftToNext)
+-- > , ((modMask .|. shiftMask, xK_Left), shiftToPrev)
+
+-- %import XMonadContrib.RotView
+-- %keybind , ((modMask .|. shiftMask, xK_Right), rotView True)
+-- %keybind , ((modMask .|. shiftMask, xK_Left), rotView False)
+
+
+-- ---------------------
+-- |
+-- Switch to next workspace
+nextWorkspace :: X()
+nextWorkspace = switchWorkspace (1)
+
+-- ---------------------
+-- |
+-- Switch to previous workspace
+prevWorkspace :: X()
+prevWorkspace = switchWorkspace (-1)
+
+-- |
+-- Move focused window to next workspace
+shiftToNext :: X()
+shiftToNext = shiftBy (1)
+
+-- |
+-- Move focused window to previous workspace
+shiftToPrev :: X ()
+shiftToPrev = shiftBy (-1)
+
+switchWorkspace :: Int -> X ()
+switchWorkspace d = wsBy d >>= windows . greedyView
+
+shiftBy :: Int -> X ()
+shiftBy d = wsBy d >>= windows . shift
+
+wsBy :: Int -> X (WorkspaceId)
+wsBy d = do
+ ws <- gets windowset
+ let orderedWs = sortBy (comparing wsIndex) (workspaces ws)
+ let now = fromMaybe 0 $ findWsIndex (workspace (current ws)) orderedWs
+ let next = orderedWs !! ((now + d) `mod` length orderedWs)
+ return $ tag next
+
+
+wsIndex :: WindowSpace -> Maybe Int
+wsIndex ws = findIndex (==(tag ws)) Config.workspaces
+
+findWsIndex :: WindowSpace -> [WindowSpace] -> Maybe Int
+findWsIndex ws wss = findIndex ((== tag ws) . tag) wss