[gtkada] GtkAda builder example

Tony Gair tony.gair at bmshome.co.uk
Mon Sep 10 13:49:52 CEST 2012


On 08/09/12 18:17, Brian Drummond wrote:
> I realised, having made the create_builder example from testgtk work
> standalone, that it doesn't use the interface I had been intending to
> try!
>
> There are two ways of interfacing to the GTK builder. The TestGTK
> example uses the low level Gtk.Builder binding. However there is a
> higher level binding, Gtkada.Builder, which is supposed to simplify the
> process of connecting signal handlers.
>
> I have put together a tiny example using this interface, but I am not
> really happy with it, as will be evident from the comments.
>
> Handlers are in their own package at library level. If they are local to
> the main procedure, they run into accessibility problems
> testglade.adb:136:51: subprogram must not be deeper than access type
>
> I have not included the XML file, as it is huge.
>
> I hope this example is helpful, and any comments on where I went wrong
> are welcome.
>
> - Brian
>
> ------ testglade.adb ----------------------------------------------
>
> with Gtk.Widget;
> with Ada.Text_IO;		use Ada.Text_IO;
> with Handlers;			use Handlers;
>
>
> procedure TestGlade is
>     Builder : Gtkada_Builder;
>     Error   : Glib.Error.GError;
>     GladeFileName : constant String := "Test1.glade";
>
> -- Handlers look like
> --
> --   type Builder_Handler is access procedure
> --     (Builder : access Gtkada_Builder_Record'Class);
> --
> --   type Object_Handler is access procedure
> --     (User_Data : access GObject_Record'Class);
> --
> -- and types returning Boolean
> --
> -- Having only Gtkada_Builder_Record'Class and GObject_Record'Class
> -- seems restrictive. I failed to find any way to register and use
> -- the following:
> --    procedure Destroy(Object : access Gtk_Widget_Record'Class);
> -- eventually resorting to Gtk.Builder.Get_Widget in the procedure body.
> -- I must be missing something here...
> --
> --     Steps below are described in Gtkada_builder.ads
> --     See also Gtk_builder.ads
> --
> --     Step 1: create a Builder and add the XML data,
>
> begin
>     Gtk.Main.Init;
>     Gtk_New (Builder);
>     Error := Add_From_File (Builder, GladeFileName);
>     if Error /= null then
>        Put_Line ("Error in "&  GladeFileName&  " : "
>                  &  Glib.Error.Get_Message (Error));
>        Glib.Error.Error_Free (Error);
>     end if;
>
> --     Step 2: add calls to "Register_Handler" to associate your
> --     handlers with your callbacks.
>
>     register_handler(Builder, "on_quit_activate",  File_Quit'access);
>     register_handler(Builder, "On_Connect",        On_Clicked'access);
>     register_handler(Builder, "On_Disconnect",     On_Clicked'access);
>     register_handler(Builder, "On_Help",           on_help'access);
>     register_handler(Builder, "On_First_Clicked",  On_Clicked'access);
>     register_handler(Builder, "On_Second_Clicked", On_Clicked'access);
>     register_handler(Builder, "On_Third_Clicked",  On_Clicked'access);
>     register_handler(Builder, "On_Destroy",        Destroy'access);
>
> --     Step 3: call Do_Connect. Once to connect all registered handlers
>
>     Do_Connect (Builder);
>
> --    Step 3.5, not mentioned in gtkada_builder.ads...
> --  Find our main window, then display it and all of its children.
>     Gtk.Widget.Show_All (Get_Widget (Builder, "window1"));
>     Gtk.Main.Main;
>
> --     Step 4: when the application terminates or all Windows
> --             described through
> --             your builder should be closed, call Unref to free memory
> --             associated with the Builder.
> --     Unref is part of what other package, used how exactly?
>
> end TestGlade;
>
> ------ handlers.ads -----------------------------------------------
>
> with Gtkada.Builder; use Gtkada.Builder;
>
> package Handlers is
>
>     procedure on_help
>       (Object : access Gtkada_Builder_Record'Class);
>     procedure On_Clicked
>       (Object : access Gtkada_Builder_Record'Class);
>     procedure Destroy (Object : access Gtkada_Builder_Record'Class);
>     procedure File_Quit (Object : access Gtkada_Builder_Record'Class);
>
> end Handlers;
>
> ------ handlers.adb -----------------------------------------------
>
> with Ada.Text_IO;		use Ada.Text_IO;
> with Gtk.Main;
> with Gtk.Widget;
>
> package body Handlers is
>
>     procedure on_help
>       (Object : access Gtkada_Builder_Record'Class)
>     is
>        pragma Unreferenced (Object);
>     begin
>        Put_Line (" =^..^=   HALP!");
>     end on_help;
>
>     procedure On_Clicked
>       (Object : access Gtkada_Builder_Record'Class)
>     is
>        pragma Unreferenced (Object);
>     begin
>        Put_Line ("Button pressed");
>     end On_Clicked;
>
>     procedure Destroy (Object : access Gtkada_Builder_Record'Class) is
>     begin
>        Put_Line ("Destroy_Clicked");
>        Gtk.Main.Main_Quit;
>     end Destroy;
>
>     procedure File_Quit (Object : access Gtkada_Builder_Record'Class) is
>     begin
>        Gtk.Widget.Destroy (Get_Widget(Object, "window1"));
>     end File_Quit;
>
> end Handlers;
>
> --------------------------------------------------------------------------
>
>
>
>
>
>
> _______________________________________________
> gtkada mailing list
> gtkada at lists.adacore.com
> http://lists.adacore.com/mailman/listinfo/gtkada
>
>    
Thank you Brian , that is very much appreciated.


More information about the gtkada mailing list