CanvasGadget and OSX Darkmode

Mac OSX specific forum
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

CanvasGadget and OSX Darkmode

Post by mk-soft »

Some gadgets are transparent.

I think is not a Bug from Purebasic , but a problem with macOS Mojave in Darkmode and the CanvasGadget.

Code: Select all

;-TOP

; Workaround PB v5.62
; Version : v1.1
; Create  : 24.08.2018
; Update  : 15.12.2018

; -----------------------------------------------------------------------------

;- Global

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_MacOS
    ;TODO
    
  CompilerCase #PB_OS_Windows
    ;TODO
    
  CompilerCase #PB_OS_Linux
    ; Ubuntu compiler bug
    ImportC "-no-pie" : EndImport
    
CompilerEndSelect

; -----------------------------------------------------------------------------

;- Begin Module

DeclareModule Workaround
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS
      
      Declare FixResizeGadget(Gadget, x, y, width, height)
      
      Macro ResizeGadget(Gadget, x, y, width, height)
        FixResizeGadget(Gadget, x, y, width, height)
      EndMacro
      
    CompilerCase #PB_OS_Windows
      ;TODO
      
    CompilerCase #PB_OS_Linux
      ;TODO
      
  CompilerEndSelect
  
EndDeclareModule

;----

Module Workaround
  
  EnableExplicit
  
  Macro PB(Function)
    Function
  EndMacro
  
  CompilerSelect #PB_Compiler_OS
      
    CompilerCase #PB_OS_MacOS
      
      ; Link https://www.purebasic.fr/english/viewtopic.php?f=24&t=71269
      ; Canvas Gadget Container Bugfix
      Procedure FixResizeGadget(Gadget, x, y, width, height)
        Protected rect.NSRect, sv, container
        PB(ResizeGadget)(Gadget, x, y, width, height)
        If GadgetType(Gadget) <> #PB_GadgetType_Canvas
          ProcedureReturn 1
        EndIf
        sv = CocoaMessage(0, GadgetID(Gadget), "subviews")
        If CocoaMessage(0, sv, "count")
          container = CocoaMessage(0, sv, "objectAtIndex:", 0)
          If container
            CocoaMessage(@rect, GadgetID(Gadget), "frame")
            rect\origin\x = 0
            rect\origin\y = 0
            CocoaMessage(0, container, "setFrame:@", @rect)
          EndIf
        EndIf
      EndProcedure
      
    CompilerCase #PB_OS_Windows
      ;TODO
      
    CompilerCase #PB_OS_Linux
      ;TODO
  CompilerEndSelect
  
EndModule

;- End Module

; *****************************************************************************

CompilerIf #PB_Compiler_IsMainFile
  
  UseModule Workaround
  
  ; ---------------------------------------------------------------------------
  
  Procedure RedrawCanvas0()
    ResizeGadget(0, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
    StartDrawing(CanvasOutput(0))
    Box(0, 0, GadgetWidth(0), GadgetHeight(0), $FF0000)
    Box(2, 2, GadgetWidth(0) - 4, GadgetHeight(0) - 4, $B48246)
    StopDrawing()
  EndProcedure
  
  Procedure RedrawCanvas3()
    ResizeGadget(5, #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore)
  EndProcedure
  
  Procedure SizeWindow()
    ResizeGadget(4, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20)
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure CanvasSetGadgetBackgoundColor(Gadget, NSBackColor)
    Protected sv, container, cnt, index, obj
    
    sv = CocoaMessage(0, GadgetID(Gadget), "subviews")
    If CocoaMessage(0, sv, "count")
      container = CocoaMessage(0, sv, "objectAtIndex:", 0)
      If container
        sv = CocoaMessage(0, container, "subviews")
        cnt = CocoaMessage(0, sv, "count") - 1
        For index = 0 To cnt
          obj = CocoaMessage(0, sv, "objectAtIndex:@", @index)
          CocoaMessage(0, obj, "setBackgroundColor:@", @NSBackColor)
        Next
      EndIf
    EndIf
    
  EndProcedure
  
  Define Event
  
  ; ---------------------------------------------------------------------------
  
  If OpenWindow(0, 0, 0, 220, 220, "Canvas Container Workaround", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    
    Define NSBackColor = CocoaMessage(0, WindowID(Window), "backgroundColor", 0)
    
    CanvasGadget(0, 0, 0, 200, 200, #PB_Canvas_Container)
      ButtonGadget(1, 10, 10, 80, 30, "Button 1")
    CloseGadgetList()
    
    ScrollAreaGadget(2, 0, 0, 400, 400, 400, 400); #PB_Container_BorderLess)
      CanvasGadget(3, 0, 0, 400, 400, #PB_Canvas_Container)
        ButtonGadget(5, 10, 10, 80, 30, "Button 5")
        StringGadget(6, 10, 50, 200, 25, "Texte")
        TextGadget(7, 10, 90, 200, 60, "Hello World!")
      CloseGadgetList()
    CloseGadgetList()
    
    
    ;CanvasSetGadgetBackgoundColor(0, NSBackColor)
    ;CanvasSetGadgetBackgoundColor(3, NSBackColor)
    
    StartDrawing(CanvasOutput(3))
    Define x, y
    y = 0
    For x = 0 To 195 Step 10
      Box(x, y, 400-2*x, 400-2*y, RGB(Random(255), Random(255), Random(255)))
      y + 10        ; the same as y = y + 10
    Next x
    StopDrawing()
    
    SplitterGadget(4, 10, 10, 200, 200, 2, 0);, #PB_Splitter_Separator)
    
    RedrawCanvas0()
    
    BindEvent(#PB_Event_SizeWindow, @SizeWindow(), 0)
    
    BindGadgetEvent(0, @RedrawCanvas0(), #PB_EventType_Resize)
    BindGadgetEvent(2, @RedrawCanvas3(), #PB_EventType_Resize)
    
    Repeat
      Event = WaitWindowEvent()
      
    Until Event = #PB_Event_CloseWindow
    
  EndIf
  
CompilerEndIf
[/size]
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive