Re: How to make a button look like a treeview column title? [Was: How to use the treeview column title style for a button?]
- From: Bastiaan Veelo <bastiaan sarc nl>
- To: Bastiaan Veelo <bastiaan sarc nl>
- Cc: gtk-app-devel-list gnome org, Kristian Rietveld <kris imendio com>
- Subject: Re: How to make a button look like a treeview column title? [Was: How to use the treeview column title style for a button?]
- Date: Tue, 09 Oct 2007 10:58:40 +0200
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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]