GTK3 SetGadgetColor Workaround (Teamwork / Release)
Posted: Wed Dec 26, 2018 4:27 pm
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
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