Difference between revisions of "Xmonad/Notable changes since 0.9"

From HaskellWiki
Jump to navigation Jump to search
Line 45: Line 45:
   
 
====Hooks====
 
====Hooks====
* '''CurrentWorkspaceOnTop''' logHook for use to restack floating layouts, used by bluetile config.
+
* '''CurrentWorkspaceOnTop''' logHook for use to restack floating layouts, ensuring dragged windows stay on top, used by bluetile config.
   
 
* '''PositionStoreHooks''' manageHook and eventHook to store and maintain position and size data, used by bluetile config.
 
* '''PositionStoreHooks''' manageHook and eventHook to store and maintain position and size data, used by bluetile config.

Revision as of 18:58, 10 December 2009

This page is for keeping a record of significant changes in darcs xmonad and xmonad-contrib since the 0.9 release. See 'darcs changes' for more details about miscellaneous feature enhancements, and documentation and bug fixes not noted here.

The idea is to put here a list of things which a user upgrading from 0.9 to the current darcs version might like to know, so that they are sure to be included in the next release change log.

Updates that require changes in xmonad.hs

Simplified interface for X.A.SpawnOn and X.H.DynamicHooks

Since contrib modules can now store custom state in XState, the additional IORef parameters are no longer required: Users have to remove the first parameter to the respective functions. The functions mkSpawner and initDynamicHooks are also no longer necessary and have been removed. The same applies to XMonad.Hooks.DynamicHooks. See below for examples.

X.A.OnScreen changes

The type of onScreen has been changed to allow more general onScreen functions. The new onScreen takes any function that modifies the stack and runs it on the given screen. Since XMonad can not guess what you'd like to do with the focus after running this function, onScreen also accepts a Focus data which tells XMonad how to act. See below for detailed examples. The more common "end user" functions like viewOnScreen and greedyViewOnScreen didn't change in their interface though.

Changes to the xmonad core

  • XState now supports state extensions in xmonad-contrib. See darcs source or documentation.
  • xmonad --verbose-version flag added to provide more detailed information about the xmonad build useful for troubleshooting.
  • <+> is `mappend` for any Monoid now, not just ManageHook. Thus it can be used with keybindings, handleEventHook, X(a -> a), and more.
  • The GenerateManpage script now uses the GPL'd pandoc to generate html and man versions of the manpage.

Changes to xmonad-contrib

Updated modules

Actions

  • OnScreen has improved several functions and offers greater flexibility, however some interfaces have changed. See changes in xmonad.hs for details.

Config

Hooks

Layout

Prompt

Util

New contrib modules

Actions

  • BluetileCommands are the X.H.ServerMode commands used by the bluetile gtk2hs dock. Most of them can also be used with other interfaces to ServerMode if you have enabled the appropriate layout extensions from X.C.Bluetile.

Config

  • Bluetile enables the bluetile extensions less its greeter and dock.

Hooks

  • CurrentWorkspaceOnTop logHook for use to restack floating layouts, ensuring dragged windows stay on top, used by bluetile config.
  • PositionStoreHooks manageHook and eventHook to store and maintain position and size data, used by bluetile config.

Layout

  • ButtonDecoration provides window decoration with clickable menu, minimize, maximize, close buttons. Requires use of L.Minimize and L.Maximize and L.DecorationAddons.
  • DecorationAddons extra utilities to make decorations more useful.
  • DraggingVisualizer helper for L.WindowSwitcherDecoration to make dragged windows follow the mouse cursor.
  • MultiColumns Use as many columns as you'd like with as many windows in each column as you'd like.
  • PositionStoreFloat the main bluetile floating layout designed for dual-head, should be used along with L.NoFrillsDecoration and L.BorderResize. (Currently requires use of mouse to move and resize floating windows.)
  • WindowSwitcherDecoration drag windows on top of each other to swap positions.

Util

  • ExtensibleState allows storing custom mutable state in xmonad. Can optionally be made persistent over restarts.
  • PositionStore store window position and size info in XState for better float management. Used extensively by C.Bluetile.
  • SpawnOnce spawns a command once and only once. Useful for session settings unique to xmonad to be run from startupHook only on login rather than on each xmonad restart.

Deleted modules

Detailed examples regarding changes to xmonad.hs

XState details

Since contrib modules can now store custom state in XState, the additional IORef parameters are no longer required: Users have to remove the first paramter to the respective functions. The functions mkSpawner and initDynamicHooks are also no longer necessary and have been removed.

Example:

-- Old code:
 sp <- mkSpawner
 ..
  [((mod1Mask,xK_k), shellPromptHere sp defaultXPConfig
   ..]

The above has to be changed to:

  -- no mkSpawner line
  ..
  [((mod1Mask,xK_k), shellPromptHere defaultXPConfig)
   ..]

The same applies to XMonad.Hooks.DynamicHooks.

OnScreen details

The type of onScreen has been changed to allow more general onScreen functions. The old onScreen was very limited. Basicly the only working function derived from onScreen was viewOnScreen, since the greedyViewOnScreen never worked as supposed to, and any other function wouldn't work either.

The new onScreen takes any function that modifies the stack and runs it on the given screen. Since XMonad can not guess what you'd like to do with the focus after running this function, onScreen also accepts a Focus data which tells XMonad how to act.

Comparison:

---- Old version ----

-- Old type of onScreen:
onScreen :: (WorkspaceId -> WindowSet -> WindowSet) -- ^ default action
         -> ScreenId                                -- ^ screen id
         -> WorkspaceId                             -- ^ index of the workspace
         -> WindowSet                               -- ^ current stack
         -> WindowSet

-- The old implementation of viewOnScreen was:
viewOnScreen :: ScreenId -> WorkspaceId -> WindowSet -> WindowSet
viewOnScreen sc i = onScreen view sc i


---- New version ----

-- The new Focus data:
data Focus = FocusNew                       -- ^ always focus the new screen
           | FocusCurrent                   -- ^ always keep the focus on the current screen
           | FocusTag WorkspaceId           -- ^ always focus tag i on the new stack
           | FocusTagVisible WorkspaceId    -- ^ focus tag i only if workspace with tag i is visible on the old stack

-- New type of onScreen:
onScreen :: (WindowSet -> WindowSet) -- ^ function to run
         -> Focus                    -- ^ what to do with the focus
         -> ScreenId                 -- ^ screen id
         -> WindowSet                -- ^ current stack
         -> WindowSet

-- A few example implementations (don't worry - they're already built in):
viewOnScreen           :: ScreenId -> WorkspaceId -> WindowSet -> WindowSet
viewOnScreen sc i       = onScreen (view i) (FocusTag i) sc
greedyViewOnScreen     :: ScreenId -> WorkspaceId -> WindowSet -> WindowSet
greedyViewOnScreen sc i = onScreen (greedyView i) FocusCurrent sc