DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦18b155df0⟧ Ada Source

    Length: 76800 (0x12c00)
    Types: Ada Source
    Notes: 03_class, FILE, Long Ada Source, R1k_Segment, e3_tag, package body Xlbp_Hint, seg_004f6b

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Xlbt_Arithmetic;  
use Xlbt_Arithmetic;  
with Xlbt_Atom_Defs;  
use Xlbt_Atom_Defs;  
with Xlbt_Basic;  
use Xlbt_Basic;  
with Xlbt_Hint3;  
use Xlbt_Hint3;  
with Xlbt_String;  
use Xlbt_String;  
with Xlbt_Window;  
use Xlbt_Window;

with Xlbp_Atom;  
use Xlbp_Atom;  
with Xlbp_U_Char_Converters;  
use Xlbp_U_Char_Converters;  
with Xlbp_Window_Property;  
use Xlbp_Window_Property;

with Xlbit_Hint2;  
use Xlbit_Hint2;

with Xlbip_Internal;  
use Xlbip_Internal;

with Xlbmp_Environment;  
use Xlbmp_Environment;

package body Xlbp_Hint is
------------------------------------------------------------------------------
-- X Library Hints - Window Manager Hints
--
-- Xlbp_Hint - Support for the various Window Manager properties of a window.
------------------------------------------------------------------------------
-- Copyright 1989 - 1991 by Rational, Santa Clara, California.
-- Copyright 1987 - 1989 by Digital Equipment Corporation, Maynard, Mass.
-- Copyright 1987 - 1989 by Massachusetts Institute of Technology,
--                          Cambridge, Massachusetts.
-- Copyright 1988 - 1988 by Wyse Technology, Inc., San Jose, Ca.,
--
--                  All Rights Reserved.
--
-- Permission to use, copy, modify, and distribute this software and its
-- documentation for any purpose and without fee is hereby granted,
-- provided that the above copyright notice(s) appear in all copies and that
-- both that copyright notice(s) and this permission notice appear in
-- supporting documentation, and that the names of Digital, MIT, Rational, or
-- Wyse not be used in advertising or publicity pertaining to distribution of
-- the software without specific, written prior permission.
--
-- Digital, MIT, Rational, and Wyse disclaim all warranties with regard to this
-- software, including all implied warranties of merchantability and fitness,
-- in no event shall Digital, MIT, Rational, or Wyse be liable for any special,
-- indirect or consequential damages or any damages whatsoever resulting from
-- loss of use, data or profits, whether in an action of contract, negligence
-- or other tortious action, arising out of or in connection with the use or
-- performance of this software.
------------------------------------------------------------------------------

--\x0c
    procedure X_Get_Class_Hint (Display    :     X_Display;  
                                Window     :     X_Window;  
                                Class_Hint : out X_Class_Hint;  
                                Status     : out X_Status) is  
        Hint          : X_Class_Hint;  
        Actual_Type   : X_Atom;  
        Actual_Format : U_Char;  
        N_Items       : S_Natural;  
        Leftover      : S_Natural;  
        Buff          : U_Char_List;  
        Succ          : X_Status;  
    begin

----Get the property.

        X_Get_Window_Property (Display, Window, Xa_Wm_Class, 0,  
                               S_Long'Last - 4, False, Xa_String, Actual_Type,  
                               Actual_Format, N_Items, Leftover, Buff, Succ);

----We must have it and it must be in the right format.

        if Succ = Successful and then  
           Actual_Type = Xa_String and then  
           Actual_Format = 8 then

----Search for the separating null.

            for I in Buff'Range loop  
                if Buff (I) = 0 then  
                    Hint.Res_Name := new X_String (1 .. I - 1);  
                    From_Uca (Hint.Res_Name.all, Buff (1 .. I - 1));  
                    if I = Buff'Last then
                        ----If the Res_Class is empty then there may
                        --  only be one string.
                        Hint.Res_Class := new X_String'(Hint.Res_Name.all);  
                    elsif Buff (Buff'Last) = 0 then  
                        Hint.Res_Class := new X_String (1 .. Buff'Last - I - 1);  
                        From_Uca (Hint.Res_Class.all,  
                                  Buff (I + 1 .. Buff'Last - 1));  
                    else  
                        Hint.Res_Class := new X_String (1 .. Buff'Last - I);  
                        From_Uca (Hint.Res_Class.all,  
                                  Buff (I + 1 .. Buff'Last));  
                    end if;  
                    Free_U_Char_List (Buff);  
                    Class_Hint := Hint;  
                    Status     := Successful;  
                    return;  
                end if;  
            end loop;  
        end if;

----We come here if the property is missing or bad.

        Free_U_Char_List (Buff);  
        Class_Hint := None_X_Class_Hint;  
        Status     := Failed;

    exception

        when others =>  
            Free_X_String_Pointer (Hint.Res_Name);  
            Free_X_String_Pointer (Hint.Res_Class);  
            raise;

    end X_Get_Class_Hint;

--\x0c
    procedure X_Set_Class_Hint (Display    :     X_Display;  
                                Window     :     X_Window;  
                                Class_Hint :     X_Class_Hint;  
                                Status     : out X_Status) is  
        Llen : S_Natural := Class_Hint.Res_Name'Length;  
        Clen : S_Natural := Class_Hint.Res_Class'Length;  
        Uca  : U_Char_Array (1 .. 2 + Llen + Clen);  
        Ucai : S_Natural := 0;  
    begin

        for I in Class_Hint.Res_Name'Range loop  
            Ucai       := Ucai + 1;  
            Uca (Ucai) := X_Character'Pos (Class_Hint.Res_Name (I));  
        end loop;  
        Ucai       := Ucai + 1;  
        Uca (Ucai) := 0;

        for I in Class_Hint.Res_Class'Range loop  
            Ucai       := Ucai + 1;  
            Uca (Ucai) := X_Character'Pos (Class_Hint.Res_Class (I));  
        end loop;  
        Ucai       := Ucai + 1;  
        Uca (Ucai) := 0;

        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Xa_Wm_Class,  
                           Representation => Xa_String,  
                           Format         => 8,  
                           Mode           => Prop_Mode_Replace,  
                           Data           => Uca);  
        Status := Successful;

    end X_Set_Class_Hint;

--\x0c
    procedure X_Get_Wm_Colormap_Windows (Display :     X_Display;  
                                         Window  :     X_Window;  
                                         Windows : out X_Window_List;  
                                         Status  : out X_Status) is
------------------------------------------------------------------------------
--  Display - Specifies the display to use.
--  W       - Specifies the window to use.
--  Windows - Receives None_X_Window_List or a list of windows
--  Status  - Receives Successful if we succeeded; Failed if not.
--
-- Called to fetch the list of window identifiers stored in the
-- WM_COLORMAP_WINDOWS property on the specified window.  Returns Failed if
-- a) the property has never been set, b) the property is set but it does not
-- have the correct type, format, or size.  The list must be freed after use
-- with the Free_X_Window_List routine.
------------------------------------------------------------------------------
        Data          : U_Char_List;  
        Actual_Type   : X_Atom;  
        Actual_Format : U_Char;  
        Leftover      : S_Natural;  
        Nitems        : S_Natural;  
        Succ          : X_Status;  
        Wins          : X_Window_List;  
    begin

----Initialize out parameters.

        Windows := None_X_Window_List;

----Make sure we have the internal atom that we need to do this.

        if Display.Atoms.Wm_Colormap_Windows = None_X_Atom then

            Actual_Type := X_Intern_Atom (Display,  
                                          "WM_COLORMAP_WINDOWS", False);  
            if Actual_Type = None_X_Atom then  
                Status := Failed;  
                return;  
            end if;  
            Lock_Display (Display);  
            Display.Atoms.Wm_Colormap_Windows := Actual_Type;  
            Unlock_Display (Display);

        end if;

----Get the property and make sure we really got it.

        X_Get_Window_Property  
           (Display, Window, Display.Atoms.Wm_Colormap_Windows,  
            0, 1_000_000, False, Xa_Window, Actual_Type,  
            Actual_Format, Nitems, Leftover, Data, Succ);  
        if Succ /= Successful then  
            Status := Failed;  
            return;  
        end if;

----Make sure that we have the correct format.

        if Actual_Type /= Xa_Window or else  
           Actual_Format /= 32 then  
            Free_U_Char_List (Data);  
            Status := Failed;  
            return;  
        end if;

----Convert the data into a window array.

        Wins := new X_Window_Array (1 .. Nitems);  
        From_Uca (Wins.all, Data.all);  
        Free_U_Char_List (Data);  
        Windows := Wins;  
        Status  := Successful;

    exception

        when others =>  
            Free_U_Char_List (Data);  
            Free_X_Window_List (Wins);  
            raise;

    end X_Get_Wm_Colormap_Windows;

--\x0c
    procedure X_Set_Wm_Colormap_Windows (Display :     X_Display;  
                                         Window  :     X_Window;  
                                         Windows :     X_Window_Array;  
                                         Status  : out X_Status) is
------------------------------------------------------------------------------
--  Display - Specifies the display to use.
--  W       - Specifies the window to use.
--  Windows - Specifies the window list.
--  Status  - Receives Successful if we succeeded; Failed if not.
--
-- Sets the WM_COLORMAP_WINDOWS property for the spcified window.  The
-- property is set to have a type of WINDOW and a format of 32.
--
--      WM_COLORMAP_WINDOWS         type: WINDOW        format:32
------------------------------------------------------------------------------
        A    : X_Atom;  
        Data : U_Char_Array (1 .. X_Window'Size / U_Char'Size * Windows'Length);  
    begin

----Make sure that our internal atom exists.

        if Display.Atoms.Wm_Colormap_Windows = None_X_Atom then  
            A := X_Intern_Atom (Display, "WM_COLORMAP_WINDOWS", False);  
            if A = None_X_Atom then  
                Status := Failed;  
                return;  
            end if;  
            Lock_Display (Display);  
            Display.Atoms.Wm_Colormap_Windows := A;  
            Unlock_Display (Display);  
        end if;

----Convert and send the data.

        To_Uca (Data, Windows);  
        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Display.Atoms.Wm_Colormap_Windows,  
                           Representation => Xa_Window,  
                           Format         => 32,  
                           Mode           => Prop_Mode_Replace,  
                           Data           => Data);  
        Status := Successful;

    end X_Set_Wm_Colormap_Windows;

--\x0c
    procedure X_Get_Rgb_Colormaps (Display   :     X_Display;  
                                   Window    :     X_Window;  
                                   Colormaps : out X_Standard_Colormap_List;  
                                   Property  :     X_Atom;  
                                   Status    : out X_Status) is
------------------------------------------------------------------------------
--  Display   - Specifies the display to use.
--  W         - Specifies the window to use.
--  Stdcmap   - Receives the color map(s) associated with the Property.
--  Property  - Specifies the property to query.
--  Status    - Receives Successful if we succeeded; Failed if not.
--
-- Used to obtain the color map definition(s) associated with the standard
-- color map property specified.
--
-- If the property exists, is of type RGB_COLOR_MAP, is of format 32, and is
-- long enough to contain a colormap definition we allocate and fill in the
-- space for the returned colormaps and returns Status  = Successful.
--
-- If the Visual_Id of a colormap is not present then we assume the default
-- visual for the screen.  If the Kill_Id is not present then None is used;
-- meaning that the resources cannot be released.
------------------------------------------------------------------------------
        Data          : U_Char_List;  
        Actual_Type   : X_Atom;             -- how the prop was actually stored
        Actual_Format : U_Char;             -- ditto
        Leftover      : S_Natural;            -- how much was left over
        Nitems        : S_Natural;            -- number of 32bits read
        Ncmaps        : S_Natural;            -- number of structs this makes
        Old_Style     : Boolean     := False;   -- if was too short
        Def_Visual    : X_Visual_Id := None_X_Visual_Id;-- visual if prop short
        Cmaps         : X_Standard_Colormap_List; -- our return value
        Sp            : X_Screen;  
        Succ          : X_Status;

        Cmap_Size : constant S_Natural :=  
           X_Standard_Colormap'Size / U_Char'Size;  
    begin

----Initialize our out parameters.

        Colormaps := None_X_Standard_Colormap_List;

----Get the window property and see if we really got it.

        X_Get_Window_Property (Display, Window, Property, 0, 1_000_000,  
                               False, Xa_Rgb_Color_Map, Actual_Type,  
                               Actual_Format, Nitems, Leftover, Data, Succ);  
        if Succ /= Successful then  
            Status := Failed;  
            return;  
        end if;

----If it is the wrong type, the wrong format, or too small for us, then punt.

        if Actual_Type /= Xa_Rgb_Color_Map or else  
           Actual_Format /= 32 or else  
           Nitems < Cmap_Size - 8 then  
            Free_U_Char_List (Data);  
            Status := Failed;  
            return;  
        end if;

----See how many properties were found; if pre-ICCCM size then assume default
--  visual and a kill id of None.

        if Nitems < Cmap_Size then

----Old style; pre-ICCCM.

            Ncmaps    := 1;  
            Old_Style := True;  
            if Nitems < Cmap_Size - 1 then  
                Sp := Internal_X_Screen_Of_Window (Display, Window);

                if Sp = None_X_Screen then  
                    Free_U_Char_List (Data);  
                    Status := Failed;  
                    return;  
                end if;  
                Def_Visual := Sp.Root_Visual.Visual_Id;  
            end if;

----New style; post-ICCCM.  Make sure we have an integral number of colormaps.

        else  
            Ncmaps := Nitems / Cmap_Size;  
            if Ncmaps * Cmap_Size /= Nitems then  
                Free_U_Char_List (Data);  
                Status := Failed;  
                return;  
            end if;  
        end if;

---Allocate the result array.

        Cmaps := new X_Standard_Colormap_Array (1 .. Ncmaps);

----And fill it in, handling compatibility with pre-ICCCM short stdcmaps.

        declare  
            Map  : S_Natural := Cmaps'First;  
            Prop : S_Natural := Data'First;  
        begin

            for I in 1 .. Ncmaps loop  
                if Old_Style then  
                    From_Uca (Cmaps (Map),  
                              Data (Prop .. Prop + Cmap_Size - 1 - 8) &  
                                 (1 .. 8 => 0));  
                    Cmaps (Map).Kill_Id := None_X_Id;  
                else  
                    From_Uca (Cmps (Map), Data (Prop .. Prop + Cmap_Size - 1));  
                end if;  
                if Def_Visual /= None_X_Visual_Id then  
                    Cmaps (Map).Visual_Id := Def_Visual;  
                end if;  
                Map  := Map + 1;  
                Prop := Prop + Cmap_Size;  -- Only every 1 small/old cmap.
            end loop;  
        end;  
        Free_U_Char_List (Data);  
        Colormaps := Cmaps;  
        Status    := Successful;

    exception

        when others =>  
            Free_U_Char_List (Data);  
            Free_X_Standard_Colormap_List (Cmaps);  
            raise;

    end X_Get_Rgb_Colormaps;

--\x0c
    procedure X_Set_Rgb_Colormaps (Display   :     X_Display;  
                                   Window    :     X_Window;  
                                   Colormaps :     X_Standard_Colormap_Array;  
                                   Property  :     X_Atom;  
                                   Status    : out X_Status) is
------------------------------------------------------------------------------
--  Display   - Specifies the display to use.
--  W         - Specifies the window to use.
--  Stdcmap   - Specifies the Colormap(s) to use.
--  Property  - Specifies the property to set.
--
-- Used by window managers to create standard color map properties.
--
-- The colormap(s) are stored with type RGB_COLOR_MAP and a format of 32.
--
-- It is the caller's responsibility to honor the ICCCM restriction that only
-- RGB_DEFAULT_MAP contain more than one definition.
------------------------------------------------------------------------------
        Cmap_Size : constant S_Natural :=  
           X_Standard_Colormap'Size / U_Char'Size;

        Data : U_Char_Array (1 .. Colormaps'Length * Cmap_Size);  
    begin

        if Colormaps'Length < 1 then  
            return;  
        end if;

        To_Uca (Data, Colormaps);

        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Property,  
                           Representation => Xa_Rgb_Color_Map,  
                           Format         => 32,  
                           Mode           => Prop_Mode_Replace,  
                           Data           => Data);  
        Status := Successful;

    end X_Set_Rgb_Colormaps;

--\x0c
    procedure X_Set_Command (Display :     X_Display;  
                             Window  :     X_Window;  
                             Arg_V   :     X_String_Pointer_Array;  
                             Status  : out X_Status) is  
        N_Bytes : S_Natural;  
    begin

----Count the number of characters we need to include in the property.

        N_Bytes := 0;  
        for I in Arg_V'Range loop  
            if Arg_V (I) /= None_X_String_Pointer then  
                N_Bytes := N_Bytes + Arg_V (I)'Length + 1;             else  
                N_Bytes := N_Bytes + 1;  
            end if;  
        end loop;

----Create the uca version of the property and then set it.

        declare  
            Bp  : U_Char_Array (1 .. N_Bytes);  
            Bpi : S_Natural := 1;  
            Sp  : X_String_Pointer;  
        begin  
            for I in Arg_V'Range loop  
                Sp := Arg_V (I);  
                if Sp /= None_X_String_Pointer then  
                    To_Uca (Bp (Bpi .. Bpi + Sp'Length - 1), Arg_V (I).all);  
                    Bpi := Bpi + Sp'Length;  
                end if;  
                Bp (Bpi) := 0;  
                Bpi      := Bpi + 1;  
            end loop;

            X_Change_Property (Display        => Display,  
                               Window         => Window,  
                               Property       => Xa_Wm_Command,  
                               Representation => Xa_String,  
                               Format         => 8,  
                               Mode           => Prop_Mode_Replace,  
                               Data           => Bp);  
        end;  
        Status := Successful;

    end X_Set_Command;

--\x0c
    procedure X_Get_Command (Display :     X_Display;  
                             Window  :     X_Window;  
                             Arg_V   : out X_String_Pointer_List;  
                             Status  : out X_Status) is
------------------------------------------------------------------------------
--  Display - Specifies the display to use.
--  Window  - Specifies the window to ask about
--
-- Called to fetch the command arguments which were used in a call to
-- X_Set_Class_Hint.  Returns an empty array if a) the WM_COMMAND property
-- has never been set, b) the original command list was empty as well, c)
-- the property is set but it does not have the correct type, format, or size.
------------------------------------------------------------------------------
        Tp   : X_Text_Property;  
        Stat : X_Status;  
    begin

        X_Get_Text_Property (Display, Window, Tp, Xa_Wm_Command, Stat);  
        if Stat /= Successful then  
            Status := Failed;  
            return;  
        end if;

----Ignore trailing <NUL> if present since a UNIX WM_COMMAND is nul-terminated.

        if Tp.N_Items > 0 and then  
           Tp.Value (Tp.N_Items - 1) = 0 then  
            Tp.N_Items := Tp.N_Items - 1;  
        end if;

----Create a string list and return if successful.

        X_Text_Property_To_String_List (Tp, Arg_V, Status);  
        Free_X_Text_Property (Tp);

    exception

        when others =>  
            Free_X_Text_Property (Tp);  
            raise;

    end X_Get_Command;

--\x0c
    procedure X_Get_Icon_Sizes (Display :     X_Display;  
                                Window  :     X_Window;  
                                List    : out X_Icon_Size_List;  
                                Status  : out X_Status) is  
        Succ          : X_Status;  
        Actual_Type   : X_Atom;  
        Actual_Format : U_Char;  
        Leftover      : S_Natural;  
        N_Items       : S_Natural;  
        Buff          : U_Char_List;  
        New_List      : X_Icon_Size_List;  
    begin

----Ask for the property.

        X_Get_Window_Property  
           (Display        => Display,  
            Window         => Window,  
            Property       => Xa_Wm_Icon_Size,  
            Offset         => 0,  
            Maximum_Length => 1_000_000,  
            Delete         => False,  
            Representation => Xa_Wm_Icon_Size,  
            Actual_Type    => Actual_Type,  
            Actual_Format  => Actual_Format,  
            N_Items        => N_Items,  
            Bytes_After    => Leftover,  
            Data           => Buff,  
            Status         => Succ);

----Make sure we have what we wanted.

        if Succ = Failed or else  
           Actual_Type /= Xa_Wm_Icon_Size or else  
           N_Items < X_Icon_Size'Size / 32 or else  
           N_Items rem X_Icon_Size'Size / 32 /= 0 or else  
           Actual_Format /= 32 then

            Status := Failed;

----Convert the bytes to an array and return it.

        else  
            New_List := new X_Icon_Size_Array  
                               (1 .. N_Items / (X_Icon_Size'Size /  
                                                S_Natural (Actual_Format)));  
            From_Uca (New_List.all, Buff.all);  
            List   := New_List;  
            Status := Successful;  
        end if;  
        Free_U_Char_List (Buff);

    exception

        when others =>  
            Free_U_Char_List (Buff);  
            Free_X_Icon_Size_List (New_List);  
            raise;

    end X_Get_Icon_Sizes;

--\x0c
    procedure X_Set_Icon_Sizes (Display :     X_Display;  
                                Window  :     X_Window;  
                                List    :     X_Icon_Size_Array;  
                                Status  : out X_Status) is  
        Data : U_Char_Array (1 .. X_Icon_Size'Size / U_Char'Size * List'Length);  
    begin

        To_Uca (Data, List);  
        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Xa_Wm_Icon_Size,  
                           Representation => Xa_Wm_Icon_Size,  
                           Format         => 32,  
                           Mode           => Prop_Mode_Replace,  
                           Data           => Data);  
        Status := Successful;

    end X_Set_Icon_Sizes;

--\x0c
    procedure X_Get_Wm_Name (Display :     X_Display;  
                             Window  :     X_Window;  
                             Name    : out X_Text_Property;  
                             Status  : out X_Status) is  
    begin

        X_Get_Text_Property (Display, Window, Name, Xa_Wm_Name, Status);

    end X_Get_Wm_Name;

--\x0c
    procedure X_Get_Wm_Icon_Name (Display :     X_Display;  
                                  Window  :     X_Window;  
                                  Name    : out X_Text_Property;  
                                  Status  : out X_Status) is  
    begin

        X_Get_Text_Property (Display, Window, Name, Xa_Wm_Icon_Name, Status);

    end X_Get_Wm_Icon_Name;

--\x0c
    procedure X_Set_Wm_Icon_Name (Display   :     X_Display;  
                                  Window    :     X_Window;  
                                  Icon_Name :     X_Text_Property;  
                                  Status    : out X_Status) is  
    begin

        X_Set_Text_Property (Display, Window, Icon_Name, Xa_Wm_Icon_Name);  
        Status := Successful;

    end X_Set_Wm_Icon_Name;

--\x0c
    procedure X_Set_Wm_Name (Display :     X_Display;  
                             Window  :     X_Window;  
                             Name    :     X_Text_Property;  
                             Status  : out X_Status) is  
    begin

        X_Set_Text_Property (Display, Window, Name, Xa_Wm_Name);  
        Status := Successful;

    end X_Set_Wm_Name;

--\x0c
    procedure X_Get_Wm_Normal_Hints (Display :     X_Display;  
                                     Window  :     X_Window;  
                                     Hints   : out X_Size_Hints;  
                                     Status  : out X_Status) is  
    begin

        X_Get_Wm_Size_Hints (Display, Window,  
                             Xa_Wm_Normal_Hints, Hints, Status);

    end X_Get_Wm_Normal_Hints;

--\x0c
    procedure X_Set_Wm_Normal_Hints (Display :     X_Display;  
                                     Window  :     X_Window;  
                                     Hints   :     X_Size_Hints;  
                                     Status  : out X_Status) is  
    begin

        X_Set_Wm_Size_Hints (Display, Window,  
                             Xa_Wm_Normal_Hints, Hints, Status);

    end X_Set_Wm_Normal_Hints;

--\x0c
    procedure X_Get_Wm_Protocols (Display   :     X_Display;  
                                  Window    :     X_Window;  
                                  Protocols : out X_Atom_List;  
                                  Status    : out X_Status) is
------------------------------------------------------------------------------
--  Display     - Specifies the display to use.
--  W           - Specifies the window to use.
--  Protocols   - Receives the window protocols list.
--  Status      - Returns Successful if we succeeded; Failed if not.
--
-- Fetches the protocol list for the window.
--
-- Called to fetch the protocol list which was used in a call to
-- X_Set_Class_Hint.  Returns Failed if a) the WM_PROTOCOLS property
-- has never been set, b) the property is set but it does not have the correct
-- type, format, or size.
--
-- Free the list with Free_X_Atom_List after use.
------------------------------------------------------------------------------
        Data          : U_Char_List;  
        Actual_Type   : X_Atom;  
        Actual_Format : U_Char;  
        Leftover      : S_Natural;  
        Nitems        : S_Natural;  
        Atoms         : X_Atom_List;  
        Succ          : X_Status;

    begin

        Protocols := None_X_Atom_List;  
        if Display.Atoms.Wm_Protocols = None_X_Atom then  
            Actual_Type := X_Intern_Atom (Display, "WM_PROTOCOLS", False);  
            if Actual_Type = None_X_Atom then  
                Status := Failed;  
                return;  
            end if;  
            Lock_Display (Display);  
            Display.Atoms.Wm_Protocols := Actual_Type;  
            Unlock_Display (Display);  
        end if;

----Get the property.

        X_Get_Window_Property (Display, Window, Display.Atoms.Wm_Protocols,  
                               0, 1_000_000, False, Xa_Atom, Actual_Type,  
                               Actual_Format, Nitems, Leftover, Data, Succ);  
        if Succ /= Successful then  
            Status := Failed;  
            return;  
        end if;

        if Actual_Type /= Xa_Atom or else  
           Actual_Format /= 32 then  
            Free_U_Char_List (Data);  
            Status := Failed;  
            return;  
        end if;

        Atoms := new X_Atom_Array (1 .. Nitems);  
        From_Uca (Atoms.all, Data.all);  
        Free_U_Char_List (Data);  
        Status := Successful;

    exception

        when others =>  
            Free_U_Char_List (Data);  
            Free_X_Atom_List (Atoms);  
            raise;

    end X_Get_Wm_Protocols;

--\x0c
    procedure X_Set_Wm_Protocols (Display   :     X_Display;  
                                  Window    :     X_Window;  
                                  Protocols :     X_Atom_Array;  
                                  Status    : out X_Status) is
------------------------------------------------------------------------------
--  Display     - Specifies the display to use.
--  W           - Specifies the window to use.
--  Protocols   - Specifies the protocols to be set for this window.
--  Status      - Returns Successful if we succeeded; Failed if not.
--
-- Sets the protocol list for a window.
--
-- The property is stored with a type of XA_ATOM and a format of 32.
------------------------------------------------------------------------------
        A    : X_Atom;  
        Data : U_Char_Array (1 .. X_Atom'Size / U_Char'Size * Protocols'Length);  
    begin

        if Display.Atoms.Wm_Protocols = None_X_Atom then  
            A := X_Intern_Atom (Display, "WM_PROTOCOLS", False);  
            if A = None_X_Atom then  
                Status := Failed;  
                return;  
            end if;  
            Lock_Display (Display);  
            Display.Atoms.Wm_Protocols := A;  
            Unlock_Display (Display);  
        end if;

        To_Uca (Data, Protocols);  
        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Display.Atoms.Wm_Protocols,  
                           Representation => Xa_Atom,  
                           Format         => 32,  
                           Mode           => Xlbt_Window.Prop_Mode_Replace,  
                           Data           => Data);  
        Status := Successful;

    end X_Set_Wm_Protocols;

--\x0c
    procedure X_Get_Wm_Size_Hints (Display  :     X_Display;  
                                   Window   :     X_Window;  
                                   Property :     X_Atom;  
                                   Hints    : out X_Size_Hints;  
                                   Status   : out X_Status) is  
        Phints : X_Size_Hints_Protocol;  
        Actual_Type : X_Atom;  
        Actual_Format : U_Char;  
        Leftover : S_Natural;  
        N_Items : S_Natural;  
        Succ : X_Status;  
        Buff : U_Char_List;  
        Hsize : constant S_Natural := X_Size_Hints_Protocol'Size / U_Char'Size;  
    begin

----Request the property from the server.

        X_Get_Window_Property (Display,  
                               Window,  
                               Property,  
                               0,  
                               S_Long (X_Size_Hints'Size / 32),  
                               False,  
                               Xa_Wm_Size_Hints,  
                               Actual_Type,  
                               Actual_Format,  
                               N_Items,  
                               Leftover,  
                               Buff,  
                               Succ);

----See if we got a positive reply.  If the data is not of the expected form
--  or size or format then we simply reject it and return.

        if Succ = Failed or else Actual_Type /= Xa_Wm_Size_Hints or else  
           (N_Items /= X_Size_Hints_Protocol'Size / 32 and then  
            N_Items /= X_Size_Hints_Protocol'Size / 32 - 3) or else  
           Actual_Format /= 32 then  
            Free_U_Char_List (Buff);  
            Hints  := None_X_Size_Hints;  
            Status := Failed;  
            return;  
        end if;

----If the data is of the new form then convert it one way.  If the data is
--  of the old (shorter) from then convert it after appending some extra
--  zeroes to make it the expected length.  Turn off any bogus flags that
--  may be accidentally turned on by an old server or whatever.

        if N_Items >= X_Size_Hints_Protocol'Size / 32 then  
            From_Uca (Phints, Buff (Buff'First .. Buff'First + Hsize- 1));  
            Phints.Flags := Phints.Flags and  
                               X_Size_Hints_Flags'  
                                  (U_S_Position | U_S_Size | P_Position |  
                                   P_Size | P_Min_Size | P_Max_Size |  
                                   P_Resize_Inc | P_Aspect |  
                                   P_Base_Size | P_Win_Gravity => True,  
                                   others                      => False);  
        else  
            From_Uca (Phints, Buff.all & (1 .. (3 * 32) / U_Char'Size => 0));  
            Phints.Flags := Phints.Flags and  
                               X_Size_Hints_Flags'  
                                  (U_S_Position | U_S_Size | P_Position |  
                                   P_Size | P_Min_Size | P_Max_Size |  
                                   P_Resize_Inc | P_Aspect => True,  
                                   others                  => False);  
        end if;

----Return the data to the user (after re-representing it).  We do it this
--  way because we cannot rely upon Ada compilers to implement rep-spec's at
--  all so Hints and PHints are different types rather than the same type with
--  different rep's.  Otherwise we could just do Hints := PHints and let Ada
--  rules do the rest.

        Hints  :=  
           (Flags       => Phints.Flags,  
            X           => Phints.X,  
            Y           => Phints.Y,  
            Width       => Phints.Width,  
            Height      => Phints.Height,  
            Min_Width   => Phints.Min_Width,  
            Min_Height  => Phints.Min_Height,  
            Max_Width   => Phints.Max_Width,  
            Max_Height  => Phints.Max_Height,  
            Width_Inc   => Phints.Width_Inc,  
            Height_Inc  => Phints.Height_Inc,  
            Min_Aspect  => Phints.Min_Aspect,  
            Max_Aspect  => Phints.Max_Aspect,  
            Base_Width  => Phints.Base_Width, 
            Base_Height => Phints.Base_Height,  
            Win_Gravity => X_Window_Gravity'Val  
                              (X_Size_Hints_Gravity'Pos (Phints.Win_Gravity))  
            );  
        Status := Successful;

    end X_Get_Wm_Size_Hints;

--\x0c
    procedure X_Set_Wm_Size_Hints (Display  :     X_Display;  
                                   Window   :     X_Window;  
                                   Property :     X_Atom;  
                                   Hints    :     X_Size_Hints;  
                                   Status   : out X_Status) is  
        Phints : X_Size_Hints_Protocol;  
        Uca    : U_Char_Array (1 .. X_Size_Hints_Protocol'Size / U_Char'Size);  
    begin

        Phints := (Flags       => Hints.Flags,  
                   X           => Hints.X,  
                   Y           => Hints.Y,  
                   Width       => Hints.Width,  
                   Height      => Hints.Height,  
                   Min_Width   => Hints.Min_Width,  
                   Min_Height  => Hints.Min_Height,  
                   Max_Width   => Hints.Max_Width,  
                   Max_Height  => Hints.Max_Height,  
                   Width_Inc   => Hints.Width_Inc,  
                   Height_Inc  => Hints.Height_Inc,  
                   Min_Aspect  => Hints.Min_Aspect,  
                   Max_Aspect  => Hints.Max_Aspect,  
                   Base_Width  => Hints.Base_Width,  
                   Base_Height => Hints.Base_Height,  
                   Win_Gravity => X_Size_Hints_Gravity'Val  
                                     (X_Window_Gravity'Pos (Hints.Win_Gravity))  
                   );  
        To_Uca (Uca, Phints);  
        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Property,  
                           Representation => Xa_Wm_Size_Hints,  
                           Format         => 32,  
                           Mode           => Prop_Mode_Replace,  
                           Data           => Uca);  
        Status := Successful;

    end X_Set_Wm_Size_Hints;

--\x0c
    procedure X_Set_Wm_Properties (Display     :     X_Display;  
                                   Window      :     X_Window;  
                                   Window_Name :     X_String;  
                                   Icon_Name   :     X_String;  
                                   Arg_V       :     X_String_Pointer_Array;  
                                   Normal      :     X_Size_Hints;  
                                   Wm          :     X_Wm_Hints;  
                                   Class       :     X_Class_Hint;  
                                   Status      : out X_Status) is  
        Win : X_Text_Property;  
        Icn : X_Text_Property;  
    begin

        X_String_To_Text_Property (Window_Name, Win);  
        X_String_To_Text_Property (Icon_Name, Icn);  
        X_Set_Wm_Properties (Display, Window, Win, Icn, Arg_V,  
                             Normal, Wm, Class, Status);  
        Free_X_Text_Property (Win);  
        Free_X_Text_Property (Icn);

    exception

        when others =>  
            Free_X_Text_Property (Win);  
            Free_X_Text_Property (Icn);  
            raise;

    end X_Set_Wm_Properties;

--\x0c
    ------------------------------------------------------------------------------
-- X_Set_WM_Properties sets the following properties:
--      WM_NAME           type: TEXT                format: varies?
--      WM_ICON_NAME      type: TEXT                format: varies?
--      WM_HINTS          type: WM_HINTS            format: 32
--      WM_COMMAND        type: TEXT                format: varies?
--      WM_CLIENT_MACHINE type: TEXT                format: varies?
--      WM_NORMAL_HINTS   type: WM_SIZE_HINTS       format: 32
--      WM_CLASS          type: STRING/STRING       format: 8
------------------------------------------------------------------------------

    procedure X_Set_Wm_Properties (Display     :     X_Display;  
                                   Window      :     X_Window;  
                                   Window_Name :     X_Text_Property;  
                                   Icon_Name   :     X_Text_Property;  
                                   Arg_V       :     X_String_Pointer_Array;  
                                   Normal      :     X_Size_Hints;  
                                   Wm          :     X_Wm_Hints;  
                                   Class       :     X_Class_Hint;  
                                   Status      : out X_Status) is
------------------------------------------------------------------------------
--  Display     - Specifies the display to use.
--  W           - Specifies the window to decorate.
--  Name        - Specifies the name of the window.
--  Icon_String - Specifies the name of the window's icon.
--  Icon_Pixmap - Specifies the pixmap to be used for the icon; or None_Pixmap.
--  Arg_V       - Specifies the command arguments used to start the application.
--  Normal      - Specifies a series of window manager sizing hints.
--  Wm          - Specifies a series of window manager control hints.
--  Class       - Specifies a application name/class hint
--
-- Provides a way to specify a minimum set of properties that describe the
-- "quickie" application to a window manager.
--
-- If Window_Name = "" then the WM_NAME property is not set.
--
-- If Icon_Name = "" then the WM_ICON_NAME property is not set.
--
-- If Arg_V'Length = 0 then the WM_COMMAND property is not set.
--
-- If Normal = None_X_Size_Hints then the WM_NORMAL_HINTS property
--
-- If Wm = None_X_Wm_Hints then the WM_HINTS property is not set.
--
-- If Class = None_X_Class_hints then the WM_CLASS property is not set.
------------------------------------------------------------------------------
        Prop : X_Text_Property;  
        Host : constant X_String := X_Env_Get_Host_Name;  
        Succ : X_Status;  
    begin

        if Window_Name /= None_X_Text_Property then  
            X_Set_Wm_Name (Display, Window, Window_Name, Succ);  
        end if;

        if Icon_Name /= None_X_Text_Property then  
            X_Set_Wm_Icon_Name (Display, Window, Icon_Name, Succ);  
        end if;

        if Arg_V'Length /= 0 then  
            X_Set_Command (Display, Window, Arg_V, Succ);  
        end if;

        X_String_To_Text_Property (Host, Prop);  
        X_Set_Wm_Client_Machine (Display, Window, Prop, Succ);  
        Free_X_Text_Property (Prop);

        if Normal /= None_X_Size_Hints then  
            X_Set_Wm_Normal_Hints (Display, Window, Normal, Succ);  
        end if;

        if Wm /= None_X_Wm_Hints then  
            X_Set_Wm_Hints (Display, Window, Wm, Succ);  
        end if;

        declare  
            Cl  : X_Class_Hint := Class;  
            Set : Boolean      := False;  
        begin  
            if Cl.Res_Name = None_X_String_Pointer then  
                Set         := True;  
                Cl.Res_Name := X_Env_Get_Environment_Variable ("RESOURCE_NAME");  
            end if;  
            if Cl.Res_Class = None_X_String_Pointer then  
                Cl.Res_Class := Cl.Res_Name;  
            end if;  
            if Cl = None_X_Class_Hint then  
                if Arg_V'Length > 0 then  
                    Set          := True;  
                    Cl.Res_Name  := new X_String'(X_Env_Strip_Program_Name  
                                                     (Arg_V (Arg_V'First).all));  
                    Cl.Res_Class := Cl.Res_Name;  
                end if;  
            end if;  
            if Cl /= None_X_Class_Hint then  
                X_Set_Class_Hint (Display, Window, Cl, Succ);  
                if Set then  
                    Free_X_String_Pointer (Cl.Res_Name);  
                end if;  
            end if;  
        exception  
            when others =>  
                if Set then  
                    Free_X_String_Pointer (Cl.Res_Name);  
                end if;  
                raise;  
        end;

        Status := Successful;

    end X_Set_Wm_Properties;

--\x0c
    procedure X_Get_Transient_For_Hint (Display :     X_Display;  
                                        Window  :     X_Window;  
                                        Parent  : out X_Window;  
                                        Status  : out X_Status) is  
        Actual_Type   : X_Atom;  
        Actual_Format : U_Char;  
        N_Items       : S_Natural;  
        Leftover      : S_Natural;  
        Buff          : U_Char_List;  
        Succ          : X_Status;  
    begin

----Get the property.

        X_Get_Window_Property (Display,  
                               Window,  
                               Xa_Wm_Transient_For,  
                               0,  
                               X_Window'Size / 32,  
                               False,  
                               Xa_Window,  
                               Actual_Type,  
                               Actual_Format,  
                               N_Items,  
                               Leftover,  
                               Buff,  
                               Succ);

----See if we got what we asked for.

        if Succ /= Failed and then  
           Actual_Type = Xa_Window and then  
           N_Items >= X_Window'Size / 32 and then  
           Actual_Format = 32 then

            From_Uca (Parent, Buff.all);  
            Status := Successful;

----We got garbage.

        else  
            Parent := None_X_Window;  
            Status := Failed;  
        end if;

----Free up storage and return.

        Free_U_Char_List (Buff);

    exception

        when others =>  
            Free_U_Char_List (Buff);  
            raise;

    end X_Get_Transient_For_Hint;

--\x0c
    procedure X_Set_Transient_For_Hint (Display :     X_Display;  
                                        Window  :     X_Window;  
                                        Parent  :     X_Window;  
                                        Status  : out X_Status) is  
        Uca : U_Char_Array (1 .. X_Window'Size / U_Char'Size);  
    begin

        To_Uca (Uca, Parent);  
        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Xa_Wm_Transient_For,  
                           Representation => Xa_Window,  
                           Format         => 32,  
                           Mode           => Prop_Mode_Replace,  
                           Data           => Uca);  
        Status := Successful;

    end X_Set_Transient_For_Hint;

--\x0c
    procedure X_Get_Wm_Hints (Display  :     X_Display;  
                              Window   :     X_Window;  
                              Wm_Hints : out X_Wm_Hints;  
                              Status   : out X_Status) is  
        Actual_Type   : X_Atom;  
        Actual_Format : U_Char;  
        Leftover      : S_Natural;  
        N_Items       : S_Natural;  
        Succ          : X_Status;  
        Buff          : U_Char_List;  
    begin

        X_Get_Window_Property (Display,  
                               Window,  
                               Xa_Wm_Hints,  
                               0,  
                               S_Long (X_Wm_Hints'Size / 32),  
                               False,  
                               Xa_Wm_Hints,  
                               Actual_Type,  
                               Actual_Format,  
                               N_Items,  
                               Leftover,  
                               Buff,  
                               Succ);

        if Succ = Failed or else  
           Actual_Type /= Xa_Wm_Hints or else  
           N_Items < X_Wm_Hints'Size / 32 - 1 or else  
           Actual_Format /= 32 then  
            Wm_Hints := None_X_Wm_Hints;  
            Status   := Failed;  
            return;  
        end if;

        ----Some X servers prior to X11R3 forgot to send the last full-word
        --  of the X_Wm_Hints; this is the Window_Group field.  We
        --  allow the N_Items to be as-much-as 1 word smaller than the real
        --  complete record.

        if N_Items = X_Wm_Hints'Size / 32 - 1 then  
            From_Uca (Wm_Hints, Buff.all & (1 .. 4 => 0));  
        else  
            From_Uca (Wm_Hints,  
                      Buff (Buff'First ..  
                               Buff'First + X_Wm_Hints'Size / U_Char'Size - 1));  
        end if;  
        Free_U_Char_List (Buff);  
        Status := Successful

    exception

        when others =>  
            Free_U_Char_List (Buff);  
            raise;

    end X_Get_Wm_Hints;

--\x0c
    procedure X_Set_Wm_Hints (Display  :     X_Display;  
                              Window   :     X_Window;  
                              Wm_Hints :     X_Wm_Hints;  
                              Status   : out X_Status) is  
        Uca : U_Char_Array (1 .. X_Wm_Hints'Size / U_Char'Size);  
    begin

        To_Uca (Uca, Wm_Hints);  
        X_Change_Property (Display        => Display,  
                           Window         => Window,  
                           Property       => Xa_Wm_Hints,  
                           Representation => Xa_Wm_Hints,  
                           Format         => 32,  
                           Mode           => Prop_Mode_Replace,  
                           Data           => Uca);  
        Status := Successful;

    end X_Set_Wm_Hints;

--\x0c
    procedure X_Get_Wm_Client_Machine (Display :     X_Display;  
                                       Window  :     X_Window;  
                                       Machine : out X_Text_Property;  
                                       Status  : out X_Status) is  
    begin

        X_Get_Text_Property (Display, Window, Machine,  
                             Xa_Wm_Client_Machine, Status);

    end X_Get_Wm_Client_Machine;

--\x0c
    procedure X_Set_Wm_Client_Machine (Display :     X_Display;  
                                       Window  :     X_Window;  
                                       Machine :     X_Text_Property;  
                                       Status  : out X_Status) is  
    begin

        X_Set_Text_Property (Display, Window, Machine, Xa_Wm_Client_Machine);  
        Status := Successful;

    end X_Set_Wm_Client_Machine;

--\x0c
end Xlbp_Hint;  

E3 Meta Data

    nblk1=4a
    nid=0
    hdr6=94
        [0x00] rec0=26 rec1=00 rec2=01 rec3=05a
        [0x01] rec0=11 rec1=00 rec2=02 rec3=06e
        [0x02] rec0=17 rec1=00 rec2=03 rec3=06a
        [0x03] rec0=01 rec1=00 rec2=4a rec3=032
        [0x04] rec0=15 rec1=00 rec2=04 rec3=048
        [0x05] rec0=1f rec1=00 rec2=05 rec3=022
        [0x06] rec0=00 rec1=00 rec2=49 rec3=010
        [0x07] rec0=18 rec1=00 rec2=06 rec3=05e
        [0x08] rec0=01 rec1=00 rec2=48 rec3=01c
        [0x09] rec0=15 rec1=00 rec2=07 rec3=018
        [0x0a] rec0=18 rec1=00 rec2=08 rec3=054
        [0x0b] rec0=01 rec1=00 rec2=47 rec3=00c
        [0x0c] rec0=20 rec1=00 rec2=09 rec3=00a
        [0x0d] rec0=1a rec1=00 rec2=0a rec3=066
        [0x0e] rec0=00 rec1=00 rec2=46 rec3=002
        [0x0f] rec0=1a rec1=00 rec2=0b rec3=046
        [0x10] rec0=00 rec1=00 rec2=44 rec3=006
        [0x11] rec0=14 rec1=00 rec2=0c rec3=00a
        [0x12] rec0=12 rec1=00 rec2=0d rec3=008
        [0x13] rec0=16 rec1=00 rec2=45 rec3=02e
        [0x14] rec0=04 rec1=00 rec2=0e rec3=01a
        [0x15] rec0=1e rec1=00 rec2=0f rec3=030
        [0x16] rec0=00 rec1=00 rec2=43 rec3=006
        [0x17] rec0=1d rec1=00 rec2=10 rec3=040
        [0x18] rec0=00 rec1=00 rec2=42 rec3=002
        [0x19] rec0=1b rec1=00 rec2=11 rec3=056
        [0x1a] rec0=00 rec1=00 rec2=41 rec3=008
        [0x1b] rec0=1a rec1=00 rec2=12 rec3=042
        [0x1c] rec0=19 rec1=00 rec2=13 rec3=002
        [0x1d] rec0=1a rec1=00 rec2=14 rec3=030
        [0x1e] rec0=00 rec1=00 rec2=40 rec3=00e
        [0x1f] rec0=15 rec1=00 rec2=15 rec3=05a
        [0x20] rec0=22 rec1=00 rec2=16 rec3=04c
        [0x21] rec0=00 rec1=00 rec2=3f rec3=004
        [0x22] rec0=1a rec1=00 rec2=17 rec3=048
        [0x23] rec0=02 rec1=00 rec2=3e rec3=040
        [0x24] rec0=21 rec1=00 rec2=18 rec3=00e
        [0x25] rec0=00 rec1=00 rec2=3d rec3=004
        [0x26] rec0=16 rec1=00 rec2=19 rec3=034
        [0x27] rec0=1f rec1=00 rec2=1a rec3=032
        [0x28] rec0=1b rec1=00 rec2=1b rec3=00a
        [0x29] rec0=17 rec1=00 rec2=1c rec3=01c
        [0x2a] rec0=1b rec1=00 rec2=1d rec3=01a
        [0x2b] rec0=02 rec1=00 rec2=3c rec3=034
        [0x2c] rec0=1f rec1=00 rec2=1e rec3=06c
        [0x2d] rec0=15 rec1=00 rec2=1f rec3=01a
        [0x2e] rec0=00 rec1=00 rec2=3b rec3=006
        [0x2f] rec0=18 rec1=00 rec2=20 rec3=026
        [0x30] rec0=19 rec1=00 rec2=21 rec3=028
        [0x31] rec0=15 rec1=00 rec2=22 rec3=088
        [0x32] rec0=00 rec1=00 rec2=3a rec3=002
        [0x33] rec0=12 rec1=00 rec2=23 rec3=012
        [0x34] rec0=14 rec1=00 rec2=24 rec3=05a
        [0x35] rec0=00 rec1=00 rec2=39 rec3=002
        [0x36] rec0=18 rec1=00 rec2=25 rec3=024
        [0x37] rec0=00 rec1=00 rec2=38 rec3=006
        [0x38] rec0=12 rec1=00 rec2=26 rec3=040
        [0x39] rec0=16 rec1=00 rec2=27 rec3=030
        [0x3a] rec0=18 rec1=00 rec2=28 rec3=036
        [0x3b] rec0=10 rec1=00 rec2=29 rec3=01c
        [0x3c] rec0=15 rec1=00 rec2=2a rec3=048
        [0x3d] rec0=1c rec1=00 rec2=2b rec3=01e
        [0x3e] rec0=17 rec1=00 rec2=2c rec3=02a
        [0x3f] rec0=01 rec1=00 rec2=37 rec3=01c
        [0x40] rec0=1f rec1=00 rec2=2d rec3=042
        [0x41] rec0=01 rec1=00 rec2=36 rec3=02a
        [0x42] rec0=21 rec1=00 rec2=2e rec3=014
        [0x43] rec0=1a rec1=00 rec2=2f rec3=02e
        [0x44] rec0=19 rec1=00 rec2=30 rec3=04c
        [0x45] rec0=01 rec1=00 rec2=35 rec3=030
        [0x46] rec0=19 rec1=00 rec2=31 rec3=038
        [0x47] rec0=00 rec1=00 rec2=34 rec3=002
        [0x48] rec0=1f rec1=00 rec2=32 rec3=02a
        [0x49] rec0=19 rec1=00 rec2=33 rec3=000
    tail 0x217006cec8197828b79a0 0x42a00088462063203