Libbonobo Reference Manual | |||
---|---|---|---|
<<< Previous Page | Home | Up | Next Page >>> |
#define BONOBO_X_OBJECT_TYPE #define BONOBO_X_OBJECT_HEADER_SIZE #define BONOBO_X_OBJECT_GET_SERVANT (o) #define BONOBO_X_SERVANT_GET_OBJECT (o) #define BonoboXObject #define BonoboXObjectClass #define bonobo_x_object #define BonoboXObjectPOAFn #define bonobo_x_type_unique #define bonobo_x_type_setup #define BONOBO_X_TYPE_FUNC_FULL (class_name, corba_name, parent, prefix) #define BONOBO_X_TYPE_FUNC (class_name, parent, prefix) |
BonoboXObject provides an easy to use way of writing CORBA servers. It strongly deprecates BonoboObject ( with which it is compatible ). It drastically simplifies the issues of epv and vepv construction by automating these, and automatically instantiates a CORBA_Object on gtk_type_new. This removes clutter from construction time.
The CORBA methods are associated with a Gtk class in the same way that standard Gtk+ methods and signals are. We insert the CORBA generated Entry Point Vector (epv) struct as the first element of the derived class eg.
Example 1. Setting up the GtkClass data
typedef struct { BonoboXObject base; BonoboControlPrivate *priv; } BonoboControl; typedef struct { BonoboXObjectClass parent_class; POA_Bonobo_Control__epv epv; /* Signals. */ void (*set_frame) (BonoboControl *control); void (*activate) (BonoboControl *control, gboolean state); } BonoboControlClass; |
Then we set up the type using the bonobo_x_type_unique function instead of gtk_type_unique ( but otherwise in the standard Gtk+ fashion ).
Example 2. Registering the type with bonobo
GtkType bonobo_control_get_type (void) { GtkType ptype; static GtkType type = 0; if (type == 0) { static GtkTypeInfo info = { "BonoboControl", sizeof (BonoboControl), sizeof (BonoboControlClass), (GtkClassInitFunc)bonobo_control_class_init, (GtkObjectInitFunc)bonobo_control_init, NULL, NULL, (GtkClassInitFunc) NULL }; ptype = (parent); type = bonobo_x_type_unique (ptype, POA_Bonobo_Control__init, NULL, GTK_STRUCT_OFFSET (BonoboControlClass, epv), &info); } return type; } |
Example 3. Registering the type more simply
BONOBO_X_TYPE_FUNC_FULL (BonoboControl, Bonobo_Control, PARENT_TYPE, bonobo_control); |
After registering the type in the class initialization function, we must fill out the epv with our entry points, similar to the way we hook up virtual class functions. It may also be necessary to override the parent's epv's; this can be done by accessing the epv pointer for the parent class.
Example 4. Setting up the class' methods
static void bonobo_control_class_init (BonoboControlClass *klass) { GtkObjectClass *object_class = (GtkObjectClass *)klass; POA_Bonobo_Control__epv *epv = &klass->epv; bonobo_control_parent_class = gtk_type_class (PARENT_TYPE); ... object_class->destroy = bonobo_control_destroy; object_class->finalize = bonobo_control_finalize; epv->activate = impl_Bonobo_Control_activate; epv->setSize = impl_Bonobo_Control_setSize; ... epv->realize = impl_Bonobo_Control_realize; epv->unrealize = impl_Bonobo_Control_unrealize; } |
#define BONOBO_X_OBJECT_TYPE BONOBO_TYPE_X_OBJECT /* deprecated, you should use BONOBO_TYPE_X_OBJECT */ |
#define BONOBO_X_OBJECT_GET_SERVANT(o) ((PortableServer_Servant)&(o)->servant) |