This page identifies some milestones for guiding and tracking development. We note down potential release versions and their corresponding features (plus any implementation ideas). This "plan" is not meant to be set in stone; it is merely an aid to help record and crystallize ideas as Minx evolves...
Version 0.1.0
We should be able to cleanly switch keyboard focus from one top-level window to the next with a single keystroke, say, F1. The first window to be created will have the focus initially. Focus should never go "off-screen," i.e., to a hidden window (e.g., the hidden top-level windows created by the XFCE4 Terminal program) or revert to the root window while there are extant top-level windows capable of receiving the input focus.
Testing
- Start Xephyr.
- Start 2-4 terminals using --geometry to position them next to each other.
- Switch to the Xephyr window.
- Use F1 to switch between the terminals. If F1 does not seem to work, try capturing the keyboard with CTRL + SHIFT; some versions of Xephyr seem to need this.
Implementation Implications
minxlib
- display and window classes to encapsulate relevant portions of the Xlib API and export from C++ to Python.
- event class hierarchy to expose required Xlib events (create notify, map, configure, keypress, etc.) from C++ to Python.
- Xlib error handling and exceptions forwarded from C++ to Python.
minx.core
- wm class with basic event loop. This is the main end-user class for starting Minx and maintaining the window manager state.
- window class to keep track of top-level windows (how many, which one is focused, whether they've been mapped, resized, etc.).
- Basic hook infrastructure to be able to respond to events internally.
Patches to Version 0.1.0
- Version 0.1.1: Draw a one-pixel border around all top-level windows. The focused window will have a red border, others will be white.
- Version 0.1.2: Allow users to customize border size and color.
- Version 0.1.3: Add logging support to enable debugging.
- Version 0.1.4: On start-up, query extant top-level windows and manage them.
- Version 0.1.5: Add support for ignoring windows based on their properties (class, name, etc.).
- Version 0.1.6: Allow users to customize key bindings.
- Version 0.1.7: Add function for killing windows.
- Version 0.1.8: Add function for launching new applications.
Version 0.2.x: Layouts and Related Functionality
- Version 0.2.0: The focused window should fill the entire screen, i.e., the full layout.
- Version 0.2.1: The manual layout, i.e., laying out windows by splitting horizontally or vertically (a la Emacs C-x 2 or C-x 3 respectively).
- Version 0.2.2: Resizing tiled windows with the keyboard.
- Version 0.2.3: Laying out windows in rows and columns.
- Version 0.2.4: An implementation of XMonad's tall layout.
- Version 0.2.5: Laying out windows in a grid.
- Version 0.2.6: Support for moving windows between layouts.
- Version 0.2.7: Support for moving and resizing whole layouts.
- Version 0.2.8: Moving and resizing windows and layouts with the mouse.
- Version 0.2.9: A specialized layout for The GIMP.
Remaining Milestones
- Version 0.3.0: Snapshots (aka workspaces) via custom user state.
- Version 0.4.0: Focus policy infrastructure.
- Version 0.5.0: Defaults (so out-of-box user experience with minimal config is sane).
- Version 0.6.0: Packaging for various systems (FreeBSD, Debian-based, Arch).
- Version 0.7.0: Documentation for users and hackers.
- Version 0.8.0: Session management (if feasible or to the extent feasible).
- Version 1.0.0: Various fixes/tweaks (e.g., equivalent of a --replace option, sending window manager commands over local socket, helper apps such as window switcher and resizer) and release into the wild as "ready for prime-time."