]> git.draconx.ca Git - gob-dx.git/blob - doc/gob.1.in
Release 0.91.0
[gob-dx.git] / doc / gob.1.in
1 .\"
2 .\" gob manual page
3 .\" (C) 1999 George Lebl <jirka@5z.com>
4 .\" 
5 .\" This manual page is covered by the terms of the GNU General
6 .\" Public License.  
7 .\"
8 .TH GOB 1 "GOB @VERSION@" 
9 .SH NAME
10 GOB \- The GTK+ Object Builder
11 .SH SYNOPSIS
12 .PP
13 .B gob [-?] [-h] [-w] [--exit-on-warn] [--no-exit-on-warn] [--for-cpp]
14 [--no-touch-headers] file
15 .SH DESCRIPTION
16 .PP
17 GTK+ Object Builder is a simple preprocessor for easily creating
18 GTK+ objects.  It does not parse any C code and ignores any C errors.  It
19 is in spirit similar to things like lex or yacc.
20
21 .SH OPTIONS
22 .PP
23 .TP
24 .B -?
25 .TP
26 .B -h
27 Display a simple help screen.
28 .TP
29 .B -w
30 .TP
31 .B --exit-on-warn
32 Exit with an errorcode even when you encounter a warning.
33 .TP
34 .B --no-exit-on-warn
35 Exit with an error only on errors, not on warnings, this is the default.
36 .TP
37 .B --for-cpp
38 Generate C++ code.
39 .TP
40 .B --no-touch-headers
41 Don't touch the generated header file unless it really changed, this avoids
42 spurious rebuilds, but can confuse some make systems (automake in particular),
43 so it is not enabled by default.
44
45
46 .SH TYPENAMES
47 .PP
48 Because we need to parse out different parts of the typename, sometimes you
49 need to specify the typename with some special syntax.  Types are specified in
50 capitalized form and words are separated by ':'.  The first word of the type
51 (which can be empty) is the "namespace".  This fact is for example used for the
52 type checking macro and the type macro.  For "Gtk:New:Button", the macros will
53 be GTK_IS_NEW_BUTTON and GTK_TYPE_NEW_BUTTON.  This colon separated format of
54 typenames is used in the class declaration header and for method argument
55 types.
56
57 .SH OUTPUT FILES
58 .PP
59 The filenames are created from the typename.  The words are
60 separated by '-' and all in lower case.  For example for an object named
61 "Gtk:New:Button", the files are gtk-new-button.c and gtk-new-button.h.
62 The header file is created to be human readable and to be used as a
63 reference to the object.  The .c source file is not created as a human
64 readable source and is littered with #line statements, which make the
65 compiler attempt to point you to the right line in your .gob file in
66 case of parsing errors.  The output should not be editted by hand, and
67 you should only edit the .gob file.
68
69 .SH INCLUDING NORMAL C CODE IN THE OUTPUT FILES
70 .PP
71 To include some code directly in the output C file begin with '%{'
72 on an empty line and end the code with a '%}' on an empty line.  To
73 put the code in the output header file, start the code with a '%h{'.
74 For example:
75 .nf
76
77   %h{
78   /* will be included in the header */
79   void somefunc(int i);
80   %}
81
82   %{
83   /* will be included in the C file */
84   void somefunc(int i)
85   {
86         /* some code */
87   }
88   %}
89
90 .fi
91
92 .SH INCLUDE FILES
93 .PP
94 Gob will automatically include the class header file at the top of the .c 
95 source file.  If you wish to include it somewhere else, put the include
96 into some %{ %} section above the class definition, and gob will not include
97 it automatically.  This way you can avoid circular includes and control
98 where in the file do you want to include the header.
99
100 .SH MAKING A NEW CLASS
101 .PP
102 The class header:
103 .PP
104 There can be only one class per input file.  Defining a class
105 is sort of like in Java, you define the class and write inline code
106 directly into the class definition.  To define a class you need to specify
107 the new object name and the name of the object from which it is derived
108 from, such as this "class <new type> from <parent type> { <class code> }".
109 For example:
110 .nf
111
112   class Gtk:New:Button from Gtk:Button {
113           <class code>
114   }
115
116 .fi
117 .PP
118 Data members:
119 .PP
120 There are three types of data members.  Two of them are normal
121 data numbers, and one is a virtual one, usually linked to a normal public
122 data member.  The two normal data members are public or private. They are
123 basically just copied into the object directly.  There is only one
124 identifier allowed per typename unlike in normal C.  Example:
125 .nf
126
127   public int i;
128   private GtkWidget *h;
129
130 .fi
131 .PP
132 Public datamembers are accessed normally as members of the object struct.
133 Example where 'i' is as above a public data member:
134 .nf
135
136   object->i = 1;
137
138 .fi
139 .PP
140 The private data members are defined in a structure which is only available
141 inside the .c file.  You must access them using the structure _priv.  Example
142 where 'h' is the private data member (as in the above example):
143 .nf
144
145   object->_priv->h = NULL;
146
147 .fi
148 Note that the _priv structure is only accessible to C code blocks below or
149 inside the class definition in the .gob file.  If you use it above, you will
150 get a 'dereferencing incomplete pointer type' error from the C compiler.
151 .PP
152 The third type is an argument type.  It is a named datamember which
153 is one of the features of the GTK+ object system.  You need to define a get
154 and a set handler.  They are fragments of C code that will be used to 
155 get the value or set the value of the argument.  Inside them you can use the
156 define ARG to which you assign the data or get the data.  You can also use
157 the identifier "self" as pointer to the object instance.  The type is
158 defined as one of the gtk type enums, but without the GTK_TYPE_ prefix.
159 For example:
160 .nf
161
162   public int height;
163   argument INT height set { self->height = ARG; } get { ARG = self->height; };
164
165 .fi
166 .PP
167 If you don't define a set or a get handler it will be a readonly
168 or a writeonly argument.  If you want to add extra argument flags, add
169 them into parenthesis after the argument keyword, separated by '|' and
170 without the GTK_ARG_ prefix.  For example:
171 .nf
172
173   public int height;
174   argument (CONSTRUCT) INT height get { ARG = self->height; };
175
176 .fi
177 .PP
178 Methods:
179 .PP
180 There is a whole array of possible methods.  The two normal,
181 "familiar" method types are private and public.  Public are defined as
182 normal functions with a prototype in the header file.  Private methods
183 are defined as static functions with prototypes at the top of the .c
184 file.  Then there are signal, virtual and override methods.  You can also
185 define init and init_class methods with a special definition if you want
186 to add code to the constructors or you can just leave them out.
187 .PP
188 Argument lists:
189 .PP
190 For all but the init and init_class methods, you use the
191 following syntax for arguments.  The first argument can be just "self",
192 which gob will translate into a pointer to the object instance.  The rest
193 of the arguments are very similar to normal C arguments.  If the
194 typename is an object pointer you should use the syntax defined above
195 with the words separated by ':'
196 .nf
197 <type> <argument id>
198 or
199 <type> <argument id> (check <list of checks>)
200 .fi
201 .PP
202 The checks are glib type preconditions, and can be the following:
203 "null", which tests pointers for being NULL, "type" which checks GTK+
204 object pointers for being the right type, "<test> <number>" which tests
205 numeric arguments for being a certain value.  The test can be a <,>,<=,>=
206 != or ==.  Example:
207 .nf
208   
209   public int foo(self, int h (check > 0 < 11), Gtk:Widget *w (check null type))
210
211 .fi
212 .PP
213 This will be the prototype of a function which has a self pointer
214 as the first argument, an integer argument which will be checked and has
215 to be more then 0 and less then 11, and a pointer to a GtkWidget object
216 instance and it is checked for being null and the type will also be
217 checked.
218 .PP
219 Error return:
220 .PP
221 Methods which have a return value, there also has to be something
222 returned if there is an error, such as if a precondition is not met.  The
223 default is 0, casted to the type of the method.  If you need to return
224 something else then you can specify an "onerror" keyword after the
225 prototype and after that a number, a token (an identifier) or a bit of C
226 code enclosed in braces {}.  The braces will not be printed into the
227 output, they just delimit the string.  For example
228 .nf
229
230   public void * get_something(self, int i (check >= 0)) onerror NULL {
231           ...
232   }
233
234 .fi
235 .PP
236 Virtual methods:
237 .PP
238 Virtual methods are basically pointers in the class structure,
239 so that one can override the method in derived methods.  They can be empty
240 (if you put ';' instead of the C code).  A wrapper will also be defined
241 which makes calling the methods he same as public methods.  This type of
242 method is just a little bit "slower" then normal functions, but not as
243 slow as signals.  You define them by using "virtual" keyword before the
244 prototype. If you put the keyword "private" right after the "virtual"
245 keyword, the wrapper will not be a public method, but a private one.
246 .PP
247 Signals:
248 .PP
249 Signals are methods to which the user can bind other handlers
250 and override the default handler.  The default handler is basically the
251 method body.  This is the most versatile and flexible type of a method
252 and also the slowest.  You need to specify a whole bunch of things when
253 you define a signal.  One thing is when the default handler will be run,
254 first or last.  You specify that by "first" or "last" right after the
255 "signal" keyword.  Then you need to define the gtk enum types (again
256 without the GTK_TYPE_ prefix).  For that you define the return types
257 and the types of arguments after the "self" pointer (not including the
258 "self" pointer).  You put it in the following syntax "<return type> (<list
259 of arguments>)".  If the return type is void, the type should be "NONE",
260 the same should be for the argument list.  The rest of the prototype is
261 the same as for other method types.  The body can also be empty, and
262 also there is a public method wrapper which you can use for calling the
263 signal just like a public method.  Example:
264 .nf
265
266   signal first INT(POINTER,INT)
267   int do_something(self, Gtk:Widget *w (check null type), int length)
268   {
269           ...
270   }
271   
272 or
273
274   signal last NONE(NONE) void foo(self);
275
276 .fi
277 .PP
278 If you don't want the wrapper that emits the signal to be public, you can
279 include the keyword "private" after the "signal" keyword. This will make
280 the wrapper a normal private method.
281 .PP
282 If you don't define a "first" or a "last", the default will be taken as
283 "last".
284 .PP
285 Override methods:
286 .PP
287 If you need to override some method (a signal or a virtual method
288 of some class in the parent tree of the new object), you can define and
289 override method.  After the "override" keyword, you should put the
290 typename of the class you are overriding a method from.  Other then that
291 it is the same as for other methods.  The "self" pointer in this case
292 should be the type of the method you are overriding so that you don't
293 get warnings during compilation.  Also to call the method of the parent
294 class, you can use the PARENT_HANDLER macro with your arguments.  Example:
295 .nf
296
297   override (Gtk:Container) void
298   add (Gtk:Container *self (check null type), Gtk:Widget *wid (check null type))
299   {
300           /* some code here */
301           PARENT_HANDLER(self, wid);
302   }
303
304 .fi
305 .PP
306 Calling methods:
307 .PP
308 Inside the code, pointers are set for the methods, so that you don't
309 have to type the class name before each call, just the name of the method.
310 Example:
311 .nf
312
313   private int
314   foo(self)
315   {
316           return self->len;
317   }
318   
319   private int
320   bar(self,int i)
321   {
322           return foo(self) + i;
323   }
324
325 .fi
326 .PP
327 Making new objects:
328 .PP
329 You should define a new method which should be a normal public method.  Inside
330 this method, you can use the GET_NEW macro that is defined for you and that
331 will fetch a new object, so a fairly standard new method would look like:
332 .nf
333
334   public GtkObject *
335   new(void) {
336           GtkObject *ret;
337           ret = GTK_OBJECT (GET_NEW);
338           return ret;
339   }
340
341 .fi
342
343 .SH C++ MODE
344 .PP
345 There is a C++ mode so that gob creates C++ compiler friendly files.  You need
346 to use the --for-cpp argument to gob.  This will make the generated file have
347 a .cc instead of a .c extention, and several things will be adjusted to
348 make it all work for a C++ compiler.  One thing that will be missing is an
349 alias to the new method, as that clashes with C++, so instead you'll have to
350 use the full name of the method inside your code.  Also note that gob does
351 not use any C++ features, this option will just make the generated code
352 compile with a C++ compiler.
353
354 .SH BUGS
355 .PP
356 Also the lexer does not actually parse the C code, so I'm sure that some corner
357 cases or maybe even some not so corner cases of C syntax might confuse gob
358 completely.  If you find any, send me the source that makes it go gaga and I'll
359 try to make the lexer try to handle it properly, but no promises.
360 .PP
361 Another thing is that gob ignores preprocessor macros.  Since gob counts
362 braces, the following code won't work:
363 .nf
364
365   #ifdef SOME_DEFINE
366   if(foo) {
367   #else
368   if(bar) {
369   #endif
370           blah();
371   }
372
373 .fi
374 To make this work, you'd have to do this:
375 .nf
376
377   #ifdef SOME_DEFINE
378   if(foo)
379   #else
380   if(bar)
381   #endif
382   {
383           blah();
384   }
385
386 .fi
387 There is no real good way we can handle this without parsing C code, so we
388 probably never will.  In the future, I might add #if 0 as a comment but
389 that's about as far as I can really take it and even that is problematic.
390 Basically, if you use gob, just don't use the C preprocessor too extensively.
391
392 .SH AUTHOR
393 .PP
394 George Lebl <jirka@5z.com>