Thanks for the example.
But I'd pull the CSS color of GtkHeaderBar to follow the theme colors instead 
of the hardcoded draw_box().
As I attached in the previous mail, calling gtk_widget_class_set_css_name(class, "headerbar") can set the themed background-color but the behavior is different between GtkBox and inherited GtkBox as my test program.

Fujiwara

On 04/14/17 06:44, cecas...@aol.com-san wrote:

Hi Fujiwara,

The GtkBox is going to use the background window for it's color. The box just 
does the layout. If you create a header bar from a box you will have to
draw on the background where your header bar is going to be. This can get a 
little tricky to get the measurements that you need. A simple case
shouldn't be too difficult though. If you pass the box to the main window 
"draw" callback you can get something going. You can draw with cairo or get
your CSS color. I don't have a C# setup to test with so I hope C will do.

By the way, I was just programming something similar looking at cairo meshes. 
Don't know if you like mesh drawing but there is a little program at the
following that changes some background windows from the UI.

https://github.com/cecashon/OrderedSetVelociRaptor/blob/master/Misc/cairo_drawings/draw_mesh1.c

Eric

/*
   gcc -Wall box1.c -o box1 `pkg-config --cflags --libs gtk+-3.0`
   Tested with GTK3.18 on Ubuntu16.04
*/
#include<gtk/gtk.h>

static gboolean draw_box(GtkWidget *widget, 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), "Title Bar");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_widget_set_app_paintable(window, TRUE);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    GtkWidget *label1=gtk_label_new("Header");
    GtkWidget *label2=gtk_label_new("Bar");

    GtkWidget *box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    gtk_container_set_border_width(GTK_CONTAINER(box), 10);
    gtk_widget_set_hexpand(box, TRUE);
    gtk_box_pack_start(GTK_BOX(box), label1, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(box), label2, TRUE, TRUE, 0);
    g_signal_connect(window, "draw", G_CALLBACK(draw_box), box);

    GtkWidget *label3=gtk_label_new("Main");
    gtk_widget_set_vexpand(label3, TRUE);
    gtk_widget_set_hexpand(label3, TRUE);
    GtkWidget *label4=gtk_label_new("Window");
    gtk_widget_set_vexpand(label4, TRUE);
    gtk_widget_set_hexpand(label4, TRUE);

    GtkWidget *grid=gtk_grid_new();
    gtk_grid_attach(GTK_GRID(grid), box, 0, 0, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), label3, 0, 1, 1, 1);
    gtk_grid_attach(GTK_GRID(grid), label4, 0, 2, 1, 1);

    gtk_container_add(GTK_CONTAINER(window), grid);

    gtk_widget_show_all(window);

    gtk_main();

    return 0;
  }
static gboolean draw_box(GtkWidget *widget, cairo_t *cr, gpointer data)
  {
    //Paint the main window.
    cairo_set_source_rgb(cr, 0.0, 1.0, 0.0);
    cairo_paint(cr);
    //Get the dimensions to draw header bar.
    gint width=gtk_widget_get_allocated_width(GTK_WIDGET(widget));
    gint height=gtk_widget_get_allocated_height(GTK_WIDGET(data));
    cairo_set_source_rgb(cr, 1.0, 0.0, 1.0);
    //Add 20 to height for 2 time contain width.
    cairo_rectangle(cr, 0.0, 0.0, width, height+20);
    cairo_fill(cr);
    return FALSE;
  }


_______________________________________________
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