From mboxrd@z Thu Jan 1 00:00:00 1970 Path: eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: On_Button_Press_Event in Text_View Date: Wed, 14 Aug 2024 14:03:24 +0200 Organization: A noiseless patient Spider Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Wed, 14 Aug 2024 14:03:24 +0200 (CEST) Injection-Info: dont-email.me; posting-host="3d900c2c11c597f78526ab8206708905"; logging-data="475681"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18oLFaRLYEIjFfTUXwq3lu2lxsvKicjh9I=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:uU9NR8J8RmHD0kj+V+umvPxfjM8= Content-Language: en-US In-Reply-To: Xref: news.eternal-september.org comp.lang.ada:66304 List-Id: 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