|
|
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: 23196 (0x5a9c)
Types: TextFile
Names: »B«
└─⟦85b835f43⟧ Bits:30000549 8mm tape, Rational 1000, Xlib rev 6.00
└─⟦0c20f784e⟧ »DATA«
└─⟦1abbe589f⟧
└─⟦306851c02⟧
└─⟦this⟧
with Text_Io;
--/ if TeleGen2 and then Unix then
--// with Process_Control; -- Unix process control
--/ end if;
with Board;
use Board;
with Button;
use Button;
with Draw;
use Draw;
with Icon;
use 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_Gc;
use Xlbt_Gc;
with Xlbt_Hint;
use Xlbt_Hint;
with Xlbt_Geometry;
use Xlbt_Geometry;
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_Gc;
use Xlbp_Gc;
with Xlbp_Geometry;
use Xlbp_Geometry;
with Xlbp_Hint;
use Xlbp_Hint;
with Xlbp_Window;
use Xlbp_Window;
package body Main is
------------------------------------------------------------------------------
-- Dragon - a version of Mah-Jongg for X Windows
--
-- Author: Gary E. Barnes March 1989
--
-- main.c - The mainline code.
------------------------------------------------------------------------------
-- 05/30/90 GEB - Translate to Ada
------------------------------------------------------------------------------
Background_Width : constant := 16;
Background_Height : constant := 16;
Background_X_Hot : constant := -1;
Background_Y_Hot : constant := -1;
Background_Bits : constant U_Char_Array :=
(16#40#, 16#00#, 16#02#, 16#00#, 16#00#, 16#00#, 16#00#, 16#80#,
16#00#, 16#04#, 16#20#, 16#00#, 16#01#, 16#00#, 16#00#, 16#00#,
16#00#, 16#40#, 16#00#, 16#02#, 16#10#, 16#00#, 16#00#, 16#00#,
16#00#, 16#00#, 16#00#, 16#20#, 16#00#, 16#01#, 16#08#, 16#00#);
Gray_Width : constant := 16;
Gray_Height : constant := 16;
Gray_X_Hot : constant := -1;
Gray_Y_Hot : constant := -1;
Gray_Bits : constant U_Char_Array :=
(16#55#, 16#55#, 16#AA#, 16#AA#, 16#55#, 16#55#, 16#AA#, 16#AA#,
16#55#, 16#55#, 16#AA#, 16#AA#, 16#55#, 16#55#, 16#AA#, 16#AA#,
16#55#, 16#55#, 16#AA#, 16#AA#, 16#55#, 16#55#, 16#AA#, 16#AA#,
16#55#, 16#55#, 16#AA#, 16#AA#, 16#55#, 16#55#, 16#AA#, 16#AA#);
Shadow_Width : constant := 16;
Shadow_Height : constant := 16;
Shadow_X_Hot : constant := -1;
Shadow_Y_Hot : constant := -1;
Shadow_Bits : constant U_Char_Array :=
(16#44#, 16#04#, 16#20#, 16#22#, 16#01#, 16#11#, 16#08#, 16#88#,
16#44#, 16#40#, 16#22#, 16#02#, 16#10#, 16#11#, 16#80#, 16#88#,
16#04#, 16#44#, 16#22#, 16#20#, 16#11#, 16#01#, 16#88#, 16#08#,
16#40#, 16#44#, 16#02#, 16#22#, 16#11#, 16#10#, 16#88#, 16#80#);
--\f
------------------------------------------------------------------------------
-- Dragon Resources
------------------------------------------------------------------------------
-- static s_long def_DCTime := 250; -- ms for double click
-- static boolean def_FALSE := false;
-- static boolean def_TRUE := True;
--
-- #define offset(field) XtOffset( Dragon_Resources_Ptr, field )
-- #define BOOLEAN(name,class,field,default) )\
-- {name, class, Xlbt_Rm_Defs.Xt_R_Boolean, sizeof(boolean), offset(field), Xlbt_Rm_Defs.Xt_R_Boolean, ,\
-- (X_Univ_Ptr)default}
-- #define CURSOR(name,class,field,default) )\
-- {name, class, Xlbt_Rm_Defs.Xt_R_Cursor, sizeof(Xlbt_Basic.X_Cursor), offset(field), ,\
-- Xlbt_Rm_Defs.Xt_R_String, (X_Univ_Ptr)default}
-- #define FONT(name,class,field,default) )\
-- {name, class, Xlbt_Rm_Defs.Xt_R_Font_Struct, sizeof(Xlbt_Font.X_Font_Struct*), offset(field), ,\
-- Xlbt_Rm_Defs.Xt_R_String, (X_Univ_Ptr)default}
-- #define INT(name,class,field,default) )\
-- {name, class, Xlbt_Rm_Defs.Xt_R_Int, sizeof(s_long), offset(field), Xlbt_Rm_Defs.Xt_R_Int, (X_Univ_Ptr)default}
-- #define PIXEL(name,class,field,default) )\
-- {name, class, Xlbt_Rm_Defs.Xt_R_Pixel, sizeof(Xlbt_Basic.X_Pixel), ,\
-- offset(field), Xlbt_Rm_Defs.Xt_R_String, (X_Univ_Ptr)default}
-- #define STRING(name,class,field,default) )\
-- {name, class, Xlbt_Rm_Defs.Xt_R_String, sizeof(String), offset(field), Xlbt_Rm_Defs.Xt_R_String, ,\
-- (X_Univ_Ptr)default}
--
-- static XtResource dragon_resources() := {
-- PIXEL ( XtNbackground, XtCBackground, Background,
-- XtExtdefaultbackground ),
-- CURSOR ( "cursor", XtCCursor, Xlbt_Basic.X_Cursor, "hand2" ),
-- BOOLEAN( "debug", "Debug", Debug, and def_FALSE ),
-- INT ( "doubleClick", "DoubleClick", Double_Click_Time, and def_DCTime ),
-- PIXEL ( XtNforeground, XtCForeground, Foreground,
-- XtExtdefaultforeground ),
-- STRING ( XtNgeometry, XtCGeometry, Xlbt_Rm.X_Rm_Geometry, "450x340" ),
-- STRING ( "iconGeometry", "IconGeometry", Icon_Geometry, "64x64" ),
-- BOOLEAN( "iconic", "Iconic", Iconic, and def_FALSE ),
-- STRING ( XtNiconName, XtCIconName, Icon_Name, null ),
-- BOOLEAN( XtNreverseVideo, XtCReverseVideo, Reverse_Video, and def_FALSE ),
-- BOOLEAN( "stickyTile", "StickyTile", Sticky_Tile, and def_TRUE ),
-- BOOLEAN( "tileShadows", "TileShadows", Tile_Shadows, and def_TRUE ),
-- STRING ( "tileSides", "TileSides", Tile_Sides, "gray" ),
-- };
--\f
------------------------------------------------------------------------------
-- Dragon Command Line Options
------------------------------------------------------------------------------
-- static Xlbt_Rm2.X_Rm_Option_Desc command_line_options() := {
-- {"-cursor", ".cursor", Xlbt_Rm.X_Rm_Option_Sep_Arg, (X_Univ_Ptr)null },
-- {"-debug", ".debug", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"on" },
-- {"-double", ".doubleClick", Xlbt_Rm.X_Rm_Option_Sep_Arg, (X_Univ_Ptr)null },
-- {"-geometry", ".geometry", Xlbt_Rm.X_Rm_Option_Sep_Arg, (X_Univ_Ptr)null },
-- {"-icongeometry",".iconGeometry", Xlbt_Rm.X_Rm_Option_Sep_Arg, (X_Univ_Ptr)null },
-- {"-iconic", ".iconic", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"on" },
-- {"+iconic", ".iconic", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"off" },
-- {"-iconname", ".iconName", Xlbt_Rm.X_Rm_Option_Sep_Arg, (X_Univ_Ptr)null },
-- {"-reverse", "*reverseVideo", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"on" },
-- {"+reverse", "*reverseVideo", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"off" },
-- {"-shadows", ".tileShadows", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"off" },
-- {"+shadows", ".tileShadows", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"on" },
-- {"-sides", ".tileSides", Xlbt_Rm.X_Rm_Option_Sep_Arg, (X_Univ_Ptr)"line"},
-- {"-sticky", ".stickyTile", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"off" },
-- {"+sticky", ".stickyTile", Xlbt_Rm.X_Rm_Option_No_Arg, (X_Univ_Ptr)"on" },
-- };
--
-- typedef struct {
-- String name;
-- String desc;
-- } Option_Help;
--
-- static Option_Help command_line_help() := {
-- {"-help", "print out this message"},
-- {"-display displayname", "X server to contact"},
-- {"-cursor name", "name of the cursor to use"},
-- {"-double time", "double-click time limit in milliseconds"},
-- {"-font name", "font to use for buttons and messages"},
-- {"-geometry WxH+X+Y", "size (in pixels) and position of the board"},
-- {"-icongeometry WxH+X+Y","size (in pixels) and position of the program icon"},
-- {"-/+iconic", "begin program as an icon"},
-- {"-iconname name", "name to use with the program icon"},
-- {"-/+reverse", "turn on/off reverse video"},
-- {"-/+shadows", "turn on/off tile shadows"},
-- {"-sides line/black/gray","set the style for tile sides"},
-- {"-/+sticky", "first tile selected sticky"},
-- { null, null }
-- };
--\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; flops colors between the
-- foreground and the background when applied.
Gcv.Funct := Gx_Xor;
Gcv.Foreground := Dragon_Resources.Foreground xor
Dragon_Resources.Background;
Gcv.Background := X_Pixel (0); -- pixel value with all bits "off"
Xor_Gc :=
X_Create_Gc (Dpy,
Dragon.Drawable,
X_Gc_Components'
(Gc_Function | Gc_Foreground | Gc_Background => True,
others => False),
Gcv);
----Normal_GC - fg = black, bg = white, func = copy
Gcv.Funct := Gx_Copy;
Gcv.Foreground := Dragon_Resources.Foreground;
Gcv.Background := Dragon_Resources.Background;
Normal_Gc :=
X_Create_Gc (Dpy,
Dragon.Drawable,
X_Gc_Components'
(Gc_Function | Gc_Foreground | Gc_Background => True,
others => False),
Gcv);
----Gray_GC - fg = black, bg = white, func = copy, tile = Gray
Gcv.Tile := X_Create_Pixmap_From_Bitmap_Data
(Dpy, Board.Drawable, Gray_Bits, Gray_Width,
Gray_Height, Dragon_Resources.Foreground,
Dragon_Resources.Background,
X_Default_Depth (Dpy, X_Default_Screen (Dpy)));
if Gcv.Tile = None_X_Pixmap then
Text_Io.Put_Line ("Can't allocate gray pixmap.");
return;
end if;
Gcv.Fill_Style := Fill_Tiled;
Gray_Gc :=
X_Create_Gc
(Dpy,
Dragon.Drawable,
X_Gc_Components'(Gc_Function | Gc_Foreground |
Gc_Background | Gc_Tile | Gc_Fill_Style => True,
others => False),
Gcv);
----Over_GC - fg = black xor white, bg = 0, func = copy
Gcv.Funct := Gx_Copy;
Gcv.Stipple := -- stipple operations are always depth 1
X_Create_Bitmap_From_Data (Dpy, Board.Drawable, Shadow_Bits,
Shadow_Width, Shadow_Height);
if Gcv.Stipple = None_X_Pixmap then
Text_Io.Put_Line ("Can't allocate shadow pixmap.");
return;
end if;
Gcv.Fill_Style := Fill_Stippled;
Over_Gc :=
X_Create_Gc
(Dpy, Dragon.Drawable,
X_Gc_Components'(Gc_Function | Gc_Foreground | Gc_Background |
Gc_Stipple | Gc_Fill_Style => True,
others => False),
Gcv);
----Reverse_GC - fg = white, bg = black, func = copy
Gcv.Funct := Gx_Copy;
Gcv.Background := Dragon_Resources.Foreground;
Gcv.Foreground := Dragon_Resources.Background;
Reverse_Gc :=
X_Create_Gc (Dpy, Dragon.Drawable,
X_Gc_Components'
(Gc_Function | Gc_Foreground | Gc_Background => 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) 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;
Event : X_Event;
Success : X_Status;
Icon_Window : X_Window := None_X_Window;
Env : constant X_String :=
X_Display_Name (Display);
begin
----Start up the toolkit. This creates a shell widget. Unfortunately the
-- only way the toolkit allows you to specify default application resources
-- is by having a /usr/lib/X11/app-defaults/Application resouce file. I'm
-- not interested in doing this. If some site wants to create one in order
-- to customize the program then that is fine. However, I want my program
-- to be "standalone"; ie. if you have the binary executable then you have
-- all you *must-have*. So, I will Destroy this widget shortly.
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.
Dragon_Resources.Background := X_White_Pixel (Dpy, Screen);
Dragon_Resources.Cursor := X_Create_Font_Cursor (Dpy, Xc_Hand2);
Dragon_Resources.Debug := False;
Dragon_Resources.Double_Click := 250;
Dragon_Resources.Foreground := X_Black_Pixel (Dpy, Screen);
Dragon_Resources.Geometry := new X_String'("450x340");
Dragon_Resources.Icon_Geometry := new X_String'("64x64");
Dragon_Resources.Iconic := False;
Dragon_Resources.Icon_Name := null;
Dragon_Resources.Reverse_Video := False;
Dragon_Resources.Sticky_Tile := True;
Dragon_Resources.Tile_Shadows := True;
Dragon_Resources.Tile_Sides := new X_String'("gray");
----Set up the various Hints structures for our main window.
Size_Hints.Min_Width := 450;
Size_Hints.Min_Height := 340;
Size_Hints.Base_Width := 450;
Size_Hints.Base_Height := 340;
Size_Hints.Width_Inc := 210;
Size_Hints.Height_Inc := 160;
Size_Hints.Min_Aspect.X := 1333;
Size_Hints.Min_Aspect.Y := 1000;
Size_Hints.Max_Aspect.X := 1333;
Size_Hints.Max_Aspect.Y := 1000;
Size_Hints.Flags :=
X_Size_Hints_Flags'
(P_Min_Size | P_Aspect | P_Resize_Inc | P_Base_Size => True,
others => False);
Set_Size_Hints (Size_Hints, Dragon_Resources.Geometry.all);
Wm_Hints.Input := True;
Wm_Hints.Flags := X_Wm_Hints_Flags'(Input_Hint => True,
others => False);
Class_Hint.Res_Name := new X_String'("dragon");
Class_Hint.Res_Class := new X_String'("Dragon");
Attr.Background_Pixel := Dragon_Resources.Background;
Attr.Border_Pixel := Dragon_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);
if Wm_Hints.Flags (Icon_Window_Hint) then
Icon_Window := Wm_Hints.Icon_Window;
end if;
----Create our main window.
Dragon := 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);
Board := Dragon;
X_Set_Wm_Properties (Dpy, Dragon, "Dragon", "Dragon",
(1 .. 0 => None_X_String_Pointer),
Size_Hints, Wm_Hints, Class_Hint, Success);
----Check the tile controls.
Tile_Control := 0;
if Dragon_Resources.Tile_Shadows then
Tile_Control := Tile_Control or Shadow;
end if;
if Dragon_Resources.Tile_Sides.all = "black" then
Tile_Control := Tile_Control or Blackside;
elsif Dragon_Resources.Tile_Sides.all = "gray" then
Tile_Control := Tile_Control or Blackside or Grayside;
elsif Dragon_Resources.Tile_Sides.all /= "line" then
Text_Io.Put_Line
("-side option not given line, gray, or black value.");
end if;
----Create the board that we will be using; realize it too.
Board_Setup;
X_Select_Input
(Dpy, Dragon,
X_Event_Mask'(Structure_Notify_Mask | Exposure_Mask |
Button_Release_Mask | Button_Press_Mask => True,
others => False));
X_Map_Window (Dpy, Dragon);
----Set up our GC's.
Gc_Setup;
----Now make it all appear in front of the user.
declare
Pix : X_Pixmap;
begin
Pix := X_Create_Pixmap_From_Bitmap_Data
(Dpy, Dragon.Drawable, Background_Bits,
Background_Width, Background_Height,
Dragon_Resources.Foreground, Dragon_Resources.Background,
X_Default_Depth (Dpy, X_Default_Screen (Dpy)));
if Pix = None_X_Pixmap then
Text_Io.Put_Line ("Can't allocate background pixmap.");
raise Abandon;
end if;
X_Set_Window_Background_Pixmap (Dpy, Board, Pix);
end;
----Now do the real thing.
loop
X_Next_Event (Dpy, Event);
if Event.Window = Dragon then
case Event.Kind is
when Expose =>
Button_Expose;
Board_Expose;
when Configure_Notify =>
Board_Configure (Event);
when Xlbt_Event.Button_Press =>
if Event.Button.State /= None_X_Key_Button_Mask then
null; -- No Meta/Shift/Control keys allowed.
elsif Event.Button.Button = Button_1 then
Button.Button_Press (Event);
Tile_Press (Event);
elsif Event.Button.Button = Button_2 then
Hints (Event);
elsif Event.Button.Button = Button_3 then
Tile_Remove (Event);
end if;
when Xlbt_Event.Button_Release =>
if Event.Button.Button = Button_1 then
Button.Button_Release (Event);
Tile_Release (Event);
end if;
when others =>
null;
end case;
elsif Event.Window = Icon_Window then
if Event.Kind = Expose then
Icon_Expose (Icon_Window, Event);
end if;
else
Text_Io.Put ("Event for window 0x");
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;
exception
----Differing forms of program termination.
when Abandon =>
--/ if TeleGen2 and then Unix then
--// Process_Control.Exit_Execution (1);
--/ end if;
raise;
when Quit =>
--/ if TeleGen2 and then Unix then
--// Process_Control.Exit_Execution (0);
--/ end if;
null;
end Main;
end Main;