diff --git a/lcl/interfaces/gtk/gtkcallback.inc b/lcl/interfaces/gtk/gtkcallback.inc index 7800633a8a..77a810185a 100644 --- a/lcl/interfaces/gtk/gtkcallback.inc +++ b/lcl/interfaces/gtk/gtkcallback.inc @@ -403,7 +403,6 @@ begin LCLMenuItem := TMenuItem(AData); // some sanity checks if LCLMenuItem = nil then Exit; - if not LCLMenuItem.IsCheckItem then Exit; // ??? // the gtk always toggles the check flag // -> restore 'checked' flag if needed diff --git a/lcl/interfaces/gtk/gtkglobals.pp b/lcl/interfaces/gtk/gtkglobals.pp index 61f2563229..68a244f09a 100644 --- a/lcl/interfaces/gtk/gtkglobals.pp +++ b/lcl/interfaces/gtk/gtkglobals.pp @@ -361,7 +361,6 @@ type const OldCheckMenuItemDrawProc: TCheckMenuItemDrawProc = nil; OldMenuSizeRequestProc: TMenuSizeRequestProc = nil; - OldCheckMenuItemToggleSize: integer = 0; { Accelerators } diff --git a/lcl/interfaces/gtk/gtkproc.inc b/lcl/interfaces/gtk/gtkproc.inc index daa004008a..b7b42e48ef 100644 --- a/lcl/interfaces/gtk/gtkproc.inc +++ b/lcl/interfaces/gtk/gtkproc.inc @@ -5964,7 +5964,7 @@ begin MenuItem:=PGtkMenuItem(ListItem^.Data); if GTK_IS_CHECK_MENU_ITEM(PGtkWidget(MenuItem)) then begin CheckMenuItem:=MenuItem; - CurToggleSize:=OldCheckMenuItemToggleSize; + CurToggleSize:=1; LCLMenuItem:=TMenuItem(GetLCLObject(MenuItem)); if LCLMenuItem<>nil then begin IconSize:=LCLMenuItem.GetIconSize(0); @@ -6113,11 +6113,6 @@ var bm_show_toggle_indicator; {$ENDIF} - // set our own draw handler - if OldCheckMenuItemDrawProc = nil then - OldCheckMenuItemDrawProc := CHECK_MENU_ITEM_CLASS(MenuItemWidget)^.draw_indicator; - CHECK_MENU_ITEM_CLASS(MenuItemWidget)^.draw_indicator := @DrawMenuItemIcon; - {$IFNDEF Gtk2} // add a dummy widget for the icon height MinHeightWidget := gtk_label_new(''); diff --git a/lcl/interfaces/gtk/gtkwsmenus.pp b/lcl/interfaces/gtk/gtkwsmenus.pp index 16022ffc74..321eed311b 100644 --- a/lcl/interfaces/gtk/gtkwsmenus.pp +++ b/lcl/interfaces/gtk/gtkwsmenus.pp @@ -170,15 +170,23 @@ begin if GtkWidgetIsA(Widget, GTK_TYPE_CHECK_MENU_ITEM) then begin - // set 'ShowAlwaysCheckable' - gtk_check_menu_item_set_show_toggle(PGtkCheckMenuItem(Widget), - AMenuItem.ShowAlwaysCheckable); + // set 'ShowAlwaysCheckable' (this modifies the always_show_toggle bitfield + // in the private _GtkCheckMenuItem - it used to be modifiable by a function + // call but in Gtk 1.2.9 and 1.2.10 it became a noop, however aside from + // that the rest of the code didn't change + if AMenuItem.ShowAlwaysCheckable then + PGtkCheckMenuItem(Widget)^.flag0:=PGtkCheckMenuItem(Widget)^.flag0 or 2 + else + PGtkCheckMenuItem(Widget)^.flag0:=PGtkCheckMenuItem(Widget)^.flag0 and not 2; // set 'Checked' gtk_check_menu_item_set_active(PGtkCheckMenuItem(Widget), AMenuItem.Checked); - if (OldCheckMenuItemToggleSize=0) then - OldCheckMenuItemToggleSize := MENU_ITEM_CLASS(Widget)^.toggle_size; + // always set our own indicator draw handler to ensure the check box is not + // drawn for non-checkable menu items + if OldCheckMenuItemDrawProc = nil then + OldCheckMenuItemDrawProc := CHECK_MENU_ITEM_CLASS(Widget)^.draw_indicator; + CHECK_MENU_ITEM_CLASS(Widget)^.draw_indicator := @DrawMenuItemIcon; g_signal_connect_after(PGTKObject(Widget), 'toggled', TGTKSignalFunc(@GTKCheckMenuToggeledCB), Pointer(AMenuItem));