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