|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 32954 (0x80ba)
Types: TextFile
Names: »B«
└─⟦85b835f43⟧ Bits:30000549 8mm tape, Rational 1000, Xlib rev 6.00
└─⟦0c20f784e⟧ »DATA«
└─⟦1abbe589f⟧
└─⟦ada0be243⟧
└─⟦this⟧
with Debug_Tools;
with Scheduler;
with Text_Io;
--/ if TeleGen2 and then Unix then
--// with Process_Control; -- Unix process control
--/ end if;
with Xload_Icon;
use Xload_Icon;
with Xlbt_Arithmetic;
use Xlbt_Arithmetic;
with Xlbt_Basic;
use Xlbt_Basic;
with Xlbt_Cursor_Font;
use Xlbt_Cursor_Font;
with Xlbt_Event;
use Xlbt_Event;
with Xlbt_Font;
use Xlbt_Font;
with Xlbt_Gc;
use Xlbt_Gc;
with Xlbt_Hint;
use Xlbt_Hint;
with Xlbt_Geometry;
use Xlbt_Geometry;
with Xlbt_Graphics;
use Xlbt_Graphics;
with Xlbt_Key;
use Xlbt_Key;
with Xlbt_Misc;
use Xlbt_Misc;
with Xlbt_Pointer;
use Xlbt_Pointer;
with Xlbt_String;
use Xlbt_String;
with Xlbt_Window;
use Xlbt_Window;
with Xlbp_Bitmap;
use Xlbp_Bitmap;
with Xlbp_Cursor;
use Xlbp_Cursor;
with Xlbp_Display;
use Xlbp_Display;
with Xlbp_Event;
use Xlbp_Event;
with Xlbp_Font;
use Xlbp_Font;
with Xlbp_Gc;
use Xlbp_Gc;
with Xlbp_Geometry;
use Xlbp_Geometry;
with Xlbp_Graphics;
use Xlbp_Graphics;
with Xlbp_Hint;
use Xlbp_Hint;
with Xlbp_Keyboard_Control;
use Xlbp_Keyboard_Control;
with Xlbp_Proc_Var;
use Xlbp_Proc_Var;
with Xlbp_Sync;
use Xlbp_Sync;
with Xlbp_Text;
use Xlbp_Text;
with Xlbp_Window;
use Xlbp_Window;
with Xlbmt_Network_Types;
use Xlbmt_Network_Types;
with Xlbmp_Environment;
use Xlbmp_Environment;
with Xlbmp_Network_Interface;
use Xlbmp_Network_Interface;
package body Xload_Main is
------------------------------------------------------------------------------
-- Xload - a version of Mah-Jongg for X Windows
--
-- Author: Gary E. Barnes March 1991
--
-- main.c - The mainline code.
------------------------------------------------------------------------------
-- 03/14/91 GEB - Translate to Ada
------------------------------------------------------------------------------
Notify : Notify_Complete := new Notify_Complete_Task;
History : S_Long_List := new S_Long_Array'(1 .. 1024 => 0);
History_Last : S_Natural := History'Last;
Peak : S_Natural := History'Last; -- Largest value in History.
History_Units : constant := 100; -- level of 1.0 is a value of 100.0
Window_Height : S_Short := 40; -- Actual height/width
Window_Width : S_Short := 40;
Base_Height : S_Short := 40; -- Graphed height/width
Base_Width : S_Natural := 70;
Last_Y_Pixel : S_Short := 40; -- Y coordinate of bottommost pixel.
Last_Histo : S_Short := 70; -- X coordinate of last histogram line
Dash_Flag : Boolean := True; -- Skip the dots next load.
Need_Redraw : Boolean := False; -- Need a partial redraw? (exposure)
Title_Overall : X_Char_Struct; -- Extents for our title string
type Boolean_Array is array (S_Natural range <>) of Boolean;
Levels : S_Natural := 2; -- Number of lines across
Pixels_Per_Level : S_Short_Array (1 .. 20); -- Pixels from line to line
Levels_Height : S_Short_Array (1 .. 20); -- Levels * Pixels_Per_Level
Top_Line : S_Short_Array (1 .. 20); -- Y coordinate of topmost line
Title_Overlap : Boolean_Array (1 .. 20); -- Levels ovelap title
Levels_History : S_Long_Array (0 .. 20); -- Load average for this Levels
-- \f
procedure Redraw_From_History is
------------------------------------------------------------------------------
-- Clear the window and redraw everything.
------------------------------------------------------------------------------
Seg : X_Segment_Array (1 .. Base_Width);
Pnt : X_Point_Array (1 .. Base_Width);
Load : S_Long;
Y : S_Short;
begin
----Clear the window.
X_Clear_Window (Dpy, Xload);
----We wouldn't be here if we didn't need a redraw.
Need_Redraw := False;
----Draw the host name.
X_Draw_Image_String (Dpy, Xload.Drawable,
Gc => Normal_Gc,
X => 4,
Y => 4 + Title_Overall.Ascent,
Text => Xload_Resources.Host.all);
----Compute the histogram. Seg is the histogram. Pnt is the tops of the
-- histogram.
for I in 1 .. Base_Width loop
Seg (I).X1 := S_Short (Base_Width - I);
Seg (I).X2 := S_Short (Base_Width - I);
Seg (I).Y1 := Last_Y_Pixel;
if I > History_Last then
Load := History (History'Last - (I - History_Last));
else
Load := History (History_Last - I + 1);
end if;
Seg (I).Y2 := Last_Y_Pixel -
S_Short ((Load *
S_Long (Pixels_Per_Level (Levels))) /
History_Units);
Pnt (I).X := Seg (I).X2;
Pnt (I).Y := Seg (I).Y2;
end loop;
----Draw the histogram.
X_Draw_Segments (Dpy, Xload.Drawable, Normal_Gc, Seg);
----Draw the load lines across the window.
Dash_Flag := not Xload_Resources.Use_Dashes;
for I in 1 .. Levels loop
Y := Last_Y_Pixel - S_Short (I) * Pixels_Per_Level (Levels);
X_Draw_Line (Dpy, Xload.Drawable,
Gc => Xor_Gc,
X1 => Last_Histo,
Y1 => Y,
X2 => 0,
Y2 => Y);
end loop;
----Redraw the historgram tops just in case the load lines zapped them.
X_Draw_Points (Dpy, Xload.Drawable, Normal_Gc, Pnt, Coord_Mode_Origin);
end Redraw_From_History;
-- \f
procedure Move_Peak (New_Peak : Boolean;
Do_Layout : Boolean) is
Load1 : S_Long;
Load2 : S_Long;
J : S_Natural;
K : S_Short;
begin
----Count the number of samples that we have between "now" and the peak load.
if Peak > History_Last then
J := History'Last - Peak + 1 + History_Last;
else
J := History_Last - Peak + 1;
end if;
----See if the old peak is gone or overridden.
if New_Peak or else
J > Base_Width then
Load1 := History (History_Last);
Peak := History_Last;
for I in 2 .. Base_Width loop
if I > History_Last then
J := History'Last - (I - History_Last);
else
J := History_Last - I + 1;
end if;
Load2 := History (J);
if Load1 < Load2 then
Load1 := Load2;
Peak := J;
end if;
end loop;
else
if History (Peak) < History (History_Last) then
Peak := History_Last;
end if;
end if;
----If we aren't redoing the layout then return now.
if not Do_Layout then
return;
end if;
----See if we need to change the number of levels that we are displaying.
while History (Peak) > Levels_History (Levels) loop
Levels := Levels + 1;
Need_Redraw := True;
end loop;
while History (Peak) <= Levels_History (Levels - 1) and then
Levels > S_Natural (Xload_Resources.Levels) loop
Levels := Levels - 1;
Need_Redraw := True;
end loop;
end Move_Peak;
-- \f
procedure Compute_Layout is
------------------------------------------------------------------------------
-- Called whenever Base_Height, Base_Width, or Levels is changed.
------------------------------------------------------------------------------
Tmp : S_Natural;
begin
----If we are wider than we can physicall handle then adjust our history array.
if Base_Width > History'Length then
declare
Na : S_Long_List :=
new S_Long_Array (1 .. (Base_Width + 255) / 256 * 256);
His1 : S_Natural := History_Last;
His2 : S_Natural := History'Last - History_Last;
Na0 : S_Natural := Na'Last - History'Last;
begin
Na (Na'Last - Na0 + 1 .. Na'Last) := (others => 0);
Na (1 .. His2) := History (History_Last + 1 .. History'Last);
Na (His2 + 1 .. His2 + History_Last) :=
History (1 .. History_Last);
History_Last := History'Last;
History := Na;
Move_Peak (New_Peak => True, Do_Layout => False);
end;
----If we are narrower than before, is our peak now off screen?
else
if Peak > History_Last then
Tmp := History'Last - Peak + History_Last + 1;
else
Tmp := History_Last - Peak + 1;
end if;
if Tmp > Base_Width then
Move_Peak (New_Peak => True, Do_Layout => False);
end if;
end if;
----Recompute the number of pixels we use per level and such.
Levels_History (0) := -1;
for I in Pixels_Per_Level'Range loop
Pixels_Per_Level (I) :=
(Base_Height + S_Short (I) - 1) / S_Short (I);
if Pixels_Per_Level (I) >= 2 then
Title_Overlap (I) := False;
else
Pixels_Per_Level (I) := 2;
Title_Overlap (I) := True;
end if;
Top_Line (I) := Window_Height -
Pixels_Per_Level (I) * S_Short (I) - 1;
Levels_Height (I) := S_Short (I) * Pixels_Per_Level (I) + 1;
Levels_History (I) :=
S_Long (I) * History_Units +
History_Units / S_Long (Pixels_Per_Level (I)) - 1;
end loop;
Last_Y_Pixel := Window_Height - 1;
Last_Histo := Window_Width - 1;
end Compute_Layout;
-- \f
procedure Load_Sample is
------------------------------------------------------------------------------
-- Get the latest load average. If we need to reconfigure the display in
-- order to increase/decrease the number of levels of display then we do that
-- also.
------------------------------------------------------------------------------
use Scheduler;
Last : Load_Factor;
Minute : Load_Factor;
Minute_5 : Load_Factor;
Minute_15 : Load_Factor;
Last_Y : S_Short;
Tmp : S_Long;
begin
----Get the latest load average.
Scheduler.Get_Run_Queue_Load (Last, Minute, Minute_5, Minute_15);
if History_Last = History'Last then
History_Last := 1;
else
History_Last := History_Last + 1;
end if;
if Xload_Resources.Which_Load = 0 then
History (History_Last) := S_Long (Last);
elsif Xload_Resources.Which_Load = 1 then
History (History_Last) := S_Long (Minute);
elsif Xload_Resources.Which_Load = 5 then
History (History_Last) := S_Long (Minute_5);
else
History (History_Last) := S_Long (Minute_15);
end if;
if History (History_Last) >= History_Units *
(Pixels_Per_Level'Last + 1) then
History (History_Last) := History_Units *
(Pixels_Per_Level'Last + 1) - 1;
end if;
----See if the old peak is gone or overridden.
Move_Peak (New_Peak => False, Do_Layout => True);
----Draw the new load average on the screen.
if not Need_Redraw then
X_Copy_Area (Dpy, Xload.Drawable, Xload.Drawable,
Gc => Normal_Gc,
Source_X => 1,
Source_Y => Top_Line (Levels),
Width => U_Short (Window_Width - 1),
Height => U_Short (Levels_Height (Levels)),
Destination_X => 0,
Destination_Y => Top_Line (Levels));
if Title_Overlap (Levels) then
X_Draw_Image_String (Dpy, Xload.Drawable,
Gc => Normal_Gc,
X => 4,
Y => 4 + Title_Overall.Ascent,
Text => Xload_Resources.Host.all);
end if;
X_Clear_Area (Dpy, Xload,
X => Last_Histo,
Y => Top_Line (Levels),
Width => 1,
Height => U_Short (Levels_Height (Levels)),
Exposures => False);
Last_Y := Last_Y_Pixel -
S_Short ((History (History_Last) *
S_Long (Pixels_Per_Level (Levels))) /
History_Units);
X_Draw_Line (Dpy, Xload.Drawable,
Gc => Normal_Gc,
X1 => Last_Histo,
Y1 => Last_Y_Pixel,
X2 => Last_Histo,
Y2 => Last_Y);
if Xload_Resources.Use_Dashes and then
Dash_Flag then
Dash_Flag := False;
else
Dash_Flag := Xload_Resources.Use_Dashes;
for I in 1 .. Levels loop
X_Draw_Point
(Dpy, Xload.Drawable,
Gc => Xor_Gc,
X => Last_Histo,
Y => Last_Y_Pixel -
S_Short (I) * Pixels_Per_Level (Levels));
end loop;
X_Draw_Point (Dpy, Xload.Drawable,
Gc => Normal_Gc,
X => Last_Histo,
Y => Last_Y);
end if;
end if;
end Load_Sample;
-- \f
procedure Reconfigure (Event : X_Event) is
------------------------------------------------------------------------------
-- The window has changed size or something. Rearrange our internal
-- data structures.
------------------------------------------------------------------------------
Height : S_Short;
begin
----Compute the new Base_Height/Width.
Height := S_Short (Event.Configure.Height);
if Height < 1 then
Height := 1;
end if;
Window_Height := Height;
Height := Height - 4 - 2 * (Title_Overall.Ascent +
Title_Overall.Descent) - 4;
if Height < 2 * S_Short (Levels) then
Height := 2 * S_Short (Levels);
Title_Overlap (Levels) := True;
else
Title_Overlap (Levels) := False;
end if;
Base_Height := Height;
Base_Width := S_Natural (Event.Configure.Width);
if Base_Width < 1 then
Base_Width := 1;
end if;
Window_Width := S_Short (Base_Width);
----Refigure the layout and redraw the image.
Compute_Layout;
end Reconfigure;
-- \f
procedure Change_Load_Average is
------------------------------------------------------------------------------
-- We got a Button3 click. Change the load average that we are monitoring.
------------------------------------------------------------------------------
begin
----Change source of the load average.
if Xload_Resources.Which_Load = 0 then
Xload_Resources.Which_Load := 1;
elsif Xload_Resources.Which_Load = 1 then
Xload_Resources.Which_Load := 5;
elsif Xload_Resources.Which_Load = 5 then
Xload_Resources.Which_Load := 15;
else
Xload_Resources.Which_Load := 0;
end if;
----Recompute our title and its size.
Xload_Resources.Host :=
new X_String'(X_Env_Get_Host_Name &
To_X_String (Natural'Image
(Xload_Resources.Which_Load)));
declare
Dir : X_Font_Direction;
Font_Ascent : S_Short;
Font_Descent : S_Short;
begin
X_Text_Extents (Xload_Resources.Font,
Xload_Resources.Host.all,
Dir, Font_Ascent, Font_Descent, Title_Overall);
end;
----Reconfigure our layout, if necessary.
declare
Event : X_Configure_Notify_Event;
begin
Event.Configure.Width := U_Short (Window_Width);
Event.Configure.Height := U_Short (Window_Height);
Reconfigure (Event);
end;
Need_Redraw := True;
end Change_Load_Average;
-- \f
procedure Gc_Setup is
------------------------------------------------------------------------------
-- Set up the GC's that we will be using for drawing.
------------------------------------------------------------------------------
Gcv : X_Gc_Values;
Pix : X_Pixel;
begin
----Xor_GC - fg = black, bg = white, func = xor
Gcv.Funct := Gx_Xor;
Gcv.Foreground := Xload_Resources.Foreground xor
Xload_Resources.Background;
Gcv.Background := Xload_Resources.Background;
Gcv.Font := Xload_Resources.Font.Font_Id;
Gcv.Graphics_Exposures := True;
Gcv.Line_Style := Line_On_Off_Dash;
Gcv.Dash_Offset := 1;
Gcv.Dashes := 1;
if Xload_Resources.Use_Dashes then
Xor_Gc :=
X_Create_Gc
(Dpy, Xload.Drawable,
X_Gc_Components'
(Gc_Function | Gc_Font | Gc_Foreground |
Gc_Background | Gc_Graphics_Exposures |
Gc_Line_Style | Gc_Dash_Offset | Gc_Dash_List => True,
others => False), Gcv);
else
Xor_Gc := X_Create_Gc
(Dpy,
Xload.Drawable,
X_Gc_Components'
(Gc_Function | Gc_Font | Gc_Foreground |
Gc_Background | Gc_Graphics_Exposures => True,
others => False),
Gcv);
end if;
----Normal_GC - fg = black, bg = white, func = copy
Gcv.Funct := Gx_Copy;
Gcv.Foreground := Xload_Resources.Foreground;
Gcv.Background := Xload_Resources.Background;
Gcv.Font := Xload_Resources.Font.Font_Id;
Gcv.Graphics_Exposures := True;
Normal_Gc :=
X_Create_Gc
(Dpy,
Xload.Drawable,
X_Gc_Components'(Gc_Function | Gc_Font | Gc_Foreground |
Gc_Background | Gc_Graphics_Exposures => True,
others => False),
Gcv);
end Gc_Setup;
-- \f
procedure Set_Size_Hints (Hints : in out X_Size_Hints;
Geom : X_String) is
------------------------------------------------------------------------------
-- Hints - Receives the X/Y/Width/Height values from the Geometry string
-- Geom - Specifies the string specified by the user for the geometry
--
-- Parses the geometry string (if any) and takes care of setting the X/Y and
-- the Width/Height fields in the Hints structure.
------------------------------------------------------------------------------
Geom_Result : X_Parse_Geometry_Flags;
begin
Hints.X := 0;
Hints.Y := 0;
Geom_Result := None_X_Parse_Geometry_Flags;
if Geom /= "" then
X_Parse_Geometry (Geom,
S_Short (Hints.X), S_Short (Hints.Y),
U_Short (Hints.Width), U_Short (Hints.Height),
Geom_Result);
if Geom_Result (Width_Value) and then
Geom_Result (Height_Value) then
Hints.Width := Max (Hints.Width, Hints.Min_Width);
Hints.Height := Max (Hints.Height, Hints.Min_Height);
Hints.Flags (U_S_Size) := True;
end if;
if Geom_Result (X_Value) and then
Geom_Result (Y_Value) then
Hints.Flags (U_S_Position) := True;
end if;
end if;
if not Hints.Flags (U_S_Size) then
Hints.Width := Hints.Min_Width;
Hints.Height := Hints.Min_Height;
Hints.Flags (P_Size) := True;
end if;
if not Hints.Flags (U_S_Position) then
Hints.X := 0;
Hints.Y := 0;
Hints.Flags (P_Position) := True;
end if;
if Geom_Result (X_Negative) then
Hints.X := S_Long (X_Display_Width (Dpy, X_Default_Screen (Dpy))) +
Hints.X - S_Long (Hints.Width);
end if;
if Geom_Result (Y_Negative) then
Hints.Y := S_Long (X_Display_Height (Dpy, X_Default_Screen (Dpy))) +
Hints.Y - S_Long (Hints.Height);
end if;
end Set_Size_Hints;
-- \f
procedure Main (Display : X_String;
Geometry : X_String := "70x40";
Which_Load : Natural := 1;
Interval : Positive := 10;
Levels : Positive := 2;
Font : X_String := "*cour*med*r*norm*--10*";
Use_Dashes : Boolean := False) is
------------------------------------------------------------------------------
-- Our Main-Line Code.
------------------------------------------------------------------------------
Error : X_Error_String;
Class_Hint : X_Class_Hint;
Size_Hints : X_Size_Hints;
Wm_Hints : X_Wm_Hints;
Attr : X_Set_Window_Attributes;
Mask : X_New_Window_Attributes := None_X_New_Window_Attributes;
Screen : X_Screen_Number;
Success : X_Status;
Icon_Window : X_Window := None_X_Window;
Env : constant X_String :=
X_Display_Name (Display);
Event : X_Event;
Length : X_Raw_Data_Index;
begin
----Open a display connection.
X_Open_Display (Env, Dpy, Error);
if Dpy = null then
Text_Io.Put_Line ("Unable to open display {" & To_String (Display) &
"}: " & To_String (Err (Error)));
raise Abandon;
end if;
Screen := X_Default_Screen (Dpy);
----Initialize the resources. Do it this way until we have real widgets.
Xload_Resources.Foreground := X_Black_Pixel (Dpy, Screen);
Xload_Resources.Background := X_White_Pixel (Dpy, Screen);
Xload_Resources.Cursor := X_Create_Font_Cursor (Dpy, Xc_Hand2);
Xload_Resources.Debug := False;
Xload_Resources.Geometry := new X_String'(Geometry);
Xload_Resources.Icon_Geometry := new X_String'("32x32");
Xload_Resources.Iconic := False;
Xload_Resources.Icon_Name := null;
Xload_Resources.Reverse_Video := False;
Xload_Resources.Use_Dashes := Use_Dashes;
Xload_Resources.Interval := Interval;
----Which load do we watch?
if Which_Load = 0 then
Xload_Resources.Which_Load := 0;
elsif Which_Load < 5 then
Xload_Resources.Which_Load := 1;
elsif Which_Load < 10 then
Xload_Resources.Which_Load := 5;
else
Xload_Resources.Which_Load := 15;
end if;
----How many levels minimum?
if Levels in 1 .. Positive (S_Short'Last) then
Xload_Resources.Levels := S_Short (Levels);
else
Xload_Resources.Levels := 2;
end if;
----Which font do we use?
Xload_Resources.Font := X_Load_Query_Font (Dpy, Font);
if Xload_Resources.Font = None_X_Font_Struct then
Text_Io.Put_Line ("Unable to load font :{" &
To_String (Font) & "}.");
Xload_Resources.Font := X_Load_Query_Font (Dpy, "fixed");
if Xload_Resources.Font = None_X_Font_Struct then
Text_Io.Put_Line ("Unable to load font :{fixed}; exiting.");
return;
end if;
end if;
----Set the debugging flag? Use Sync?
if Xload_Resources.Debug then
declare
Void : Proc_Var_X_Synchandler.Pv;
begin
Void := X_Synchronize (Dpy, Onoff => True);
end;
end if;
----Set up the non-resources.
Xload_Resources.Host :=
new X_String'(X_Env_Get_Host_Name &
To_X_String (Natural'Image
(Xload_Resources.Which_Load)));
declare
Dir : X_Font_Direction;
Font_Ascent : S_Short;
Font_Descent : S_Short;
begin
X_Text_Extents (Xload_Resources.Font,
Xload_Resources.Host.all,
Dir, Font_Ascent, Font_Descent, Title_Overall);
----Set up the various Hints structures for our main window.
Size_Hints.Min_Width := S_Long (4 + Title_Overall.Width + 4);
Size_Hints.Min_Height :=
4 + S_Long (Title_Overall.Ascent + Title_Overall.Descent) +
4 + S_Long (Xload_Resources.Levels) * 4;
Size_Hints.Base_Width := Size_Hints.Min_Width;
Size_Hints.Base_Height := Size_Hints.Min_Height;
Size_Hints.Width_Inc := S_Long (Levels);
Size_Hints.Height_Inc := S_Long (Levels);
Size_Hints.Flags :=
X_Size_Hints_Flags'
(P_Min_Size | P_Resize_Inc | P_Base_Size => True,
others => False);
Set_Size_Hints (Size_Hints, Xload_Resources.Geometry.all);
end;
Wm_Hints.Input := True;
Wm_Hints.Flags := X_Wm_Hints_Flags'(Input_Hint => True,
others => False);
Class_Hint.Res_Name := new X_String'("xload");
Class_Hint.Res_Class := new X_String'("XLoad");
Attr.Background_Pixel := Xload_Resources.Background;
Attr.Border_Pixel := Xload_Resources.Foreground;
Attr.Cursor := X_Create_Font_Cursor (Dpy, Xc_Hand2);
Mask := X_New_Window_Attributes'
(Cw_Background_Pixel | Cw_Border_Pixel | Cw_Cursor => True,
others => False);
----Set up our icon.
Icon_Setup (Wm_Hints);
----Create our main window.
Xload := X_Create_Window
(Dpy, X_Default_Root_Window (Dpy),
S_Short (Size_Hints.X), S_Short (Size_Hints.Y),
U_Short (Size_Hints.Width), U_Short (Size_Hints.Height),
2, X_Default_Depth (Dpy, Screen),
Input_Output, X_Default_Visual_Of_Screen
(X_Default_Screen_Of_Display (Dpy)),
Mask, Attr);
X_Set_Wm_Properties (Dpy, Xload, "xload", "XLoad",
(1 .. 0 => None_X_String_Pointer),
Size_Hints, Wm_Hints, Class_Hint, Success);
----Select for certain kinds of events.
X_Select_Input
(Dpy, Xload,
X_Event_Mask'
(Structure_Notify_Mask | Exposure_Mask | Button_Press_Mask =>
True,
others => False));
X_Map_Window (Dpy, Xload);
----Set up our GC's.
Gc_Setup;
----Give our controls some kind of default initial values. These will be
-- overridden by the real values almost immediately as RECONFIGURE events
-- come in.
Pixels_Per_Level := (others => 4);
Levels_Height := (others => 0);
Top_Line := (others => 60);
Title_Overlap := (others => False);
----Now do the real thing.
Xload_Main.Levels := S_Natural (Xload_Resources.Levels);
----Loop forever. When we don't have pending events we will queue a read
-- request and wait for it to complete. Every so many seconds we will wake
-- up and take a load sample while we wait.
Notify.Set_Not_Done;
loop
while X_Pending (Dpy) = 0 loop
if Need_Redraw then
Redraw_From_History;
end if;
if Dpy.Network.Fd.State /= Pending_Read_Wait then
Receive_Queue
(Dpy.Network.Fd,
Dpy.Network.Fd_Error,
Dpy.Input.Data
(Dpy.Input.Used + 1 .. Dpy.Input.Data'Last), Length,
Notify);
end if;
if Dpy.Network.Fd.State = Pending_Read_Wait then
select
Notify.Wait_For_Done;
or
delay Duration (Xload_Resources.Interval);
Load_Sample;
X_Flush (Dpy);
end select;
elsif Length > 0 then
Dpy.Input.Used := Dpy.Input.Used + Length;
end if;
end loop;
X_Next_Event (Dpy, Event);
----Handle the event.
if Event.Window = Xload then
case Event.Kind is
----Exposures cause a redraw.
when Expose =>
if Event.Expose.Count = 0 then
Need_Redraw := True;
end if;
when Graphics_Expose =>
if Event.Graphics_Expose.Count = 0 then
Need_Redraw := True;
end if;
----Changes in size cause a reconfiguration and a redraw.
when Configure_Notify =>
Reconfigure (Event);
Need_Redraw := True;
----Button presses.
when Xlbt_Event.Button_Press =>
----Button 1 says do a load sample now.
if Event.Button.Button = Button_1 then
Load_Sample;
----CM_Button 2 says exit.
elsif Event.Button.Button = Button_2 and then
Event.Button.State =
X_Key_Button_Mask'
(Control_Mask | Shift_Mask => True,
others => False) then
exit;
----Button 3 says change the sampled average.
elsif Event.Button.Button = Button_3 then
Change_Load_Average;
----Other buttons just ring the bell.
else
X_Bell (Dpy, 0);
end if;
----Ignore anything else.
when others =>
null;
end case;
----Handle unexpected events for unknown windows.
else
Text_Io.Put ("Event for window ");
S_Long_Io.Put
(Event.Window.Drawable.Id.Number, Base => 16, Width => 0);
Text_Io.Put (" kind: ");
Text_Io.Put (X_Event_Code'Image (Event.Kind));
Text_Io.New_Line;
end if;
end loop;
X_Close_Display (Dpy);
end Main;
-- \f
end Xload_Main;