Search code examples
cgtkgtk3

How to add css style context providers for all labels in a grid?


I am trying to set the background color of all labels in GtkGrid. Here is a simplified example:

#include <gtk/gtk.h>

static void activate (GtkApplication* app, gpointer user_data)
{
    GtkWidget *window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), "Window1");
    gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

    GtkWidget *grid = gtk_grid_new ();
    gtk_container_add (GTK_CONTAINER (window), grid);
    GtkWidget *label1 = gtk_label_new("Hello world!");
    gtk_widget_set_hexpand( label1, TRUE);
    gtk_grid_attach(GTK_GRID (grid), label1, 0,0,1,1);
    GtkWidget *label2 = gtk_label_new("Simple Gtk example");
    gtk_widget_set_hexpand( label2, TRUE);
    gtk_grid_attach(GTK_GRID (grid), label2, 0,1,1,1);
    GtkCssProvider *provider = gtk_css_provider_new ();
    gtk_css_provider_load_from_data (
        provider, "label {background-color: #AAAAAA;}", -1, NULL);
    GtkStyleContext *context = gtk_widget_get_style_context (grid);
    gtk_style_context_add_provider(
        context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);

    gtk_widget_show_all (window);
}

int main (int argc, char **argv) {
    GtkApplication *app = gtk_application_new(
        "org.gtk.example", G_APPLICATION_FLAGS_NONE );
    g_signal_connect( app, "activate", G_CALLBACK(activate), NULL);
    int status = g_application_run(G_APPLICATION(app), argc, argv);

    g_object_unref (app);
    return status;
}

However, adding the style context provider to the grid's context (as shown above) does not work.


Solution

  • I've modified your code, this will change the background of the labels:

    #include <gtk/gtk.h>
    
    static void activate (GtkApplication* app, gpointer user_data)
    {
        GtkWidget *window = gtk_application_window_new (app);
        gtk_window_set_title (GTK_WINDOW (window), "Window1");
        gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
    
        GtkWidget *grid = gtk_grid_new ();
        gtk_container_add (GTK_CONTAINER (window), grid);
        GtkWidget *label1 = gtk_label_new("Hello world!");
        gtk_widget_set_hexpand( label1, TRUE);
        gtk_grid_attach(GTK_GRID (grid), label1, 0,0,1,1);
        GtkWidget *label2 = gtk_label_new("Simple Gtk example");
        gtk_widget_set_hexpand( label2, TRUE);
        gtk_grid_attach(GTK_GRID (grid), label2, 0,1,1,1);
        GtkCssProvider *provider = gtk_css_provider_new ();
        GdkDisplay *display = gdk_display_get_default();
        GdkScreen *screen = gdk_display_get_default_screen (display);
        gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
        gtk_css_provider_load_from_data (
            provider, "GtkLabel { background-color: #AAAAAA;}", -1, NULL);
    
        gtk_widget_show_all (window);
    }
    
    int main (int argc, char **argv) {
        GtkApplication *app = gtk_application_new(
            "org.gtk.example", G_APPLICATION_FLAGS_NONE );
        g_signal_connect( app, "activate", G_CALLBACK(activate), NULL);
        int status = g_application_run(G_APPLICATION(app), argc, argv);
    
        g_object_unref (app);
        return status;
    }
    

    Result:

    enter image description here