cocoa: workaround for a problem with 64-bit boolean parameter passing (see fpc issue #34411 for details)

git-svn-id: trunk@59329 -
This commit is contained in:
dmitry 2018-10-21 03:45:35 +00:00
parent a313fc1796
commit a341d94c64
15 changed files with 158 additions and 6 deletions

View File

@ -16,6 +16,7 @@ unit Cocoa_Extra;
{$mode objfpc}{$H+}
{$modeswitch objectivec1}
{$include cocoadefines.inc}
interface
@ -39,6 +40,23 @@ type
function itemAtIndex(index: NSInteger): NSMenuItem; message 'itemAtIndex:';
end;
{$ifdef BOOLFIX}
ObjCBool = ShortInt; // Matches BOOL declaration in ObjC "signed char"
NSMenuItemFix = objccategory external (NSMenuItem)
procedure setEnabled_(aenabled: ObjCBool); message 'setEnabled:';
procedure setHidden_(ahidden: ObjCBool); message 'setHidden:';
end;
NSControlFix = objccategory external (NSControl)
procedure setEnabled_(aenabled: ObjCBool); message 'setEnabled:';
end;
NSStatusItemFix = objccategory external (NSStatusItem)
procedure setEnabled_(aenabled: ObjCBool); message 'setEnabled:';
end;
{$endif}
NSEdgeInsets = packed record
top : CGFloat;
left : CGFloat;
@ -52,6 +70,9 @@ type
function alignmentRectInsets: NSEdgeInsets; message 'alignmentRectInsets';
function alignmentRectForFrame(ns: NSRect): NSRect; message 'alignmentRectForFrame:';
function frameForAlignmentRect(ns: NSRect): NSRect; message 'frameForAlignmentRect:';
{$ifdef BOOLFIX}
procedure setHidden_(flag: Byte); message 'setHidden:';
{$endif}
end;
NSLayoutConstraint = objcclass external (NSObject)
@ -104,6 +125,9 @@ type
NSTableColumnFix = objccategory external (NSTableColumn)
procedure setTitle(atitle: NSString); message 'setTitle:';
function title: NSString; message 'title';
{$ifdef BOOLFIX}
procedure setHidden_(flag: Byte); message 'setHidden:';
{$endif}
end;
NSUserInterfaceItemIdentifier = NSString;

View File

@ -1,4 +1,16 @@
{%MainUnit cocoaint.pas}
{.$define COCOA_USE_NATIVE_MODAL}
// There's an issue identified with passing boolean parameters.
// with FPC 3.0.4. see: https://bugs.freepascal.org/view.php?id=34411
//
// In short: Boolean is being passed only as 8-bits value, leaving
// other registers untouched. Apple code (compiler) however,
// reads the entire 32-bit value of the register.
// x86_64 ABI is not entirely complete regarding the proper ways
//
// The issue is presumably only for 64-bit platform.
// The workaround is possible! the issue should be fixed in future
// release of FPC, but 3.0.4 is the offical supported by LCL.
{$define BOOLFIX}

View File

@ -265,7 +265,11 @@ begin
end;
dl:=mx-mn;
bar.setEnabled(dl<>0);
{$ifdef BOOLFIX}
bar.setEnabled_(Ord(dl<>0));
{$else}
bar.SetEnabled(dl<>0);
{$endif}
// if changed page or range, the knob changes
if ScrollInfo.fMask and (SIF_RANGE or SIF_PAGE)>0 then

View File

@ -18,6 +18,7 @@ unit CocoaPrivate;
{$modeswitch objectivec1}
{$modeswitch objectivec2}
{$interfaces corba}
{$include cocoadefines.inc}
{.$DEFINE COCOA_DEBUG_SETBOUNDS}
{.$DEFINE COCOA_SPIN_DEBUG}
@ -849,7 +850,11 @@ end;
procedure LCLControlExtension.lclSetEnabled(AEnabled:Boolean);
begin
SetEnabled(AEnabled and ((not Assigned(superview)) or (superview.lclisEnabled)) );
{$ifdef BOOLFIX}
SetEnabled_( Ord(AEnabled and ((not Assigned(superview)) or (superview.lclisEnabled))) );
{$else}
SetEnabled( AEnabled and ((not Assigned(superview)) or (superview.lclisEnabled)) );
{$endif}
inherited lclSetEnabled(AEnabled);
end;
@ -891,7 +896,11 @@ begin
if not Assigned(Result) then
Exit;
{$ifdef BOOLFIX}
setHidden_(Ord(AParams.Style and WS_VISIBLE = 0));
{$else}
setHidden(AParams.Style and WS_VISIBLE = 0);
{$endif}
if Assigned(p) then
p.lclContentView.addSubview(Result);
@ -921,7 +930,11 @@ end;
procedure LCLViewExtension.lclSetVisible(AVisible: Boolean);
begin
{$ifdef BOOLFIX}
setHidden_(Ord(not AVisible));
{$else}
setHidden(not AVisible);
{$endif}
{$IFDEF COCOA_DEBUG_SETBOUNDS}
WriteLn(Format('LCLViewExtension.lclSetVisible: %s AVisible=%d',
[NSStringToString(Self.ClassName), Integer(AVisible)]));

View File

@ -18,6 +18,7 @@ unit CocoaScrollers;
{$modeswitch objectivec1}
{$modeswitch objectivec2}
{$interfaces corba}
{$include cocoadefines.inc}
interface
@ -325,8 +326,13 @@ procedure allocScroller(parent: TCocoaManualScrollView; var sc: NSScroller; dst:
begin
sc:=TCocoaScrollBar(TCocoaScrollBar.alloc).initWithFrame(dst);
parent.addSubview(sc);
{$ifdef BOOLFIX}
sc.setEnabled_(Ord(true));
sc.setHidden_(Ord(not AVisible));
{$else}
sc.setEnabled(true);
sc.setHidden(not AVisible);
{$endif}
TCocoaScrollBar(sc).preventBlock := true;
//Suppress scrollers notifications.
TCocoaScrollBar(sc).callback := parent.callback;
@ -399,13 +405,21 @@ begin
if fvscroll.isHidden then
begin
{$ifdef BOOLFIX}
fvscroll.setHidden_(Ord(false));
{$else}
fvscroll.setHidden(false);
{$endif}
ch := true;
end;
end
else if Assigned(fvscroll) and not fvscroll.isHidden then
begin
{$ifdef BOOLFIX}
fvscroll.setHidden_(Ord(true));
{$else}
fvscroll.setHidden(true);
{$endif}
ch := true;
end;
if ch then
@ -429,13 +443,21 @@ begin
end;
if fhscroll.isHidden then
begin
{$ifdef BOOLFIX}
fhscroll.setHidden_(Ord(false));
{$else}
fhscroll.setHidden(false);
{$endif}
ch := true;
end;
end
else if Assigned(fhscroll) and (not fhscroll.isHidden) then
begin
{$ifdef BOOLFIX}
fhscroll.setHidden_(Ord(true));
{$else}
fhscroll.setHidden(true);
{$endif}
ch := true;
end;

View File

@ -18,6 +18,7 @@ unit CocoaTabControls;
{$modeswitch objectivec1}
{$modeswitch objectivec2}
{$interfaces corba}
{$include cocoadefines.inc}
interface
@ -288,9 +289,17 @@ var
begin
ReviseTabs(aview, showPrev, showNExt);
if Assigned(aview.prevarr) then
{$ifdef BOOLFIX}
aview.prevarr.setHidden_(Ord(not showPrev));
{$else}
aview.prevarr.setHidden(not showPrev);
{$endif}
if Assigned(aview.nextarr) then
{$ifdef BOOLFIX}
aview.nextarr.setHidden_(Ord(not showNext));
{$else}
aview.nextarr.setHidden(not showNext);
{$endif}
end;
function IndexOfTab(ahost: TCocoaTabControl; atab: NSTabViewItem): Integer;

View File

@ -18,6 +18,7 @@ unit CocoaTables;
{$modeswitch objectivec1}
{$modeswitch objectivec2}
{$interfaces corba}
{$include cocoadefines.inc}
{.$DEFINE COCOA_DEBUG_LISTVIEW}
@ -981,14 +982,22 @@ end;
procedure TCocoaTableListItem.setImage(AImage: NSImage);
begin
imageSubView.setImage(AImage);
{$ifdef BOOLFIX}
imageSubView.setHidden_(Ord(AImage = nil));
{$else}
imageSubView.setHidden(AImage = nil);
{$endif}
resizeSubviewsWithOldSize(GetNSSize(column.width, column.tableView.rowHeight));
end;
procedure TCocoaTableListItem.setCheckState(AState: NSInteger);
begin
checkedSubView.setState(AState);
{$ifdef BOOLFIX}
checkedSubView.setHidden_(Ord(AState = -1));
{$else}
checkedSubView.setHidden(AState = -1);
{$endif}
resizeSubviewsWithOldSize(GetNSSize(column.width, column.tableView.rowHeight));
end;

View File

@ -18,6 +18,7 @@ unit CocoaTextEdits;
{$modeswitch objectivec1}
{$modeswitch objectivec2}
{$interfaces corba}
{$include cocoadefines.inc}
{.$DEFINE COCOA_DEBUG_SETBOUNDS}
{.$DEFINE COCOA_SPIN_DEBUG}
@ -1810,7 +1811,11 @@ end;
procedure TCocoaSpinEdit.lclSetVisible(AVisible: Boolean);
begin
inherited lclSetVisible(AVisible);
{$ifdef BOOLFIX}
Stepper.setHidden_(Ord(not AVisible));
{$else}
Stepper.setHidden(not AVisible);
{$endif}
end;
procedure TCocoaSpinEdit.lclSetFrame(const r: TRect);

View File

@ -92,7 +92,11 @@ begin
StatusItemHandle.lclSetTrayIcon(ATrayIcon);
statusitem.setHighlightMode(True);
{$ifdef BOOLFIX}
statusitem.setEnabled_(Ord(True));
{$else}
statusitem.setEnabled(True);
{$endif}
Result := True;

View File

@ -18,6 +18,7 @@ unit CocoaWindows;
{$modeswitch objectivec1}
{$modeswitch objectivec2}
{$interfaces corba}
{$include cocoadefines.inc}
interface
@ -518,7 +519,11 @@ var
begin
if isembedded then
begin
{$ifdef BOOLFIX}
inherited setHidden_(Ord(aisHidden));
{$else}
inherited setHidden(aisHidden);
{$endif}
end
else
begin

View File

@ -4,6 +4,7 @@ interface
{$mode delphi}
{$modeswitch objectivec1}
{$include cocoadefines.inc}
{.$DEFINE COCOA_DEBUG_TABCONTROL}
{.$DEFINE COCOA_DEBUG_LISTVIEW}
@ -989,8 +990,11 @@ var
lNSColumn: NSTableColumn;
begin
if not CheckColumnParams(lTableLV, lNSColumn, ALV, AIndex) then Exit;
{$ifdef BOOLFIX}
lNSColumn.setHidden_(Ord(not AVisible));
{$else}
lNSColumn.setHidden(not AVisible);
{$endif}
end;
class procedure TCocoaWSCustomListView.ItemDelete(const ALV: TCustomListView;

View File

@ -2,6 +2,7 @@ unit CocoaWSCommon;
{$mode objfpc}{$H+}
{$modeswitch objectivec1}
{$include cocoadefines.inc}
{.$DEFINE COCOA_DEBUG_SETBOUNDS}
interface
@ -185,11 +186,19 @@ begin
Result := TCocoaScrollView.alloc.initWithFrame(NSNullRect);
if Assigned(p) then p.addSubView(Result);
Result.lclSetFrame(r);
{$ifdef BOOLFIX}
Result.setHidden_(Ord(AView.isHidden));
{$else}
Result.setHidden(AView.isHidden);
{$endif}
Result.setDocumentView(AView);
Result.setDrawsBackground(false); // everything is covered anyway
if AReleaseView then AView.release;
{$ifdef BOOLFIX}
AView.setHidden_(Ord(false));
{$else}
AView.setHidden(false);
{$endif}
SetViewDefaults(Result);
end;
@ -208,9 +217,17 @@ begin
Result := TCocoaManualScrollView.alloc.initWithFrame(NSNullRect);
if Assigned(p) then p.addSubView(Result);
Result.lclSetFrame(r);
{$ifdef BOOLFIX}
Result.setHidden_(Ord(AView.isHidden));
{$else}
Result.setHidden(AView.isHidden);
{$endif}
Result.setDocumentView(AView);
{$ifdef BOOLFIX}
AView.setHidden_(Ord(false));
{$else}
AView.setHidden(false);
{$endif}
SetViewDefaults(Result);
if AView.isKindOfClass(TCocoaCustomControl) then
TCocoaCustomControl(AView).auxMouseByParent := true;

View File

@ -18,6 +18,7 @@ unit CocoaWSExtCtrls;
{$mode delphi}
{$modeswitch objectivec1}
{$include cocoadefines.inc}
interface
@ -29,7 +30,8 @@ uses
// widgetset
WSExtCtrls, WSLCLClasses, WSControls, WSProc,
// LCL Cocoa
CocoaPrivate, CocoaWSMenus, CocoaWSCommon, CocoaGDIObjects, CocoaScrollers;
CocoaPrivate, CocoaWSMenus, CocoaWSCommon, CocoaGDIObjects, CocoaScrollers
,Cocoa_Extra;
type

View File

@ -522,8 +522,13 @@ class procedure TCocoaWSCustomForm.UpdateWindowIcons(AWindow: NSWindow;
Btn := AWindow.standardWindowButton(AButton);
if Assigned(Btn) then
begin
{$ifdef BOOLFIX}
Btn.setHidden_(Ord(not AVisible));
Btn.setEnabled_(Ord(AEnabled));
{$else}
Btn.setHidden(not AVisible);
Btn.setEnabled(AEnabled);
{$endif}
end;
end;

View File

@ -33,6 +33,7 @@ uses
// Widgetset
WSMenus, WSLCLClasses,
// LCL Cocoa
Cocoa_extra,
CocoaPrivate, CocoaWSCommon, CocoaUtils, CocoaGDIObjects;
type
@ -544,7 +545,11 @@ begin
TCocoaMenuItem(item).menuItemCallback:=TLCLMenuItemCallback.Create(item, AMenuItem);
// initial set of properties
{$ifdef BOOLFIX}
item.setEnabled_(Ord(AMenuItem.Enabled));
{$else}
item.setEnabled(AMenuItem.Enabled);
{$endif}
Do_SetCheck(item, AMenuItem.Checked);
if AMenuItem.HasIcon and ((AMenuItem.ImageIndex>=0) or (AMenuItem.HasBitmap)) then
@ -640,7 +645,11 @@ class procedure TCocoaWSMenuItem.SetVisible(const AMenuItem: TMenuItem;
const Visible: boolean);
begin
if not Assigned(AMenuItem) or (AMenuItem.Handle=0) then Exit;
{$ifdef BOOLFIX}
NSMenuItem(AMenuItem.Handle).setHidden_( Ord(not Visible) );
{$else}
NSMenuItem(AMenuItem.Handle).setHidden( not Visible );
{$endif}
end;
{------------------------------------------------------------------------------
@ -679,7 +688,11 @@ class function TCocoaWSMenuItem.SetEnable(const AMenuItem: TMenuItem;
begin
Result:=Assigned(AMenuItem) and (AMenuItem.Handle<>0);
if not Result then Exit;
{$ifdef BOOLFIX}
NSMenuItem(AMenuItem.Handle).setEnabled_( Ord(Enabled) );
{$else}
NSMenuItem(AMenuItem.Handle).setEnabled( Enabled );
{$endif}
end;
{------------------------------------------------------------------------------
@ -810,7 +823,11 @@ begin
enb := not Assigned(TCocoaMenuItem(it).FMenuItemTarget)
or ( TCocoaMenuItem(it).FMenuItemTarget.Enabled );
end;
{$ifdef BOOLFIX}
it.setEnabled_( Ord(enb));
{$else}
it.setEnabled(enb);
{$endif}
if (it.hasSubmenu) then
begin
ToggleAppNSMenu(it.submenu, ALogicalEnabled);