What is Ice-9?
A mouse is not the most efficient way to control a computer. Dragging a cursor back and forth accross a screen, aiming your mouse at small targets, and navigating tiny popup menus is slow, bad for the wrists, and difficult for some disabled users. The common way to get around this, of course, is to set up key-combos on the keyboard to launch frequently used applications, change focus, or arrange windows. However, memorizing lots of key combos can be a hastle and there are some tasks which are just awkward to control with simple keyboard shortcuts.
Ice-9 is a project exploring a new and innovative spatially-oriented system for launching programs, switching applications, and arranging windows without ever needing the mouse. Tiny popup menus are replaced with very large or full-screen menus where content is divided into nine segments, a three-by-three grid. I like to call this arrangment a "menu of nine". Choosing which segment you're interested is as easy as pointing, but there's no need to point! Use your keyboard's number pad to choose the area you're interested in without ever touching the mouse. This way you can see what you're doing and navigate spatially, like with a mouse, but your hands never leave the keyboard.
A Plee to Developers
Ice-9 is still in the very early stages development, and I would very greatly appreciate any thoughts, suggestions, or other assistance. If anyone is interested in helping with the actual coding, advertising to get more attention (and maybe potential developers ;) ), or even just testing, please let me know! I can develop Ice-9 on my own, but being a busy college student, I know that my pace will be glacial without a little friendly assistance. Even just encouragement goes a long way! You can reach me at firstname.lastname@example.org
I'm designing Ice-9 as an extension to the popular keyboard-oriented window manager for X11 called IceWM, since I'm a big fan and I feel the philosophy of Ice-9 complements that of IceWM nicely. Ice-9 will be light-weight, written in C++, and developed with an emphasis on efficiency and ease of use. The key features which I hope to include in Ice-9 are as follows:
A hierarchical menu system for launching applications: The "menus of nine" paradigm is very useful for launching applications. If each of the nine main screen regions is subdivided into another menu of nine, up to 81 possible options can be shown on the screen simultaneously and the user can select any one in just two keystrokes. This is just as fast as typing a key combo, but having the menu on the screen can remind the user of which keys to press. This layout also encourages better menu organization, and its spatial grouping makes it much easier to browse than just a list of program names. For screenshots or a demo of this process written in Qt, check out menoku.sourceforget.net.
An application switching tool: Switching between applications with the typical alt-tab system is a little awkward, since you have to go through a list of all the open windows, one by one. It's very linear, and there's no way to select an application out of order. By using a menu of nine, you can select any window immediately without browsing through the other options. Also, since the layout of the menu of nine is based on the positions of the windows on the screen, finding the window you want to switch to is easy! Again, like the menu system, if you want to browse through more than nine windows, it's easy enough to subdivide the nine sections into nine subsections and support up to 81 options simultaneously.
A desktop switching tool: While we're making all of these menus, why not use one for switching desktops? I must admit there's no great advantage to doing this over IceWM's default desktop-switching key combos, unless, of course, you like to envision your desktops laid out spatially.
Advanced window moving and resizing: Parts of this functionality are currently sorta implemented in IceWM, but not all. I envision being able to move a window to any of the nine main regions of the screen (in the 4 corners, centered along the 4 sides, and the middle of the screen) with one key combo. Also, I would like to be able to resize windows with the keyboard using an expansion algorithm. With a simple key combo, you could "grow" the current window in any of the primary 8 directions until it bumped into another window. This makes it easy to maximize screen usage and can be written to be aware of the various window layers. To compliment this, perhaps a combo could be made to shrink a window to its smallest allowed size, based on window hints. Using this system makes it much easier and faster to arrange windows on the desktop and to take up all available screen real estate without having to slowly and carefully click and drag thin window borders with a mouse.
Other input methods: Primarily, the menus of nine system was designed with the keyboard numberpad in mind, since these keys are conveniently laid out in a three-by-three grid, mirroring the menu on screen. However, this is very inconvenient for laptop users who don't have a true number pad, or for disabled users who might find using a keyboard at all more difficult than other methods. With this in mind, I would like to make Ice-9's input system flexible and explore operating menus of nine with other keys (just the arrow keys for instance), or with other input devices such as using a joystick or mouse gestures.
- Figuring out how to use XLib and the IceWM source: XLib is huge, old, and not very well documented. It's a little awkward to use, and I have no experience with it. IceWM, although relatively small for a modern window manager, is still a good-sized code base. Getting a good understanding of the inner workings will take time and exploration.
- Finding key combos for all these menus: Part of the idea behind Ice-9 is moving away from little menus that are always visible to big menus that are visible only when you ask for them. Although I could just add toolbar buttons for all of these features, it would feel silly if you had to click to open a menu designed for keyboard navigation. I would like to have a quick and memorable shortcut to open all of these menus and to move or resize any window. I'm not entirely opposed to replacing IceWM's default mappings with new ones, especially when I'm replacing existing functionality, but even so my choices for key combos are limited. Of course, the user will be able to reconfigure it all, but I'd like to have a good set of default bindings.
- A "plugable" input system: I don't know if I want to make the input to Ice-9 a true plug-in system, but I would like to write the code abstractly enough so that developing and switching between alternate input systems will be relatively painless. This will be a little challenging, since I'll have to abstract the user input away from the UI. I've never really done that before.
July 31, 2006
At this point, I have implemented a demo of the menu system in Qt, currently listed as a separate project on Source Forge. It can be found at menoku.sourceforget.net. This was mainly just to test how well the concept worked and as a demonstration to spread the idea.
I have also started development of the window switching tool. So far, I have worked out the algorithm for optimally choosing where to place up to nine windows in a menu of nine so as to best match their actual positions on the screen. I have a working demo in Qt that uses this algorithm successfully on real window data fetched from XLib.
The next step for me will be coming up with a system for displaying windows divided into menus of nine, like the menoku window, using XLib and/or function calls from the IceWM source. I plan to make it nice and abstract so it can support being any size and can handle menus with 9 or 81 items to choose from (or, more specifically, each of the nine screen segments must support holding a single item or a small menu of nine). From there I can start including code from my window switcher demo and dealing with user input.