Voyager

IBM Redbooks

 * SG24-4630-00 OS/2 Warp (PowerPC Edition) A First Look
 * SG24-4639-00 OS/2 Warp (PowerPC Edition) Graphical Subsystem

We do have the first one digitaly, but not the second one. In case anyone finds that, let us know.

Darwin Documentation
There is plenty of documentation available about Darwin, a good start is Kernel Programming, which gives a nice overview about the design of the kernel.

Technologies to study

 * OpenGL, FreeGLUT, CPW (Application framework for windows, menus etc.). Here's a Readme text.
 * glitz - OpenGL interface for Cairo, so one could run Cairo directly on OpenGL, see Xegl for a diagram.
 * Glitz: Hardware Accelerated Image Compositing Using OpenGL and as PDF
 * The State of Linux Graphics, comments and more comments
 * Current gtk+ development- among other topics about cairo integration and a new theme system
 * GTK+ Planning - a more recent plan of GTK+ development
 * X on GL states very clearly, what has still to be done
 * DirectFB with rootless XServer, hardware accelerated OpenGL, GTK+ backend, an experimental Cairo backend, Qt backend, DirectVNC, SDL backend
 * Enlightenment and its support libs. Here's a Live CD.
 * Why Englightenment? So far I just knew it as a fancy desktop, what makes it special? Ktk 15:39, 30 October 2005 (CET)
 * Cinc: it's more than just a fancy desktop. It offers quite some libs e.g. HW accelerated canvas on top of OpenGL, libs for alphachannel blending of pics, antialiased text, imlib and quite some more.
 * GNUstep.org
 * OpenSolaris
 * Ogre 3D The open source real time 3D rendering engine - for nice 3D effects on the Voyager desktop

Design Decisions
Creating a binary compatible OS/2 clone may be tempting but is not strictly necessary. Important is the user experience. Which toolkit should be used for primary development?

Graphics Drivers

 * X11
 * OpenGL ES (an OpenGL only desktop without X!)
 * DirectFB
 * SciTech Snap Graphics

These graphics engines can be emulated vice-versa: You can run X11, OpenGL, and DirectFB programs on the same graphics driver. We should have a look at HW support when chosing the driver system. For example I've read OpenGL drivers are not that common (often they're not HW accelerated). A viable idea may be to just use OpenGL as the core API on top of something else. There're quite a lot OpenGL implementations running on different low level drivers or even Mesa.

2D API

 * Cairo. Cairo has a PDF-like engine which seems to be inspired by Quartz of MacOS X.
 * Cairo runs on almost everything, including OS/2 and X but also directly on OpenGL hardware with Glitz. So one could use it as a complete GPI replacement without the need of X one day.
 * To make things easier 24Bit screens should be the primary target. Hell it's 2005 today...

It seems there are many possiblities here!
 * General Graphics Interface
 * Cairo (used by GTK+)
 * Evas (used by Enlightenment)
 * libart (used by Gnome)
 * Anti-Grain Geometry
 * Simple DirectMedia Layer
 * Arthur (used by KDE)

We will have to use more than one. KDE programs use Arthur, GTK+ ones use Cairo, and so on ... These libraries are (mostly) used for display and printing. So we won't have a consistent graphical subsystem with this multitude.

All these libraries have several backends, e.g. X11, DirectFB, OpenGL, OS/2, ...

Even if we do have to use more than one we should focus on a library that is widly supported, at the moment my impression is that Cairo will win the race. Mozilla is using it for new versions, OOo will use it and GTK+ is migrating into it as well. Also projects like Glitz will dramatically speedup the rendering in the Cairo engine. See some comments of one of the GTK+ developers.

Layer between 2D API and window manager (please enter name suggestions)
Between the 2D API and the window manager one layer is missing
 * that cares for user input by mouse, keyboard, ...
 * that knows the basics about windows and controls their behaviour (A window manager only modifies this behaviour!)
 * a Session manager that manages the processes which want do to screen output
 * a message architecture that connects everything and enables inter-client communication

Questions:
 * Should we choose X for that? Quasi-standard, but old
 * modify existing(?) systems
 * port Presentation Manager -> access to source code needed
 * code that ourselves?

Window Manager
To manage the windows we need some sort of window manager. So far most implementations are done for X, we need to abstract that directly on Cairo.


 * Window Manager Specification Project
 * Inter-Client Communication Conventions Manual - Support this standard in order to let X applications run
 * Waimea - WM which is using Cairo for all rendering, they write it's for X so one would have to check if this can be separated from X as well.

Ideas for a new Window Manager
What features should a new windows manager have?

Main Features

 * Built i18n (internationoalization)
 * .prestartup and .poststartup fils
 * Multiscreen support (with possibility of virtual desktops 1 being on physical screen 1, while having virtual desktop 4 on screen 2)
 * Anti aliasing
 * Virtual desktops (different layouts and number of desktops - 4x2, 3x3, ...)
 * Storing sessions
 * 100% ewmh complient
 * Large desktops (scrolling and paging)
 * Themes with possibility of associating a background image or pattern (i.e. blackbox)

Client Window Features

 * Client window header can be top/bottom/right/left (with vertical text if necessary)
 * Window manager keeps track of stacking order of all client windows
 * Sticky windows - Possibility to show clients on all or few or just one virtual desktop
 * Virtual desktops with resolutions different from the physical screen resolution.
 * Ability to display multiple virtual desktops on one physical screen.
 * Maximization:
 * Maximize to given area
 * Maximize to actual screen
 * Maximize to more than one screen
 * Maximize vertically only
 * Maximize horizontally only
 * Clients can influence their states:
 * Maximized
 * Stacking order
 * Shading
 * Stickiness
 * Desktop(s)
 * Window in Window handling for MDI applications
 * Edge snapping while move- resizing a client window
 * Client window shading
 * Store client window properties per application (size, position, etc)
 * Client window can drop shadow
 * Application icons in client window headers
 * Different focus models (click to focus, focus follows mouse, ...)

Docking Area Features

 * Allow having multiple docking areas
 * Docking areas can be hid (approaching mouse makes them appeare)
 * Transparency
 * Drop shadow

Menu Features

 * Dynamically filled menus (piped menus)
 * Menu configuration can be separated over several files, i.e. one file for each submenu section
 * All the submenues can be called separatly (by key combination for example)
 * Dockable menues (like blackbox)
 * Transparency
 * Drop shadow
 * Icons for entries

Configuration Features

 * Configuration changes take effect withou restarting the wm
 * Every single command is configurable to hava a certain keyboard or mouse click shortcut.
 * Shortcuts are simple keyboard shortcuts (i.e. Ctrl+F1), or so called keychains known from Emacs editor (i.e. Alt+e+x)
 * The wm allows mouse gestures, and keyboard mouse combined input (i.e. ctrl+mouse1 click, etc.)
 * Single, double, or even tripple clicks call different actions (attention with patent from M$ in USA)
 * Clicking the client window header is a different action than clicking the clients body for example.

Extensibility

 * Programming interface (every single command can be called from outside)
 * Allow writing modules and applications that interact with the wm

Other

 * Ability to play (opengl) games in fullscreen on virtual desktops instead of physical screens. (Today, if a game goes fullscreen, it'll either spread over all physical screens or the other screens are switched off... which is not nice if you would like to have the server stats/a map/whatever on the secondary screen).

CMD
directory)
 * full capabilities of current CMD.EXE concerning
 * usage of system messages and error codes
 * nested io redirection
 * grouping commands with round brackets
 * &, && |, and || operators
 * correct wildcard matching for files with multiple extensions
 * PROMPT command
 * keep UPPERCASE environment variable names only ! (unlike 32-bit Command Interpreter from Jonathan de Boyne Pollard)
 * proper implementation of EXTPROC command (fix errors with exptproc scripts not residing in current
 * new general features
 * support extended command set of Win NT CMD.EXE
 * at least include string functions with extended SET command
 * extend IF clause with new conditions
 * os version match
 * free space on a drive
 * is drive removeable
 * is drive USB mass storage
 * more ?
 * support PATHEXT variable
 * start files with their associated program
 * automatic environment vars
 * DATE, DATE_SORTED, TIME, TIME_SORTED, WEEKDAY, DAY, MONTH, YEAR, YEARDAY
 * CMDLINE, ERRORLEVEL
 * OS, OSVER
 * BOOTDRIVE
 * support filename completion
 * new internal or extended commands
 * INITVIOCMD determines a command being executed when initialized as a VIO session
 * INITPMCMD determines a command being executed when initialized as a PM session
 * SET allows to include equal signs in value of environment var
 * SET /P retrieves value of environment var from keyboard
 * SHIFT xx shifts parameter by positive number
 * ECHO /N does not append CRLF to output
 * CDD command changes directory and drive
 * TIMER command starts, stops or displays the value of a timer
 * SLEEP n waits for n secs
 * PAUSE n waits for n secs
 * implement START command with all features of DosStartSession, among others implement
 * /WAIT (synchronous start)
 * /NC (NoAutoClose)
 * /DOS[:settings.dat] (if DOS-Box still available)
 * /POS:x,y,x1,y1 (initial window position)
 * /ICON:icon.ico (system menu icon)
 * MOVE files with implicit copy/delete across partitions
 * exlicit UNLOCK command
 * implicit unlock with COPY, DEL, REN, MOVE (very usefull, but also dangerous ?)
 * macro support with ALIAS command
 * new batch handling or batch commands
 * %* specifies all parameters (like %1, %2 etc)
 * in for loops support %%a%f, %%a%p, %%a%d and more for specifying filename, path and driveletter of matching file
 * GOSUB - executes a subroutine
 * RETURN [xx] - exits a batchfile or subroutine [with errorlevel]
 * CANCEL (ends batch processing, but does not close window as EXIT does)
 * Integration of any REXX replacement like with current CMD.EXE
 * call of REXX Scripts with CMD
 * usage of exit handlers
 * manipulation of environment vars within REXX (changes remain after end of script, unless setlocal/endlocal is called), including BEGINLIBPATH and ENDLIBPATH
 * readonly access to the LIBPATH value as an environment variable

MM

 * The concept of IO procedures should be retained at least for file IO and format converting.

Toolkits

 * GTK+
 * GnuStep (look at Apples programs to see what's possible. Yes I know Apple uses Cocoa not Gnustep)
 * other?

SOM
Dropping SOM for something better? Creating a poor mans SOM kernel isn't too difficult (Cinc: there's already a working prototype for the basic functionality).

If SOM is dropped, no binary compatibility for old WPS enhancements is given. This may break a considerable amount of OS/2 apps. This may not be an issue if applications have to be recompiled anyway for a new plattform. Cinc: I don't see many OS/2-apps which are worth to be supported no matter how much work it needs. Binary compatibility is out of sight IMHO. Nobody really needs it (anyone really using OD nowadays?).

WPS

 * The WPS should be designed with REXX scriptability in mind (like WPS-wizard addon)

REXX

 * REXX should be implemented like AppleScript so controlling of applications from other apps is possible (commands not tied to one process).
 * Regina may be used as an interpreter.
 * any REXX replacement should implement the following
 * true CMD integration like under OS/2
 * access to environment vars of the calling interpreter. Cinc: ???
 * support of the full REXX C API or an equivalent concept (macro space control, app handlers, WPS object access API etc). Most of this is supported by Regina AFAIK.
 * complete reimplementation of REXXUTIL ! I seem to remember having seen such a project for Windows and Unix.
 * It should be possible to write GUI based apps with REXX, a bit Dr.Dialog like

Backward Compatibility
The question about backward compatibility is indeed a good one, it's risky to break with the current OS/2 API for religious reasons but one should have a look at that more from a technical point of view. The OS/2 API is not really modern anymore, programming directly on PM is much more work than using a modern toolkit like GTK+.

At the moment it's unfortunately unlikely that PM and WPS source get released by IBM.

Options:


 * implement parts of PM and GPI on top of the new 2D API and try to integrate it with the toolkit choosen (same look & feel, clipboard support, D&D, etc. That's a lot of work, the question is if this is really necessary. We would have to do the same for supporting other toolkits like qt (which is a requirement).
 * Implement only some crucial parts to ease source code migration. For example message queues, concept of object windows (often used to comunicate with background threads).
 * Map often used PM-functions to counterparts of the chosen toolkit.
 * Use a VM and run OS/2 or eCS inside the VM. There are very promising opensource VMs like
 * XEN
 * QEMU

XEN seems to be the most promising one at the moment because it will support dual core CPUs in the future so one can run the guest OS on a separate CPU core. So far one had to alter the guest OS in sourcecode but that changes at the moment because they integrate parts of QEMU sourcecode inside XEN to emulate those parts (memory allocation and such stuff).

Questions

 * the Xegl diagram mentioned above only shows the path of the graphics; the path of e.g. mouse and keyboard input is missing; that's not as trivial as it sounds (it has been missing in Xegl, when that was stopped); will we use OS/2-like driver model or wait for x.org 7.0 (currently RC1!) and take out the input system from there? Other sources (hotplug, ...)?
 * one good thing about OS/2 are the fast interactions when you click somewhere, like opening a folder or getting the focus on a window. Why is that like this? We should try to keep that stuff fast.
 * do we want the traditional window manager<->application scheme? With the Gnome/KDE interfaces? Then we are deep in X again ...
 * the question is if we can incooperate the WM functionality in GTK somehow. As far as I remember Fresco implemented GTK API as well so one might have a look at that.
 * IMO GTK runs on top of a WM. The WM just gives GTK a surface to work with but manages where on screen this surface will be painted. Even OS/2 has something like a WM managing the windows for us.