AtheOS
  Main
  AtheOS News
  Download
  Available software
  Supported hardware

Users
  Features
  AtheOS GUI
  Screen shots
  FAQ

Developers
  CVS Repository
  Documentation
  Multithreading
  Posix compliance
  Contribute

For Fun
  Server info
  Server up-time
  Ascii parrots

Contact
  Mailing list
  Webmaster

Use this site
  Search
  Links
  Credits

Search:


SourceForge
The AtheOS Graphical User Interface.

As mentioned already, AtheOS do not use X11, or any other well known GUI systems/toolkits. The AtheOS GUI looks a bit like X11 at the lowest level, in that there is a server/client system. The comunication is not over TCP/IP though but is handled by the high-speed/low-latency messaging system built into the AtheOS kernel. Another difference is that the server/client lowlevel protocol is not known by applications, but are handled entirely by the GUI toolkit's C++ classes. Applications only know about highlevel entities like windows, views, fonts, bitmaps, etc etc. The AtheOS GUI is a much more integrated part of the OS than in your favourite Unix system.

The application server is a central connection point in the system. The kernel manage shared low-level resources like semaphores and message ports, while the appserver manage more high-level resources like windows, bitmap and clipboards. The application server can receive data from one process and deliver it to another through message ports. This is used for drag and drop between applications and for the global clipboard. One of the most important tasks for the appserver is to manage the GUI. Each process lives in it's own address space and generally can't see the memory owned by another process. This means that they can't share the neccesarry structures needed to have multiple windows belonging to multiple applications on a single desktop. This is solved by putting all the windows into one central process (the appserver) and let the applications controll them by sending messages to that process.

The users (not even the programmers) does not see this communication. It is hidden behind a set of C++ classes that give a simple API through which the GUI is programmed.

There is tree main components used to construct the GUI. At the highest level is the desktop. There is a fixed number (32) of desktops. Each desktop can have it's own resolution and color depth. The screen-mode is configured individually for each desktop by the user (not by programs). The first 12 desktops is easily accessible by hitting F1-F12 while holding a qualifier. In addition you can toggle between the two last visited desktops with another hot-key.

Each desktop can hold an arbritary number of windows. You can move windows between desktops by clicking the border while switching to a new desktop. If both the left and right mouse button is pushed the window will be "cloned", making it accessible from more than one desktop. You can manipulate the windows with the mouse and with the keyboard. To move or resize a window the only option is the mouse, but there is a flexible system for selecting and depth-aranging windows. Note that simply selecting a window with the mouse do not make it pop frontmost. The reason for this is that I often find it useful to give a window temporary focus without getting it atop of the window I am working in. Instead there is a button on the window that when pushed will move the window to the front unless it already is the topmost window. If the window already is topmost, it will be moved behind all other windows. You can also move the window frontmost by double clicking the border, or by pushing one of the [CTRL] keys while selecting it. If you don't feel like leaving the keyboard, you can both select and depth-arrange windows using hot-keys. Holding down the left [ALT] qualifier while tapping on the [TAB] key will open a menu listing all the windows on the current desktop. Each time you hit the [TAB] key whithout letting go on the [ALT] key the list will be rotated by one and the focus will be moved to the next window in the list. When the right window has focus you can simply release the [ALT] key and the window will be moved to the front. If you only want to give the window focus (not moving it frontmost) you can hit the [|] key (below [ESC]) and the menu will be removed and the currently selected window will keep the focus. If you change your mind while "tabbing" around in the list you can hit the [ESC] key to restore focus to the window having it before the menu was opened. The list is arrange so that in the common case of toggling back and fort between two windows, you only hit [ALT]-[TAB] once each time you want to flip between the current and the previous topmost window.

Inside each window there is a hierarchy of "views". This is the most active component in the GUI. All rendering except the window border is done by views. Each view has it's own graphical environment and it's own coordinate system. Each view can have child views that have a coordinate system relative to it's parent. Views are also responsible for handling user input from keyboard and mouse. Concequently there is a concept of "active" view in addition to "active" window and "active" desktop. The final endpoint for a input event is the "active" view in the "active" window on the "active" desktop. All basic GUI components like buttons, edit-boxes, list-views, etc etc are derived from the View class.