The layout is similar to a drawing area. Set up your "draw" callback and draw 
what you like. You can put your pictures in there also and be able to scroll 
them easily. 

/*   
    gcc -Wall layout1.c -o layout1 `pkg-config --cflags --libs gtk+-3.0`
    Tested on Ubuntu16.04 and GTK3.18
*/

#include<gtk/gtk.h>

static gboolean window_background(GtkWidget *widget, cairo_t *cr, gpointer 
data);
static gboolean layout_drawing(GtkWidget *da, cairo_t *cr, gpointer data);

int main(int argc, char **argv)
 {
   gtk_init(&argc, &argv);

   GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title(GTK_WINDOW(window), "Layout");
   gtk_window_set_default_size(GTK_WINDOW(window), 400, 400);
   gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
   gtk_container_set_border_width(GTK_CONTAINER(window), 40);
   g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
   gtk_widget_set_app_paintable(window, TRUE);
   //Try to set transparency of main window.
   if(gtk_widget_is_composited(window))
     {
       GdkScreen *screen=gtk_widget_get_screen(window);  
       GdkVisual *visual=gdk_screen_get_rgba_visual(screen);
       gtk_widget_set_visual(window, visual);
     }
   else g_print("Can't set window transparency.\n");
   g_signal_connect(window, "draw", G_CALLBACK(window_background), NULL);

   GtkWidget *layout=gtk_layout_new(NULL, NULL);
   gtk_widget_set_hexpand(layout, TRUE);
   gtk_widget_set_vexpand(layout, TRUE);
   g_signal_connect(layout, "draw", G_CALLBACK(layout_drawing), NULL);
   
   GtkWidget *grid=gtk_grid_new();
   gtk_grid_attach(GTK_GRID(grid), layout, 0, 0, 1, 1);
   
   gtk_container_add(GTK_CONTAINER(window), grid);

   gtk_widget_show_all(window);

   gtk_main();

   return 0;  
 }
static gboolean window_background(GtkWidget *widget, cairo_t *cr, gpointer data)
 {
   //Draw background window transparent blue.
   cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 0.3);
   cairo_paint(cr);
   return FALSE;
 }
static gboolean layout_drawing(GtkWidget *da, cairo_t *cr, gpointer data)
 {
   cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
   cairo_paint(cr);
   return FALSE;
 }


 

 

 

-----Original Message-----
From: Rúben Rodrigues <ruben...@live.com.pt>
To: Emmanuele Bassi <eba...@gmail.com>
Cc: gtk-app-devel-list <gtk-app-devel-list@gnome.org>
Sent: Tue, Mar 14, 2017 8:00 am
Subject: Re: gtk3 layout background image

Thanks again!

So, i will test with gtkbox. thanks for explanation..


Às 14:46 de 14/03/2017, Emmanuele Bassi escreveu:
> On 14 March 2017 at 14:31, Rúben Rodrigues <ruben...@live.com.pt> wrote:
>> Just window can have background?
> I was referring to GdkWindow, not GtkWindow.
>
> GtkBox draws background, for instance; GtkGrid does as well.
>
>> I don't know why is a violation, because in my case my
>> applicationdoesn't make sense without background image..
> I think the issue, here, is that you're not aware that 15 years passed
> in the internals of GTK+.
>
> Changing the background pixmap of a GdkWindow is a layering violation
> because it assumes that you're essentially working on X11 and you
> control the X server as well; on X11, you're telling the X server to
> clear the contents of the native window used by GtkLayout using the
> bytes you're passing. This worked in 1997, but it's not how modern
> toolkits work — and it's not even how different windowing systems
> work. Widgets do not have their own native window for rendering any
> more, for instance.
>
> If your application window has a background image then use the
> background-image CSS property on your GtkWindow widget.
>
> Ciao,
>   Emmanuele.
>
>> On 14-03-2017 14:01, Emmanuele Bassi wrote:
>>> You were not changing the background with your theme: you were
>>> programmatically replacing the base pixmap of the GdkWindow used by
>>> GtkLayout. It was essentially a layering violation, and would actually
>>> break your theme.
>>>
>>> The API reference for each GTK widget should tell you the CSS styling
>>> available; see the "CSS nodes" section, for instance, of GtkBox:
>>> https://developer.gnome.org/gtk3/stable/GtkBox.html
>>>
>>> Ciao,
>>>    Emmanuele.
>>>
>>>
>>> On 14 March 2017 at 13:55, Rúben Rodrigues <ruben...@live.com.pt> wrote:
>>>> Thanks!
>>>>
>>>> But in GTK+2 we could change background in layout with this:
>>>>
>>>> // Set picture as background.
>>>> //        gdk_pixbuf_render_pixmap_and_mask (pixbuf, &background, NULL, 0);
>>>> //        style = gtk_style_new ();
>>>> //        style->bg_pixmap[0] = background;
>>>> //        homeWindow = GTK_WIDGET(gtk_builder_get_object(builder,
>>>> "layout_Home"));
>>>> //       gtk_widget_set_style (GTK_WIDGET(homeWindow), GTK_STYLE(style));
>>>>
>>>> How i know witch containers draw background?
>>>>
>>>> THanks
>>>>
>>>>
>>>> On 14-03-2017 12:55, Emmanuele Bassi wrote:
>>>>> Not all GTK containers draw a background, mostly for historical
>>>>> reasons. This has been true for GTK 1.x, 2.x, and 3.x.
>>>>>
>>>>> In particular, GtkLayout does not draw any background with CSS, so you
>>>>> will need to either subclass GtkLayout, override the GtkWidget::draw
>>>>> virtual function, and call gtk_render_* functions yourself; or you
>>>>> will need to put a GtkLayout into a parent container that does draw a
>>>>> background. You will, of course, need to style the parent container's
>>>>> background, not the GtkLayout itself.
>>>>>
>>>>> Ciao,
>>>>>     Emmanuele.
>>>>>
>>>>>
>>>>> On 14 March 2017 at 12:43, Rúben Rodrigues <ruben...@live.com.pt> wrote:
>>>>>> I verify that i can't use css provider, don't works.
>>>>>>
>>>>>> My css file is :
>>>>>>
>>>>>> GtkLayout#layout_Home.background{
>>>>>>         background-image: url('background.png');
>>>>>> }
>>>>>>
>>>>>> GtkLabel#Home_Cooling_Tunnel1_Cooler_label1{
>>>>>>         color: white;
>>>>>> }
>>>>>>
>>>>>> GtkLabel#Home_Sensors_MoistAvg_value{
>>>>>>   font-family: Segoe UI;
>>>>>>         font-weight: lighter;
>>>>>>         font-size: 25px;
>>>>>> }
>>>>>>
>>>>>> And this code:
>>>>>>
>>>>>> static void apply_css(GtkWidget *widget, GtkStyleProvider *provider)
>>>>>> {
>>>>>> gtk_style_context_add_provider(gtk_widget_get_style_context(widget),
>>>>>> GTK_STYLE_PROVIDER(provider),G_MAXUINT);
>>>>>>         if(GTK_IS_CONTAINER(widget))
>>>>>>             gtk_container_forall(GTK_CONTAINER(widget),(GtkCallback)
>>>>>> apply_css,provider);
>>>>>>
>>>>>> }
>>>>>>
>>>>>> GFile *file= g_file_new_for_path("custom.css");
>>>>>>             GtkStyleProvider *css_provider =
>>>>>> GTK_STYLE_PROVIDER(gtk_css_provider_new());
>>>>>> gtk_css_provider_load_from_file(GTK_CSS_PROVIDER(css_provider), file,
>>>>>> &error);
>>>>>> apply_css(gtk_builder_get_object(builder,"window_Main"),css_provider);
>>>>>>
>>>>>> This is the code used in gtk3-demo and don't works for me.. Why????
>>>>>>
>>>>>> THanks
>>>>>>
>>>>>> On 14-03-2017 10:00, Rúben Rodrigues wrote:
>>>>>>> Hi guys,
>>>>>>>
>>>>>>> Finnaly i migrate my application to gtk+3. So, now i neet to change some
>>>>>>> things like image background. I used css provider like in this :
>>>>>>>
>>>>>>> custom.css file:
>>>>>>>
>>>>>>> GtkLayout:layout_Home{
>>>>>>>          background-color: black;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> C Program:
>>>>>>>
>>>>>>> GFile *file= g_file_new_for_path("custom.css");
>>>>>>>              GtkCssProvider *css_provider = 
>>>>>>> gtk_css_provider_get_default();
>>>>>>>              gtk_css_provider_load_from_file(css_provider, file, 
>>>>>>> &error);
>>>>>>>            GtkStyleContext *context = gtk_style_context_new();
>>>>>>>              gtk_style_context_add_provider(context,
>>>>>>> GTK_STYLE_PROVIDER(css_provider),GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
>>>>>>>
>>>>>>> But nothing happens. I tried this too:
>>>>>>>
>>>>>>> http://stackoverflow.com/questions/7375624/gtk3-window-background-image
>>>>>>>
>>>>>>>
>>>>>>> Someone can help me?
>>>>>>>
>>>>>>>
>>>>>>> THanks
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> gtk-app-devel-list mailing list
>>>>>>> gtk-app-devel-list@gnome.org
>>>>>>> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>>>>>> _______________________________________________
>>>>>> gtk-app-devel-list mailing list
>>>>>> gtk-app-devel-list@gnome.org
>>>>>> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>>>
>
>


---
Este e-mail foi verificado em termos de vírus pelo software antivírus Avast.
https://www.avast.com/antivirus

_______________________________________________gtk-app-devel-list mailing 
listgtk-app-devel-list@gnome.orghttps://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to