/ api / guicomp / window
Window & Form
A window can be:

- Top-level.
- Embedded inside a container.
- Embedded in another X window by the X-Embed protocol.

When the window is instanciated:

- If a container is specified, then the window is embedded inside this container like a normal widget.
- Otherwise, if the Application.Embedder property is defined, then the window is embedded with the X-Embed protocol.
- Otherwise, the window is a normal top-level window.

At instanciation, the window is inserted in the global window list, unless it is embedded inside a container.

Each time a window is destroyed, it is removed from the global window list. If this list becomes void, then the application may quit, if there is no pending timers or watched file descriptors.

A window has:

- A menu bar, visible or not, even if the window is not top-level.
- A central area.
- An optional "default" button.
- An optional "cancel" button.

The `Picture` property defines the background picture used by the window. If the `Mask` property is set, then this background picture is used as window mask, provided it has some transparent part.

A Form is just a Window whose event observer is itself, and that has a static public `Main` method that instanciates and shows the auto-created instance of the Form.

You can show a window:

- Modeless by calling `Window.Show`.
- Modal by calling `Window.ShowModal`.

`Window.ShowModal` returns the value passed to the `Window.Close` method.

Closing a window does nothing if:

- The window has been already closed. You need one flag for that. Do not forget to clear this flag if the window is shown again.
- The window is being closed. You need one other flag for that.

The Close event is raised only if the window has been effectively shown.

If `Window.Persistent` is set, then closing a window does not destroy it.

An embedded window must receive the Close event too.

`Window.Raise` automatically shows the window if needed.

`Window.Hide` calls `Window.Close` when the window is in modal mode.

The following properties depends on the freedesktop window manager specifications: `Window.Minimized`, `Window.Maximized`, `Window.FullScreen`, `Window.Stacking`, `Window.SkipTaskBar`, `Window.Sticky`

When you show a window for the first time, or that was closed, you must be careful to initialize all the previous properties.

When a window is shown, it is automatically raised and activated.

If a resizable window is shown in modal mode, then its initial size becomes automatically its minimum size.

The Resize and Move events are raised only if the window is shown, or once just before the window is shown.

Pressing the RETURN key must activate the default button if it is defined. Pressing the ESC key must activate the "cancel" button if it is defined.

The first created window becomes automatically the "main" window. If this window is closed, then all other windows are closed automatically. Once the main window is closed, you can create another window. This new window then becomes the new main window.

Reparenting a window can change its top-level state.

A top-level window, or an embedded window that implements the Activate event handler can become the current active window.

If a control gets the focus, then its window becomes the active window, provided this window can become the current active window as explained above. If its window cannot become the current active window, then the parent window of this window is tried, and so on, until a top-level window is reached.

Activating a window sends a Deactivate event to the old current active window, and an Activate event to the new one.

When the application is iconified, then the current active window is deactivated. When the application is uniconified, then the current active window is reactivated again.

Setting the focus to an hidden control is just memorized by the window, so that this focus is applied when the window is effectively opened.