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

Reply via email to