the GInstanceInitFunc of my GtkWidget subclass is never called



I'm writing a widget that is similar to GtkDrawingArea.  I started with
the code from gtkdrawingarea.{c|h} in gtk+-2.2.2.  My problem is that the
widget instance initiation function gtk_ogla_init is not called when I
create a new instance.  I'm probably just missing some mundane detail, but
I'd appreciate it if anyone could put me on the right path.  The
condensed version of my code is listed below.  Thanks for the help.

-Will


#include <glib.h>
#include <gtk/gtk.h>

G_BEGIN_DECLS


#define GTK_TYPE_OGLA            (gtk_drawing_area_get_type ())
#define GTK_OGLA(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj),
GTK_TYPE_OGLA, GtkOgla))
#define GTK_OGLA_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),
GTK_TYPE_OGLA, GtkOglaClass))
#define GTK_IS_OGLA(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
GTK_TYPE_OGLA))
#define GTK_IS_OGLA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
GTK_TYPE_OGLA))
#define GTK_OGLA_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),
GTK_TYPE_OGLA, GtkOglaClass))


typedef struct _GtkOgla       GtkOgla;
typedef struct _GtkOglaClass  GtkOglaClass;

struct _GtkOgla
{
  GtkWidget widget;

  guint ogl_capable : 1;
  guint double_buffered : 1;
};

struct _GtkOglaClass
{
  GtkWidget parent_class;

  /* Padding for future expansion */
  void (*_gtk_reserved1) (void);
  void (*_gtk_reserved2) (void);
  void (*_gtk_reserved3) (void);
  void (*_gtk_reserved4) (void);
};

GType      gtk_ogla_get_type (void) G_GNUC_CONST;
GtkWidget* gtk_ogla_new      (void);


G_END_DECLS

static void gtk_ogla_class_init    (GtkOglaClass *klass);
static void gtk_ogla_init          (GtkOgla      *darea, gpointer data);
static void gtk_ogla_realize       (GtkWidget           *widget);
static void gtk_ogla_size_allocate (GtkWidget           *widget,
                                            GtkAllocation
*allocation);
static void gtk_ogla_send_configure (GtkOgla     *darea);


GType
gtk_ogla_get_type (void)
{
  static GType ogla_type = 0;

  if (!ogla_type)
    {
      static const GTypeInfo ogla_info =
      {
        sizeof (GtkOglaClass),
        NULL,           /* base_init */
        NULL,           /* base_finalize */
        (GClassInitFunc) gtk_ogla_class_init,
        NULL,           /* class_finalize */
        NULL,           /* class_data */
        sizeof (GtkOgla),
        0,              /* n_preallocs */
        (GInstanceInitFunc) gtk_ogla_init
      };

      ogla_type =
        g_type_register_static (GTK_TYPE_WIDGET, "GtkOgla",
                                &ogla_info, 0);
    }

  return ogla_type;
}

static void
gtk_ogla_class_init (GtkOglaClass *class)
{
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);

  widget_class->realize = gtk_ogla_realize;
  widget_class->size_allocate = gtk_ogla_size_allocate;
}

static void
gtk_ogla_init (GtkOgla *darea, gpointer data)
{
  g_assert_not_reached();
}


GtkWidget*
gtk_ogla_new (void)
{
  return g_object_new (GTK_TYPE_OGLA, NULL);
}

static void
gtk_ogla_realize (GtkWidget *widget)
{
  GtkOgla *darea;
  GdkWindowAttr attributes;
  gint attributes_mask;

  g_return_if_fail (GTK_IS_OGLA (widget));

  darea = GTK_OGLA (widget);
  GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);

  attributes.window_type = GDK_WINDOW_CHILD;
  attributes.x = widget->allocation.x;
  attributes.y = widget->allocation.y;
  attributes.width = widget->allocation.width;
  attributes.height = widget->allocation.height;
  attributes.wclass = GDK_INPUT_OUTPUT;
  attributes.visual = gtk_widget_get_visual (widget);
  attributes.colormap = gtk_widget_get_colormap (widget);
  attributes.event_mask = gtk_widget_get_events (widget) |
GDK_EXPOSURE_MASK;

  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;

  widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
&attributes, attributes_mask);
  gdk_window_set_user_data (widget->window, darea);

  widget->style = gtk_style_attach (widget->style, widget->window);
  gtk_style_set_background (widget->style, widget->window,
GTK_STATE_NORMAL);

  gtk_ogla_send_configure (GTK_OGLA (widget));
}

static void
gtk_ogla_size_allocate (GtkWidget     *widget,
                                GtkAllocation *allocation)
{
  g_return_if_fail (GTK_IS_OGLA (widget));
  g_return_if_fail (allocation != NULL);

  widget->allocation = *allocation;

  if (GTK_WIDGET_REALIZED (widget))
    {
      gdk_window_move_resize (widget->window,
                              allocation->x, allocation->y,
                              allocation->width, allocation->height);

      gtk_ogla_send_configure (GTK_OGLA (widget));
    }
}

static void
gtk_ogla_send_configure (GtkOgla *darea)
{
  GtkWidget *widget;
  GdkEvent *event = gdk_event_new (GDK_CONFIGURE);

  widget = GTK_WIDGET (darea);

  event->configure.window = g_object_ref (widget->window);
  event->configure.send_event = TRUE;
  event->configure.x = widget->allocation.x;
  event->configure.y = widget->allocation.y;
  event->configure.width = widget->allocation.width;
  event->configure.height = widget->allocation.height;

  gtk_widget_event (widget, event);
  gdk_event_free (event);
}


static gboolean delete_event( GtkWidget *widget,
                              GdkEvent  *event,
                              gpointer   data )
{
    g_print ("delete event occurred\n");
    return FALSE;
}

static void destroy( GtkWidget *widget,
                     gpointer   data )
{
    gtk_main_quit ();
}

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *ogla;

    gtk_init (&argc, &argv);

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    g_signal_connect (G_OBJECT (window), "delete_event",
                      G_CALLBACK (delete_event), NULL);

    g_signal_connect (G_OBJECT (window), "destroy",
                      G_CALLBACK (destroy), NULL);

    gtk_container_set_border_width (GTK_CONTAINER (window), 10);

    ogla = gtk_ogla_new();

    gtk_widget_set_size_request( GTK_WIDGET (ogla), 320, 240 );

    gtk_container_add (GTK_CONTAINER (window), ogla);

    gtk_widget_show (ogla);
    gtk_widget_show (window);

    gtk_main ();

    return 0;
}



---------------------------------------------------------------
Bob: Looks like you've been missing quite a bit of work lately.
Peter: Well, I wouldn't say I've been MISSING it, Bob.






[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]