User API idea
Introduction
Here is some thought about an API for the users of CLFSWM, because CLFSWM is meant to be a programmable window manager. This could be a categorized list of feature that CLFSWM could provide. This API should not be tied to a particular implementation.
Comment:
Concept
- window: application window (X window).
- frame: A set of frame that are geometrically contained.
- The identity of a frame is the path in the geometry inclusion tree (frame tree)
- A frame has a list of its children (frame-children) which are frames
- A frame has only one parent
- Special frame:
- A window which is its own frame.
- The root frame which parent is itself
- group: An arbitrary set of group.
- A group has a name that is unique among the membership
- The identity of a group is the path in the DAG. A group can have multiple identity.
- A group has a list of member (group-member) which are groups
- A group cannot contain itself (transitive)
- A group can be a member of different group but at least one.
- Special group
- A frame which is its own group. The group-member have at least the member of the frame-children.
- The root group is a member of no group and is named "*root*"
- operation:
- name
- parameter (group or other type of parameter)
- must be undo-able
Comment:
- I don't see what is exactly a frame. In the current clfswm version there is only groups and windows (X window). A group can contains childs. A child is another group or an X window. Can you explain the need of frames? -- Philippe
- Frame are the actual group in CLFSWM. I would like to use the term group for a more relaxed relationship that could be arbitrary as far as it is a DAG. For me, frame are a more constraint than group as far as membership is concerned (tree) because it is a geometrical relation. For example, you can use group to select any kind of frame even if there are not related by a geometry inclusion relation. -- Cyrille
- Ah, ok I see. What do you think about a tag system on (actual) groups to do some actions on groups with no geometry relation. Another question: how do you want to represent children in your version of groups? How do you want to manipulate them? In the actual version the relation between childs is straightforward. -- Philippe
- Actually, this user API is much more a programmatic interface than a user interface. I try to make it as orthogonal and generic as possible so that it could be a good foundation for user interfaces. I would second this with some tooling that would have a visual interface. -- Cyrille
- I have asked on the ML -- Philippe
- Actually, this user API is much more a programmatic interface than a user interface. I try to make it as orthogonal and generic as possible so that it could be a good foundation for user interfaces. I would second this with some tooling that would have a visual interface. -- Cyrille
- Ah, ok I see. What do you think about a tag system on (actual) groups to do some actions on groups with no geometry relation. Another question: how do you want to represent children in your version of groups? How do you want to manipulate them? In the actual version the relation between childs is straightforward. -- Philippe
- Frame are the actual group in CLFSWM. I would like to use the term group for a more relaxed relationship that could be arbitrary as far as it is a DAG. For me, frame are a more constraint than group as far as membership is concerned (tree) because it is a geometrical relation. For example, you can use group to select any kind of frame even if there are not related by a geometry inclusion relation. -- Cyrille
Facility API
API that the extension API rely on.
Comment:
Input
Concept:
- input sequence: A list of sequential or combination of input event (example: C-a a) that can be recognized.
List of event:
- mouse
- motion
- left
- right
- up
- down
- click
- button (left, middle, right, 1, 2, 3, ...)
- click type (simple, double, triple)
- motion
- keyboard
- key
- modifier
- Other event
- On mouse enter
- On focus (window)
- On new member (frame or group membership)
- ...
List of event combinator:
- Simultaneous event (and)
- Alternative event (or)
- sequence of event
An input sequence is send to the window if one has a focus and if the input sequence is not recognized.
Comment:
- Actually keys combination are done with a sub menu system. I think it's simple for the user to add its own keys combination and the info window helps to remember keys. So two systems are in place: shortcut (define-main-key/define-second-key) and menu (info-mode-menu). -- Philippe
- This is only a definition of event. See the shortcut section for the binding between shortcut and operation, and the info menu -- Cyrille
Window management
Mode:
- full: remove its own frame and group
- window-only: without touching its own frame and group
Operations:
- close
- delete
- destroy
Reference:
Comment:
Undo
Any operation of the extension API could be undone.
Convention:
- If step is 0, proceed to the last mark
- If step is superior to 1, proceed at last 'step' operations
Operations:
- emacs-undo (&optional (step 1)): undo a la emacs
- undo (&optional (step 1))
- redo (&optional (step 1))
- exclude-operation (operation): mark this operation has to be ignored for undo and redo. (For example, selection modification by default must be ignored)
- include-operation (operation): mark this operation has to be undone or redone if asked.
- history-size (step)
- mark
Comment:
- This is a nice idea (added in the TODO). But I don't really know already how to implement it now (save a state before each actions?). -- Philippe
- Each operation of the extension API should register a reverse operation in a command stack. -- Cyrille
Naming
A group has a name unique for any membership it takes part to or a rank for each membership. The path (numbered or named) is its external identity (ie. seen by the user). Any operation of the extension API are applied to a group identified by its path in the DAG of group.
Accessor:
- get-group-by-name (path)
- get-frame-by-name (path): return the frame that its own group has this name if it exists such a frame
- get-window-by-name (path): return the window that its own frame that its own group has this name if it exists such a window.
Comment:
- What about numbers. A group is named and numbered. Name and numbers are not guaranted to be unique. There is a need for a function to ensure that name or numbers are unique (added in the TODO) -- Philippe.
- I should change it to path. It is more consistent with the concept section -- Cyrille
- Added in the TODO -- Philippe
- I should change it to path. It is more consistent with the concept section -- Cyrille
Property group
The idea is to have special groups that if a group belong to, any of the member as a property of the group set and vice versa.
A property group as a property with a value. A property group behave like a group, that is a group can be a member of multiple property group.
Operation:
- make-property (name property value)
- change-property (property-group property value)
Comment:
Extension API
API that tries to be orthogonal.
Comment:
Focus
Handle the input focus (X window).
Operation:
- focus-on (window)
- no-focus: no window has the focus (X window)
Comment:
Geometry
This section describes the operations that a user can perform on a frame to change its geometry.
Mode:
- linear: the change is done n pixels by n pixels
- edge: the change is done until an edge/border is hit in the direction
Convention:
- An increment of 0 means in edge mode
- An increment superior to 1 means in linear mode
Operation:
- move (frame &optional (increment 1))
- left
- right
- up
- down
- resize (frame &optional (increment 1))
- left border
- grow/left
- shrink/right
- right border
- grow/right
- shrink/left
- top border
- grow/up
- shrink/down
- bottom border
- grow/down
- shrink/up
- left border
Comment:
- Only groups have geometry. Windows are managed by a group. The geometry of a group is between 0 (left/top) and 1 (right/bottom).
The user is asked for numbers between 0 and 100 when it need to specify a geometry. Then this numbers are converted in 0 to 1 before storage.
For mouse actions. The geometry is done in pixel and then converted in float numbers (need a function to convert from and to float or pixel -> TODO).
Actually there is some functions to find groups edges and you can manipluate x, y, h, w directly to change the geometry. Another thing, see the macro with-movement. -- Philippe- Ok for the implementation. I would like to change the term of the actual group in CLFSWM to be a frame which has more a geometrical meaning, group being more arbitrary. -- Cyrille
Layout manager
A layout manager handle the geometry of its children.
Type:
- tile (row, column)
- maximize
- Stack tilling (percent (up, down, left right))
- ...
Operation:
- set-layout-manager (frame, type)
Nota:
- Could be a property group
Comment:
Layer
Frames can sometimes be overlaid. A frame have a list of frame (frame-layer) to handler the order of exposure.
Operation:
- put (frame): change the layer of the frame in the layer list of the parent
- front
- back
- top
- bottom
Nota:
- Could be a property group
Comment:
- This have to be implemented but for groups: raise/lower group (in the TODO). -- Philippe
Group management
A group is deleted if it has no more membership.
Accessor
- list-children (group)
- list-membership (group)
Operation
- make-group (name parents &optional groups): There must be at least one parent to make a group. The name must be unique in all parents membership.
- rename (group, new-name): the new name must not exist.
- add (group, group): The second group become a child of the first group
- remove (group, group): Remove the second group for the list of children of the first group
- add-children (group, group): Add the children of the second group to the list of children of the first group. The list of children of the second group is not modified
- merge (group, group): All the children of the second group are added to the first group. The second group is left empty.
- move-child (group, child): change the place of the child group in the list of member of the group
- previous
- next
- first
- last
Comment:
Frame management
This section describes the operations that a user can perform on a frame.
Accessor:
- list-children (frame)
- parent (frame)
Operation:
- make-frame (parent)
- remove-frame (frame): Remove the frame from the children list of the parent, so deleting it.
- move (frame)
- parent
- first sister
- next aunt
- move-child (frame): change the place of the frame in the children list of the parent
- previous
- next
- first
- last
Comment:
- See question on top: is a frame really needed?
- I think the geometry inclusion relation is a contraint because you could want to make operation on geometricaly unrelated frame. So, I propose to separate an arbitrary relation (group) and the geometrical relation (frame) -- Cyrille
- Ok, asked on the ML -- Philippe
- I think the geometry inclusion relation is a contraint because you could want to make operation on geometricaly unrelated frame. So, I propose to separate an arbitrary relation (group) and the geometrical relation (frame) -- Cyrille
Hide
This section describes operations that a user can perform to show or hide a group meaning that it is not shown on the screen.
Accessor
- hidden (group)
Operation:
- hide (group)
- show (group)
Nota:
- Could be a property group
Comment:
- How do you unhide a group when it is hidden? By name or number? -- Philippe
- There should be a way to show the tree of frame and the DAG of group so that you can find the path to identify one, or at least the children of a frame or the member of a group. -- Cyrille
Window shadow
A window can be duplicated. The copy become a shadow of the copied window. An operation perform on one shadow does not impact the other shadow of the same window.
Accessor
- list-shadow (window)
Operation
- make-shadow (window)
- remove-other-shadow (window): remove the other shadow but the one in parameter
Comment:
Shortcut
Concept:
- mode: A mode is a list of shortcut. Its external identifier is its name.
- shortcut: It is an input sequence associated to an operation
Accessor
- list-shortcut (mode)
- current-mode-name
Operation:
- make-mode (name &key extend-modes overide-modes)
- add-key-shortcut (mode, input-sequence, operation)
- add-motion-shortcut (mode, input-sequence, operation)
- add-escape-sequence (mode, input-sequence, input-sequence): The second input sequence is the one send to the application having the focus if the first input sequence is recognized.
- set-current-mode (mode)
Shortcut assistant:
- Show as a menu the list of possible keys that could be next typed
Comment:
- This is done actually with the info-mode-menu. Is there a need to do something more sofisticated? -- Philippe
- No, it was just to not miss it in this specification proposition -- Cyrille
Selection
Manage a special group named "*group-selection*" and a son of the group "*root*"
Accessor:
- list-selection
Operation:
- add (group)
- remove (group)
- clear
Comment:
- Actually the selection is just stored in a list of childs. I think there is no need for a group to do that. -- Philippe
- You might want to select different frame in different sub-trees. For example, to copy them in a new frame, so you have a new view. Frame cannot do that but group can. -- Cyrille
- This is already doable in the current implementation: you can put a child from any group in the selection list. -- Philippe
- You might want to select different frame in different sub-trees. For example, to copy them in a new frame, so you have a new view. Frame cannot do that but group can. -- Cyrille
Current frame
Handle a special group named "*current-frame*" containing only one frame that is the current one and a son of the group "*root*". It is a mean to navigate through the frame tree.
Accessor
- current-frame-path
Operation:
- set-current-frame (frame)
- browse (set as current)
- parent: set the current to the parent frame of the current one
- first-child: set the current to the first child of the current one
- last-child: set the current to the last child of the current one
- next-sister: set the current to the first child of the next brother of the father of the current one.
Comment:
Zoom
Concept:
- zoom out: Behave as if the application window is bigger for the application but completely drawn in a small amount of space (miniature). The zoom factor is inferior to 100%
- zoom in: Behave as a magnifying glass. The zoom factor is superior to 100%. The part of the application window shown (viewport) can be moved.
Accessor:
- zoom-factor (frame)
Operation:
- set-zoom-factor (frame, factor)
- move-viewport (frame &optional (increment 1))
- left
- right
- up
- down
Nota:
- Could be a property group
Note:
- Moving the viewport when the zoom factor is inferior to 100% has no effect.
Comment:
- This is a nice idea but I don't know yet how to implement this. (-> In the TODO as maybe) -- Philippe
Discussion
- If the structure of the page is OK for everybody, I would break it into smaller pages -- Cyrille Thouvenin
- It's ok for me but without the frame level. I don't really see why frames are needed. -- Philippe
- Ok I see what you mean by frame. I've asked for comments on the ML before doing anything. -- Philippe
- It's ok for me but without the frame level. I don't really see why frames are needed. -- Philippe