Update v0.3
- Beispiel erweitert
Code: Alles auswählen
;-TOP
; Linux GTK CSS Gadget Style
; by : mk-soft
; Version : v0.2
; Create : 28.12.2018
; Update :
DeclareModule GtkGadgetStyle
Declare AddCssProvider(Gadget, StyleID, CSSData.s)
Declare RemoveCssProvider(Gadget, StyleID)
Declare AddCssProviderForScreen(Gadget, StyleID, CSSData.s)
Declare RemoveCssProviderForScreen(Gadget, StyleID)
Declare.s CSSColorString(color)
EndDeclareModule
Module GtkGadgetStyle
EnableExplicit
;- Imports
ImportC ""
gtk_widget_get_screen(*Widget.GtkWidget)
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)
EndImport
;- Constants
#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
;- Maps
Global NewMap CSSProviderList()
Global NewMap CSSProviderForScreenList()
; ---------------------------------------------------------------------------
Procedure AddCssProvider(Gadget, StyleID, CSSData.s)
Protected CSSProvider, CSSContext
CSSProvider = gtk_css_provider_new()
CSSContext = gtk_widget_get_style_context(GadgetID(Gadget))
If FindMapElement(CSSProviderList(), Hex(Gadget) + "/" + Hex(StyleID))
gtk_style_context_remove_provider(CSSContext, CSSProviderList())
EndIf
CSSProviderList(Hex(Gadget) + "/" + Hex(StyleID)) = CSSProvider
gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
gtk_style_context_add_provider(CSSContext, CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_USER)
g_object_unref_(CSSProvider)
EndProcedure
; ---------------------------------------------------------------------------
Procedure RemoveCssProvider(Gadget, StyleID)
Protected CSSContext
CSSContext = gtk_widget_get_style_context(GadgetID(Gadget))
If FindMapElement(CSSProviderList(), Hex(Gadget) + "/" + Hex(StyleID))
gtk_style_context_remove_provider(CSSContext, CSSProviderList())
DeleteMapElement(CSSProviderList())
EndIf
EndProcedure
; ---------------------------------------------------------------------------
Procedure AddCssProviderForScreen(Gadget, StyleID, CSSData.s)
Protected CSSProvider, CSSContext
CSSProvider = gtk_css_provider_new()
CSSContext = gtk_widget_get_screen(GadgetID(Gadget))
If FindMapElement(CSSProviderForScreenList(), Hex(gadget) + "/" + Hex(StyleID))
gtk_style_context_remove_provider_for_screen(CSSContext, CSSProviderForScreenList())
EndIf
CSSProviderForScreenList(Hex(gadget) + "/" + Hex(StyleID)) = CSSProvider
gtk_css_provider_load_from_data(CSSProvider, CSSData, -1, 0)
gtk_style_context_add_provider_for_screen(CSSContext, CSSProvider, #GTK_STYLE_PROVIDER_PRIORITY_APPLICATION)
g_object_unref_(CSSProvider)
EndProcedure
; ---------------------------------------------------------------------------
Procedure RemoveCssProviderForScreen(Gadget, StyleID)
Protected CSSContext
CSSContext = gtk_widget_get_screen(GadgetID(Gadget))
If FindMapElement(CSSProviderForScreenList(), Hex(gadget) + "/" + Hex(StyleID))
gtk_style_context_remove_provider_for_screen(CSSContext, CSSProviderForScreenList())
DeleteMapElement(CSSProviderForScreenList())
EndIf
EndProcedure
; ---------------------------------------------------------------------------
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
; ---------------------------------------------------------------------------
EndModule
; *******************************************************************************
CompilerIf #PB_Compiler_IsMainFile
UseModule GtkGadgetStyle
Define css_string.s, css_fr.s, css_bg1.s, css_bg2.s
Define css_color.s
If OpenWindow(0, 0, 0, 270, 140, "CSS-Gadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StringGadget(0, 10, 10, 250, 25, "StringGadget")
ButtonGadget(1, 10, 45, 120, 25, "Toggle", #PB_Button_Toggle)
ButtonGadget(2, 140, 45, 120, 25, "Remove")
css_color = CSSColorString(RGB(255,255,0))
css_string = "entry {color: darkred; background-color: gray} entry > selection {background-color: " + css_color + "}"
css_fr = "button {color: blue}"
css_bg1 = "button {background-color: yellow}"
css_bg2 = "button {background-color: green}"
AddCssProviderForScreen(1, 1, css_fr) ; Gilt für alle Gadgets ab den Level
AddCssProvider(0, 1, css_string)
AddCssProvider(1, 2, css_bg1)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case 1
If GetGadgetState(1)
AddCssProvider(1, 2, css_bg2)
Else
AddCssProvider(1, 2, css_bg1)
EndIf
Case 2
RemoveCssProvider(1, 2)
EndSelect
EndSelect
ForEver
EndIf
CompilerEndIf