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

    From richardthiebaud@21:1/5 to All on Fri Sep 1 17:04:16 2023
    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?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luke A. Guest@21:1/5 to Luke A. Guest on Fri Sep 1 22:44:13 2023
    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.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luke A. Guest@21:1/5 to richardthiebaud on Fri Sep 1 22:41:54 2023
    Handler needs to be in a package you with.

    On 01/09/2023 22:04, richardthiebaud wrote:
    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?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From richardthiebaud@21:1/5 to Luke A. Guest on Fri Sep 1 18:51:40 2023
    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?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon Wright@21:1/5 to richardthiebaud on Sun Sep 3 15:06:45 2023
    richardthiebaud <thiebauddick2@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.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Luke A. Guest@21:1/5 to Simon Wright on Sun Sep 3 16:22:17 2023
    On 03/09/2023 15:06, Simon Wright wrote:
    richardthiebaud <thiebauddick2@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.

    It's because what is beteen this:

    procedure test1 is

    and

    begin -- test1

    is on the stack and therefore not in permanent memory.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon Wright@21:1/5 to Simon Wright on Sun Sep 3 19:44:04 2023
    Simon Wright <simon@pushface.org> writes:

    richardthiebaud <thiebauddick2@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.

    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)