Merge branch 'gtk1-fix-menu-drawing' into 'main'

LCL-GTK1: Fix menu item drawing for menus without icons

See merge request freepascal.org/lazarus/lazarus!254
This commit is contained in:
Maxim Ganetsky 2023-11-30 17:58:24 +00:00
commit de4dd6bb5d
4 changed files with 14 additions and 13 deletions

View File

@ -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

View File

@ -361,7 +361,6 @@ type
const
OldCheckMenuItemDrawProc: TCheckMenuItemDrawProc = nil;
OldMenuSizeRequestProc: TMenuSizeRequestProc = nil;
OldCheckMenuItemToggleSize: integer = 0;
{ Accelerators }

View File

@ -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('');

View File

@ -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));