Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

What does this error mean and how do I correct this?

55 views
Skip to first unread message

richardthiebaud

unread,
Sep 1, 2023, 5:04:19 PM9/1/23
to
in the following program:

with Gtk.Enums; use Gtk.Enums;
with Gtk.Main;
with Gtk.Window;
with Gdk;
with Gdk.Event;
with Glib;
with Glib.Object;

procedure test1 is
Win : Gtk.Window.Gtk_Window;
function Handler
(Self : access Glib.Object.GObject_Record'Class;
Event : Gdk.Event.Gdk_Event_Button) return Boolean is
begin
Gtk.Main.Main_Quit;
return True;
end Handler;
--
-- defined in gtk-widget.ads
--
-- type Cb_GObject_Gdk_Event_Button_Boolean is not null access function
-- (Self : access Glib.Object.GObject_Record'Class;
-- Event : Gdk.Event.Gdk_Event_Button) return Boolean;

begin -- Gtk.Init;
Gtk.Main.Init;
Gtk.Window.Gtk_New (Window => Win, The_Type =>
Gtk.Enums.Window_Toplevel);
Win.Set_Position (Win_Pos_Center);
Gtk.Window.Set_Title (Window => Win, Title => "Editor");
Gtk.Window.Show_All (Win);
Win.On_Button_Press_Event <------------ line that gets the error
(Call => Handler'Access,
After => False,
Slot => Win);
Gtk.Main.Main;
end test1;

I get the compiler error message:

test1.adb:32:17: subprogram must not be deeper than access type

What does this mean and how can I correct it?

Luke A. Guest

unread,
Sep 1, 2023, 5:41:58 PM9/1/23
to
Handler needs to be in a package you with.

Luke A. Guest

unread,
Sep 1, 2023, 5:44:16 PM9/1/23
to
On 01/09/2023 22:41, Luke A. Guest wrote:
> Handler needs to be in a package you with.
>

>> begin  -- Gtk.Init;
>>     Gtk.Main.Init;
>>     Gtk.Window.Gtk_New (Window => Win, The_Type =>
>> Gtk.Enums.Window_Toplevel);
>>     Win.Set_Position (Win_Pos_Center);
>>     Gtk.Window.Set_Title (Window => Win, Title => "Editor");
>>     Gtk.Window.Show_All (Win);
>>     Win.On_Button_Press_Event     <------------ line that gets the error
>>        (Call =>  Handler'Access,
>>         After => False,
>>         Slot =>  Win);
>>     Gtk.Main.Main;
>> end test1;
>>
>> I get the compiler error message:
>>
>> test1.adb:32:17: subprogram must not be deeper than access type

Ada doesn't like 'access types to be in an area that can go out of scope
iirc. You can get around it with unchecked_access, but if you put
handler into a package of it's own, it's at library level and is
available to grab the access of.

richardthiebaud

unread,
Sep 1, 2023, 6:51:44 PM9/1/23
to
On 9/1/23 17:44, Luke A. Guest wrote:
> On 01/09/2023 22:41, Luke A. Guest wrote:
>> Handler needs to be in a package you with.
>>
>
>>> begin  -- Gtk.Init;
....;
>>>
>>> test1.adb:32:17: subprogram must not be deeper than access type
>
> Ada doesn't like 'access types to be in an area that can go out of scope
> iirc. You can get around it with unchecked_access, but if you put
> handler into a package of it's own, it's at library level and is
> available to grab the access of.
>
That worked, thanks. Under gtkada, must procedures that handle events
always be in their own package?

Simon Wright

unread,
Sep 3, 2023, 10:06:48 AM9/3/23
to
richardthiebaud <thieba...@aol.com> writes:

> Under gtkada, must procedures that handle events always be in their
> own package?

In general, they'd need to be in _a_ package. You could group related
event handlers in a package.

Luke A. Guest

unread,
Sep 3, 2023, 11:22:21 AM9/3/23
to
It's because what is beteen this:

procedure test1 is

and

begin -- test1

is on the stack and therefore not in permanent memory.


Simon Wright

unread,
Sep 3, 2023, 2:44:08 PM9/3/23
to
I mean, if you had handlers for button A press & button A release they
could be grouped in one package. Int might make more sense for button B
event handlers to be grouped in another package. All depends on the
application
0 new messages