----------------------------------------------------------------------- -- GtkAda - Ada95 binding for Gtk+/Gnome -- -- -- -- Copyright (C) 1998-2000 E. Briot, J. Brobecker and A. Charlet -- -- Copyright (C) 2000-2009, AdaCore -- -- -- -- This library is free software; you can redistribute it and/or -- -- modify it under the terms of the GNU General Public -- -- License as published by the Free Software Foundation; either -- -- version 2 of the License, 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 -- -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- -- General Public License for more details. -- -- -- -- You should have received a copy of the GNU General Public -- -- License along with this library; if not, write to the -- -- Free Software Foundation, Inc., 59 Temple Place - Suite 330, -- -- Boston, MA 02111-1307, USA. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----------------------------------------------------------------------- -- -- -- The aim of this package is to provide some services to connect a -- handler to a signal emitted by a Gtk Object. To understand the -- services provided by this package, some definitions are necessary: -- -- Signal: A signal is a kind of message that an object wants to -- broadcast. All GObjects can emit signals. These messages are -- associated to certain events happening during the life of an -- object. For instance, when a user clicks on a button, the -- "clicked" signal is emitted by the button. -- -- Handler (or callback): A handler is a function or procedure that -- the user "connects" to a signal for a particular object. -- Connecting a handler to a signal means associating this handler to -- the signal. When the signal is emitted, all connected handlers -- are called back. Usually, the role of those callbacks is to do -- some processing triggered by a user action. For instance, when -- "clicked" signal is emitted by the "OK" button of a dialog, the -- connected handler can be used to close the dialog or recompute -- some value. -- -- In GtkAda, the handlers are defined in a form as general as -- possible. The first argument is always an access to the object it -- has been connected to. The second object is a table of values -- (See Glib.Values for more details about this table). It is the -- responsibility of this handler to extract the values from it, and -- to convert them to the correct Ada type. -- -- Because such handlers are not very convenient to use, this package -- also provides some services to connect a marshaller instead. It -- will then do the extraction work before calling the more -- programmer-friendly handler, as defined in Gtk.Marshallers (see -- Gtk.Marshallers for more details). -- -- The subdivision of this package is identical to Gtk.Marshallers; it -- is made of four generic sub-packages, each representing one of the -- four possible kinds of handlers: they can return a value or not, and -- they can have some user specific data associated to them or not. -- Selecting the right package depends on the profile of the handler. -- For example, the handler for the "delete_event" signal of a -- Gtk_Window has a return value, and has an extra parameter (a Gint). -- All handlers also have a user_data field by default, but its usage -- is optional. To connect a handler to this signal, if the user_data -- field is not used, the Return_Callback generic should be -- instantiated. On the other hand, if the user_data field is -- necessary, then the User_Return_Callback generic should be used. -- -- Note also that the real handler in Gtk+ should expect at least as -- many arguments as in the marshaller you are using. If your -- marshaller has one argument, the C handler must have at least one -- argument too. -- -- The common generic parameter to all sub-packages is the widget type, -- which is the basic widget manipulated. This can be -- Glib.Object.GObject_Record type if you want to reduce the number of -- instantiations, but the conversion to the original type will have to be -- done inside the handler. -- -- All sub-packages are organized in the same way. -- -- First, the type "Handler" is defined. It represents the general -- form of the callbacks supported by the sub-package. -- -- The corresponding sub-package of Gtk.Marshallers is instantiated. -- -- A series of "Connect" procedures and functions is given. All cases -- are covered: the functions return the Handler_Id of the newly -- created association, while the procedures just connect the -- handler, dropping the Handler_Id; some services allow the user to -- connect a Handler while some others allow the usage of -- Marshallers, which are more convenient. Note that more than one -- handler may be connected to a signal; the handlers will then be -- invoked in the order of connection. -- -- Some "Connect_Object" services are also provided. Those services -- never have a user_data. They accept an additional parameter called -- Slot_Object. When the callback in invoked, the Gtk Object emitting -- the signal is substituted by this Slot_Object. -- These callbacks are always automatically disconnected as soon as one -- of the two widgets involved is destroyed. -- -- There are several methods to connect a handler. For each method, -- although the option of connecting a Handler is provided, the -- recommended way is to use Marshallers. Each connect service is -- documented below, in the first sub-package. -- -- A series of "To_Marshaller" functions are provided. They return -- some marshallers for the most commonly used types in order to ease -- the usage of this package. Most of the time, it will not be -- necessary to use some other marshallers. -- For instance, if a signal is documented as receiving a single argument, -- the widget (for instance the "clicked" signal for a Gtk_Button), you -- will connect to it with: -- with Gtkada.Handlers; -- procedure On_Clicked (Button : access Gtk_Widget_Record'Class); -- ... -- Widget_Callback.Connect (Button, "clicked", On_Clicked'Access); -- -- The simple form above also applies for most handlers that take one -- additional argument, for instance the "button_press_event" in -- gtk-widget.ads. Just declare your subprogram with the appropriate profile -- and connect it, as in: -- with Gtkada.Handlers; -- procedure On_Button (Widget : access Gtk_Widget_Record'Class; -- Event : Gdk_Event); -- ... -- Widget_Callback.Connect (Widget, "button_press_event", -- On_Button'Access); -- -- More complex forms of handlers exists however in GtkAda, for which no -- predefined marshaller exists. In this case, you have to use the general -- form of callbacks. For instance, the "select_row" signal of Gtk.Clist. -- with Gtkada.Handlers; -- with Gtk.Arguments; -- procedure On_Select (Clist : access Gtk_Widget_Record'Class; -- Args : Glib.Values.GValues) -- is -- Row : constant Gint := To_Gint (Args, 1); -- Column : constant Gint := To_Gint (Args, 2); -- Event : constant Gdk_Event := To_Event (Args, 3); -- begin -- ... -- end On_Select; -- ... -- Widget_Callback.Connect (Clist, "select_row", On_Select'Access); -- -- As for the "To_Marshaller" functions, a series of "Emit_By_Name" -- procedures are also provided for the same most common types, to -- allow the user to easily emit signals. These procedures are mainly -- intended for people building new GObjects. -- -- At the end of this package, some general services related to the -- management of signals and handlers are also provided. Each one of -- them is documented individually below. -- -- IMPORTANT NOTE: These packages must be instantiated at library-level -- -- -- 2.8.17 -- Signal handling with Glib.Values; with Gdk.Event; with Glib.Object; with Gtk.Marshallers; pragma Elaborate_All (Gtk.Marshallers); with Gtk.Notebook; with Gtk.Tree_Model; with Gtk.Widget; with Unchecked_Conversion; package Gtk.Handlers is -- pragma Elaborate_Body; type GClosure is new Glib.C_Proxy; Null_Handler_Id : constant Gulong := 0; type Handler_Id is record Id : Gulong := Null_Handler_Id; Closure : GClosure; end record; -- This uniquely identifies a connection widget<->signal. -- Closure is an internal data, that you should not use. --------------------------------------------------------- -- These handlers should return a value -- They do not have a User_Data --------------------------------------------------------- generic type Widget_Type is new Glib.Object.GObject_Record with private; type Return_Type is (<>); package Return_Callback is type Handler is access function (Widget : access Widget_Type'Class; Params : Glib.Values.GValues) return Return_Type; type Simple_Handler is access function (Widget : access Widget_Type'Class) return Return_Type; package Marshallers is new Gtk.Marshallers.Return_Marshallers (Widget_Type, Return_Type); -- Connecting a handler to an object -- In all the Connect services below, the following arguments -- will be used: -- o Widget, Name: This represents the association (Gtk Object, -- Glib.Signal_Name) to which the handler is to be connected. -- o After: If this boolean is set to True, then the handler -- will be connected after all the default handlers. By -- default, it is set to False. procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; After : Boolean := False); -- Connects a Marshaller. The Handler_Id is dropped. procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; After : Boolean := False); -- Connect a Marshaller. The Handler_Id is dropped. -- This is automatically disconnected as soon as either Widget or -- Slot_Object is destroyed. -- Slot_Object *must* be of type Gtk_Object or one of its children. procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; Slot_Object : access Widget_Type'Class; After : Boolean := False); -- Same as above, except with a simple handle with no parameter. This -- is the same as using a To_Marshaller call to the above two -- procedures, except it is shorter to write. procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; After : Boolean := False); -- Connect a Handler. The Handler_Id is dropped. -- This is automatically disconnected as soon as either Widget or -- Slot_Object is destroyed. -- Slot_Object *must* be of type Gtk_Object or one of its children. pragma Inline (Connect); pragma Inline (Object_Connect); function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; After : Boolean := False) return Handler_Id; -- Connects a Marshaller. Returns the Handler_Id. function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; After : Boolean := False) return Handler_Id; -- Connect a Marshaller. Return the Handler_Id. -- This is automatically disconnected as soon as either Widget or -- Slot_Object is destroyed. -- Slot_Object *must* be of type Gtk_Object or one of its children. function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; After : Boolean := False) return Handler_Id; -- Connects a Handler. Returns the Handler_Id. function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; After : Boolean := False) return Handler_Id; -- Connect a Handler. Returns the Handler_Id. -- This is automatically disconnected as soon as either Widget or -- Slot_Object is destroyed. -- Slot_Object *must* be of type Gtk_Object or one of its children. -- Some convenient functions to create marshallers package Gint_Marshaller is new Marshallers.Generic_Marshaller (Gint, Glib.Values.Get_Int); package Guint_Marshaller is new Marshallers.Generic_Marshaller (Guint, Glib.Values.Get_Uint); package Event_Marshaller is new Marshallers.Generic_Marshaller (Gdk.Event.Gdk_Event, Gdk.Event.Get_Event); package Widget_Marshaller is new Marshallers.Generic_Widget_Marshaller (Gtk.Widget.Gtk_Widget_Record, Gtk.Widget.Gtk_Widget); package Notebook_Page_Marshaller is new Marshallers.Generic_Marshaller (Gtk.Notebook.Gtk_Notebook_Page, Gtk.Notebook.Get_Notebook_Page); function To_Marshaller (Cb : Gint_Marshaller.Handler) return Marshallers.Marshaller renames Gint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Guint_Marshaller.Handler) return Marshallers.Marshaller renames Guint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Event_Marshaller.Handler) return Marshallers.Marshaller renames Event_Marshaller.To_Marshaller; function To_Marshaller (Cb : Widget_Marshaller.Handler) return Marshallers.Marshaller renames Widget_Marshaller.To_Marshaller; function To_Marshaller (Cb : Marshallers.Void_Marshaller.Handler) return Marshallers.Marshaller renames Marshallers.Void_Marshaller.To_Marshaller; function To_Marshaller (Cb : Notebook_Page_Marshaller.Handler) return Marshallers.Marshaller renames Notebook_Page_Marshaller.To_Marshaller; -- Emitting a signal function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gint) return Return_Type renames Gint_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Guint) return Return_Type renames Guint_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gdk.Event.Gdk_Event) return Return_Type; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : access Gtk.Widget.Gtk_Widget_Record'Class) return Return_Type renames Widget_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name) return Return_Type renames Marshallers.Void_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gtk.Notebook.Gtk_Notebook_Page) return Return_Type renames Notebook_Page_Marshaller.Emit_By_Name; private -- type Acc is access all Widget_Type'Class; -- This type has to be declared at library level, otherwise -- Program_Error might be raised when trying to cast from the -- parameter of Marshaller to another type. type Data_Type_Record is record Func : Handler; -- User's callback Proxy : Marshallers.Handler_Proxy := null; -- Handler_Proxy to use Object : Acc := null; -- Slot Object for Object_Connect end record; type Data_Type_Access is access all Data_Type_Record; pragma Convention (C, Data_Type_Access); -- Data passed to the C handler function Convert is new Unchecked_Conversion (Data_Type_Access, System.Address); function Convert is new Unchecked_Conversion (System.Address, Data_Type_Access); procedure Free_Data (Data : Data_Type_Access); pragma Convention (C, Free_Data); -- Free the memory associated with the callback's data procedure First_Marshaller (Closure : GClosure; Return_Value : Glib.Values.GValue; N_Params : Guint; Params : System.Address; Invocation_Hint : System.Address; User_Data : System.Address); pragma Convention (C, First_Marshaller); -- First level marshaller. This is the function that is actually -- called by gtk+. It then calls the Ada functions as required. -- end Return_Callback; --------------------------------------------------------- -- These handlers should return a value -- They require a User_Data -- See also the package User_Callback_With_Setup --------------------------------------------------------- generic type Widget_Type is new Glib.Object.GObject_Record with private; type Return_Type is (<>); type User_Type (<>) is private; package User_Return_Callback is type Handler is access function (Widget : access Widget_Type'Class; Params : Glib.Values.GValues; User_Data : User_Type) return Return_Type; type Simple_Handler is access function (Widget : access Widget_Type'Class; User_Data : User_Type) return Return_Type; package Marshallers is new Gtk.Marshallers.User_Return_Marshallers (Widget_Type, Return_Type, User_Type); -- Connecting a handler to an object procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); pragma Inline (Connect); function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; -- Some convenient functions to create marshallers package Gint_Marshaller is new Marshallers.Generic_Marshaller (Gint, Glib.Values.Get_Int); package Guint_Marshaller is new Marshallers.Generic_Marshaller (Guint, Glib.Values.Get_Uint); package Event_Marshaller is new Marshallers.Generic_Marshaller (Gdk.Event.Gdk_Event, Gdk.Event.Get_Event); package Widget_Marshaller is new Marshallers.Generic_Widget_Marshaller (Gtk.Widget.Gtk_Widget_Record, Gtk.Widget.Gtk_Widget); package Notebook_Page_Marshaller is new Marshallers.Generic_Marshaller (Gtk.Notebook.Gtk_Notebook_Page, Gtk.Notebook.Get_Notebook_Page); function To_Marshaller (Cb : Gint_Marshaller.Handler) return Marshallers.Marshaller renames Gint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Guint_Marshaller.Handler) return Marshallers.Marshaller renames Guint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Event_Marshaller.Handler) return Marshallers.Marshaller renames Event_Marshaller.To_Marshaller; function To_Marshaller (Cb : Widget_Marshaller.Handler) return Marshallers.Marshaller renames Widget_Marshaller.To_Marshaller; function To_Marshaller (Cb : Marshallers.Void_Marshaller.Handler) return Marshallers.Marshaller renames Marshallers.Void_Marshaller.To_Marshaller; function To_Marshaller (Cb : Notebook_Page_Marshaller.Handler) return Marshallers.Marshaller renames Notebook_Page_Marshaller.To_Marshaller; -- Emitting a signal function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gint) return Return_Type renames Gint_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Guint) return Return_Type renames Guint_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gdk.Event.Gdk_Event) return Return_Type; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : access Gtk.Widget.Gtk_Widget_Record'Class) return Return_Type renames Widget_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name) return Return_Type renames Marshallers.Void_Marshaller.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gtk.Notebook.Gtk_Notebook_Page) return Return_Type renames Notebook_Page_Marshaller.Emit_By_Name; private -- type Acc is access all Widget_Type'Class; -- This type has to be declared at library level, otherwise -- Program_Error might be raised when trying to cast from the -- parameter of Marshaller to another type. type User_Access is access User_Type; type Data_Type_Record is record Func : Handler; -- User's callback Proxy : Marshallers.Handler_Proxy := null; -- Handler_Proxy to use User : User_Access := null; Object : Acc := null; -- Slot Object for Object_Connect end record; type Data_Type_Access is access all Data_Type_Record; pragma Convention (C, Data_Type_Access); -- Data passed to the C handler function Convert is new Unchecked_Conversion (Data_Type_Access, System.Address); function Convert is new Unchecked_Conversion (System.Address, Data_Type_Access); procedure Free_Data (Data : Data_Type_Access); pragma Convention (C, Free_Data); -- Free the memory associated with the callback's data procedure First_Marshaller (Closure : GClosure; Return_Value : Glib.Values.GValue; N_Params : Guint; Params : System.Address; Invocation_Hint : System.Address; User_Data : System.Address); pragma Convention (C, First_Marshaller); -- First level marshaller. This is the function that is actually -- called by gtk+. It then calls the Ada functions as required. -- end User_Return_Callback; ------------------------------------- -- User_Return_Callback_With_Setup -- ------------------------------------- -- This package is basically the same as User_Return_Callback, except that -- an extra function (Setup) is called after a handler has been -- connected. Typical usage is to automatically call Add_Watch (see below) -- in case the User_Type is (or contains) widgets. generic type Widget_Type is new Glib.Object.GObject_Record with private; type Return_Type is (<>); type User_Type (<>) is private; with procedure Setup (User_Data : User_Type; Id : Handler_Id); package User_Return_Callback_With_Setup is package Internal_Cb is new User_Return_Callback (Widget_Type, Return_Type, User_Type); subtype Handler is Internal_Cb.Handler; subtype Simple_Handler is Internal_Cb.Simple_Handler; package Marshallers renames Internal_Cb.Marshallers; -- Connecting a handler to an object procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); pragma Inline (Connect); function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; -- Some convenient functions to create marshallers package Gint_Marshaller renames Internal_Cb.Gint_Marshaller; package Guint_Marshaller renames Internal_Cb.Guint_Marshaller; package Event_Marshaller renames Internal_Cb.Event_Marshaller; package Widget_Marshaller renames Internal_Cb.Widget_Marshaller; package Notebook_Page_Marshaller renames Internal_Cb.Notebook_Page_Marshaller; function To_Marshaller (Cb : Gint_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Guint_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Event_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Widget_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Internal_Cb.Marshallers.Void_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Notebook_Page_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; -- Emitting a signal function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gint) return Return_Type renames Internal_Cb.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Guint) return Return_Type renames Internal_Cb.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gdk.Event.Gdk_Event) return Return_Type renames Internal_Cb.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : access Gtk.Widget.Gtk_Widget_Record'Class) return Return_Type renames Internal_Cb.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name) return Return_Type renames Internal_Cb.Emit_By_Name; function Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gtk.Notebook.Gtk_Notebook_Page) return Return_Type renames Internal_Cb.Emit_By_Name; end User_Return_Callback_With_Setup; --------------------------------------------------------- -- These handlers do not return a value -- They do not have a User_Data --------------------------------------------------------- generic type Widget_Type is new Glib.Object.GObject_Record with private; package Callback is type Handler is access procedure (Widget : access Widget_Type'Class; Params : Glib.Values.GValues); type Simple_Handler is access procedure (Widget : access Widget_Type'Class); package Marshallers is new Gtk.Marshallers.Void_Marshallers (Widget_Type); -- Connecting a handler to an object procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; Slot_Object : access Widget_Type'Class; After : Boolean := False); pragma Inline (Connect); pragma Inline (Object_Connect); function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; After : Boolean := False) return Handler_Id; function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; After : Boolean := False) return Handler_Id; -- Some convenient functions to create marshallers package Gint_Marshaller is new Marshallers.Generic_Marshaller (Gint, Glib.Values.Get_Int); package Guint_Marshaller is new Marshallers.Generic_Marshaller (Guint, Glib.Values.Get_Uint); package Event_Marshaller is new Marshallers.Generic_Marshaller (Gdk.Event.Gdk_Event, Gdk.Event.Get_Event); package Widget_Marshaller is new Marshallers.Generic_Widget_Marshaller (Gtk.Widget.Gtk_Widget_Record, Gtk.Widget.Gtk_Widget); package Notebook_Page_Marshaller is new Marshallers.Generic_Marshaller (Gtk.Notebook.Gtk_Notebook_Page, Gtk.Notebook.Get_Notebook_Page); package Tree_Path_Marshaller is new Marshallers.Generic_Marshaller (Gtk.Tree_Model.Gtk_Tree_Path, Gtk.Tree_Model.Get_Tree_Path); package Tree_Iter_Tree_Path_Marshaller is new Marshallers.Generic_Marshaller_2 (Gtk.Tree_Model.Gtk_Tree_Iter, Gtk.Tree_Model.Get_Tree_Iter, Gtk.Tree_Model.Gtk_Tree_Path, Gtk.Tree_Model.Get_Tree_Path); package Tree_Path_Tree_Iter_Marshaller is new Marshallers.Generic_Marshaller_2 (Gtk.Tree_Model.Gtk_Tree_Path, Gtk.Tree_Model.Get_Tree_Path, Gtk.Tree_Model.Gtk_Tree_Iter, Gtk.Tree_Model.Get_Tree_Iter); function To_Marshaller (Cb : Gint_Marshaller.Handler) return Marshallers.Marshaller renames Gint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Guint_Marshaller.Handler) return Marshallers.Marshaller renames Guint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Event_Marshaller.Handler) return Marshallers.Marshaller renames Event_Marshaller.To_Marshaller; function To_Marshaller (Cb : Widget_Marshaller.Handler) return Marshallers.Marshaller renames Widget_Marshaller.To_Marshaller; function To_Marshaller (Cb : Marshallers.Void_Marshaller.Handler) return Marshallers.Marshaller renames Marshallers.Void_Marshaller.To_Marshaller; function To_Marshaller (Cb : Notebook_Page_Marshaller.Handler) return Marshallers.Marshaller renames Notebook_Page_Marshaller.To_Marshaller; function To_Marshaller (Cb : Tree_Path_Marshaller.Handler) return Marshallers.Marshaller renames Tree_Path_Marshaller.To_Marshaller; function To_Marshaller (Cb : Tree_Iter_Tree_Path_Marshaller.Handler) return Marshallers.Marshaller renames Tree_Iter_Tree_Path_Marshaller.To_Marshaller; function To_Marshaller (Cb : Tree_Path_Tree_Iter_Marshaller.Handler) return Marshallers.Marshaller renames Tree_Path_Tree_Iter_Marshaller.To_Marshaller; -- Emitting a signal procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gint) renames Gint_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Guint) renames Guint_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gdk.Event.Gdk_Event); procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : access Gtk.Widget.Gtk_Widget_Record'Class) renames Widget_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name) renames Marshallers.Void_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gtk.Notebook.Gtk_Notebook_Page) renames Notebook_Page_Marshaller.Emit_By_Name; procedure Emit_By_Name is new Tree_Path_Marshaller.Emit_By_Name_Generic (Gtk.Tree_Model.To_Address); procedure Emit_By_Name is new Tree_Iter_Tree_Path_Marshaller.Emit_By_Name_Generic (Gtk.Tree_Model.To_Address, Gtk.Tree_Model.To_Address); procedure Emit_By_Name is new Tree_Path_Tree_Iter_Marshaller.Emit_By_Name_Generic (Gtk.Tree_Model.To_Address, Gtk.Tree_Model.To_Address); private -- type Acc is access all Widget_Type'Class; -- This type has to be declared at library level, otherwise -- Program_Error might be raised when trying to cast from the -- parameter of Marshaller to another type. type Data_Type_Record is record Func : Handler; -- User's callback Proxy : Marshallers.Handler_Proxy := null; -- Handler_Proxy to use Object : Acc := null; -- Slot Object for Object_Connect end record; type Data_Type_Access is access all Data_Type_Record; pragma Convention (C, Data_Type_Access); -- Data passed to the C handler function Convert is new Unchecked_Conversion (Data_Type_Access, System.Address); function Convert is new Unchecked_Conversion (System.Address, Data_Type_Access); procedure Free_Data (Data : Data_Type_Access); pragma Convention (C, Free_Data); -- Free the memory associated with the callback's data procedure First_Marshaller (Closure : GClosure; Return_Value : Glib.Values.GValue; N_Params : Guint; Params : System.Address; Invocation_Hint : System.Address; User_Data : System.Address); pragma Convention (C, First_Marshaller); -- First level marshaller. This is the function that is actually -- called by gtk+. It then calls the Ada functions as required. -- end Callback; --------------------------------------------------------- -- These handlers do not return a value -- They require a User_Data -- See also the package User_Callback_With_Setup --------------------------------------------------------- generic type Widget_Type is new Glib.Object.GObject_Record with private; type User_Type (<>) is private; package User_Callback is type Handler is access procedure (Widget : access Widget_Type'Class; Params : Glib.Values.GValues; User_Data : User_Type); type Simple_Handler is access procedure (Widget : access Widget_Type'Class; User_Data : User_Type); package Marshallers is new Gtk.Marshallers.User_Void_Marshallers (Widget_Type, User_Type); -- Connecting a handler to an object procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); pragma Inline (Connect); function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; -- Some convenient functions to create marshallers package Gint_Marshaller is new Marshallers.Generic_Marshaller (Gint, Glib.Values.Get_Int); package Guint_Marshaller is new Marshallers.Generic_Marshaller (Guint, Glib.Values.Get_Uint); package Event_Marshaller is new Marshallers.Generic_Marshaller (Gdk.Event.Gdk_Event, Gdk.Event.Get_Event); package Widget_Marshaller is new Marshallers.Generic_Widget_Marshaller (Gtk.Widget.Gtk_Widget_Record, Gtk.Widget.Gtk_Widget); package Notebook_Page_Marshaller is new Marshallers.Generic_Marshaller (Gtk.Notebook.Gtk_Notebook_Page, Gtk.Notebook.Get_Notebook_Page); package Tree_Path_Marshaller is new Marshallers.Generic_Marshaller (Gtk.Tree_Model.Gtk_Tree_Path, Gtk.Tree_Model.Get_Tree_Path); package Tree_Iter_Tree_Path_Marshaller is new Marshallers.Generic_Marshaller_2 (Gtk.Tree_Model.Gtk_Tree_Iter, Gtk.Tree_Model.Get_Tree_Iter, Gtk.Tree_Model.Gtk_Tree_Path, Gtk.Tree_Model.Get_Tree_Path); package Tree_Path_Tree_Iter_Marshaller is new Marshallers.Generic_Marshaller_2 (Gtk.Tree_Model.Gtk_Tree_Path, Gtk.Tree_Model.Get_Tree_Path, Gtk.Tree_Model.Gtk_Tree_Iter, Gtk.Tree_Model.Get_Tree_Iter); function To_Marshaller (Cb : Gint_Marshaller.Handler) return Marshallers.Marshaller renames Gint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Guint_Marshaller.Handler) return Marshallers.Marshaller renames Guint_Marshaller.To_Marshaller; function To_Marshaller (Cb : Event_Marshaller.Handler) return Marshallers.Marshaller renames Event_Marshaller.To_Marshaller; function To_Marshaller (Cb : Widget_Marshaller.Handler) return Marshallers.Marshaller renames Widget_Marshaller.To_Marshaller; function To_Marshaller (Cb : Marshallers.Void_Marshaller.Handler) return Marshallers.Marshaller renames Marshallers.Void_Marshaller.To_Marshaller; function To_Marshaller (Cb : Notebook_Page_Marshaller.Handler) return Marshallers.Marshaller renames Notebook_Page_Marshaller.To_Marshaller; function To_Marshaller (Cb : Tree_Path_Marshaller.Handler) return Marshallers.Marshaller renames Tree_Path_Marshaller.To_Marshaller; function To_Marshaller (Cb : Tree_Iter_Tree_Path_Marshaller.Handler) return Marshallers.Marshaller renames Tree_Iter_Tree_Path_Marshaller.To_Marshaller; function To_Marshaller (Cb : Tree_Path_Tree_Iter_Marshaller.Handler) return Marshallers.Marshaller renames Tree_Path_Tree_Iter_Marshaller.To_Marshaller; -- Emitting a signal procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gint) renames Gint_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Guint) renames Guint_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gdk.Event.Gdk_Event); procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : access Gtk.Widget.Gtk_Widget_Record'Class) renames Widget_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name) renames Marshallers.Void_Marshaller.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gtk.Notebook.Gtk_Notebook_Page) renames Notebook_Page_Marshaller.Emit_By_Name; procedure Emit_By_Name is new Tree_Path_Marshaller.Emit_By_Name_Generic (Gtk.Tree_Model.To_Address); procedure Emit_By_Name is new Tree_Iter_Tree_Path_Marshaller.Emit_By_Name_Generic (Gtk.Tree_Model.To_Address, Gtk.Tree_Model.To_Address); procedure Emit_By_Name is new Tree_Path_Tree_Iter_Marshaller.Emit_By_Name_Generic (Gtk.Tree_Model.To_Address, Gtk.Tree_Model.To_Address); private -- type Acc is access all Widget_Type'Class; -- This type has to be declared at library level, otherwise -- Program_Error might be raised when trying to cast from the -- parameter of Marshaller to another type. type User_Access is access User_Type; type Data_Type_Record is record Func : Handler; -- User's callback Proxy : Marshallers.Handler_Proxy := null; -- Handler_Proxy to use User : User_Access := null; Object : Acc := null; -- Slot_Object for Object_Connect end record; type Data_Type_Access is access all Data_Type_Record; pragma Convention (C, Data_Type_Access); -- Data passed to the C handler function Convert is new Unchecked_Conversion (Data_Type_Access, System.Address); function Convert is new Unchecked_Conversion (System.Address, Data_Type_Access); procedure Free_Data (Data : Data_Type_Access); pragma Convention (C, Free_Data); -- Free the memory associated with the callback's data procedure First_Marshaller (Closure : GClosure; Return_Value : Glib.Values.GValue; N_Params : Guint; Params : System.Address; Invocation_Hint : System.Address; User_Data : System.Address); pragma Convention (C, First_Marshaller); -- First level marshaller. This is the function that is actually -- called by gtk+. It then calls the Ada functions as required. -- end User_Callback; ------------------------------ -- User_Callback_With_Setup -- ------------------------------ -- This package is basically the same as User_Callback, except that an -- extra function (Setup) is called after a handler has been -- connected. Typical usage is to automatically call Add_Watch (see below) -- in case the User_Type is (or contains) widgets. generic type Widget_Type is new Glib.Object.GObject_Record with private; type User_Type (<>) is private; with procedure Setup (User_Data : User_Type; Id : Handler_Id); package User_Callback_With_Setup is package Internal_Cb is new User_Callback (Widget_Type, User_Type); package Marshallers renames Internal_Cb.Marshallers; subtype Handler is Internal_Cb.Handler; subtype Simple_Handler is Internal_Cb.Simple_Handler; -- Connecting a handler to an object procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); procedure Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; User_Data : User_Type; After : Boolean := False); procedure Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Simple_Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False); pragma Inline (Connect); function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Marsh : Marshallers.Marshaller; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Connect (Widget : access Widget_Type'Class; Name : Glib.Signal_Name; Cb : Handler; User_Data : User_Type; After : Boolean := False) return Handler_Id; function Object_Connect (Widget : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name; Cb : Handler; Slot_Object : access Widget_Type'Class; User_Data : User_Type; After : Boolean := False) return Handler_Id; -- Some convenient functions to create marshallers package Gint_Marshaller renames Internal_Cb.Gint_Marshaller; package Guint_Marshaller renames Internal_Cb.Guint_Marshaller; package Event_Marshaller renames Internal_Cb.Event_Marshaller; package Widget_Marshaller renames Internal_Cb.Widget_Marshaller; package Notebook_Page_Marshaller renames Internal_Cb.Notebook_Page_Marshaller; function To_Marshaller (Cb : Gint_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Guint_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Event_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Widget_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Internal_Cb.Marshallers.Void_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; function To_Marshaller (Cb : Notebook_Page_Marshaller.Handler) return Internal_Cb.Marshallers.Marshaller renames Internal_Cb.To_Marshaller; -- Emitting a signal procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gint) renames Internal_Cb.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Guint) renames Internal_Cb.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gdk.Event.Gdk_Event) renames Internal_Cb.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : access Gtk.Widget.Gtk_Widget_Record'Class) renames Internal_Cb.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name) renames Internal_Cb.Emit_By_Name; procedure Emit_By_Name (Object : access Widget_Type'Class; Name : Glib.Signal_Name; Param : Gtk.Notebook.Gtk_Notebook_Page) renames Internal_Cb.Emit_By_Name; end User_Callback_With_Setup; ------------------------------------------------------------------ -- General functions ------------------------------------------------------------------ procedure Add_Watch (Id : Handler_Id; Object : access Glib.Object.GObject_Record'Class); -- Make sure that when Object is destroyed, the handler Id is also -- destroyed. This function should mostly be used in cases where you use a -- User_Data that is Object. If you don't destroy the callback at the same -- time, then the next time the callback is called it will try to access -- some invalid memory (Object being destroyed), and you will likely get a -- Storage_Error. procedure Disconnect (Object : access Glib.Object.GObject_Record'Class; Id : in out Handler_Id); -- Disconnect the handler identified by the given Handler_Id. procedure Emit_Stop_By_Name (Object : access Glib.Object.GObject_Record'Class; Name : Glib.Signal_Name); -- During a signal emission, invoking this procedure will halt the -- emission. procedure Handler_Block (Obj : access Glib.Object.GObject_Record'Class; Id : Handler_Id); -- Blocks temporily the signal. For each call to this procedure, -- a call to Handler_Unblock must be performed in order to really -- unblock the signal. procedure Handlers_Destroy (Obj : access Glib.Object.GObject_Record'Class); -- Destroys all the handlers associated to the given object. procedure Handler_Unblock (Obj : access Glib.Object.GObject_Record'Class; Id : Handler_Id); -- See Handler_Block. -- end Gtk.Handlers; -- -- -- This example connects the "delete_event" signal to a widget. -- -- The handlers for this signal get an extra argument which is -- -- the Gdk_Event that generated the signal. -- -- with Gtk.Handlers; use Gtk.Handlers; -- with Gtk.Marshallers; use Gtk.Marshallers; -- -- function My_Cb (Widget : access Gtk_Widget_Record'Class; -- Event : Gdk.Event.Gdk_Event) -- return Gint; -- -- your own function -- -- package Return_Widget_Cb is new Gtk.Handlers.Return_Callback -- (Gtk.Widget.Gtk_Widget_Record, Gint); -- -- Return_Widget_Cb.Connect (W, "delete_event", -- Return_Widget_Cb.To_Marshaller (My_Cb'Access)); -- --