------------------------------------------------------------------------------
-- GtkAda - Ada95 binding for Gtk+/Gnome --
-- --
-- Copyright (C) 2011-2018, AdaCore --
-- --
-- This library is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 3, or (at your option) any later --
-- version. This library is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- . --
-- --
------------------------------------------------------------------------------
--
--
-- This package provides a high-level API for using Gtk.Builder and
-- user interface files produced with the GUI builder glade-3.
--
-- Here is how to use this package:
--
-- Step 1: create a Builder and add the XML data, just as you would a
-- standard Gtk.Builder:
--
-- declare
-- Builder : Gtkada_Builder;
-- Error : GError;
-- begin
-- Gtk_New (Builder);
-- Error := Add_From_File (Builder, Default_Filename);
--
-- Step 2: add calls to "Register_Handler" to associate your handlers
-- with your callbacks.
--
-- Register_Handler
-- (Builder => Builder,
-- Handler_Name => "my_handler_id",
-- Handler => My_Handler'Access);
--
-- Where:
-- - Builder is your Gtkada_Builder,
-- - "my_handler_id" is the name of the handler as specified in
-- Glade-3, in the "Handler" column of the "Signals" tab for
-- your object,
-- - Handler is your Ada subprogram.
--
-- You will need one call to "Register_Handler" per handler
-- declared in the Glade-3 interface. If there is one or more
-- handler declared in Glade-3 which does not have an associated
-- call to Register_Handler, an ASSERT_FAILURE will be raised by
-- the Gtk main loop.
--
-- There are multiple way to call Register_Handler, see below.
--
-- Step 3: call Do_Connect.
--
-- 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.
--
--
-- GUI Builder
with Ada.Containers.Hashed_Maps;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Strings.Unbounded.Hash;
with Glib.Object; use Glib.Object;
with Gtk.Builder;
package Gtkada.Builder is
type Gtkada_Builder_Record is new
Gtk.Builder.Gtk_Builder_Record with private;
type Gtkada_Builder is access all Gtkada_Builder_Record'Class;
procedure Gtk_New (Builder : out Gtkada_Builder);
procedure Initialize (Builder : access Gtkada_Builder_Record'Class);
-- Create a new Gtkada_Builder.
procedure Do_Connect (Builder : access Gtkada_Builder_Record'Class);
-- Activate in the builder callabacks that have been connected using
-- calls to Register_Handler functions below.
--------------------------------------
-- Callbacks working on the Builder --
--------------------------------------
-- These callbacks take as parameter the Gtkada_Builder.
-- If a "User data" is present in the Glade-3, it will be ignored.
type Builder_Handler is access procedure
(Builder : access Gtkada_Builder_Record'Class);
type Builder_Return_Handler is access function
(User_Data : access Gtkada_Builder_Record'Class) return Boolean;
procedure Register_Handler
(Builder : access Gtkada_Builder_Record'Class;
Handler_Name : String;
Handler : Builder_Handler);
procedure Register_Handler
(Builder : access Gtkada_Builder_Record'Class;
Handler_Name : String;
Handler : Builder_Return_Handler);
--------------------------------------------------------------
-- Callbacks working on user data specified through Glade-3 --
--------------------------------------------------------------
-- Use these registry functions if your signal handler was defined in
-- the Glade-3 interface with a "User data". The parameter User_Data
-- passed to the handlers corresponds to the object entered in the
-- "User data" column in Glade-3.
type Object_Handler is access procedure
(User_Data : access GObject_Record'Class);
type Object_Return_Handler is access function
(User_Data : access GObject_Record'Class) return Boolean;
procedure Register_Handler
(Builder : access Gtkada_Builder_Record'Class;
Handler_Name : String;
Handler : Object_Handler);
procedure Register_Handler
(Builder : access Gtkada_Builder_Record'Class;
Handler_Name : String;
Handler : Object_Return_Handler);
private
type Handler_Type is (Object, Object_Return, Builder, Builder_Return);
type Universal_Marshaller (T : Handler_Type) is record
case T is
when Object =>
The_Object_Handler : Object_Handler;
when Object_Return =>
The_Object_Return_Handler : Object_Return_Handler;
when Builder =>
The_Builder_Handler : Builder_Handler;
when Builder_Return =>
The_Builder_Return_Handler : Builder_Return_Handler;
end case;
end record;
type Universal_Marshaller_Access is access Universal_Marshaller;
package Handlers_Map is new Ada.Containers.Hashed_Maps
(Key_Type => Unbounded_String,
Element_Type => Universal_Marshaller_Access,
Hash => Ada.Strings.Unbounded.Hash,
Equivalent_Keys => "=",
"=" => "=");
type Gtkada_Builder_Record is new
Gtk.Builder.Gtk_Builder_Record
with record
Handlers : Handlers_Map.Map;
end record;
end Gtkada.Builder;