DEFINITION MODULE MultiScreen;

        (****************************************************************)
        (*                                                              *)
        (*  This module allows the creation of multiple virtual screens *)
        (*  - complete screens, not just windows - with three keyboard  *)
        (*      "hot keys" used to navigate around the screens.         *)
        (*                                                              *)
        (*  We support a two-level hierarchy: a virtual screen is a     *)
        (*  collection of windows, and each virtual screen is a member  *)
        (*  of a group.  (In addition, there is a pseudo-group made up  *)
        (*  of all windows which are not associated with any virtual    *)
        (*  screen, to handle the "normal output" which bypasses this   *)
        (*  module.)  The virtual screen switching is done using hot    *)
        (*  keys, as follows:                                           *)
        (*     Hotkey1   steps to the previous group                    *)
        (*     Hotkey2   steps to the next group                        *)
        (*     Hotkey3   steps to the next virtual screen of the        *)
        (*               currently active group.                        *)
        (*                                                              *)
        (*  In the present version, the client module has to call       *)
        (*  EnableHotKeys to define the three hot keys.                 *)
        (*                                                              *)
        (*      Programmer:         P. Moylan                           *)
        (*      Last edited:        4 September 1998                    *)
        (*      Status:             OK                                  *)
        (*                                                              *)
        (****************************************************************)

FROM Windows IMPORT
    (* type *)  Window, DisplayPage;

TYPE ScreenGroup;       (* is private *)
     VirtualScreen;     (* is private *)

PROCEDURE EnableScreenSwitching (enable: BOOLEAN);

    (* Enables hot key screen switching if enable is TRUE, or disables  *)
    (* it if enable is FALSE.                                           *)

PROCEDURE EnableHotKeys (flag1: BOOLEAN;  key1: CHAR;
                         flag2: BOOLEAN;  key2: CHAR;
                         flag3: BOOLEAN;  key3: CHAR);

    (* Creates the "hot key" tasks, and enable the hot keys.  The first *)
    (* and second pair of parameters define the previous/next group     *)
    (* switching hot keys, and the third pair defines the hot key for   *)
    (* cycling within a group.                                          *)
    (* The "flag" part of each parameter pair is FALSE for a normal     *)
    (* key, and TRUE for an extended key defined by a two-character     *)
    (* sequence (where the first character is CHR(0).                   *)

PROCEDURE CreateScreenGroup (hardwarepage: DisplayPage): ScreenGroup;

    (* Creates a new screen group, and maps it to the specified display *)
    (* page in the screen hardware.  It is permissible to map more than *)
    (* one group to the same hardware page.  Note that any group on     *)
    (* hardware page 0 shares the screen with "normal output" which     *)
    (* does not belong to any virtual page.  This is permitted, but     *)
    (* on aesthetic grounds is usually not a good idea.                 *)

PROCEDURE CreateVirtualScreen (group: ScreenGroup): VirtualScreen;

    (* Adds a new virtual screen to the specified group.        *)

PROCEDURE MapToVirtualScreen (w: Window;  screen: VirtualScreen);

    (* Before calling this procedure, both w and screen must have been  *)
    (* created.  This procedure ensures that window w is visible on     *)
    (* the screen only when the given virtual screen page is active.    *)
    (* The association lasts until the window is closed or the virtual  *)
    (* screen is removed.                                               *)

PROCEDURE VirtualScreenOf (w: Window): VirtualScreen;

    (* Returns the virtual screen, if any, with which window w is       *)
    (* associated.  It is possible that no such association exists, in  *)
    (* which case we return a NIL result.                               *)

PROCEDURE RemoveVirtualScreen (VAR (*INOUT*) screen: VirtualScreen);

    (* Destroys all associations between the given virtual screen and   *)
    (* its windows (but does not close the windows), and permanently    *)
    (* removes this screen from the collection of virtual screens.      *)

PROCEDURE RemoveScreenGroup (VAR (*INOUT*) group: ScreenGroup);

    (* As above, but removes an entire group.   *)

END MultiScreen.

