I encounter a strange error when toggling menu items. If I uncheck one menu item and check another within a single function, and then close the form, I get an error in a GTK unit, gtk3procs.pas. Steps: Start the project in debug mode, click on miProgramLanguageNL, and then on miProgramQuitClick. This results in an External SIGSEGV.
The function that is hanging is:
function Gtk3IsWidget(AWidget: PGObject): GBoolean;
begin
Result := (AWidget <> nil) and g_type_check_instance_is_a(PGTypeInstance(AWidget), gtk_widget_get_type);
end;
I can reproduce this in my current installation, which is a version 4.99 build from a few weeks ago:
Lazarus 4.99 (rev main_4_99-5296-g59d772891f) FPC 3.2.3 x86_64-linux-gtk3
Just to be sure, I also installed today's version 4.99 (29-08-16:00), and I can reproduce it there as well.
Lazarus 4.99 (rev main_4_99-5413-gead27eaeba) FPC 3.2.3 x86_64-linux-gtk3
I also installed Lazarus 4.8 with GTK2; I cannot reproduce the error there.
I use Ubuntu 26.04.
See the attachment or, alternatively, the code below.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Menus;
type
{ TForm1 }
TForm1 = class(TForm)
MainMenu1: TMainMenu;
miProgramQuit: TMenuItem;
miProgramLanguageNL: TMenuItem;
miProgramLanguageEN: TMenuItem;
miProgramLanguage: TMenuItem;
miProgram: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure miProgramLanguageENClick(Sender: TObject);
procedure miProgramLanguageNLClick(Sender: TObject);
procedure miProgramQuitClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
miProgramLanguageEN.Checked:= True;
end;
procedure TForm1.miProgramLanguageENClick(Sender: TObject);
begin
if not miProgramLanguageEN.Checked then begin
miProgramLanguageEN.Checked:= True;
miProgramLanguageNL.Checked:= False;
end;
end;
procedure TForm1.miProgramLanguageNLClick(Sender: TObject);
begin
if not miProgramLanguageNL.Checked then begin
miProgramLanguageNL.Checked:= True;
miProgramLanguageEN.Checked:= False;
end;
end;
procedure TForm1.miProgramQuitClick(Sender: TObject);
begin
Close;
end;
end.
Edit:I have filed a report:
https://gitlab.com/freepascal.org/lazarus/lazarus/-/work_items/42555And 7 hours later, it's already been fixed in Lazarus 4.99. Awesome. Thanks zeljko.