; Module/File: Window_BackgroundPaintCssGtk3_Demo.pb ; Function: Set an Window background painting by CSS - Linux gtk3 < 3.16 + PB5.46 ; Author: Omi ; Date: Dec. 06, 2015 ; Version: 0.2 ; Target Compiler: PureBasic 5.42/5.46/5.62/5.7 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ; Link to topic: http://www.purebasic.fr/english/viewtopic.php?f=15&t=64409 ;-------------------------------------------------------------- ;The visibility of the painting depends on the distro + version + 'theme'/'Gtk-Design'. ;some examples from 'gtk3-demo' ... ; Problems with the new Layout in PB5.46+ ; Already fixed in main version EnableExplicit ImportC "" gtk_css_provider_load_from_data(*css_provider, data_.p-utf8, length, *error.GError) gtk_css_provider_new() gtk_style_context_add_provider(*context, *provider, priority) gtk_widget_get_style_context(*widget.GtkWidget) gdk_rgba_parse(*rgba, spec.p-utf8) gtk_widget_override_background_color(*widget.GtkWidget, state, color) EndImport ; Object constants #Win_Main= 0 #But1 = 0 #But2 = 1 #But3 = 2 #But4 = 3 #But5 = 4 #But6 = 5 #ButCc = 6 CompilerIf Defined(GdkRGBA, #PB_Structure) CompilerElse Structure GdkRGBA red.d green.d blue.d alpha.d EndStructure CompilerEndIf Global.i gEvent, gEventWin, gQuit Global.s gColor Global *gProvider Global bgcolor.GdkRGBA Procedure.s ColorSelector() Protected.s sColor= "" Protected.l Color= ColorRequester() If Color > -1 ; sColor= "rgba(" + StrF(Red(Color)/255) + "," + StrF(Green(Color)/255) + "," + StrF(Blue(Color)/255) + ",1.0)" sColor= "#" + RSet(Hex(Red(Color)), 2, "0") + RSet(Hex(Green(Color)), 2, "0") + RSet(Hex(Blue(Color)), 2, "0") EndIf ProcedureReturn sColor EndProcedure Procedure Window_SetBkGndPaint_Stripes(Window); stripes Protected.s WinBkGndCSS= "@define-color base_bg #d8d0fc;" + #LF$ + "@define-color backdrop_bg #888;" + #LF$ + #LF$ + ".background {" + #LF$ + "background-color: @base_bg;" + #LF$ + "background-image: linear-gradient(to left, transparent, rgba(255,255,255,.57) 80%, transparent 50%)," + #LF$ + "linear-gradient(to left, transparent, rgba(255,255,255,.33) 80%, transparent 50%)," + #LF$ + "linear-gradient(to left, transparent, transparent 80%, rgba(255,255,255,.57) 50%)," + #LF$ + "linear-gradient(to left, transparent, transparent 80%, rgba(255,255,255,.39) 50%);" + #LF$ + "background-size: 29px, 59px, 73px, 109px;" + #LF$ + "}" ; Protected.s WinBkGndCSS= "GtkLayout { background-color: transparent;}" gtk_css_provider_load_from_data(*gProvider, WinBkGndCSS, -1, #Null) gtk_style_context_add_provider(gtk_widget_get_style_context(WindowID(Window)), *gProvider, 800) EndProcedure Procedure Window_SetBkGndPaint_Lines(Window); lines Protected.s WinBkGndCSS= ".background {" + #LF$ + "background-color: #fff;" + #LF$ + "background-image: linear-gradient(90deg, transparent 90%, alpha(#f98195, 0.40) 90%, #f98195 80px, alpha(#f98195, 0.40) 90.3%, transparent 90.3%)," + #LF$ + "linear-gradient(alpha(#77c5cf, 0.60), alpha(#77c5cf, 0.60) 1px, transparent 1px);" + #LF$ + "background-size: 100% 25px;" + #LF$ + "}" gtk_css_provider_load_from_data(*gProvider, WinBkGndCSS, -1, #Null) gtk_style_context_add_provider(gtk_widget_get_style_context(WindowID(Window)), *gProvider, 800) EndProcedure Procedure Window_SetBkGndPaint_Bricks(Window); bricks Protected.s WinBkGndCSS= "@define-color brick_hi #eee;" + #LF$ + "@define-color brick_lo #ddd;" + #LF$ + #LF$ + ".background {" + #LF$ + "background-color: rgba(10%,20%,30%,0.5);" + #LF$ + "background-image: linear-gradient(205deg, @brick_lo, @brick_lo 23px, transparent 23px)," + #LF$ + "linear-gradient(25deg, @brick_hi, @brick_hi 23px, transparent 23px)," + #LF$ + "linear-gradient(205deg, @brick_lo, @brick_lo 23px, transparent 23px)," + #LF$ + "linear-gradient(25deg, @brick_hi, @brick_hi 23px, transparent 23px);" + #LF$ + "background-size: 58px 58px;" + #LF$ + "background-position: 0px 6px, 4px 31px, 29px 35px, 34px 2px;" + #LF$ + "}" gtk_css_provider_load_from_data(*gProvider, WinBkGndCSS, -1, #Null) gtk_style_context_add_provider(gtk_widget_get_style_context(WindowID(Window)), *gProvider, 800) EndProcedure Procedure Window_SetBkGndPaint_LG(Window); gradient 2-color to-bottom-right Protected.s WinBkGndCSS= ".background {" + #LF$ + "background-image: linear-gradient(to bottom right, lightgrey, lightyellow 70%);" + #LF$ + "}"; to right gtk_css_provider_load_from_data(*gProvider, WinBkGndCSS, -1, #Null) gtk_style_context_add_provider(gtk_widget_get_style_context(WindowID(Window)), *gProvider, 800) EndProcedure Procedure Window_SetBkGndPaint_LG2(Window); gradient 3-color to-right Protected.s WinBkGndCSS= ".background {" + #LF$ + "background-image: linear-gradient(to right, aliceblue, aliceblue 20%, oldlace 30%, oldlace 70%, turquoise 80%);" + #LF$ + "}"; to right gtk_css_provider_load_from_data(*gProvider, WinBkGndCSS, -1, #Null) gtk_style_context_add_provider(gtk_widget_get_style_context(WindowID(Window)), *gProvider, 800) EndProcedure Procedure Window_SetBkGndPaint_Pure(Window, Color.s); pure color, all gtk-syntax Protected.s WinBkGndCSS= ".background { background-color: " + Color + ";" + #LF$ + "}"; to right gtk_css_provider_load_from_data(*gProvider, WinBkGndCSS, -1, #Null) gtk_style_context_add_provider(gtk_widget_get_style_context(WindowID(Window)), *gProvider, 800) EndProcedure Procedure Create_WinMain() If OpenWindow(#Win_Main, 300, 200, 500, 200, "Window w. CSS-background-painting (gtk3)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget) WindowBounds(#Win_Main, #PB_Ignore, 200, #PB_Ignore, #PB_Ignore) TextGadget(#PB_Any, 5, 5, 200, 22, "Choose display-mode ...") OptionGadget(#But1, 5, 30, 250, 26, "Paint 'vertical stripes'") OptionGadget(#But2, 5, 55, 250, 26, "Paint 'Lined paper'") OptionGadget(#But3, 5, 80, 250, 26, "Paint 'Bricks'") OptionGadget(#But4, 5, 105, 250, 26, "Paint gradient to right bottom") OptionGadget(#But5, 5, 130, 250, 26, "Paint gradient to right 2 colors") OptionGadget(#But6, 5, 155, 250, 26, "Paint pure color") ButtonGadget(#ButCc, 360, 155, 120, 26, "-> ColorChooser ...") SetGadgetState(#But2, #True) ;for older gtk3 - as long as it may work ... CompilerIf #PB_Compiler_Version > 545 Protected *Layout.GtkLayout= g_list_nth_data_(gtk_container_get_children_(gtk_bin_get_child_(WindowID(#Win_Main))), 0) gdk_rgba_parse(@bgcolor, "rgba(1,1,1,0.0)") gtk_widget_override_background_color(*Layout, 0, bgcolor) CompilerEndIf EndIf EndProcedure Create_WinMain() *gProvider= gtk_css_provider_new() Window_SetBkGndPaint_Lines(#Win_Main) Repeat gEvent= WaitWindowEvent() gEventWin= EventWindow() If gEventWin = #Win_Main Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_Gadget Select EventGadget() Case #But1; stripes Window_SetBkGndPaint_Stripes(#Win_Main) Case #But2; lines Window_SetBkGndPaint_Lines(#Win_Main) Case #But3; bricks Window_SetBkGndPaint_Bricks(#Win_Main) Case #But4; gradient 2-color to-bottom-right Window_SetBkGndPaint_LG(#Win_Main) Case #But5; gradient 3-color to-right Window_SetBkGndPaint_LG2(#Win_Main) Case #But6; gradient 3-color to-right Window_SetBkGndPaint_Pure(#Win_Main, "DarkTurquoise"); or "#00CED1" Case #ButCc gColor= ColorSelector() If gColor <> "" Window_SetBkGndPaint_Pure(#Win_Main, gColor) If Not GetGadgetState(#But6) SetGadgetState(#But6, #True) EndIf EndIf EndSelect EndSelect EndIf Until gQuit g_object_unref_(*gProvider) ; IDE Options = PureBasic 5.70 LTS beta 3 (Linux - x64) ; CursorPosition = 12 ; Folding = -- ; EnableXP ; EnableUnicode