Blame docs/generation.txt

Packit Service fb6fa5
Overview:
Packit Service fb6fa5
========
Packit Service fb6fa5
Packit Service fb6fa5
This file describes the way that autogeneration
Packit Service fb6fa5
works within the GTK+ source code.
Packit Service fb6fa5
Packit Service fb6fa5
The following files in the gdk/ subdirectory
Packit Service fb6fa5
are autogenerated:
Packit Service fb6fa5
Packit Service fb6fa5
  gdkkeysyms.h
Packit Service fb6fa5
  gdkcursors.h 
Packit Service fb6fa5
Packit Service fb6fa5
The following files in the gtk/ subdirectory 
Packit Service fb6fa5
are autogenerated:
Packit Service fb6fa5
Packit Service fb6fa5
 gtk.defs
Packit Service fb6fa5
   Description of GTK+ types (and some functions) in a lisp-style
Packit Service fb6fa5
   format.
Packit Service fb6fa5
 gtktypebuiltins.h
Packit Service fb6fa5
   Header file including declarations for internal types  
Packit Service fb6fa5
 gtktypebuiltins_vars.c
Packit Service fb6fa5
   Variables for type values for internal types.
Packit Service fb6fa5
 gtktypebuiltins_ids.c
Packit Service fb6fa5
   Arrays holding information about each internal type.
Packit Service fb6fa5
 gtktypebuiltins_evals.c
Packit Service fb6fa5
   Arrays holding mapping between enumeration values
Packit Service fb6fa5
   and strings.
Packit Service fb6fa5
Packit Service fb6fa5
 gtkmarshal.c
Packit Service fb6fa5
 gtkmarshal.h
Packit Service fb6fa5
   Autogenerated signal marshallers
Packit Service fb6fa5
Packit Service fb6fa5
GDK
Packit Service fb6fa5
===
Packit Service fb6fa5
Packit Service fb6fa5
gdkkeysyms.h and gdkcursors.h are generated from
Packit Service fb6fa5
the corresponding header files
Packit Service fb6fa5
Packit Service fb6fa5
  X11/cursorfont.h
Packit Service fb6fa5
  X11/keysymdef.h
Packit Service fb6fa5
Packit Service fb6fa5
by some simple sed scripts. These are not actually
Packit Service fb6fa5
run automatically because we want all the keysyms
Packit Service fb6fa5
even on systems with a limited set.
Packit Service fb6fa5
So the Gdk rule to generate both files (X-derived-headers)
Packit Service fb6fa5
only needs to be rerun for every new release of the X Window
Packit Service fb6fa5
System.
Packit Service fb6fa5
Packit Service fb6fa5
GTK+ - type definitions
Packit Service fb6fa5
=======================
Packit Service fb6fa5
Packit Service fb6fa5
The type definitions are generated from several sources:
Packit Service fb6fa5
Packit Service fb6fa5
 gtk-boxed.defs - definitions for boxed types
Packit Service fb6fa5
 GTK+ header files
Packit Service fb6fa5
 GDK header files
Packit Service fb6fa5
Packit Service fb6fa5
The makeenums.pl script does a heuristic parse of 
Packit Service fb6fa5
the header files and extracts all enumerations declarations.
Packit Service fb6fa5
It also recognizes a number of pseudo-comments in the
Packit Service fb6fa5
header files:
Packit Service fb6fa5
Packit Service fb6fa5
Two of these apply to individual enumeration values:
Packit Service fb6fa5
Packit Service fb6fa5
  /*< skip >*/
Packit Service fb6fa5
Packit Service fb6fa5
 This enumeration value should be skipped.
Packit Service fb6fa5
  
Packit Service fb6fa5
  /*< nick=NICK >*/
Packit Service fb6fa5
Packit Service fb6fa5
 The nickname for this value should NICK instead of the
Packit Service fb6fa5
 normally guessed value. For instance:
Packit Service fb6fa5
Packit Service fb6fa5
  typedef enum {
Packit Service fb6fa5
    GTK_TARGET_SAME_APP = 1 << 0,    /*< nick=same-app >*/
Packit Service fb6fa5
    GTK_TARGET_SAME_WIDGET = 1 << 1  /*< nick=same-widget >*/
Packit Service fb6fa5
  } GtkTargetFlags;
Packit Service fb6fa5
Packit Service fb6fa5
 makes the nicks "same-app" and "same-widget", instead of
Packit Service fb6fa5
 "app" and "widget" that would normally be used.
Packit Service fb6fa5
Packit Service fb6fa5
The other two apply to entire enumeration declarations.
Packit Service fb6fa5
 
Packit Service fb6fa5
  /*< prefix=PREFIX >*/
Packit Service fb6fa5
Packit Service fb6fa5
  Specifies the prefix to be removed from the enumeration
Packit Service fb6fa5
  values to generate nicknames.
Packit Service fb6fa5
Packit Service fb6fa5
  /*< flags >*/
Packit Service fb6fa5
Packit Service fb6fa5
 Specifies that this enumeration is used as a bitfield.
Packit Service fb6fa5
 (makenums.pl normally guesses this from the presence of values
Packit Service fb6fa5
  with << operators). For instance:
Packit Service fb6fa5
Packit Service fb6fa5
  typedef enum                    /*< flags >*/
Packit Service fb6fa5
  {
Packit Service fb6fa5
    GDK_IM_PREEDIT_AREA      = 0x0001, 
Packit Service fb6fa5
    GDK_IM_PREEDIT_CALLBACKS = 0x0002, 
Packit Service fb6fa5
    [ ... ]
Packit Service fb6fa5
 } GdkIMStyle;
Packit Service fb6fa5
Packit Service fb6fa5
makeenums.pl can be run into two modes:
Packit Service fb6fa5
Packit Service fb6fa5
 1) Generate the gtktypebuiltins_eval.c file (this
Packit Service fb6fa5
    contains arrays holding the mapping of 
Packit Service fb6fa5
    string <=> enumeration value)
Packit Service fb6fa5
Packit Service fb6fa5
 2) Generate the enumeration portion of gtk.defs.
Packit Service fb6fa5
Packit Service fb6fa5
The enumeration portion is added to the boxed type 
Packit Service fb6fa5
declarations in gtk-boxed.defs to create gtk.defs.
Packit Service fb6fa5
Packit Service fb6fa5
The makeetypes.awk program takes the gtk.defs file, and
Packit Service fb6fa5
from that generates various files depending on the
Packit Service fb6fa5
third parameter passed to it:
Packit Service fb6fa5
Packit Service fb6fa5
 macros: gtktypebuiltins.h
Packit Service fb6fa5
 variables: gtktypebuiltins_vars.c
Packit Service fb6fa5
 entries: gtktypebuiltins_ids.c
Packit Service fb6fa5
Packit Service fb6fa5
GTK+ - marshallers
Packit Service fb6fa5
==================
Packit Service fb6fa5
Packit Service fb6fa5
The files gtkmarshal.c and gtkmarshal.h include declarations
Packit Service fb6fa5
and definitions for the marshallers needed inside of
Packit Service fb6fa5
GTK+. The marshallers to be generated are listed in
Packit Service fb6fa5
the file gtkmashal.list, which is processed
Packit Service fb6fa5
by genmarshal.pl.
Packit Service fb6fa5
Packit Service fb6fa5
The format of this file is a list of lines:
Packit Service fb6fa5
Packit Service fb6fa5
  <retval-type>:<arg1-type>,<arg2-type>,<arg3-type>
Packit Service fb6fa5
 
Packit Service fb6fa5
e.g.:
Packit Service fb6fa5
Packit Service fb6fa5
  BOOL:POINTER,STRING,STRING,POINTER
Packit Service fb6fa5
Packit Service fb6fa5
A marshaller is generated for each line in the file.
Packit Service fb6fa5
The possible types are:
Packit Service fb6fa5
Packit Service fb6fa5
 NONE
Packit Service fb6fa5
 BOOL
Packit Service fb6fa5
 CHAR
Packit Service fb6fa5
 INT
Packit Service fb6fa5
 UINT
Packit Service fb6fa5
 LONG
Packit Service fb6fa5
 ULONG
Packit Service fb6fa5
 FLOAT
Packit Service fb6fa5
 DOUBLE
Packit Service fb6fa5
 STRING
Packit Service fb6fa5
 ENUM
Packit Service fb6fa5
 FLAGS
Packit Service fb6fa5
 BOXED
Packit Service fb6fa5
 POINTER
Packit Service fb6fa5
 OBJECT
Packit Service fb6fa5
 FOREIGN    (gpointer data, GtkDestroyNotify notify)
Packit Service fb6fa5
 C_CALLBACK (GtkFunction func, gpointer func_data)
Packit Service fb6fa5
 SIGNAL     (GtkSignalFunc f, gpointer data)
Packit Service fb6fa5
 ARGS       (gint n_args, GtkArg *args)
Packit Service fb6fa5
 CALLBACK   (GtkCallBackMarshal marshall,
Packit Service fb6fa5
             gpointer data,
Packit Service fb6fa5
	     GtkDestroyNotify Notify)
Packit Service fb6fa5
Packit Service fb6fa5
Some of these types map to multiple return values - these
Packit Service fb6fa5
are marked above with the return types in parentheses.
Packit Service fb6fa5
Packit Service fb6fa5
NOTES
Packit Service fb6fa5
=====
Packit Service fb6fa5
Packit Service fb6fa5
When autogenerating GTK+ files, the autogenerated
Packit Service fb6fa5
files are often rebuild resulting in the same result.
Packit Service fb6fa5
Packit Service fb6fa5
To prevent unnecessary rebuilds of the entire directory, some files
Packit Service fb6fa5
that multiple other source files depend on are not actually written
Packit Service fb6fa5
to directly.  Instead, an intermediate file is written, which
Packit Service fb6fa5
is then compared to the old file, and only if it is different
Packit Service fb6fa5
is it copied into the final location.