Я программирую на 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;
}
Спасибо.