|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 38912 (0x9800) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Terminal, seg_05c1cd
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦this⟧
with Xlbt_Basic, Xlbt_Event, Xlbt_Window, Xlbt_Font, Xlbt_Text, Xlbt_Key, Xlbt_String, Xlbt_Arithmetic, Xlbt_Gc, Xlbt_Hint; use Xlbt_Basic, Xlbt_Event, Xlbt_Window, Xlbt_Font, Xlbt_Text, Xlbt_Key, Xlbt_String, Xlbt_Arithmetic, Xlbt_Gc, Xlbt_Hint; with Xlbp_Event, Xlbp_Display, Xlbp_Window, Xlbp_Font, Xlbp_Key, Xlbp_Text, Xlbp_Sync, Xlbp_Gc, Xlbp_Graphics, Xlbp_Hint, Text_Io; use Xlbp_Event, Xlbp_Display, Xlbp_Window, Xlbp_Font, Xlbp_Key, Xlbp_Text, Xlbp_Sync, Xlbp_Gc, Xlbp_Graphics, Xlbp_Hint, Text_Io; with Text_Io; package body Terminal is task type Wait_Event is entry Go (H : in Handle); end Wait_Event; subtype S20 is String (1 .. 20); Max_Term : constant Integer := 20; Last_Term : Integer := 0; Noms : array (1 .. Max_Term) of S20 := (others => (others => ' ')); type T_W_Acc is access Wait_Event; type Font_Type_Type is (Small, Medium, Large); type Font_Record_Type is record Font : X_Font_Struct; Width : S_Short; Height : S_Short; end record; Null_Font_Record : constant Font_Record_Type := (Font => None_X_Font_Struct, Width => 0, Height => 0); type Font_Array_Type is array (Font_Type_Type) of Font_Record_Type; Null_Font_Array : constant Font_Array_Type := (others => Null_Font_Record); type Enreg_T; type Enreg_P is access Enreg_T; type Enreg_T is record Next, Prev : Enreg_P; Terminal : Handle; C : Character; X, Y : Tcoordonnees; Blink : Boolean; end record; task type Buffer_Task is entry Put (Terminal : in Handle; C : in Character; X, Y : in Tcoordonnees; Blink : in Boolean); entry Get (Terminal : in Handle; C : out Character; X, Y : out Tcoordonnees; Blink : out Boolean; Succes : out Boolean); entry Stop; end Buffer_Task; type T_B_Acc is access Buffer_Task; type Objet is record Buffer : T_B_Acc; First_F, First_B, Last_B : Enreg_P; No : Integer; Display : X_Display; Screen : X_Screen_Number; Root_Window, Main_Window : X_Window; Current_Font : Font_Record_Type; Fonts : Font_Array_Type; Graphic_Context : X_Gc; T : T_W_Acc; Stop : Boolean; X_Request_Count : Natural; Next, Prev : Handle; end record; Null_Objet : constant Objet := (Buffer => null, First_F => null, First_B => null, Last_B => null, No => 0, Display => None_X_Display, Screen => None_X_Screen_Number, Root_Window => None_X_Window, Main_Window => None_X_Window, Current_Font => Null_Font_Record, Fonts => Null_Font_Array, Graphic_Context => None_X_Gc, T => null, Stop => False, X_Request_Count => 0, Next => null, Prev => null); First_Busy : Handle := null; First_Free : Handle := null; Max_No_Flushed_Requests : constant Natural := 1; Black, White : X_Pixel; Width : constant Natural := 80; The_String : constant String (1 .. Width) := (others => ' '); Loc_Event_Mask : constant X_Event_Mask := All_Event_Mask; Nb_Term : Integer := 0; procedure Flush_If_Needed (H : in Handle) is begin H.X_Request_Count := H.X_Request_Count + 1; if H.X_Request_Count >= Max_No_Flushed_Requests then X_Sync (H.Display, False); H.X_Request_Count := 0; end if; end Flush_If_Needed; procedure Video_Normale (H : in Handle) is begin X_Set_Foreground (H.Display, H.Graphic_Context, Black); X_Set_Background (H.Display, H.Graphic_Context, White); end Video_Normale; procedure Video_Inverse (H : in Handle) is begin X_Set_Foreground (H.Display, H.Graphic_Context, White); X_Set_Background (H.Display, H.Graphic_Context, Black); end Video_Inverse; procedure Envoyer (Terminal : in Handle; C : in Character; X, Y : in Tcoordonnees; Blink : in Boolean := False) is My_X_String : X_String (1 .. 1); C_P : X_Character; begin if Blink then Video_Inverse (Terminal); end if; C_P := X_Character'Val (Character'Pos (C)); My_X_String (1) := C_P; X_Draw_Image_String (Display => Terminal.Display, Drawable => Terminal.Main_Window.Drawable, Gc => Terminal.Graphic_Context, X => Terminal.Current_Font.Width * S_Short (X - 1), Y => Terminal.Current_Font.Height * S_Short (Y), Text => My_X_String); Flush_If_Needed (Terminal); if Blink then Video_Normale (Terminal); end if; end Envoyer; task body Wait_Event is Event : X_Event; Terminal : Handle; Rc, C : Character; X, Y : Tcoordonnees; Succes, Blink : Boolean; Buffer : X_String (1 .. 10); Result : S_Natural; Key_Symbol : X_Key_Sym; Status : X_Compose_Status; type State_Type is (Wait_Press, Wait_Release, Wait_Read); State : State_Type := Wait_Press; begin accept Go (H : in Handle) do Terminal := H; Text_Io.Put_Line ("Creation term " & Integer'Image (Terminal.No)); end Go; while not Terminal.Stop loop if Terminal.First_B /= null then Terminal.Buffer.Get (Terminal => Terminal, C => Rc, X => X, Y => Y, Blink => Blink, Succes => Succes); Envoyer (Terminal => Terminal, C => Rc, X => X, Y => Y, Blink => Blink); end if; if (X_Pending (Terminal.Display) > 0) then X_Next_Event (Terminal.Display, Event); --Text_Io.Put_Line ("Term = " & Integer'Image (Terminal.No) & -- " Event = " & X_Event_Code'Image (Event.Kind)); case Event.Kind is when Key_Press => --if State = Wait_Press then begin X_Lookup_String (Event, Buffer, Result, Key_Symbol, Status); C := To_String (Buffer (1 .. Result)) (1); Envoyer_Caractere (C => C, No => Terminal.No); --State := Wait_Release; exception when others => null; end; --end if; -- when Key_Release => -- if State = Wait_Release then -- State := Wait_Read; -- --Text_Io.Put_Line -- -- ("****** Term = " & -- -- Integer'Image (Terminal.No) & " Event = " & -- -- X_Event_Code'Image (Event.Kind)); -- Envoyer_Caractere (C => C, No => Terminal.No); -- State := Wait_Press; -- end if; when others => null; end case; elsif Terminal.First_B = null then delay 0.1; end if; end loop; exception when others => Text_Io.Put_Line ("Exception wait_event" & Integer'Image (Terminal.No)); end Wait_Event; function Get_Handle return Handle is Loc_Handle : Handle := First_Free; begin if First_Free /= null then First_Free := First_Free.Next; else Loc_Handle := new Objet; end if; Loc_Handle.all := Null_Objet; Loc_Handle.T := new Wait_Event; Loc_Handle.Buffer := new Buffer_Task; return Loc_Handle; end Get_Handle; procedure Put_Handle (H : in out Handle) is begin H.Next := First_Free; First_Free := H; end Put_Handle; procedure Set_Window_Manager_Hints (H : Handle; Title : String; X, Y : S_Short; Width, Height : U_Short_Positive) is Success : X_Status; Size_Hints : X_Size_Hints; begin Size_Hints.Flags (U_S_Position) := True; Size_Hints.Flags (U_S_Size) := True; Size_Hints.Width := S_Long (Width); Size_Hints.Height := S_Long (Height); Size_Hints.X := S_Long (X); Size_Hints.Y := S_Long (Y); X_Set_Wm_Properties (Display => H.Display, Window => H.Main_Window, Window_Name => To_X_String (Title), Icon_Name => To_X_String (Title), Arg_V => (1 .. 0 => null), Normal => Size_Hints, Wm => None_X_Wm_Hints, Class => None_X_Class_Hint, Status => Success); end Set_Window_Manager_Hints; procedure Create_Window (H : in Handle; Title : String; X, Y : S_Short; Width, Height : U_Short_Positive) is Xswa : X_Set_Window_Attributes; begin Xswa.Event_Mask := Loc_Event_Mask; Xswa.Background_Pixel := White; Xswa.Border_Pixel := Black; H.Main_Window := X_Create_Window (Display => H.Display, Parent => H.Root_Window, X => X, Y => Y, Width => Width, Height => Height, Border_Width => 0, Depth => X_Default_Depth (H.Display, H.Screen), Class => Input_Output, Visual => X_Default_Visual (H.Display, H.Screen), Values_Mask => (Cw_Event_Mask | Cw_Back_Pixel | Cw_Border_Pixel => True, others => False), Values => Xswa); Set_Window_Manager_Hints (H, Title, X, Y, Width, Height); X_Map_Window (H.Display, H.Main_Window); end Create_Window; procedure Create_Graphic_Context (H : in Handle) is Xgcv : X_Gc_Values; begin H.Graphic_Context := X_Create_Gc (H.Display, H.Main_Window.Drawable, None_X_Gc_Components, None_X_Gc_Values); Xgcv.Foreground := Black; Xgcv.Background := White; Xgcv.Line_Width := 1; Xgcv.Cap_Style := Cap_Round; Xgcv.Font := H.Current_Font.Font.Font_Id; X_Change_Gc (H.Display, H.Graphic_Context, (Gc_Line_Width | Gc_Cap_Style | Gc_Foreground | Gc_Background | Gc_Font => True, others => False), Xgcv); end Create_Graphic_Context; procedure Load_The_Fonts (H : in Handle) is begin H.Fonts (Small).Font := X_Load_Query_Font (Display => H.Display, Name => To_X_String ("rom10")); H.Fonts (Medium).Font := X_Load_Query_Font (Display => H.Display, Name => To_X_String ("rom14")); H.Fonts (Large).Font := X_Load_Query_Font (Display => H.Display, Name => To_X_String ("rom28")); for Ft in Font_Type_Type loop H.Fonts (Ft).Width := S_Short (H.Fonts (Ft).Font.Max_Bounds.Width); H.Fonts (Ft).Height := S_Short (H.Fonts (Ft).Font.Ascent + H.Fonts (Ft).Font.Descent); end loop; end Load_The_Fonts; function Creer (Col : in Tcoordonnees := Max_Col; Lin : in Tcoordonnees := Max_Lin; No : in Integer) return Handle is Title : constant String := "BT/BP"; Left, Right : S_Short := 100; Width, Height : U_Short_Positive := 800; The_Name : constant X_String := X_Display_Name (To_X_String (Noms (No))); Error : X_Error_String; Loc_Handle : Handle := Get_Handle; begin Loc_Handle.No := No; X_Open_Display (The_Name, Loc_Handle.Display, Error); if Loc_Handle.Display = None_X_Display then Text_Io.Put_Line ("Fatal error, " & To_String (Err (Error))); else Nb_Term := Nb_Term + 1; Loc_Handle.Screen := X_Default_Screen (Loc_Handle.Display); Loc_Handle.Root_Window := X_Root_Window (Loc_Handle.Display, Loc_Handle.Screen); Black := X_Black_Pixel (Loc_Handle.Display, Loc_Handle.Screen); White := X_White_Pixel (Loc_Handle.Display, Loc_Handle.Screen); Load_The_Fonts (Loc_Handle); Loc_Handle.Current_Font := Loc_Handle.Fonts (Small); Width := U_Short_Positive (Loc_Handle.Current_Font.Width) * U_Short_Positive (Col); Height := U_Short_Positive (Loc_Handle.Current_Font.Height) * U_Short_Positive (Lin); Create_Window (Loc_Handle, Title, Left, Right, Width, Height); Create_Graphic_Context (Loc_Handle); Video_Normale (Loc_Handle); if First_Busy /= null then First_Busy.Prev := Loc_Handle; end if; Loc_Handle.Next := First_Busy; First_Busy := Loc_Handle; Loc_Handle.T.Go (Loc_Handle); end if; return Loc_Handle; end Creer; task body Buffer_Task is Tc : Character; E : Enreg_P := null; function Get (Terminal : in Handle) return Enreg_P is El : Enreg_P; begin if Terminal.First_F = null then El := new Enreg_T; else El := Terminal.First_F; Terminal.First_F := El.Next; end if; El.Prev := Terminal.Last_B; El.Next := null; if Terminal.Last_B /= null then Terminal.Last_B.Next := El; end if; Terminal.Last_B := El; if Terminal.First_B = null then Terminal.First_B := El; end if; return El; end Get; procedure Put (Terminal : in Handle; El : in out Enreg_P) is begin if El.Next /= null then if El.Prev /= null then El.Prev.Next := El.Next; El.Next.Prev := El.Prev; else Terminal.First_B := El.Next; El.Next.Prev := null; end if; else if El.Prev /= null then Terminal.Last_B := El.Prev; El.Prev.Next := null; else Terminal.First_B := null; Terminal.Last_B := null; end if; end if; El.Next := Terminal.First_F; Terminal.First_F := El; end Put; begin Ad_Vitam_Eternam: loop select accept Put (Terminal : in Handle; C : in Character; X, Y : in Tcoordonnees; Blink : in Boolean) do E := Get (Terminal => Terminal); E.Terminal := Terminal; E.C := C; E.X := X; E.Y := Y; E.Blink := Blink; end Put; or accept Get (Terminal : in Handle; C : out Character; X, Y : out Tcoordonnees; Blink : out Boolean; Succes : out Boolean) do C := 'a'; X := Tcoordonnees'Last; Y := Tcoordonnees'Last; Blink := False; Succes := False; E := Terminal.First_B; Boucle_Cherche: while E /= null loop if E.Terminal = Terminal then C := E.C; Tc := E.C; X := E.X; Y := E.Y; Blink := E.Blink; Put (Terminal => Terminal, El => E); Succes := True; exit Boucle_Cherche; end if; E := E.Next; end loop Boucle_Cherche; end Get; or accept Stop; exit Ad_Vitam_Eternam; end select; end loop Ad_Vitam_Eternam; Text_Io.Put_Line ("Buffer_task : fin"); exception when others => Text_Io.Put_Line ("Buffer_task : exception"); end Buffer_Task; procedure Ecrire (Terminal : in Handle; C : in Character; X, Y : in Tcoordonnees; Blink : in Boolean := False) is begin --Envoyer (Terminal => Terminal, C => C, X => X, Y => Y, Blink => Blink); Terminal.Buffer.Put (Terminal => Terminal, C => C, X => X, Y => Y, Blink => Blink); end Ecrire; procedure Fermer (Terminal : in out Handle) is begin Text_Io.Put_Line ("Fermeture term " & Integer'Image (Terminal.No)); Terminal.Stop := True; Terminal.Buffer.Stop; X_Close_Display (Terminal.Display); if Terminal.Prev /= null then if Terminal.Next /= null then Terminal.Prev.Next := Terminal.Next; Terminal.Next.Prev := Terminal.Prev; else Terminal.Prev.Next := null; end if; else if Terminal.Next /= null then Terminal.Next.Prev := null; First_Busy := Terminal.Next; else First_Busy := null; end if; end if; Put_Handle (H => Terminal); Nb_Term := Nb_Term - 1; --if Nb_Term = 0 then -- Buffer_Task.Stop; --end if; end Fermer; procedure Init_Configuration is F : Text_Io.File_Type; S : String (1 .. 100); L : Natural; begin Text_Io.Open (File => F, Mode => Text_Io.In_File, Name => "liste_noms"); while not Text_Io.End_Of_File (File => F) loop Text_Io.Get_Line (File => F, Item => S, Last => L); Last_Term := Last_Term + 1; Text_Io.Put_Line ("Lecture de " & S (1 .. L)); Noms (Last_Term) (1 .. L) := S (1 .. L); end loop; Text_Io.Close (File => F); end Init_Configuration; end Terminal;
nblk1=25 nid=12 hdr6=40 [0x00] rec0=17 rec1=00 rec2=01 rec3=028 [0x01] rec0=1b rec1=00 rec2=13 rec3=01c [0x02] rec0=00 rec1=00 rec2=22 rec3=02c [0x03] rec0=18 rec1=00 rec2=14 rec3=002 [0x04] rec0=02 rec1=00 rec2=0e rec3=070 [0x05] rec0=10 rec1=00 rec2=03 rec3=02e [0x06] rec0=11 rec1=00 rec2=07 rec3=022 [0x07] rec0=19 rec1=00 rec2=1a rec3=05c [0x08] rec0=1a rec1=00 rec2=23 rec3=02e [0x09] rec0=15 rec1=00 rec2=20 rec3=052 [0x0a] rec0=00 rec1=00 rec2=16 rec3=030 [0x0b] rec0=14 rec1=00 rec2=1c rec3=01c [0x0c] rec0=1b rec1=00 rec2=04 rec3=032 [0x0d] rec0=00 rec1=00 rec2=1e rec3=006 [0x0e] rec0=18 rec1=00 rec2=0f rec3=00e [0x0f] rec0=03 rec1=00 rec2=06 rec3=04e [0x10] rec0=17 rec1=00 rec2=10 rec3=01c [0x11] rec0=00 rec1=00 rec2=17 rec3=024 [0x12] rec0=17 rec1=00 rec2=1f rec3=046 [0x13] rec0=01 rec1=00 rec2=05 rec3=006 [0x14] rec0=15 rec1=00 rec2=0a rec3=05e [0x15] rec0=15 rec1=00 rec2=0c rec3=01c [0x16] rec0=02 rec1=00 rec2=11 rec3=036 [0x17] rec0=12 rec1=00 rec2=19 rec3=018 [0x18] rec0=1d rec1=00 rec2=1b rec3=084 [0x19] rec0=1c rec1=00 rec2=15 rec3=04e [0x1a] rec0=14 rec1=00 rec2=08 rec3=066 [0x1b] rec0=01 rec1=00 rec2=25 rec3=03e [0x1c] rec0=16 rec1=00 rec2=21 rec3=02c [0x1d] rec0=04 rec1=00 rec2=09 rec3=03a [0x1e] rec0=19 rec1=00 rec2=0b rec3=028 [0x1f] rec0=1c rec1=00 rec2=02 rec3=000 [0x20] rec0=1b rec1=00 rec2=02 rec3=014 [0x21] rec0=1a rec1=00 rec2=13 rec3=000 [0x22] rec0=1b rec1=00 rec2=13 rec3=040 [0x23] rec0=1c rec1=00 rec2=0e rec3=014 [0x24] rec0=05 rec1=00 rec2=1d rec3=000 tail 0x2176b692c895942fabbb9 0x42a00088462063c03 Free Block Chain: 0x12: 0000 00 18 00 4d 80 01 3b 01 00 29 20 20 20 20 20 20 ┆ M ; ) ┆ 0x18: 0000 00 0d 00 06 00 03 20 20 20 03 00 08 20 20 20 20 ┆ ┆ 0xd: 0000 00 1d 00 3d 80 0f 6e 6b 20 20 20 20 3d 3e 20 42 ┆ = nk => B┆ 0x1d: 0000 00 24 00 53 80 06 66 65 63 74 65 3b 06 00 05 62 ┆ $ S fecte; b┆ 0x24: 0000 00 00 00 4b 80 14 20 20 20 20 20 20 20 3a 3d 20 ┆ K := ┆