requires 0.92.1 /* This will work with an older version (0.92.1 specifically), if you want * to see a version with automatic argument<->datamember linking, automatic * initialization and destruction, look at my-person2.gob */ %{ #include #include "my-person.h" #include "my-person-private.h" %} class My:Person from Gtk:Object { public char *name; public long dob; /* date of birth as a time_t */ public long dod; /* date of death as a time_t */ private int rounds_in_shotgun; /* number of rounds in our shotgun */ argument POINTER (type char *) name get { /* note that g_strdup handles NULL correctly */ ARG = g_strdup(self->name); } set { /* note that g_free and g_strdup handles NULL correctly */ g_free(self->name); self->name = g_strdup(ARG); }; argument LONG dob get { ARG = self->dob; } set { self->dob = ARG; }; argument LONG dod get { ARG = self->dod; } set { self->dod = ARG; }; init(self) { self->name = g_strdup("Nobody"); self->dob = 0; self->dod = 0; /* initially we have no rounds in the shotgun */ self->_priv->rounds_in_shotgun = 0; } /* when the person gets born, sends out a signal, the caller of the signal should provide the date of birth */ signal last NONE (LONG) void birth(self, long dob) { self->dob = dob; } /* when the person dies, sends out a signal, the caller of the signal should provide the date of death */ signal last NONE (LONG) void death(self, long dod) { self->dod = dod; } public void load_shotgun(self) { /* add a round to our shotgun */ self->_priv->rounds_in_shotgun++; } public void shoot_oneself_in_the_head(self) { if(self->_priv->rounds_in_shotgun==0) { g_warning("No rounds in the shotgun!"); return; } /* one round was fired */ self->_priv->rounds_in_shotgun--; /* death is imminent if we shoot oneself in the head */ death(self, (long)time(NULL)); } /* override the destroy signal where we destroy data we need to free */ override (Gtk:Object) void destroy (Gtk:Object *self (check null type)) { g_free(MY_PERSON(self)->name); PARENT_HANDLER(self); } public GtkObject * new(void) { return (GtkObject *)GET_NEW; } }