[clfswm-devel] Major update of clfswm

Philippe Brochard pbrochard at common-lisp.net
Mon Feb 18 22:05:34 UTC 2008


Hi all,

After some exchange with Cyrille Thouvenin I started to rewrite some
parts of clfswm.

The main major change is that there is no more references to
workspaces, all is a group. There is a root group and there childs.
A child can be a group or an application window.

Here is the old data structure:
--------------------------------------------------
(defstruct workspace number group-list)
(defstruct group x y width height window-list fullscreenp)

(defparameter *workspace-list* nil)
--------------------------------------------------

Here is the new one:
--------------------------------------------------
(defclass group name number x y w h layout window gc child ...) -simplified-

(defparameter *root-group* nil
  "Root of the root - ie the root group")
(defparameter *current-root* nil
  "The current fullscreen maximized child")
(defparameter *current-child* nil
  "The current child with the focus")
--------------------------------------------------

Now using clfswm is like walking throw a tree of groups and windows.
Here is the current keybinding to navigate throw this tree:
  Alt-Tab: circulate throw childs of *current-child* if it is a group.
  Alt-Left/Right: circulate throw brother childs (ie: this is like
                  workspaces)
  Alt-Up: select the first child.
  Alt-Down: select the father of *current-child*
  Alt-Enter: Make the current selected child the current root (ie
                  maximize it)
  Alt+Shift-Enter: Make the father of current root the current root
                  (ie unmaximize the current child)

There is no workspace but the same effect is obtened by circulating
throw brothers childs.

The advantages:
  - you can have workspace in any level.
  - there is no need for the pager: _you_are_in_the_pager_!!!

You can find some screenshots here for a better idea:

  http://common-lisp.net/project/clfswm/temp/


Others changes are:

 * group/window coordinates are in float number between 0 (left) and 
   1 (right) so we can zoom them. Each group have its own window.

 * each group can have its own layout:
     no-layout: groups have there size, windows are maximized in the
         father group
     maximize-layout: groups and windows are maximized
     tile-layout: groups and windows are tiled
     tile-left/right/...: tile like in larswm/dwm...
     ... and so on - it's very easy to add a new layout.

 * a group is named so you can tell where you want to map a new
   window.

 * Each time a new window is created each group can do something with
   it (nothing, absorbe this window, copy this window, open a new
   group and map the window in it, open it in the group named toto...
   This is a more general process than the previous control-o (open
   next window in a new workspace))
     
 * Chained key binding. Key binding are grouped by action and there is
   a little window to present possibles choices (there is no more a
   lot of keys to remember).

 * Currently I'm trying to have a different focus policy by groups 
   (I don't know if I'll integrate this by default).


Ouf, here it is :)  It's a great change but the code is more simple
(for example there is no more duplicated code with the second mode
and the pager because there is no more pager :) 

I'll commited all this changes. So don't be too surprised by the new
cvs content!

Have fun,

Philippe

-- 
Philippe Brochard    <pbrochard at common-lisp.net>
                      http://hocwp.free.fr




More information about the clfswm-devel mailing list