]> git.draconx.ca Git - gob-dx.git/blobdiff - doc/gob.1
Release 0.0.2
[gob-dx.git] / doc / gob.1
diff --git a/doc/gob.1 b/doc/gob.1
new file mode 100644 (file)
index 0000000..3257c8f
--- /dev/null
+++ b/doc/gob.1
@@ -0,0 +1,258 @@
+.\"
+.\" gob manual page
+.\" (C) 1999 George Lebl <jirka@5z.com>
+.\" 
+.\" This manual page is covered by the terms of the GNU General
+.\" Public License.  
+.\"
+.TH GOB 1 "GOB 0.0.2" 
+.SH NAME
+GOB \- The GTK+ Object Builder
+.SH SYNOPSIS
+.PP
+.B gob
+.SH DESCRIPTION
+.PP
+GTK+ Object Builder is a simple preprocessor for easily creating
+GTK+ objects.  It does not parse any C code and ignores any C errors.  It
+is in spirit similiar to things like lex or yacc.
+.SH TYPENAMES
+.PP
+Because we need to parse out different parts of the typename, 
+sometimes you need to specify the typename with some special syntax.
+Types are specified in capitalized form and words are separated by ':'.
+The first word of the type (which can be empty) is the "namespace".  This
+fact is for example used for the type checking macro.  For "Gtk:New:Button",
+the macro will be GTK_IS_NEW_BUTTON.  This format of typenames is used in
+the class declaration header and for method argument types.
+
+.SH OUTPUT FILE NAMES
+.PP
+The filenames are created from the typename.  The words are
+separated by '-' and all in lower case.  For example for an object named
+"Gtk:New:Button", the files are gtk-new-button.c and gtk-new-button.h.
+
+.SH INCLUDING NORMAL C CODE IN THE OUTPUT FILES
+.PP
+To include some code directly in the output C file begin with
+'%{' on an empty line and end the code with a '%{' on an empty line.  To
+put the code in the output header file, start the code with a '%h{'.
+For example:
+.nf
+
+  %h{
+  void somefunc(int i);
+  %}
+  %{
+  void somefunc(int i)
+  {
+         /* some code */
+  }
+  %}
+
+.fi
+.SH MAKING A NEW CLASS
+.PP
+The class header:
+.PP
+There can be only one class per input file.  Defining a class
+is sort of like in Java, you define the class and write inline code
+directly into the class definition.  To define a class you need to specify
+the new object name and the name of the object from which it is derived
+from, such as this "class <new type> from <parent type> { <class code> }".
+For example:
+.nf
+
+  class Gtk:New:Button from Gtk:Button {
+         <class code>
+  }
+
+.fi
+.PP
+Data members:
+.PP
+There are three types of data members.  Two of them are normal
+data numbers, and one is a virtual one, usually linked to a normal public
+data member.  The two normal data members are public or private. They are
+basically just copied into the object directly.  There is only one
+identifier allowed per typename unlike in normal C.  Example:
+.nf
+
+  public int i;
+  private GtkWidget *h;
+
+.fi
+.PP
+The private members are not currently protected from outside use,
+they are just marked by a comment in the header file, this will most likely
+be somehow solved in some future version.
+.PP
+The third type is an argument type.  It is a named datamember which
+is one of the features of the GTK+ object system.  You need to define a get
+and a set handler.  They are fragments of C code that will be used to 
+get the value orset the value of the argument.  Inside them you can use the
+define ARG to which you assign the data or get the data.  You can also use
+the identifier "this" as pointer to the object instance.  The type is
+defined as one of the gtk type enums, but without the GTK_TYPE_ prefix.
+For example:
+.nf
+
+  public int height;
+  argument INT height set { this->height = ARG; } get { ARG = this->height; };
+
+.fi
+.PP
+If you don't define a set or a get handler it will be a readonly
+or a writeonly argument.  If you want to add extra argument flags, add
+them into parenthesis after the argument keyword, separated by '|' and
+without the GTK_ARG_ prefix.  For example:
+.nf
+
+  public int height;
+  argument (CONSTRUCT) INT height get { ARG = this->height; };
+
+.fi
+.PP
+Methods:
+.PP
+There is a whole array of possible methods.  The two normal,
+"familiar" method types are private and public.  Public are defined as
+normal functions with a prototype in the header file.  Private methods
+are defined as static functions with prototypes at the top of the .c
+file.  Then there are signal, virtual and override methods.  You can also
+define init and init_class methods with a special definition if you want
+to add code to the constructors or you can just leave them out.
+.PP
+Argument lists:
+.PP
+For all but the init and init_class methods, you use the
+following syntax for arguments.  The first argument can be just "this",
+which gob will translateinto a pointer to the object instance.  The rest
+of the arguments are very similiar to normal C arguments.  If the
+typename is an object pointer you should use the syntax defined above
+with the words separated by ':'
+.nf
+<type> <argument id>
+or
+<type> <argument id> (check <list of checks>)
+.fi
+.PP
+The checks are glib type preconditions, and can be the following:
+"null", which tests pointers for being NULL, "type" which checks GTK+
+object pointers for being the right type, "<test> <number>" which tests
+numberic arguments for being a certain value.  The test can be a <,>,<=,>=
+!= or ==.  Example:
+.nf
+  
+  public int foo(this, int h (check > 0 < 11), Gtk:Widget *w (check null type))
+
+.fi
+.PP
+This will be the prototype of a function which has a this pointer
+as the first argument, an integer argument which will be checked and has
+to be more then 0 and less then 11, and a pointer to a GtkWidget object
+instance and it is checked for being null and the type will also be
+checked.
+.PP
+Error return:
+.PP
+Methods which have a return value, there also has to be something
+returned if there is an error, such as if a precondition is not met.  The
+default is 0, casted to the type of the method.  If you need to return
+something else then you can specify an "onerror" keyword after the
+prototype and after that a number, a token (an identifier) or a bit of C
+code enclosed in braces {}.  The braces will not be printed into the
+output, they just delimit the string.  For example
+.nf
+
+  public void * get_something(this, int i (check >= 0)) onerror NULL {
+         ...
+  }
+
+.fi
+.PP
+Virtual methods:
+.PP
+Virtual methods are basically pointers in the class structure,
+so that one can override the method in derived methods.  They can be empty
+(if you put ';' instead of the C code).  A wrapper will also be defined
+which makes calling the methods he same as public methods.  This type of
+method is just a little bit "slower" then normal functions, but not as
+slow as signals.  You define them by using "virutal" keywrod before the
+prototype.
+.PP
+Signals:
+.PP
+Signals are methods to which the user can bind other handlers
+and override the default handler.  The default handler is basically the
+method body.  This is the most versatile and flexible type of a method
+and also the slowest.  You need to specify a whole bunch of things when
+you define a signal.  One thing is when the default handler will be run,
+first or last.  You specify that by "first" or "last" right after the
+"signal" keyword.  Then you need to define the gtk enum types (again
+without the GTK_TYPE_ prefix).  For that you define the return types
+and the types of arguments after the "this" pointer (not including the
+"this" pointer).  You put it in the following syntax "<return type> (<list
+of arguments>)".  If the return type is void, the type should be "NONE",
+the same should be for the argument list.  The rest of the prototype is
+the same as for other method types.  The body can also be empty, and
+also there is a public method wrapper which you can use for calling the
+signal jus tlike a public method.  Example:
+.nf
+
+  signal first INT(POINTER,INT)
+  int do_something(this, Gtk:Widget *w (check null type), int length)
+  {
+         ...
+  }
+  
+or
+
+  signal last NONE(NONE) void foo(this);
+
+.fi
+.PP
+Override methods:
+.PP
+If you need to override some method (a signal or a virtual method
+of some class in the parent tree of the new object), you can define and
+override method.  After the "override" keyword, you should put the
+typename of the class you are overriding a method from.  Other then that
+it is the same as for other methods.  The "this" pointer in this case
+should be the type of the method you are overriding so that you don't
+get warnings during compilation.  Example:
+.nf
+
+  override (Gtk:Container) void
+  add (Gtk:Container *this (check null type), Gtk:Widget *wid (check null type))
+  {
+         ...
+  }
+.fi
+.PP
+Calling methods:
+.PP
+Inside the code, defines are set for the methods, so that you don't
+have to type the class name before each call.  Example:
+.nf
+
+  private int
+  foo(this)
+  {
+         return this->len;
+  }
+  
+  private int
+  bar(this,int i)
+  {
+         return foo(this) + i;
+  }
+.fi
+.SH BUGS
+.PP
+The generated header file is included as the first file in the .c file, no
+matter what. ths means that you willhave to putthings that need to be included
+before that, into an %h{ } section.
+.SH AUTHOR
+.PP
+George Lebl <jirka@5z.com>