Page 1 of 2

GTK3 SetGadgetColor Workaround (Teamwork / Release)

Posted: Wed Dec 26, 2018 4:27 pm
by mk-soft
The fact that GTK3 is constantly changing something doesn't make things easy for app developers or Fred either.
Link to Bug-Report: viewtopic.php?f=23&t=71967

Let's see how it works with the GtkCssProviders.
Since I'm not so fit with GTK and CSS, we can switch everything to CSS together.

Thanks to ccode and Oma for help.

Here my current status of the code

Update v1.01

Update v1.02
- Fixed some colors
- Added SetWindowColor. Thanks to Shardik

Update v1.03
- Bugfix memory leak -> gtk_container_get_children_(...) returns a newly-allocated list

Update v1.04
- Bugfix CSSColorString
- Update Macro SetProvider to Procedure GtkSetProvider(...)
- Update Macro SetOverride to Procedure GtkSetOverride(...)
- Update Example

Update v1.04.3
- Bugfix ASM-Code to C-Code (PB v6.00)
- Bugfix 32 bit
- Bugfix CSSColorStringAlpha

Update v1.04.4
- Optimize ASM/C code

Update v1.04.6
- Fix: SetWindowColor #PB_Default

Update v1.05.1
- Chance: SetSelectedColor parameters for front and back color
- Remove: SetSelectionColor
- Added: Hook PB FreeGadgetProg for release Gadget CSS Provider (Save CSS Provider on object data)

Update v1.05.2
- Fix: Hook PB FreeGadgetProg

Code: Select all

;-TOP

; Workaround Linux GTK3 GadgetColor
; by      : mk-soft, ccode, Oma, Shardik
; Version : v1.05.2
; Create  : 25.12.2018
; Update  : 08.05.2023

; Link    : https://www.purebasic.fr/english/viewtopic.php?t=71992

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

;- Begin Module GtkGadgetColor

DeclareModule GtkGadgetColor
  
  Declare.s GtkGetVersionString()
  
  Declare GtkSetWindowColor(Window, Color)
  Declare GtkSetGadgetColor(Gadget, ColorType, Color)
  Declare GtkGetGadgetColor(Gadget, ColorType)
  
  Declare SetSelectedColor(ColorType, Color = #PB_Default)
  
  Macro SetWindowColor(Window, Color)
    GTKSetWindowColor(Window, Color)
  EndMacro
  
  Macro SetGadgetColor(Gadget, ColorType, Color)
    GtkSetGadgetColor(Gadget, ColorType, Color)
  EndMacro
  
  Macro GetGadgetColor(Gadget, ColorType)
    GtkGetGadgetColor(Gadget, ColorType)
  EndMacro
  
EndDeclareModule

Module GtkGadgetColor
  
  EnableExplicit
  
  CompilerIf Not Defined(PB_Compiler_Backend, #PB_Constant)
    #PB_Compiler_Backend = 0
    #PB_Backend_Asm = 0
    #PB_Backend_C = 1
  CompilerEndIf
    
  ;- Imports
  ImportC ""
    ;
    gtk_get_major_version()
    gtk_get_minor_version()
    gtk_get_micro_version()
    ;
    gtk_widget_override_color(*handle, state, color)
    gtk_widget_override_background_color(*handle, state, color)
    ;
    gtk_widget_get_style_context(*Widget.GtkWidget)
    gtk_css_provider_new()
    gtk_css_provider_load_from_data(*CSSProvider, CSSData.p-utf8, Length, *Error.GError)
    gtk_style_context_add_provider(*CSSContext, *CSSProvider, Priority)
    gtk_style_context_remove_provider(*CSSContext, *CSSProvider)
    ;
    gtk_style_context_add_provider_for_screen(*CSSContext, *CSSProvider, Priority)
    gtk_style_context_remove_provider_for_screen(*CSSContext, *CSSProvider)
    ;
    gtk_style_context_add_class(*CSSContext, ClassName.p-utf8)
    gtk_style_context_list_classes(*CSSContext)
    gtk_style_context_get_color(*context, state, *color)
    gtk_style_context_get_background_color(*context, state, *color)
  EndImport
  
  ;- Constants
  #GTK_STATE_FLAG_NORMAL       = 0
  #GTK_STATE_FLAG_ACTIVE       = 1 << 0
  #GTK_STATE_FLAG_PRELIGHT     = 1 << 1
  #GTK_STATE_FLAG_SELECTED     = 1 << 2
  #GTK_STATE_FLAG_INSENSITIVE  = 1 << 3
  #GTK_STATE_FLAG_INCONSISTENT = 1 << 4
  #GTK_STATE_FLAG_FOCUSED      = 1 << 5
  #GTK_STATE_FLAG_BACKDROP     = 1 << 6
  #GTK_STATE_FLAG_DIR_LTR      = 1 << 7
  #GTK_STATE_FLAG_DIR_RTL      = 1 << 8
  
  #GTK_STYLE_PROVIDER_PRIORITY_FALLBACK = 1
  #GTK_STYLE_PROVIDER_PRIORITY_THEME = 200
  #GTK_STYLE_PROVIDER_PRIORITY_SETTINGS = 400
  #GTK_STYLE_PROVIDER_PRIORITY_APPLICATION = 600
  #GTK_STYLE_PROVIDER_PRIORITY_USER  = 800
  
  ;- Structures
  Structure GdkRGBA
    red.d
    green.d
    blue.d
    alpha.d
  EndStructure
  
  Structure PB_GadgetVT ;PB SDK
    Size.l
    Type.l
    *Prog[0] ; Index 1: FreeGadgetProg
  EndStructure
  
  CompilerIf #PB_Compiler_Version > 600
    Structure PB_GadgetStructure ; PB SDK
      Gadget.i;
      Container.i
      *VT.PB_GadgetVT
      RootWindowID.i
      UserData.i
      Data.i[4]
    EndStructure
  CompilerElse
    Structure PB_GadgetStructure ; PB SDK
      Gadget.i;
      Container.i
      *VT.PB_GadgetVT
      UserData.i
      Data.i[4]
    EndStructure
  CompilerEndIf
  
  Global Dim PB_FreeGadgetProg(40)
  
  ;- Global Variables
  Global GTKMajorVersion = gtk_get_major_version()
  Global GTKMinorVersion = gtk_get_minor_version()
  
  Global SelectedFrontColor.s
  Global SelectedBackColor.s
  
  ;- Macros
  Macro PB(Function)
    Function
  EndMacro
  
  ; ---------------------------------------------------------------------------
  
  Procedure GtkFreeGadgetProg(*GadgetData.PB_GadgetStructure)
    Protected r1, *pb_freegadgetprog, CSSProvider

    ; Unref CSS Provider
    CSSProvider = g_object_get_data_(*GadgetData\Gadget, "pb_frontcolor")
    If CSSProvider
      ;Debug "CSS Provider Unref FrontColor " + CSSProvider
      g_object_unref_(CSSProvider)
      g_object_set_data_(*GadgetData\Gadget, "pb_frontcolor", 0)
    EndIf
    CSSProvider = g_object_get_data_(*GadgetData\Gadget, "pb_backcolor")
    If CSSProvider
      ;Debug "CSS Provider Unref BackColor " + CSSProvider
      g_object_unref_(CSSProvider)
      g_object_set_data_(*GadgetData\Gadget, "pb_backcolor", 0)
    EndIf
    *pb_freegadgetprog = PB_FreeGadgetProg(*Gadgetdata\VT\Type) - 1
    If *pb_freegadgetprog
      ;Debug "Call PB FreeGadgetProg " + *pb_freegadgetprog
      CallFunctionFast(*pb_freegadgetprog, *Gadgetdata)
    EndIf
    ;Debug "FreeGadget Finished " + *Gadgetdata\Gadget
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure GtkSetProvider(Gadget, Widget, ColorType, CSSData.s)
    Protected CSSProvider, CSSContext, *GadgetData.PB_GadgetStructure
    
    *GadgetData = IsGadget(Gadget)
    If *GadgetData
      Select ColorType
        Case #PB_Gadget_FrontColor
          CSSProvider = g_object_get_data_(*GadgetData\Gadget, "pb_frontcolor")
        Case #PB_Gadget_BackColor
          CSSProvider = g_object_get_data_(*GadgetData\Gadget, "pb_backcolor")
      EndSelect
      If CSSProvider
        gtk_style_context_remove_provider(CSSContext, CSSProvider)
        g_object_unref_(CSSProvider)
      EndIf
      CSSProvider = gtk_css_provider_new()
      If CSSProvider
        Select ColorType
          Case #PB_Gadget_FrontColor
            g_object_set_data_(*GadgetData\Gadget, "pb_frontcolor", CSSProvider)
          Case #PB_Gadget_BackColor
            g_object_set_data_(*GadgetData\Gadget, "pb_backcolor", CSSProvider)
        EndSelect
        CSSContext = gtk_widget_get_style_context(Widget)
        gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
        gtk_style_context_add_provider(CSSContext, CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
      EndIf
      ; Hook FreeGadgetProg
      If PB_FreeGadgetProg(*GadgetData\VT\Type) = 0
        PB_FreeGadgetProg(*GadgetData\VT\Type) = *GadgetData\VT\Prog[1] + 1 ; Make sure is entry exists
        *GadgetData\VT\Prog[1] = @GtkFreeGadgetProg()
      EndIf
    EndIf
  EndProcedure
  
  Procedure GtkSetOverride(Gadget, ColorType, Color)
    Protected *GdKColor.GdkRGBA = AllocateStructure(GdkRGBA)
    *GdKColor\red = (1.0/255.) * Red(Color)
    *GdKColor\green = (1.0/255.0) * Green(Color)
    *GdKColor\blue = (1.0/255.0) * Blue(Color)
    *GdKColor\alpha = 1.0
    Select ColorType
      Case #PB_Gadget_FrontColor
        gtk_widget_override_color(GadgetID(Gadget), #GTK_STATE_FLAG_NORMAL, *GdKColor)
      Case #PB_Gadget_BackColor
        gtk_widget_override_background_color(GadgetID(Gadget), #GTK_STATE_FLAG_NORMAL, *GdKColor)
        *GdKColor\red = 0.0
        *GdKColor\green = 0.0
        *GdKColor\blue = 1.0
        *GdKColor\alpha = 0.5
        gtk_widget_override_background_color(GadgetID(Gadget), #GTK_STATE_FLAG_SELECTED, *GdKColor)
      Default
        PB(SetGadgetColor)(Gadget, ColorType, Color)
    EndSelect
    FreeStructure(*GDKColor)
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure.s CSSColorString(color.l)
    CompilerIf #PB_Compiler_Backend = #PB_Backend_Asm
      !mov eax, dword [p.v_color]
      !bswap eax
      !shr eax, 8
      !mov dword [p.v_color], eax
    CompilerElse
      !v_color=__builtin_bswap32(v_color);
      !v_color=((unsigned int)v_color >> 8);
    CompilerEndIf
    ProcedureReturn "#" + RSet(Hex(Color, #PB_Long), 6, "0")
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure.s CSSColorStringAlpha(color.l, alpha.a = 255)
    CompilerIf #PB_Compiler_Backend = #PB_Backend_Asm
      !mov eax, dword [p.v_color]
      !shl eax, 8
      !or  eax, dword [p.v_alpha]
      !bswap eax
      !mov dword [p.v_color], eax
    CompilerElse
      !v_color=((v_color<<8)|v_alpha);
      !v_color=__builtin_bswap32(v_color);
    CompilerEndIf
    ProcedureReturn "#" + RSet(Hex(Color, #PB_Long), 8, "0")
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure.s CSSColorStringLight(color, prozent)
    Protected r1.s, r,g,b
    r = Red(color) * prozent / 100
    g = Green(color) * prozent / 100
    b = Blue(color) * prozent / 100
    r1 = "rgb(" + r + "," + g + "," + b + ")"
    ProcedureReturn r1
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure.l CSSGetFrontColor(Gadget, State)
    Protected color.l, CSSContext, gdk_color.GdkRGBA
    CSSContext = gtk_widget_get_style_context(GadgetID(Gadget))
    If CSSContext
      gtk_style_context_get_color(CSSContext, State, @gdk_color)
      color = RGB(gdk_color\red * 255, gdk_color\green * 255, gdk_color\blue * 255)
    EndIf
    ProcedureReturn color
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure.l CSSGetBackColor(Gadget, State)
    Protected color.l, CSSContext, gdk_color.GdkRGBA
    CSSContext = gtk_widget_get_style_context(GadgetID(Gadget))
    If CSSContext
      gtk_style_context_get_background_color(CSSContext, State, @gdk_color)
      color = RGB(gdk_color\red * 255, gdk_color\green * 255, gdk_color\blue * 255)
    EndIf
    ProcedureReturn color
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure SetSelectedColor(ColorType, Color = #PB_Default)
    Select ColorType
      Case #PB_Gadget_FrontColor
        If Color = #PB_Default
          SelectedFrontColor = ""
        Else
          SelectedFrontColor = CSSColorString(Color)
        EndIf
      Case #PB_Gadget_BackColor
        If Color = #PB_Default
          SelectedBackColor = ""
        Else
          SelectedBackColor = CSSColorString(Color)
        EndIf
    EndSelect
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure.s GtkGetVersionString()
    Protected major, minor, micro
    major = gtk_get_major_version()
    minor = gtk_get_minor_version()
    micro = gtk_get_micro_version()
    ProcedureReturn "" + major + "." + minor + "." + micro 
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  Procedure GtkSetWindowColor(Window, Color)
    Static NewMap CSSWindowProviderMap()
    Protected CSSProvider, CSSContainer, CSSContext, CSSColor.s, CSSData.s
    Protected GList
    
    CSSColor = CSSColorString(Color)
    If GTKMajorVersion >= 3 And GTKMinorVersion >= 16
      CSSData = "window.background {background-color: " + CSSColor + ";}"
      CSSContainer = WindowID(Window)
    Else
      CSSData = "GtkLayout {background-color: " + CSSColor + ";}"
      GList = gtk_container_get_children_(WindowID(Window))
      CSSContainer = g_list_nth_data_(GList, 0)
      g_list_free_(GList)
      GList = gtk_container_get_children_(CSSContainer)
      CSSContainer = g_list_nth_data_(GList, 0)
      g_list_free_(GList)
    EndIf
    CSSContext = gtk_widget_get_style_context(CSSContainer)
    If FindMapElement(CSSWindowProviderMap(), Hex(Window))
      gtk_style_context_remove_provider(CSSContext, CSSWindowProviderMap())
      g_object_unref_(CSSProvider)
    EndIf
    If Color <> #PB_Default
      CSSProvider = gtk_css_provider_new()
      CSSWindowProviderMap(Hex(Window)) = CSSProvider 
      gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
      gtk_style_context_add_provider(CSSContext, CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
    EndIf
  EndProcedure

  ; ---------------------------------------------------------------------------
  
  Procedure GtkGetGadgetColor(Gadget, ColorType)
    Protected Color, CSSContext, gdk_color.GdkRGBA
    
    If IsGadget(Gadget)
      CSSContext = gtk_widget_get_style_context(GadgetID(Gadget))
      
      Select ColorType
        Case #PB_Gadget_FrontColor
          gtk_style_context_get_color(CSSContext, #GTK_STATE_FLAG_NORMAL, @gdk_color)
          Color = RGB(gdk_color\red * 255, gdk_color\green * 255, gdk_color\blue * 255)
        Case #PB_Gadget_BackColor
          gtk_style_context_get_background_color(CSSContext, #GTK_STATE_FLAG_NORMAL, @gdk_color)
          Color = RGB(gdk_color\red * 255, gdk_color\green * 255, gdk_color\blue * 255)
        Case #PB_Gadget_LineColor
          Color = GetGadgetColor(Gadget, ColorType)
      EndSelect
    EndIf
    ProcedureReturn Color
  EndProcedure
  
  Procedure GtkSetGadgetColor(Gadget, ColorType, Color)
    Protected CSSProvider, CSSContext, CSSColor.s, CSSColor2.s, CSSData.s
    Protected GList, Layer, Layer2, Layer3
    Protected *GdKColor.GdkRGBA
    
    If GTKMinorVersion <= 15
      ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
    EndIf
    
    Select GadgetType(Gadget)
      Case #PB_GadgetType_Button
        ;-* #PB_GadgetType_Button
        
        CSSColor = CSSColorString(Color)
        CSSColor2 = CSSColorStringLight(Color, 90)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "button {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "button {background: " + CSSColor + ";}"
            CSSData + "button:active {" + "background: " + CSSColor2 + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_ButtonImage
        ;-* #PB_GadgetType_ButtonImage
        ;TODO
        PB(SetGadgetColor)(Gadget, ColorType, Color)
        
      Case #PB_GadgetType_Calendar
        ;-* #PB_GadgetType_Calendar
        ;TODO Override
        GtkSetOverride(Gadget, ColorType, Color)
        
      Case #PB_GadgetType_CheckBox
        ;-* #PB_GadgetType_CheckBox
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "checkbutton {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "checkbutton {background: " + CSSColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_ComboBox
        ;-* #PB_GadgetType_ComboBox
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* .combo {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* .combo {background: " + CSSColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        Layer = gtk_bin_get_child_(GadgetID(Gadget))
        Layer2 = gtk_widget_get_parent_(Layer)
        Layer3 = gtk_widget_get_parent_(Layer2)
        GtkSetProvider(Gadget, Layer3, ColorType, CSSData)
        
      Case #PB_GadgetType_Container
        ;-* #PB_GadgetType_Container
        ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        
      Case #PB_GadgetType_Date
        ;-* #PB_GadgetType_Date
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* entry {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* entry {background: " + CSSColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect  
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_Editor
        ;-* #PB_GadgetType_Editor
        
        If Not Bool(SelectedFrontColor)
          SelectedFrontColor = CSSColorString(CSSGetFrontColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        If Not Bool(SelectedBackColor)
          SelectedBackColor = CSSColorString(CSSGetBackColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* text {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* text {background: " + CSSColor + ";}"
            CSSData + "* text > selection {" + "color: " + SelectedFrontColor + ";}"
            CSSData + "* text > selection {" + "background-color: " + SelectedBackColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect  
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_ExplorerCombo
        ;-* #PB_GadgetType_ExplorerCombo
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* .combo {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* .combo {background: " + CSSColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        
        GList = gtk_container_get_children_(GadgetID(Gadget))
        Layer = g_list_nth_data_(GList, 0)
        g_list_free_(GList)
        GtkSetProvider(Gadget, Layer, ColorType, CSSData)
        
      Case #PB_GadgetType_ExplorerList, #PB_GadgetType_ExplorerTree
        ;-* #PB_GadgetType_ExplorerList, #PB_GadgetType_ExplorerTree
        
        If Not Bool(SelectedBackColor)
          SelectedBackColor = CSSColorString(CSSGetBackColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* .view {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* .view {background: " + CSSColor + ";}"
            CSSData + "* .view:selected {background-color: " + SelectedBackColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_Frame
        ;-* #PB_GadgetType_Frame
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* frame {color: " + CSSColor + "};"
          Case #PB_Gadget_BackColor
            CSSData = "* border {background: " + CSSColor + ";} "
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect  
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_HyperLink
        ;-* #PB_GadgetType_HyperLink
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            ;Intern: <span color='#0000FF'>Text</span>
            PB(SetGadgetColor)(Gadget, #PB_Gadget_FrontColor, Color)
          Case #PB_Gadget_BackColor
            CSSData = "* label {background: " + CSSColor + "};"
          Default
        EndSelect  
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_IPAddress
        ;-* #PB_GadgetType_IPAddress
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* entry {color: " + CSSColor + "};"
          Case #PB_Gadget_BackColor
            CSSData = "* entry {background: " + CSSColor + "};"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect  
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_ListIcon, #PB_GadgetType_ListView, #PB_GadgetType_Tree
        ;-* #PB_GadgetType_ListIcon, #PB_GadgetType_ListView, #PB_GadgetType_Tree
        
        If Not Bool(SelectedBackColor)
          SelectedBackColor = CSSColorString(CSSGetBackColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* .view {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* .view {background: " + CSSColor + ";}"
            CSSData + "* .view:selected {background: " + SelectedBackColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_Option
        ;-* #PB_GadgetType_Option
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* radiobutton {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* radiobutton {background: " + CSSColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect  
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_Panel
        ;-* #PB_GadgetType_Panel
        CSSColor = CSSColorString(Color)
        CSSColor2 = CSSColorStringLight(Color, 90)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* box * {background: " + CSSColor + ";}"
            CSSData + "* .top * {background: " + CSSColor2 + ";}"
            CSSData + "* .up {background: transparent}"
            CSSData + "* .down {background: transparent}"
            CSSData + "* :checked {background: " + CSSColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_ProgressBar
        ;-* #PB_GadgetType_ProgressBar
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* .left {background: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            ProcedureReturn 0
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
          
      Case #PB_GadgetType_Scintilla
        ;-* #PB_GadgetType_Scintilla
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            ScintillaSendMessage(Gadget, #SCI_STYLESETFORE, #STYLE_DEFAULT, color)  
            ScintillaSendMessage(Gadget, #SCI_STYLECLEARALL)
          Case #PB_Gadget_BackColor
            ScintillaSendMessage(Gadget, #SCI_STYLESETBACK, #STYLE_DEFAULT, color)  
            ScintillaSendMessage(Gadget, #SCI_STYLECLEARALL)
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        
      Case #PB_GadgetType_ScrollArea
        ;-* #PB_GadgetType_ScrollArea (Bug ?)
        ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        
      Case #PB_GadgetType_ScrollBar
        ;-* #PB_GadgetType_ScrollBar
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* slider {background: " + CSSColor + "};"
          Case #PB_Gadget_BackColor
            CSSData = "* scrollbar {background: " + CSSColor + "};"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect 
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_Shortcut
        ;-* #PB_GadgetType_Shortcut
        
        If Not Bool(SelectedFrontColor)
          SelectedFrontColor = CSSColorString(CSSGetFrontColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        If Not Bool(SelectedBackColor)
          SelectedBackColor = CSSColorString(CSSGetBackColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* entry {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* entry {background: " + CSSColor + ";}"
            CSSData + "* entry > selection {" + "color: " + SelectedFrontColor + ";}"
            CSSData + "* entry > selection {" + "background-color: " + SelectedBackColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_Spin
        ;-* #PB_GadgetType_Spin
        
        If Not Bool(SelectedFrontColor)
          SelectedFrontColor = CSSColorString(CSSGetFrontColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        If Not Bool(SelectedBackColor)
          SelectedBackColor = CSSColorString(CSSGetBackColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* entry {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* entry {background: " + CSSColor + ";}"
            CSSData + "* entry > selection {" + "color: " + SelectedFrontColor + ";}"
            CSSData + "* entry > selection {" + "background-color: " + SelectedBackColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GList = gtk_container_get_children_(GadgetID(Gadget))
        Layer = g_list_nth_data_(GList, 0)
        g_list_free_(GList)
        GtkSetProvider(Gadget, Layer, ColorType, CSSData)
        
      Case #PB_GadgetType_Splitter
        ;-* #PB_GadgetType_Splitter
        ;TODO
        PB(SetGadgetColor)(Gadget, ColorType, Color)
        
      Case #PB_GadgetType_String
        ;-* #PB_GadgetType_String
        
        If Not Bool(SelectedFrontColor)
          SelectedFrontColor = CSSColorString(CSSGetFrontColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        If Not Bool(SelectedBackColor)
          SelectedBackColor = CSSColorString(CSSGetBackColor(Gadget, #GTK_STATE_FLAG_SELECTED))
        EndIf
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* entry {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "* entry {background: " + CSSColor + ";}"
            CSSData + "* entry > selection {" + "color: " + SelectedFrontColor + ";}"
            CSSData + "* entry > selection {" + "background-color: " + SelectedBackColor + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_Text
        ;-* #PB_GadgetType_Text
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* label {color: " + CSSColor + "};"
          Case #PB_Gadget_BackColor
            CSSData = "* label {background: " + CSSColor + "};"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect  
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Case #PB_GadgetType_TrackBar
        ;-* #PB_GadgetType_TrackBar
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "* slider {background: " + CSSColor + "};"
          Case #PB_Gadget_BackColor
            CSSData = "* highlight {background: " + CSSColor + "};"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect 
        GtkSetProvider(Gadget, GadgetID(Gadget), ColorType, CSSData)
        
      Default
        PB(SetGadgetColor)(Gadget, ColorType, Color)
        
    EndSelect
    
  EndProcedure
  
EndModule

;- End Module GtkGadgetColor

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

;- Testing

CompilerIf #PB_Compiler_IsMainFile
  
  UseModule GtkGadgetColor
  
  If OpenWindow(0, 80, 80, 400, 240, "Gadget (GTK v" + GtkGetVersionString() + ")", #PB_Window_SystemMenu)
    ;widget = ButtonGadget(0, 10, 10, 380, 25, "Button")
    
    ;widget = CalendarGadget(0, 10, 10, 380, 25)
    ;widget = CheckBoxGadget(0, 10, 10, 380, 25, "Check 1")
    ;widget = ComboBoxGadget(0, 10, 10, 380, 25)
    ;widget = ContainerGadget(0, 10, 10, 380, 220, #PB_Container_Flat) : CloseGadgetList()
    
    ;widget = DateGadget(0, 10, 10, 380, 25)
    
    ;widget = EditorGadget(0, 10, 10, 380, 220)
    ;widget = ExplorerComboGadget(0, 10, 10, 380, 25, "/")
    ;widget = ExplorerListGadget(0, 10, 10, 380, 220, "/")
    ;widget = ExplorerTreeGadget(0, 10, 10, 380, 220, "/")
    
    ;widget = FrameGadget(0, 10, 10, 380, 220, "Text")
    
    ;widget = HyperLinkGadget(0, 10, 10, 380, 220, "Text", #Blue)
    
    ;widget = IPAddressGadget(0, 10, 10, 380, 25)
    
    ;widget = ListViewGadget(0, 10, 10, 380, 220)
    ;widget = ListIconGadget(0, 10, 10, 380, 220, "Column 1", 150) : AddGadgetColumn(0, 1, "Column 2", 150) 
    
    ;widget = OptionGadget(0, 10, 10, 380, 25, "Option 1")
    
    widget = PanelGadget(0, 10, 10, 380, 220)
    ;widget = ProgressBarGadget(0, 10, 10, 380, 40, 0, 100) : SetGadgetState(0, 50)
    
    ;widget = TextGadget(0, 10, 10, 380, 220, "Hello World!")
    ;widget = TreeGadget(0, 10, 10, 380, 220) : For i = 0 To 5 : AddGadgetItem (ID, -1, "Item "+Str(a), 0, i % 2) : Next
    
    ;widget = ScintillaGadget(0, 10, 10, 380, 220, 0) : SetGadgetText(0, "Hello world!")
    
    ; Help Text Gadget for Backgound
    ;widget = ScrollAreaGadget(0, 10, 10, 380, 220, 760, 440, #PB_ScrollArea_Single); : TextGadget(1, 0, 0, 760, 440, "") : CloseGadgetList()
    
    ;widget = ScrollBarGadget(0, 10, 10, 380, 20, 0, 800, 10)
    ;widget = ShortcutGadget(0, 10, 10, 380, 40, #PB_Shortcut_End)
    ;widget = SpinGadget(0, 10, 10, 380, 40, 0, 100, #PB_Spin_Numeric) : SetGadgetState(0, 50)
    ;widget = StringGadget(0, 10, 10, 380, 25, "Hello World!")
    
    ;widget = TrackBarGadget(0, 10, 10, 380, 40, 0, 100) : SetGadgetState(0, 50)
    
    Select GadgetType(0)
      Case #PB_GadgetType_ListIcon, #PB_GadgetType_ListView, #PB_GadgetType_ComboBox
        For a = 1 To 16
          AddGadgetItem (0, -1, "Item " + Str(a)) ; define listview content
        Next
      Case #PB_GadgetType_Panel
        For a = 1 To 6
          AddGadgetItem (0, -1, "Item " + Str(a)) ; define listview content
        Next
        
    EndSelect
    
    
    SetWindowColor(0, #Gray)
    
    ;SetSelectedColor(#PB_Gadget_FrontColor, #White)
    ;SetSelectedColor(#PB_Gadget_BackColor, #Red)
    
    SetGadgetColor(0, #PB_Gadget_FrontColor, #Yellow)
    SetGadgetColor(0, #PB_Gadget_BackColor, $5D524D)
    
    If IsGadget(1)
      SetGadgetColor(1, #PB_Gadget_BackColor, $E6E0B0)
    EndIf
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  
CompilerEndIf

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Wed Dec 26, 2018 6:50 pm
by ccode
I try and try, but I can not find a solution.
How to set the line colors in a ListViewGadget via CSS?
With a ListIconGadget or TreeGadget one can set this also normally.
Everything is internal but a GTKTreeView.

After the "API" but something like that, right?

"treeview: nth-child (odd) {background-color: blue;}"

????

Incidentally, the window color can also be set via CSS.

Code: Select all

Procedure SetWindowColorEx(Window, wcolor)
  Protected *gProvider= gtk_css_provider_new()
  Protected.s CSS = "*{background: rgb("+Red(wcolor)+","+Green(wcolor)+","+Blue(wcolor)+")}"
 
  gtk_css_provider_load_from_data(*gProvider, CSS, -1, #Null)
  gtk_style_context_add_provider(gtk_widget_get_style_context(WindowID(Window)), *gProvider, 600)
  g_object_unref_(*gProvider)
EndProcedure

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Wed Dec 26, 2018 8:23 pm
by mk-soft
Update
I've come a little further now.
But there is still a lot to work on. We can use help.

I optimized the CSSColor with some ASM.

Code: Select all

  Procedure.s CSSColorString(color)
    !mov eax, dword [p.v_color]
    !bswap eax
    !shr eax, 8
    !mov dword [p.v_color], eax
    ProcedureReturn "#" + Hex(Color)
  EndProcedure

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Thu Dec 27, 2018 5:08 pm
by Oma
Hi!
I've created (even if they are not PB supported ?) StringGadget and ButtonGadget with some hard coded "states". (Probably more would have to be added - but how to handle?)
I changed the CheckBoxGadget - with a 'focus'ed-state too.
I hope other people aren't working on it too - or working on better versions.

My yesterday's post for '#PB_GadgetType_ListIcon, #PB_GadgetType_ListView, #PB_GadgetType_Tree' should be extended to:
'#PB_GadgetType_ListIcon, #PB_GadgetType_ListView, #PB_GadgetType_Tree, #PB_GadgetType_ExplorerTree, #PB_GadgetType_ExplorerList', i think.

But don't trust my thing yet! I don't know what I'm doing. :(

Code: Select all

Case #PB_GadgetType_Button
	CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") + RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
	Select ColorType
		Case #PB_Gadget_FrontColor
			CSSData = "* button {color: " + CSSColor + ";}"
		Case #PB_Gadget_BackColor
				CSSData = "* button {background: " + CSSColor + ";}"
			CSSData + "* button:active {" + "background: RGB(128,128,255);}"
		Default
				ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
	EndSelect
	SetProvider()
	
Case #PB_GadgetType_String
	CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") + RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
	Select ColorType
		Case #PB_Gadget_FrontColor
			CSSData = "* entry {color: " + CSSColor + ";}"
		Case #PB_Gadget_BackColor
				CSSData = "* entry {background: " + CSSColor + ";}"
				CSSData + "* entry:focus {" + "background: RGB(128,128,255);}"
				CSSData + "* entry > selection {" + "background-color: RGB(255,0,0);}"
		Default
				ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
	EndSelect
	SetProvider()
	

Case #PB_GadgetType_CheckBox
	;TODO Lost focus ???
	CSSColor = "#" + RSet(Hex(Red(Color)), 2, "0") + RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0")
	Select ColorType
		Case #PB_Gadget_FrontColor
			CSSData = "* checkbutton {color: " + CSSColor + ";}"
		Case #PB_Gadget_BackColor
				CSSData = "* checkbutton:focus {background-color: " + CSSColor + ";}"
				CSSData + "* checkbutton {background-color: " + "RGB(255,255,255)" + ";}"
		Default
			ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
	EndSelect
	SetProvider()
Please adapt to your taste.
We should place one (or more) examples of each gadget in a ScrollAreaGadget() to have an overview and to recognize side effects.
The mysterious thing is the use of both terms background-color <-> background for the background color? I don't see the scheme behind it yet.

Regards, Charly

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Thu Dec 27, 2018 5:58 pm
by mk-soft
Thanks Oma,

I don't know what I'm doing either.

Now I put the ComboBoxGadget on the TODO list, the "gtk_style_context_add_provider_for_screen" is global for all gadgets.
But I can't do it with the ComboBox. Slowly believe it's a bug in GTK...

I took over your code with small adjustments.

Code: Select all

CSSColor = CSSColorString(Color)

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Thu Dec 27, 2018 7:21 pm
by Oma
The ComboBoxGadget can be a complicated construction. I'll try my luck with it the next few days.
Shardik has already done some things with CSS. Maybe he'd like to join in.

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Fri Dec 28, 2018 5:54 pm
by mk-soft
Cleaned up the code a bit...
Also added two color variables as standard

Code: Select all

  ;- Global Variables
  Global CSSColorSelected.s = "RGB(128,128,255)"
  Global CSSColorSelection.s = "RGB(96,96,255)"
The function "gtk_widget_override_*" is moved to a macro

Updated the following gadgets
- OptionGadget
- CheckboxGadget
- ShortcutGadget
- ContainerGadget


There are still some gadgets to edit

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Sat Dec 29, 2018 8:33 am
by Oma
Thanks so far.

Yesterday I played with the ComboBoxGadget. I haven't made a breakthrough yet.
Above all, I didn't get access to the text color in the ComboBox yet.
However, PB's SetGadgetColor() for the ComboBoxGadget is not defined at the moment!
If I get the aggressiveness again, I'll try again :twisted:

And a test on my 'still-main-system' Xubuntu 14.04 (i know the time is running out :cry: ) showed that with the CSS syntax used in the code (and possibly because of the chosen 'theme') no color setting works at all. (Wouldn't be so bad now!)

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Sat Dec 29, 2018 12:39 pm
by mk-soft
Hi,
With the Gadget with Combo I have also given up for the time being. Somehow the style is always overwritten by Application Style. A Linux professional programmer has to look at that

The rest looks pretty good already...

P.S.
with the style for "*for_screen" it works. But then it is for all "combobox"

Code: Select all

css_combo = "menuitem {color: blue; background: yellow;} menuitem:hover { background: rgb(128,128,255);} .combo {color: blue; background: yellow} "

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Sat Dec 29, 2018 8:52 pm
by Shardik
In the ImportC block I had to comment out

Code: Select all

    gtk_style_context_to_string (*Context, flags)
because this function was introduced in GTK+ 3.20 and my Linux Mint 18.3 has only installed GTK+ 3.18.9. This function is only used in these two code lines:

Code: Select all

    Protected *string = gtk_style_context_to_string(gtk_widget_get_style_context(GadgetID(Gadget)), 1)
    Debug PeekS(*string, -1, #PB_UTF8)
and you may also comment them out because currently *string isn't used in the rest of the source code.

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Sat Dec 29, 2018 10:27 pm
by ccode
Hello Shardik!

Interesting to know.

I use Linux Mint LMDE 3 and have the GTK version: 3.22.11

And it works.

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Sat Dec 29, 2018 11:24 pm
by mk-soft
Hi Shardik,

I can remove it. Is ever only for debug information ... -> removed!

Update v0.11 (OMA)
- #PB_GadgetType_ExplorerList, #PB_GadgetType_ExplorerTree

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Sun Dec 30, 2018 12:27 am
by ccode
The SpinGadget is very mysterious.
Actually it should behave like an "entry". But you have no access to it, only to the "box".

If the entry but give a style class. (Example: test)
Then I can in the CSS tab (inspector tool) via the following command set the color.

.test {color: red; background: yellow}

????

But under PureBasic at least it does not work, but the style class is set correctly.

Code: Select all

;gtk_style_context_add_class(*CSSContext, *ClassName)
; gtk_style_context_list_classes(*CSSContext)
;...
Case #PB_GadgetType_Spin
        ;-* #PB_GadgetType_Spin
        Layer = g_list_nth_data_(gtk_container_get_children_(GadgetID(Gadget)), 0)
        ;Debug PeekS(gtk_widget_get_name_(Layer), -1, #PB_UTF8)
        
        CSSContext = gtk_widget_get_style_context(Layer)
        gtk_style_context_add_class(CSSContext, UTF8("test"))
        
        ;Debug PeekS(gtk_style_context_list_classes(CSSContext), -1, #PB_UTF8)
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = ".test {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            
            CSSData = ".test {background: yellow}"
            ;CSSData + "* entry:focus {" + "background: " + CSSColorSelected + ";}"
;             CSSData + "* entry > selection {" + "background-color: " + CSSColorSelection + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        SetProvider()
;...
This works!
The context must remain with the "entry" and must not point to the "box".

Code: Select all

;...
;-* #PB_GadgetType_Spin
        Layer = g_list_nth_data_(gtk_container_get_children_(GadgetID(Gadget)), 0)
        Debug PeekS(gtk_widget_get_name_(Layer), -1, #PB_UTF8)
        
        CSSContext2 = gtk_widget_get_style_context(Layer)
        gtk_style_context_add_class(CSSContext2, UTF8("input"))
        
        CSSColor = CSSColorString(Color)
        Select ColorType
          Case #PB_Gadget_FrontColor
            CSSData = "box * {color: " + CSSColor + ";}"
            ;CSSData2 = ".input {color: " + CSSColor + ";}"
          Case #PB_Gadget_BackColor
            CSSData = "box * {background: " + CSSColor + ";}"
            CSSData2 = "*.input {background: " + CSSColor + ";}"
            CSSData2 + "*.input:focus {" + "background: " + CSSColorSelected + ";}"
            CSSData2 + "*.input > selection {" + "background-color: " + CSSColorSelection + ";}"
          Default
            ProcedureReturn PB(SetGadgetColor)(Gadget, ColorType, Color)
        EndSelect
        SetProvider()
        CSSProvider2 = gtk_css_provider_new()
        If FindMapElement(CSSProviderList(), Hex(gadget) + "/" + Hex(ColorType))
          gtk_style_context_remove_provider(CSSContext2, CSSProviderList())
        EndIf
        CSSProviderList(Hex(gadget) + "/" + Hex(ColorType)) = CSSProvider2
        gtk_css_provider_load_from_data(CSSProvider2, CSSData2, -1, 0)
        gtk_style_context_add_provider(CSSContext2, CSSProvider2, #GTK_STYLE_PROVIDER_PRIORITY_APPLICATION)
        g_object_unref_(CSSProvider2)
;...
I'm stupid!
If I do it right, the arrows will go, of course!
widget = SpinGadget(0, 10, 10, 380, 40, 0, 100, #PB_Spin_Numeric) : SetGadgetState(0, 50)

But it would be great if you could not just adjust the selected / selection colors globally.
Also, an adjustment of the containing containers should be solved nicely.
I think it needs more additional constants here.

Re: GTK3 SetGadgetColor Workaround (Teamwork)

Posted: Sun Dec 30, 2018 3:17 am
by mk-soft
As I see it, the SpinGadget of the nodes entry background color is controlled by the location gtk.css and therefore always overwritten.

Re: GTK3 SetGadgetColor Workaround (Teamwork / Release)

Posted: Tue Jan 01, 2019 2:43 pm
by mk-soft
Release Version v1.01

After good cooperation the first release version is online.
Many thanks to "ccode" for the last extensions and of course to "OMI".