{-# LANGUAGE ScopedTypeVariables #-}
-----------------------------------------------------------------------------
-- |
-- Module      : System.Taffybar.TaffyPager
-- Copyright   : (c) José A. Romero L.
-- License     : BSD3-style (see LICENSE)
--
-- Maintainer  : José A. Romero L. <escherdragon@gmail.com>
-- Stability   : unstable
-- Portability : unportable
--
-- This module provides a drop-in replacement for the XMonadLog widget
-- that allows to:
--
-- * click on a workspace label to switch to that workspace,
--
-- * left-click on the layout label to switch to the next layout, and
-- right-click to switch to the first layout,
--
-- * click on the window title to pop-up a list of all the currently open
-- windows that can be clicked to switch to any of them,
--
-- All its interactions with the windows manager are performed via EWMH
-- hints and X11 events.
--
-- This widget is actually only a convenience wrapper around a Pager, a
-- WorkspaceSwitcher, a LayoutSwitcher and a WindowSwitcher. If you are
-- looking for more advanced configurations (like having components
-- displayed separately, or using only part of them), consult directly the
-- documentation for each of the components.
--
-----------------------------------------------------------------------------

module System.Taffybar.TaffyPager (
  -- * Usage
  -- $usage
  taffyPagerNew
, PagerConfig (..)
, defaultPagerConfig
) where

import Graphics.UI.Gtk
import System.Taffybar.Pager
import System.Taffybar.WorkspaceSwitcher
import System.Taffybar.LayoutSwitcher
import System.Taffybar.WindowSwitcher

-- $usage
--
-- This widget requires that two hooks be installed in your @xmonad.hs@
-- configuration: EwmhDesktops from the XMonadContrib project, and the one
-- provided in the "System.Taffybar.Hooks.PagerHints" module:
--
-- > import XMonad.Hooks.EwmhDesktops (ewmh)
-- > import System.Taffybar.Hooks.PagerHints (pagerHints)
-- > main = do
-- >   xmonad $ ewmh $ pagerHints $ defaultConfig
-- > ...
--
-- That's all: no log hooks, no urgency hooks, no DBus client. Once you've
-- configured @xmonad.hs@, you can use the widget in your @taffybar.hs@
-- file:
--
-- > import System.Taffybar.TaffyPager
-- > main = do
-- >   let pager = taffyPagerNew defaultPagerConfig
--
-- now you can use @pager@ as any other Taffybar widget.

-- | Create a new TaffyPager widget.
taffyPagerNew :: PagerConfig -> IO Widget
taffyPagerNew cfg = do
  pgr <- pagerNew cfg
  wss <- wspaceSwitcherNew pgr
  los <- layoutSwitcherNew pgr
  wnd <- windowSwitcherNew pgr
  sp1 <- separator cfg
  sp2 <- separator cfg
  box <- hBoxNew False 0

  boxPackStart box wss PackNatural 0
  boxPackStart box sp1 PackNatural 0
  boxPackStart box los PackNatural 0
  boxPackStart box sp2 PackNatural 0
  boxPackStart box wnd PackNatural 0

  widgetShowAll box
  return (toWidget box)

-- | Create a new separator label to put between two sub-components.
separator :: PagerConfig -> IO Label
separator cfg = do
  sep <- labelNew (Nothing :: Maybe String)
  labelSetMarkup sep (widgetSep cfg)
  return sep