gtk2 intf: menu items, radioitem: not send LM_ACTIVATE when unchecking, bug #13733

git-svn-id: trunk@20015 -
This commit is contained in:
mattias 2009-05-17 20:03:07 +00:00
parent a12ca5ce2a
commit 6383c1a4a7

View File

@ -30,7 +30,7 @@ uses
glib2, gdk2pixbuf, gdk2, gtk2, Pango, glib2, gdk2pixbuf, gdk2, gtk2, Pango,
GtkInt, GtkProc, GtkGlobals, GtkDef, GtkExtra, GtkInt, GtkProc, GtkGlobals, GtkDef, GtkExtra,
Classes, InterfaceBase, Types, LCLProc, LCLType, WSMenus, WSLCLClasses, Classes, InterfaceBase, Types, LCLProc, LCLType, WSMenus, WSLCLClasses,
Graphics, Menus, Forms, LCLIntf; LMessages, Graphics, Menus, Forms, LCLIntf;
type type
@ -77,6 +77,66 @@ implementation
{$I gtkdefines.inc} {$I gtkdefines.inc}
function Gtk2MenuItemActivate(widget: PGtkWidget; data: gPointer) : GBoolean; cdecl;
var
Mess: TLMActivate;
LCLMenuItem: TMenuItem;
begin
Result:= True;
{$IFDEF EventTrace}
EventTrace('activate', data);
{$ENDIF}
ResetDefaultIMContext;
if LockOnChange(PgtkObject(Widget),0) > 0 then Exit;
LCLMenuItem := TMenuItem(Data);
// the gtk fires toggle for radio buttons when unchecking them
// the LCL expects only uncheck to check changes
if LCLMenuItem.RadioItem
and GtkWidgetIsA(Widget, GTK_TYPE_CHECK_MENU_ITEM)
and (not gtk_check_menu_item_get_active(PGTKCheckMenuItem(Widget))) then Exit;
FillChar(Mess,SizeOf(Mess),#0);
Mess.Msg := LM_ACTIVATE;
Mess.Active:=true;
Mess.Minimized:=false;
Mess.ActiveWindow:=0;
Mess.Result := 0;
DeliverMessage(Data, Mess);
Result := CallBackDefaultReturn;
end;
function Gtk2MenuItemToggled(AMenuItem: PGTKCheckMenuItem;
AData: gPointer): GBoolean; cdecl;
// AData --> LCLMenuItem
var
LCLMenuItem: TMenuItem;
begin
Result := CallBackDefaultReturn;
{$IFDEF EventTrace}
EventTrace('toggled', AData);
{$ENDIF}
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
if gtk_check_menu_item_get_active(AMenuItem) = LCLMenuItem.Checked then Exit;
if LCLMenuItem.AutoCheck then Exit;
// restore it
LockOnChange(PgtkObject(AMenuItem), +1);
gtk_check_menu_item_set_active(AMenuItem, LCLMenuItem.Checked);
LockOnChange(PgtkObject(AMenuItem), -1);
end;
function Gtk2MenuItemSelect(item: Pointer; AMenuItem: TMenuItem): GBoolean; cdecl; function Gtk2MenuItemSelect(item: Pointer; AMenuItem: TMenuItem): GBoolean; cdecl;
begin begin
AMenuItem.IntfDoSelect; AMenuItem.IntfDoSelect;
@ -96,7 +156,7 @@ class procedure TGtk2WSMenuItem.SetCallbacks(const AGtkWidget: PGtkWidget;
begin begin
// connect activate signal (i.e. clicked) // connect activate signal (i.e. clicked)
g_signal_connect(PGTKObject(AGtkWidget), 'activate', g_signal_connect(PGTKObject(AGtkWidget), 'activate',
TGTKSignalFunc(@gtkactivateCB), AWidgetInfo^.LCLObject); TGTKSignalFunc(@Gtk2MenuItemActivate), AWidgetInfo^.LCLObject);
g_signal_connect(PGTKObject(AGtkWidget), 'select', g_signal_connect(PGTKObject(AGtkWidget), 'select',
TGTKSignalFunc(@Gtk2MenuItemSelect), AWidgetInfo^.LCLObject); TGTKSignalFunc(@Gtk2MenuItemSelect), AWidgetInfo^.LCLObject);
g_signal_connect(PGTKObject(AGtkWidget), 'deselect', g_signal_connect(PGTKObject(AGtkWidget), 'deselect',
@ -189,6 +249,7 @@ begin
if GtkWidgetIsA(Widget, GTK_TYPE_CHECK_MENU_ITEM) then if GtkWidgetIsA(Widget, GTK_TYPE_CHECK_MENU_ITEM) then
begin begin
// check or radio
// set 'ShowAlwaysCheckable' // set 'ShowAlwaysCheckable'
gtk_check_menu_item_set_show_toggle(PGtkCheckMenuItem(Widget), gtk_check_menu_item_set_show_toggle(PGtkCheckMenuItem(Widget),
AMenuItem.ShowAlwaysCheckable); AMenuItem.ShowAlwaysCheckable);
@ -198,17 +259,18 @@ begin
if (OldCheckMenuItemToggleSize=0) then if (OldCheckMenuItemToggleSize=0) then
begin begin
gtk_menu_item_toggle_size_request(GTK_MENU_ITEM(Widget), @OldCheckMenuItemToggleSize); gtk_menu_item_toggle_size_request(GTK_MENU_ITEM(Widget),
@OldCheckMenuItemToggleSize);
OldCheckMenuItemToggleSize := GTK_MENU_ITEM(Widget)^.toggle_size; OldCheckMenuItemToggleSize := GTK_MENU_ITEM(Widget)^.toggle_size;
end; end;
g_signal_connect_after(PGTKObject(Widget), 'toggled', g_signal_connect_after(PGTKObject(Widget), 'toggled',
TGTKSignalFunc(@GTKCheckMenuToggeledCB), Pointer(AMenuItem)); TGTKSignalFunc(@Gtk2MenuItemToggled), Pointer(AMenuItem));
end; end;
// set attributes (enabled and rightjustify) // set attributes (enabled and rightjustify)
gtk_widget_set_sensitive(Widget, gtk_widget_set_sensitive(Widget,
AMenuItem.Enabled and (AMenuItem.Caption <> cLineCaption)); AMenuItem.Enabled and (AMenuItem.Caption <> cLineCaption));
if AMenuItem.RightJustify then if AMenuItem.RightJustify then
gtk_menu_item_right_justify(PGtkMenuItem(Widget)); gtk_menu_item_right_justify(PGtkMenuItem(Widget));