A window has a look, a feel, and a set of user attributes:
The sets of looks, feels, and attributes are defined by the BWindow class and can't be added to—for example, you can't create your own "round window" look, or "float right next to" feel. BWindow also provides a set of five pre-defined window types which are convenient covers for common combinations of look and feel.
The following sections are detailed descriptions of the window looks, feels, user attributes, and types that are defined by the BeOS.
There are three components to a window's look: a border, a title tab, and a resize control.
A window's border outlines the content area of the window. The window's title tab (if any) projects above the border. There are four types of window borders: thick, thin, line, and none (the no-border type isn't shown in the illustration).
The user drags a window by grabbing the thick or thin border. If the window has a line border (or no border) it can't be moved with the mouse.
The title tab is the box that projects above the window's content area, and that contains the window's title. There are three types of title tabs: large, small, and none.
The title tab normally sits at the far left side of the window. The user can move the window tab along the top of the window by shift dragging the tab. You can't disable this feature.
If a window is closable and zoomable (as set by the window's behavior), the title tab will also contain a close button (on the left) and a zoom button (on the right).
The user hides a window by double-clicking the title tab. If the window doesn't have a title tab, it can't be hidden.
The existence of a resize control is determined by the window's behavior—to display a resize control, the window must be set to be resizable. The window's look determines what the control looks like. There are three types of resize controls: a resize box, a resize corner, or none.
The resize box is designed to sit at the junction of a horizontal and a vertical scroll bar (illustrated in the next section).
If a window is set to be non-resizable (and so lacks a resize control), it should also be set to be non-zoomable. Lacking a resize control and zoom button, the user won't be able to resize the window.
The BeOS provides six pre-defined window looks: document, titled, floating, modal, bordered, and no border. In the sections below, each look is described and illustrated. The constants that represent the types are given in the headings.
Thick border, large title tab, resize box. The document look is used for windows that display scrollable documents. In practice, a document look window should have a menu bar across the top of the content area and a horizontal and/or vertical scrollbar. The horizontal scroll bar is sometimes shortened to leave space for other controls along the bottom (as shown in the illustration below).
Document look windows should always be combined with a normal feel.
Thick border, large title tab, resize corner. The titled look is used for windows that display controls (such as preference panels), or fixed size, non-scrollable documents.
Titled look windows are often set to be non-resizable and non-zoomable, and should always be combined with a normal feel. If resizable, a titled window should scale its contents when its resized.
Thin border, small title tab, resize corner. The floating look is used for displaying tool palettes or other auxilliary panels.
Floating look windows are almost always non-zoomable, are often non-resizable, and should always be combined with a floating feel.
Thick border, no title tab, no resize control (by convention). The modal look is used for alerts, registration panels, and other attention getting windows.
Modal look windows are almost always non-resizable and non-closable, and should always be combined with a modal feel.
If you want a standard alert panel, you should use a BAlert object rather than a modal window. The most common use of the modal look outside of the BAlert object is in a splash screen or registration panel:
Line border, no tab, no resize control. The bordered look is used to flash a temporary message on the screen—such as to inform the user that data is being loaded, or devices scanned. The window isn't expected to provide any controls through which the user can respond to the message; instead, it's expected to remove itself when the message is no longer pertinent.
Bordered windows can't be moved, resized, or zoomed, and are usually set to be non-closable. They're typically combined with the normal feel.
![]() |
You should rarely use the bordered look. If you want to present the user with a panel that says "Wait a moment, I'm doing something", you should use a modal or titled window that includes a status bar and a cancel button. |
No border, no tab, and no resize control. Unbordered windows are provided for developers who want to do everything themselves. They should very rarely be needed by "normal" applications. The window can't be moved, resized, or zoomed, but can be closed (from the keyboard).
A window's feel determines its behavior in relation to other windows. There are three basic window feels:
Note that only normal window appear Deskbar's window list.
Floating and modal windows are further specified by the scope of the set of windows that they affect (i.e. float in front of or block). There are three scopes:
The following sections look closer at the three basic feels, and list the individual feel types.
Floating feel windows are used to display tool palettes and other "auxilliary" panels. A floating window always appears in front of the normal windows within its scope (subset, app, or all), but only if one of these windows is frontmost (and active). If the frontmost window isn't in the floating window's scope, the floating window is hidden. It reappears when a window within its scope is activated. If the user moves a scoped window to another workspace, the floating window goes with it.
In the illustrations below, all three windows belong to the same app. "Floater" is a floating window; "In" is within the floater's scope, and "Out" is not. When "Out" is made active, "Floater" is hidden.
Notice that the floating window and the scoped window can both appear active at the same.
Floating feel windows never appear in Deskbar's window list. Furthermore, closing all the windows in a floating window's scope does not close the floating window itself. Your app must take care that it doesn't leave some hidden floating windows lying around after all other windows are closed.
Floating feel windows should have a floating look, and are usually made non-zoomable. Floating feel windows can't be hidden, even if you don't set the non-minimizable flag (the flag that controls whether a window is hidden when the user double-clicks the title tab).
Floating windows float in front of normal feel windows (only). A floating window isn't displayed if the only visible windows within its scope have a modal or floating feel.
A floating subset feel window can be trained to float above a limited set of windows. You create the subset programatically, through the BWindow::AddToSubset() function.
![]() |
Don't nest floating window subsets (i.e. don't add a floating window to another floating window's subset). If you feel the need to do this, you should suspect the organization of your app's windows. |
The floating app feel is like a floating subset window whose subset includes all windows in the app.
![]() |
Never use the floating all feel. There's no reason to float a window above all windows across the entire system. |
A window with a modal feel blocks the user's access to (and floats above) one or more other windows. The blocked windows can be moved, but they can't be resized, hidden, closed, activated, or worked in (the user can't direct mouse or keyboard events at them) until the modal window is closed.
The modal window appears in (at least) every workspace that its blocked windows appear in. If the user moves a blocked window to some other workspace, the modal window will move to that workspace.
The alerts that the BAlert class creates uses the modal feel with an app scope. In general, you should try to use these objects rather than create modal windows yourself.
The modal feel should only be used with the modal look. Modal feel windows can't be closed (through the Command+w shortcut), and never appear in Deskbar's window list. Because of this, modal windows invariably provide one or more buttons that let the user respond to the situation and dismiss the window.
The modal subset feel is used to create a modal window that blocks access to a limited number of windows. This can be useful in the interface to a project manager that represents each project as a separate window (or groups of windows). If a particular project needs attention, the modal window can block that project's windows without affecting the other projects.
A modal subset feel window is only displayed in the workspaces that contain members of its subset. It isn't displayed if its subset is empty.
The modal app feel creates windows that block all windows in the app. You can create an app that has a modal app feel window as its only window.
A modal app window is always opened in the current workspace, and is also displayed in all other workspaces that contain windows from that app.
The modal all feel creates windows that block all windows across the entire system. Use of this scope should be extremely rare. It could be used to good effect in an app that's monitoring the batteries in a laptop (for example)—when the power is close to gone, it could force the user to notice.
A modal all window is opened and displayed in all workspaces.
If it isn't floating or modal, it's normal.
A normal feel window doesn't block access to other windows, nor does it float in front of other windows. A window that displays a document that the user is working on should use the normal feel.
A normal feel window can appear in whichever workspace the user puts it in, isn't removed from the screen when its app is no longer active, and always appears in the Deskbar's window list.
The normal feel can be used with any window look other than floating and modal.
In addition to a look and a feel, each window has a set of 13 attributes that define how the user interacts with the window—whether the user can close, zoom, or resize the window, and so on. These attributes are represented by flags that you combine when you create the window. Most of the flags are presented in the negative (e.g. "not movable") and none of them are set by default. As a result, the default values for these attributes are double-negatives; for example, the default for "not movable" means that the window is, by default, movable.
Certain window look and feels implicitly set some of the flags.
The 13 flags are described below, divided into topical areas. A 14th flag—B_ASYNCHRONOUS_CONTROLS—isn't really a user attribute, but it's listed here for completeness.
Setting this flag prevents a user from moving the window. This flag is implied by the bordered and no border looks. Setting this flag for other windows is discouraged.
![]() |
The "minimizable" in the constant name is a vestige of an obsolete strategy. When you see "minimizable", think "hidable". |
Setting this flag prevents a user from hiding the window (by double-clicking the title tab). This flag is implied by the modal, bordered, and no border looks, and by the floating and modal feels.
Setting this flag removes the close button from the window's title tab, and disables the Command+w shortcut. This flag is implied by the modal feels.
Setting these flags prevents the user from resizing the window in one or both dimensions. The B_NOT_RESIZABLE flag removes the window's resize control; the other two don't. B_NOT_RESIZABLE is implied by the bordered and no border looks. You should set it when creating a modal window.
Setting this flag causes a window to draw only the outline of its new dimensions while it's being resized; the window doesn't redraw its contents until the user is finished resizing. By default, the window continuously redraws itself while it's being resized.
Outline resizing is discouraged. You should only use it if dynamic resizing is so compute intensive that things gets really ugly.
Setting this flag removes the zoom button from the window's title tab. This flag is implied by the modal, bordered, and no border looks.
Setting this flag tells a non-active window to process an activating mouse click (the "first" mouse click) as if it were already active. By default, the first mouse click in a non-active window activates the window, and then the mouse click event is thrown away.
Setting this flag prevents your window from being promoted to active status when the currently active window is closed or hidden. The window can only become active if the user clicks in it (or if there are no other windows to promote). This flag is implied by the floating feels.
Setting this flag prevents your window from being the target of keyboard events, even when it's the active window. Normally, the active window receives keyboard events.
Setting this flag tells the system not to jump to the workspace in which this window is being opened. This is a useful temporary flag when you're creating a set of windows that are spread out across multiple workspaces.
This flag is implied by the floating feels. Modal app feel and modal all feel windows are always opened in the current workspace; this flag doesn't apply to them.
Setting this flag tells the system to bring the window to the current workspace when the window is selected from Deskbar's window list. Normally, selecting a window from the list activates the workspace that the window is currently in. This flag doesn't apply to the floating or modal feels (which never appear in the Deskbar's window list).
![]() |
This flag only applies to activation from Deskbar, it doesn't apply to a window's initial opening. |
Setting this flag tells the window to allow controls to run asynchronously. It's strongly recommended that any window that contains a control set this flag.
![]() |
Asynchronous controls are explained in <Controls>. |
The BeOS provides five pre-defined look and feel combinations known as window types. You're encouraged to use these types whenever possible. The types are based, primarily, on the window looks; the only look that isn't represented is B_NO_BORDER_LOOK.
This is a combination of B_DOCUMENT_WINDOW_LOOK and B_NORMAL_WINDOW_FEEL.
This is a combination of B_TITLED_WINDOW_LOOK and B_NORMAL_WINDOW_FEEL.
This is a combination of B_FLOATING_WINDOW_LOOK and B_FLOATING_APP_WINDOW_FEEL.
This is a combination of B_MODAL_WINDOW_LOOK and B_MODAL_APP_WINDOW_FEEL.
This is a combination of B_BORDERED_WINDOW_LOOK and B_NORMAL_WINDOW_FEEL.
Copyright © 1999 Be, Inc. All rights reserved.
Text last modified April 20, 1999.