Gtk3 window background image

c gtk
11,096

Check if code below would work for you:

#include <gtk/gtk.h>

int main( int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *layout;
    GtkWidget *image;
    GtkWidget *button;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 290, 200);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

    layout = gtk_layout_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER (window), layout);
    gtk_widget_show(layout);

    image = gtk_image_new_from_file("/home/my_background_image.jpg");
    gtk_layout_put(GTK_LAYOUT(layout), image, 0, 0);

    button = gtk_button_new_with_label("Button");
    gtk_layout_put(GTK_LAYOUT(layout), button, 150, 50);
    gtk_widget_set_size_request(button, 80, 35);

    g_signal_connect_swapped(G_OBJECT(window), "destroy",
    G_CALLBACK(gtk_main_quit), NULL);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}
Share:
11,096
mike
Author by

mike

Updated on June 04, 2022

Comments

  • mike
    mike almost 2 years

    I'm using C language in gtk+-3.0.12 (latest stable version as of 9/10/2011) How can I create a png background image on a top window and still place other widgets like buttons on the window? I tried the following but the image is drawn over the button.

    /*
    * Compile with: 
    * gcc -Wextra -o cairo6 `pkg-config --cflags --libs gtk+-3.0` cairo6.c
    */
    
    #include <gtk/gtk.h>
    static cairo_surface_t *surface = NULL;
    cairo_surface_t *image;
    
    static gboolean
    on_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data)
    {
      cairo_t *cr;
      surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
                               CAIRO_CONTENT_COLOR,
                               gtk_widget_get_allocated_width (widget),
                               gtk_widget_get_allocated_height (widget));
    
    cr = gdk_cairo_create ( gtk_widget_get_window (GTK_WIDGET(widget)) );
    cairo_set_source_surface (cr, image, 0, 0);
    cairo_paint (cr);
    cairo_destroy (cr);
    
    return TRUE;
    }
    
     int main(int argc, char *argv[])
    {
    GtkWidget *window;
    gtk_init(&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    image = cairo_image_surface_create_from_png("bdrop.png"); //Supply your own image here
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
    gtk_widget_set_app_paintable(window, FALSE);
    gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size (GTK_WINDOW(window), 800, 480);
    
    GtkWidget *ebox = gtk_event_box_new ();
    GtkWidget *button;
    button = gtk_button_new_with_label("QUIT");
    gtk_widget_set_halign (GTK_WIDGET(button),GTK_ALIGN_CENTER);
    gtk_widget_set_valign (GTK_WIDGET(button),GTK_ALIGN_CENTER);
    gtk_container_add (GTK_CONTAINER(ebox), button);
    g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL);
    
    gtk_container_add (GTK_CONTAINER(window), ebox);
    g_signal_connect(ebox,"draw", G_CALLBACK (on_expose_event),NULL);
    
    gtk_widget_show_all (window);
    
    gtk_main();
    cairo_surface_destroy (image);
    return 0;
    }