------------------------------
-- Usage:
--
--
-- Add dans Perso.hs
--     import XMonadContrib.SendWsToAllScreen
--
--     Dans KeysPerso
--     ++
--     -- mod-[1..6] @@ Switch to workspace N and N+6 
--     [((modMask, k),sendWsToAllScreen i) 
--          | (i,k) <- take (nbWorkspacePerScreen)
--                     (zip workspaces (take (length workspaces - 1) keyWorkspace))]


-- Permet d'afficher des paires de worskpace sur 2 ecrans.

------------------------------


module Hacks.SendWsToAllScreen (sendWsToScreen,
                                sendWsToAllScreen,
                               ) where

import XMonad
import Operations 

import XMonadContrib.Submap

import qualified StackSet as S
import qualified Data.List as L (delete,find,deleteBy)


-- Deplace un workspace sur le screen sid
sendWsToScreen :: (Eq a,Eq s,Eq i) => i -> s -> S.StackSet i l a s sd -> S.StackSet i l  a s sd
sendWsToScreen wid sid s
    -- sid est le screen courant
    |  S.screen (S.current s) == sid = S.greedyView wid s
    -- sid n'est pas le screen courant mais le bureau est visible donc on ne fait rien
    |  Just x <- L.find ((wid==).S.tag.S.workspace) (S.visible s) 
    = s 
    -- sid n'est pas le screen courant et le workspace est hidden
    |  (Just x, Just screenCur) <- (L.find ((wid==).S.tag) (S.hidden s) , L.find ((sid==).S.screen) (S.visible s))
    = s { S.visible= screenCur {S.workspace = x , 
                                S.screen = S.screen screenCur , 
                                S.screenDetail =  S.screenDetail screenCur} : L.deleteBy screenEq screenCur  (S.visible s),
          S.hidden = (S.workspace screenCur) : L.deleteBy workspaceEq x (S.hidden s)}
    | otherwise = s
    where screenEq x y = S.screen x == S.screen y
          workspaceEq x y = S.tag x == S.tag y



-- Affiche le bureau w sur le screen 0 et w+6 sur le screen 1
-- Les bureaux sont grouper virtuellement par leur nom ...
-- Bureau de l'ecran 0: 0x x=0..
-- Bureau de l'ecran 1: 1x x=0..


sendWsToAllScreen :: Int -> X ()
sendWsToAllScreen w = windows  ((sendWsToScreen ("1"++(show w)) 1).(sendWsToScreen ("0"++(show w)) 0))

