Code: Select all
;---------------------------------------------------------
; Danilo Krahn, 2021/01/17, PB 5.72 (x64), macOS 11.1
;---------------------------------------------------------
EnableExplicit
;---------------------------------------------------------
; Required Structures & Types
;
Macro NSInteger : i : EndMacro
Structure NSOperatingSystemVersion
majorVersion.NSInteger
minorVersion.NSInteger
patchVersion.NSInteger
EndStructure
Structure NSEdgeInsets
top.d
left.d
bottom.d
right.d
EndStructure
;
; End Required Structures & Types
;---------------------------------------------------------
;---------------------------------------------------------
; OS Version Info
;
Procedure.i isOperatingSystemAtLeastVersion(majorVersion, minorVersion, patchVersion)
Protected returnValue
Protected processInfo = CocoaMessage(0,0,"NSProcessInfo new")
If processInfo
Protected v.NSOperatingSystemVersion
v\majorVersion = majorVersion
v\minorVersion = minorVersion
v\patchVersion = patchVersion
returnValue = CocoaMessage(0,processInfo,"isOperatingSystemAtLeastVersion:@",@v)
CocoaMessage(0,processInfo,"dealloc")
EndIf
ProcedureReturn returnValue
EndProcedure
Procedure.i GetOperatingSystemVersion(*v.NSOperatingSystemVersion)
If Not *v : ProcedureReturn 0 : EndIf
Protected processInfo = CocoaMessage(0,0,"NSProcessInfo new")
If processInfo
Protected v.NSOperatingSystemVersion
CocoaMessage(@v,processInfo,"operatingSystemVersion")
*v\majorVersion = v\majorVersion
*v\minorVersion = v\minorVersion
*v\patchVersion = v\patchVersion
CocoaMessage(0,processInfo,"dealloc")
Else
ProcedureReturn 0
EndIf
ProcedureReturn 1
EndProcedure
;
; End OS Version Info
;---------------------------------------------------------
;---------------------------------------------------------
; Scintilla macOS patch for PureBasic
;
; original patch:
; - https://sourceforge.net/p/scintilla/code/ci/b428bfb5a7303838f7ac28c941c99e73140cb786/
;
Global NewMap __Scintilla_tile_procs.i()
Global __Scintilla_tile_callback
ProcedureC Scintilla_scrollView_contentView_tile(*self, selector)
Protected proc = __Scintilla_tile_procs(Hex(*self))
If Not proc
ProcedureReturn
EndIf
CallCFunctionFast(proc,*self,selector)
If isOperatingSystemAtLeastVersion(10,14,0)
Protected verticalRulerView, frame.NSRect, thickness.d
Protected contentView = CocoaMessage(0,*self,"contentView")
If contentView
CocoaMessage(@frame,contentView,"frame")
verticalRulerView = CocoaMessage(0,*self,"verticalRulerView")
CocoaMessage(@thickness,verticalRulerView,"requiredThickness")
frame\origin\x = thickness
frame\size\width - thickness
CocoaMessage(0,contentView,"setFrame:@",@frame)
EndIf
EndIf
EndProcedure
Procedure ScintillaFix(ScintillaID)
Protected scintilla, *scrollView, *scrollView_Ivar, contentView
CocoaMessage(@scintilla, ScintillaID, "superclass")
If scintilla
*scrollView_Ivar = class_getInstanceVariable_(scintilla,"scrollView")
If *scrollView_Ivar
*scrollView = object_getIvar_(ScintillaID,*scrollView_Ivar)
If *scrollView
contentView = CocoaMessage(0,*scrollView,"contentView")
If contentView
If isOperatingSystemAtLeastVersion(10,14,0)
CocoaMessage(0,contentView,"setAutomaticallyAdjustsContentInsets:",0)
Protected insets.NSEdgeInsets
CocoaMessage(0,contentView,"setContentInsets:@",@insets)
If Not FindMapElement(__Scintilla_tile_procs(),Hex(*scrollView)) ; already patched?
If Not __Scintilla_tile_callback ; only 1st time we replace the "tile" method
__Scintilla_tile_callback = class_replaceMethod_(object_getClass_(*scrollView), sel_registerName_("tile"), @Scintilla_scrollView_contentView_tile(), "v@:")
EndIf
__Scintilla_tile_procs(Hex(*scrollView)) = __Scintilla_tile_callback ; add this *scrollview to the map
EndIf
;CocoaMessage(0,contentView,"setNeedsDisplay:",1)
;CocoaMessage(0,*scrollView,"setNeedsDisplay:",1)
EndIf
EndIf
EndIf
EndIf
EndIf
EndProcedure
;
; End Scintilla macOS patch
;---------------------------------------------------------
;---------------------------------------------------------
; Example
;
ProcedureC ScintillaCallback(Gadget, *scinotify.SCNotification)
ProcedureReturn 0
EndProcedure
Define v.NSOperatingSystemVersion
If GetOperatingSystemVersion(@v)
Debug "macOS Version: " + v\majorVersion +
"." + v\minorVersion +
"." + v\patchVersion
EndIf
If OpenWindow(0, 0, 0, 800, 600, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
If InitScintilla()
ScintillaGadget(0, 10, 10, 780, 280, @ScintillaCallback())
ScintillaGadget(1, 10, 300, 780, 290, @ScintillaCallback())
ScintillaFix(GadgetID(0))
ScintillaFix(GadgetID(1))
Define g, i, line$, *utf8
For g = 0 To 1
For i = 1 To 200
line$ = "Scintilla("+g+") Text on line "+RSet(Str(i),3)+"....................................yes!"+Chr(10)
*utf8=UTF8(line$)
ScintillaSendMessage(g, #SCI_APPENDTEXT, Len(line$), *utf8)
FreeMemory(*utf8)
Next
ScintillaSendMessage(g, #SCI_SETMARGINWIDTHN, 0, 40+g*20)
ScintillaSendMessage(g, #SCI_STYLESETBACK, #STYLE_LINENUMBER, RGB($80+g*$40,$80+g*$40,$80))
ScintillaSendMessage(g, #SCI_SETMARGINWIDTHN, 1, 5)
Next
Repeat
Select WaitWindowEvent()
Case #PB_Event_SizeWindow
ResizeGadget(0,10, 10,WindowWidth(0)-20,WindowHeight(0)*0.5-20)
ResizeGadget(1,10,WindowHeight(0)*0.5,WindowWidth(0)-20,WindowHeight(0)*0.5-10)
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
EndIf
EndIf
;
; End Example
;---------------------------------------------------------