mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-19 01:29:31 +02:00
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:
parent
a313fc1796
commit
a341d94c64
@ -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;
|
||||
|
@ -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}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)]));
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -92,7 +92,11 @@ begin
|
||||
StatusItemHandle.lclSetTrayIcon(ATrayIcon);
|
||||
|
||||
statusitem.setHighlightMode(True);
|
||||
{$ifdef BOOLFIX}
|
||||
statusitem.setEnabled_(Ord(True));
|
||||
{$else}
|
||||
statusitem.setEnabled(True);
|
||||
{$endif}
|
||||
|
||||
Result := True;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user