• Re: On_Button_Press_Event in Text_View

    From Dmitry A. Kazakov@21:1/5 to Gavin McCord on Tue Aug 13 22:29:59 2024
    On 2024-08-13 13:37, Gavin McCord wrote:

    I have a custom handler used when I update the Text_Buffer:

    Button_Callback.Connect
    (Update_Button, "clicked", Update_Clicked'Access,
    Buffer_To_Pass);

    That works fine so I was imagining something similar might
    be possible, but I've run through various permuations of
    records and access types but not yet got a working callback.

    Any help gratefully received (I can post the full code if
    that's useful).

    Something like this:

    package Event_Handlers is
    new Gtk.Handlers.User_Return_Callback
    ( GObject_Record,
    Boolean,
    User_Data_Type
    );


    function On_Button_Press
    ( Object : access GObject_Record'Class;
    Event : Gdk_Event;
    Data : User_Data_Type
    ) return Boolean;


    View.Set_Events (View.Get_Events or Button_Press_Mask);
    Event_Handlers.Connect
    ( View,
    "button-press-event",
    Event_Handlers.To_Marshaller (On_Button_Press'Access),
    Data
    );

    --
    Regards,
    Dmitry A. Kazakov
    http://www.dmitry-kazakov.de

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Dmitry A. Kazakov@21:1/5 to Gavin McCord on Wed Aug 14 14:03:24 2024
    On 2024-08-14 13:42, Gavin McCord wrote:
    On Tue, 13 Aug 2024 22:29:59 +0200, Dmitry A. Kazakov wrote:

    On 2024-08-13 13:37, Gavin McCord wrote:

    I have a custom handler used when I update the Text_Buffer:

    Button_Callback.Connect
    (Update_Button, "clicked", Update_Clicked'Access,
    Buffer_To_Pass);

    That works fine so I was imagining something similar might be possible,
    but I've run through various permuations of records and access types
    but not yet got a working callback.

    Any help gratefully received (I can post the full code if that's
    useful).

    Something like this:

    package Event_Handlers is
    new Gtk.Handlers.User_Return_Callback
    ( GObject_Record,
    Boolean, User_Data_Type
    );


    function On_Button_Press
    ( Object : access GObject_Record'Class;
    Event : Gdk_Event; Data : User_Data_Type
    ) return Boolean;


    View.Set_Events (View.Get_Events or Button_Press_Mask);
    Event_Handlers.Connect ( View,
    "button-press-event",
    Event_Handlers.To_Marshaller (On_Button_Press'Access),
    Data
    );

    Thank you. That allows me to pass a record of the buffer.

    As a general advice. Usually you have a custom widget derived from Gtk_Grid_Record servicing as the main window.

    type Main_Window_Record is new Gtk_Grid_Record with record
    Button : Gtk_Button;
    Text_View : Gtk_Text_View;
    Buffer : Gtk_Text_Buffer;
    ...
    type Main_Window is access all Main_Window_Record'Class;

    Main_Window you pass to all handlers, so that you always have a full
    context in any of them.

    There's only one other thing.

    If I try to check the Event I get another error, such as

    function On_Button_Press
    [skipped lines]

    if Event.The_Type = Gdk_2button_Press then
    Put_Line ("double-click");
    end if;

    Attempting to compile that gives me

    error: cannot reference discriminant of unchecked union

    case Get_Event_Type (Event) is
    when Button_Press =>
    ...
    when Gdk_2Button_Press | Gdk_3Button_Press =>
    ...
    when Key_Press =>
    case Get_Key_Val (Event) is
    when GDK_Up | GDK_KP_Up =>
    ...
    when GDK_Down | GDK_KP_Down =>
    ...
    end case;
    ...
    when others =>
    ...
    end case;

    --
    Regards,
    Dmitry A. Kazakov
    http://www.dmitry-kazakov.de

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