Bastiaan Veelo wrote: > The reason why this is not going to work (for the windows theme at > least, GTK+ 2.10) is a hard-coded check on the type of widget->parent in > draw_box() on line 1929 of msw_style.c: >
So I faked the parent widget through some evil hacking in the expose function below. It works, for now. #include <gtk/gtk.h> G_BEGIN_DECLS #define GTK_TYPE_HEADER (gtk_header_get_type ()) #define GTK_HEADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_HEADER, GtkMenuSheet)) #define GTK_HEADER_CLASS(klass) G_TYPE_CHECK_CLASS_CAST ((klass, GTK_TYPE_HEADER, GtkMenuSheetClass)) #define GTK_IS_HEADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_HEADER)) #define GTK_IS_HEADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_HEADER)) #define GTK_HEADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_HEADER, GtkMenuSheetClass)) typedef struct _GtkHeader GtkHeader; typedef struct _GtkHeaderClass GtkHeaderClass; struct _GtkHeader { GtkButton parent; }; struct _GtkHeaderClass { GtkButtonClass parent_class; }; G_END_DECLS GType gtk_header_get_type (void) G_GNUC_CONST; GtkWidget *gtk_header_sheet_new (); static gboolean gtk_header_expose (GtkWidget *widget, GdkEventExpose *event); static void gtk_header_class_init (GtkHeaderClass *class) { GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); widget_class->expose_event = gtk_header_expose; } static void gtk_header_init (GtkHeader *header) { } /* GType Methods */ G_DEFINE_TYPE (GtkHeader, gtk_header, GTK_TYPE_BUTTON) GType gtk_header_type () { static GType header_type = 0; if (!header_type) { static const GTypeInfo header_info = { sizeof (GtkHeaderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) gtk_header_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (GtkHeader), 0, /* n_preallocs */ (GInstanceInitFunc) gtk_header_init, }; header_type = g_type_register_static (GTK_TYPE_BUTTON, "GtkHeader", &header_info, 0); } return header_type; } static gboolean gtk_header_expose (GtkWidget *widget, GdkEventExpose *event) { static GtkWidget *treeview = NULL; if (!treeview) treeview = gtk_tree_view_new(); /* Trick draw_box() in msw_style.c on line 1929 into thinking that our parent is a GtkTreeView. This works on MS Windows and GTK+ 2.10.6, but it may fail miserably when used with other themes or other versions of GTK+. */ GtkWidget *real_parent = widget->parent; widget->parent = treeview; (* GTK_WIDGET_CLASS (gtk_header_parent_class)->expose_event) (widget, event); widget->parent = real_parent; return FALSE; } GtkWidget* gtk_header_new (void) { return g_object_new (GTK_TYPE_HEADER, NULL); } int main( int argc, char *argv[] ) { gtk_init (&argc, &argv); GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); GtkWidget *header = gtk_header_new(); gtk_button_set_label (GTK_BUTTON (header), "Header"); /* Not sure whether the folowwing is necessary. */ GtkStyle *style = gtk_rc_get_style_by_paths (gtk_widget_get_settings (header), NULL, "*.GtkTreeView.GtkButton", GTK_TYPE_BUTTON); gtk_widget_set_style (header, style); gtk_container_add (GTK_CONTAINER (window), header); gtk_widget_show_all(window); gtk_main (); return 0; } _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list