From mboxrd@z Thu Jan 1 00:00:00 1970 Path: eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Gavin McCord Newsgroups: comp.lang.ada Subject: Re: On_Button_Press_Event in Text_View Date: Wed, 14 Aug 2024 14:34:13 -0000 (UTC) Organization: A noiseless patient Spider Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Date: Wed, 14 Aug 2024 16:34:13 +0200 (CEST) Injection-Info: dont-email.me; posting-host="81ca7a3dbddd0929ae84069da7fe8b0f"; logging-data="491828"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/IBX+bIsIQAvcpDVqTUb2IcqdVaUFspMgh7mXUuD+UgQ==" User-Agent: Pan/0.149 (Bellevue; 4c157ba git@gitlab.gnome.org:GNOME/pan.git) Cancel-Lock: sha1:7zX8YwT4qiPijFFY+QeO3dEzHzA= Xref: news.eternal-september.org comp.lang.ada:66305 List-Id: On Wed, 14 Aug 2024 14:03:24 +0200, Dmitry A. Kazakov wrote: > 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; I've got it working now. Get_Event_Type (Event) is what I needed. Thank you again for all your help. Gavin