Как изменить цвет фона виджета, используя gtk3 в C, используя контекст рисования cairo (cairo_t) и сигнал "draw" - PullRequest
0 голосов
/ 14 декабря 2018

Я программирую на C и gtk3, используя Linux, и я пытался изменить цвет фона элемента GtkBox, используя сигнал рисования и контекст cairo, но пока он меняет цвет на белый вместо того, который я имеюзадающий.Я использую css для изменения цвета других элементов, но я хочу использовать контекст cairo для определенного элемента.

Это мой main.c

#include <gtk/gtk.h>
#include "MainWindow.c"

int main(int argc, char** argv){
    GtkApplication *app;

    int status;

    app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(MainWindow), NULL);
    status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return status;
}

Это мое MainWindow.c, отсюда я вызываю сигнал отрисовки

#include <gtk/gtk.h>
#include "styles.h"

static void MainWindow(GtkApplication *app, gpointer data){

    GtkWidget *window;
    GtkWidget *fBox;
    GtkWidget *boxLeft, *boxTotal, *boxDisplay;
    GtkWidget *lblInput, *lblTotal, *lblIva, *lblSubTotal;
    GtkWidget *boxItemList;
    GtkWidget *boxDisplayScreen;
    GtkWidget *boxDisplayTotal;

    /* Create the window */
    window = gtk_application_window_new(app);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    gtk_window_set_default_size(GTK_WINDOW(window), 1024, 768);

    /* Main flow box */
    fBox = gtk_flow_box_new();
    gtk_container_add(GTK_CONTAINER(window), fBox);

    /* Left Box */
    boxLeft = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
    gtk_flow_box_insert(GTK_FLOW_BOX(fBox), boxLeft ,1);

    /* Total Window */
    boxDisplay = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    gtk_widget_set_size_request(boxDisplay, 418, 80);
    gtk_box_pack_start(GTK_BOX(boxLeft), boxDisplay, FALSE, FALSE, 0);

    boxDisplayScreen = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_widget_set_size_request(boxDisplayScreen, 209, 80);
    gtk_box_pack_start(GTK_BOX(boxDisplay), boxDisplayScreen, FALSE, FALSE, 0);

    boxDisplayTotal = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_widget_set_size_request(boxDisplayTotal, 209, 80);
    gtk_box_pack_start(GTK_BOX(boxDisplay), boxDisplayTotal, FALSE, FALSE, 0);

    //Painting the box
    g_signal_connect(boxDisplayTotal, "draw", G_CALLBACK(redBackground), NULL);

    gtk_widget_show_all(window);
}

Это мой файл style.c, в котором я указываю функции рисования

#include <gtk/gtk.h>
#include "styles.h"

//Doesn't work
void whiteBackground(GtkWidget *widget, cairo_t *cr, 
        gpointer user_data){

    cairo_set_source_rgb(cr, 50,205,50);
    cairo_paint(cr);

}

    //Doesn't work
gboolean redBackground(GtkWidget *widget, cairo_t *cr, 
    gpointer user_data){

    guint width, height;
    GdkRGBA color;
    GtkStyleContext *context;

    context = gtk_widget_get_style_context(widget);
    width = gtk_widget_get_allocated_width(widget);
    height = gtk_widget_get_allocated_height(widget);

    gtk_render_background(context, cr, 0, 0, width, height);

    gtk_style_context_get_color(context,
            gtk_style_context_get_state(context),
            &color);

    cairo_set_source_rgb(cr, 50,205,50);
    //gdk_cairo_set_source_rgba(cr, &color);
    //cairo_fill(cr);
    cairo_paint(cr);

    return FALSE;
}

Спасибо.

...