wiki:UserAPI
close Warning: Can't synchronize with repository "(default)" ("(default)" is not readable or not a Git repository.). Look in the Trac log for more information.

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

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)
  • 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

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

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

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

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
Last modified 15 years ago Last modified on 03/23/08 13:57:57